Merge pull request #5 from TelegramExchange/add-members/me-route
feat: add members/me route
This commit is contained in:
@@ -11,6 +11,18 @@ from src.adapter.jwt import JWTPayload
|
|||||||
workspace_members_router = APIRouter(prefix='/workspaces/{workspace_id}/members', tags=['workspace members'])
|
workspace_members_router = APIRouter(prefix='/workspaces/{workspace_id}/members', tags=['workspace members'])
|
||||||
|
|
||||||
|
|
||||||
|
@workspace_members_router.get('/me')
|
||||||
|
async def get_current_member_permissions(
|
||||||
|
workspace_id: uuid.UUID,
|
||||||
|
current_user: Annotated[JWTPayload, Depends(deps.get_current_user)],
|
||||||
|
) -> dto.WorkspaceMemberOutput:
|
||||||
|
"""Get current user's membership and permissions in the workspace."""
|
||||||
|
return await deps.get_usecase().get_current_member_permissions(
|
||||||
|
workspace_id=workspace_id,
|
||||||
|
user_id=current_user.user_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@workspace_members_router.get('')
|
@workspace_members_router.get('')
|
||||||
async def list_workspace_members(
|
async def list_workspace_members(
|
||||||
workspace_id: uuid.UUID,
|
workspace_id: uuid.UUID,
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ from .workspace.create_workspace_invite import create_workspace_invite
|
|||||||
from .workspace.delete_workspace import delete_workspace
|
from .workspace.delete_workspace import delete_workspace
|
||||||
from .workspace.delete_workspace_avatar import delete_workspace_avatar
|
from .workspace.delete_workspace_avatar import delete_workspace_avatar
|
||||||
from .workspace.get_workspace_invites import get_workspace_invites
|
from .workspace.get_workspace_invites import get_workspace_invites
|
||||||
from .workspace.get_workspace_members import get_workspace_members
|
from .workspace.get_workspace_members import get_workspace_members, get_current_member_permissions
|
||||||
from .workspace.get_workspaces import get_workspaces
|
from .workspace.get_workspaces import get_workspaces
|
||||||
from .workspace.tg_accept_workspace_invite import tg_accept_workspace_invite
|
from .workspace.tg_accept_workspace_invite import tg_accept_workspace_invite
|
||||||
from .workspace.update_workspace import update_workspace
|
from .workspace.update_workspace import update_workspace
|
||||||
@@ -267,6 +267,7 @@ class Usecase:
|
|||||||
update_workspace_avatar = update_workspace_avatar
|
update_workspace_avatar = update_workspace_avatar
|
||||||
delete_workspace_avatar = delete_workspace_avatar
|
delete_workspace_avatar = delete_workspace_avatar
|
||||||
get_workspace_members = get_workspace_members
|
get_workspace_members = get_workspace_members
|
||||||
|
get_current_member_permissions = get_current_member_permissions
|
||||||
update_workspace_member_permissions = update_workspace_member_permissions
|
update_workspace_member_permissions = update_workspace_member_permissions
|
||||||
create_workspace_invite = create_workspace_invite
|
create_workspace_invite = create_workspace_invite
|
||||||
get_workspace_invites = get_workspace_invites
|
get_workspace_invites = get_workspace_invites
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ async def get_placements(self: 'Usecase', input: dto.GetPlacementsInput) -> dto.
|
|||||||
|
|
||||||
context.ensure_project_permission(domain.PermissionKey.PLACEMENTS_READ, project.id)
|
context.ensure_project_permission(domain.PermissionKey.PLACEMENTS_READ, project.id)
|
||||||
|
|
||||||
|
# Check analytics permissions to determine if subscription data should be hidden
|
||||||
|
hide_subscriptions = context.should_hide_subscriptions()
|
||||||
|
|
||||||
# Prefetch project channel for output building
|
# Prefetch project channel for output building
|
||||||
if project.channel is None:
|
if project.channel is None:
|
||||||
project_channel = await self.database.get_channel(channel_id=project.channel_id)
|
project_channel = await self.database.get_channel(channel_id=project.channel_id)
|
||||||
@@ -75,9 +78,11 @@ async def get_placements(self: 'Usecase', input: dto.GetPlacementsInput) -> dto.
|
|||||||
time_on_top = time_on_top_map.get(placement_post.id)
|
time_on_top = time_on_top_map.get(placement_post.id)
|
||||||
if placement_post.post:
|
if placement_post.post:
|
||||||
views_count = views_map.get(placement_post.post.id, (None,))[0]
|
views_count = views_map.get(placement_post.post.id, (None,))[0]
|
||||||
|
# Hide subscriptions if user doesn't have analytics_read permission
|
||||||
|
subscriptions_count = 0 if hide_subscriptions else subscriptions_counts.get(placement_post.placement_id, 0)
|
||||||
placement_post_output = _build_placement_post_output(
|
placement_post_output = _build_placement_post_output(
|
||||||
placement_post,
|
placement_post,
|
||||||
subscriptions_counts.get(placement_post.placement_id, 0),
|
subscriptions_count,
|
||||||
views_count,
|
views_count,
|
||||||
time_on_top,
|
time_on_top,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -9,6 +9,21 @@ if TYPE_CHECKING:
|
|||||||
from .. import Usecase
|
from .. import Usecase
|
||||||
|
|
||||||
|
|
||||||
|
async def get_current_member_permissions(
|
||||||
|
self: Usecase, workspace_id: uuid.UUID, user_id: uuid.UUID
|
||||||
|
) -> dto.WorkspaceMemberOutput:
|
||||||
|
"""Get current user's membership and permissions in the workspace.
|
||||||
|
|
||||||
|
This endpoint does NOT require ADMIN_FULL - any workspace member can access their own permissions.
|
||||||
|
"""
|
||||||
|
membership = await self.database.get_workspace_membership(workspace_id, user_id)
|
||||||
|
|
||||||
|
if not membership:
|
||||||
|
raise domain.WorkspaceNotFound(workspace_id)
|
||||||
|
|
||||||
|
return dto.WorkspaceMemberOutput.from_domain(membership)
|
||||||
|
|
||||||
|
|
||||||
async def get_workspace_members(
|
async def get_workspace_members(
|
||||||
self: Usecase, workspace_id: uuid.UUID, user_id: uuid.UUID
|
self: Usecase, workspace_id: uuid.UUID, user_id: uuid.UUID
|
||||||
) -> list[dto.WorkspaceMemberOutput]:
|
) -> list[dto.WorkspaceMemberOutput]:
|
||||||
|
|||||||
Reference in New Issue
Block a user