feat: права и инвайты
This commit is contained in:
@@ -8,6 +8,8 @@ from src.controller.http.placements import placements_router
|
||||
from src.controller.http.projects import projects_router
|
||||
from src.controller.http.purchase_plans import purchase_plan_channels_router
|
||||
from src.controller.http.views import views_router
|
||||
from src.controller.http.workspace_invites import workspace_invites_router
|
||||
from src.controller.http.workspace_members import workspace_members_router
|
||||
from src.controller.http.workspaces import workspaces_router
|
||||
|
||||
api_router = APIRouter()
|
||||
@@ -23,5 +25,7 @@ api_v1_router.include_router(placements_router)
|
||||
api_v1_router.include_router(views_router)
|
||||
api_v1_router.include_router(analytics_router)
|
||||
api_v1_router.include_router(workspaces_router)
|
||||
api_v1_router.include_router(workspace_members_router)
|
||||
api_v1_router.include_router(workspace_invites_router)
|
||||
|
||||
api_router.include_router(api_v1_router)
|
||||
|
||||
34
src/controller/http/workspace_invites.py
Normal file
34
src/controller/http/workspace_invites.py
Normal file
@@ -0,0 +1,34 @@
|
||||
import uuid
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Depends
|
||||
from fastapi.routing import APIRouter
|
||||
|
||||
from src import deps, dto
|
||||
from src.adapter.jwt import JWTPayload
|
||||
|
||||
workspace_invites_router = APIRouter(prefix='/workspaces/{workspace_id}/invites', tags=['workspace invites'])
|
||||
|
||||
|
||||
@workspace_invites_router.get('')
|
||||
async def list_workspace_invites(
|
||||
workspace_id: uuid.UUID,
|
||||
current_user: Annotated[JWTPayload, Depends(deps.get_current_user)],
|
||||
) -> dto.GetWorkspaceInvitesOutput:
|
||||
return await deps.get_usecase().get_workspace_invites(
|
||||
workspace_id=workspace_id,
|
||||
user_id=current_user.user_id,
|
||||
)
|
||||
|
||||
|
||||
@workspace_invites_router.post('')
|
||||
async def create_workspace_invite(
|
||||
workspace_id: uuid.UUID,
|
||||
request: dto.CreateWorkspaceInviteInput,
|
||||
current_user: Annotated[JWTPayload, Depends(deps.get_current_user)],
|
||||
) -> dto.WorkspaceInviteOutput:
|
||||
return await deps.get_usecase().create_workspace_invite(
|
||||
workspace_id=workspace_id,
|
||||
user_id=current_user.user_id,
|
||||
input=request,
|
||||
)
|
||||
36
src/controller/http/workspace_members.py
Normal file
36
src/controller/http/workspace_members.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import uuid
|
||||
from typing import Annotated
|
||||
|
||||
from fastapi import Depends
|
||||
from fastapi.routing import APIRouter
|
||||
|
||||
from src import deps, dto
|
||||
from src.adapter.jwt import JWTPayload
|
||||
|
||||
workspace_members_router = APIRouter(prefix='/workspaces/{workspace_id}/members', tags=['workspace members'])
|
||||
|
||||
|
||||
@workspace_members_router.get('')
|
||||
async def list_workspace_members(
|
||||
workspace_id: uuid.UUID,
|
||||
current_user: Annotated[JWTPayload, Depends(deps.get_current_user)],
|
||||
) -> dto.GetWorkspaceMembersOutput:
|
||||
return await deps.get_usecase().get_workspace_members(
|
||||
workspace_id=workspace_id,
|
||||
user_id=current_user.user_id,
|
||||
)
|
||||
|
||||
|
||||
@workspace_members_router.put('/{workspace_user_id}/permissions')
|
||||
async def put_workspace_member_permissions(
|
||||
workspace_id: uuid.UUID,
|
||||
workspace_user_id: uuid.UUID,
|
||||
request: dto.UpdateWorkspaceMemberPermissionsInput,
|
||||
current_user: Annotated[JWTPayload, Depends(deps.get_current_user)],
|
||||
) -> dto.WorkspaceMemberOutput:
|
||||
return await deps.get_usecase().update_workspace_member_permissions(
|
||||
workspace_id=workspace_id,
|
||||
workspace_user_id=workspace_user_id,
|
||||
user_id=current_user.user_id,
|
||||
input=request,
|
||||
)
|
||||
@@ -10,4 +10,5 @@ from . import ( # noqa: E402, F401
|
||||
my_chat_member,
|
||||
project_commands,
|
||||
start_with_login,
|
||||
workspace_invites,
|
||||
)
|
||||
|
||||
27
src/controller/telegram_callback/workspace_invites.py
Normal file
27
src/controller/telegram_callback/workspace_invites.py
Normal file
@@ -0,0 +1,27 @@
|
||||
import logging
|
||||
|
||||
from aiogram import F
|
||||
from aiogram.types import CallbackQuery
|
||||
|
||||
from src import deps
|
||||
from src.controller.telegram_callback import telegram_callback_router
|
||||
from src.usecase.workspace.create_workspace_invite import INVITE_ACCEPT_CALLBACK_PREFIX
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@telegram_callback_router.callback_query(F.data.startswith(f'{INVITE_ACCEPT_CALLBACK_PREFIX}:'))
|
||||
async def callback_workspace_invite_accept(callback: CallbackQuery) -> None:
|
||||
if not callback.from_user or not callback.message or not callback.data:
|
||||
log.error('Incomplete callback data for workspace invite acceptance')
|
||||
return
|
||||
|
||||
usecase = deps.get_usecase()
|
||||
await usecase.tg_accept_workspace_invite(
|
||||
telegram_id=callback.from_user.id,
|
||||
chat_id=callback.message.chat.id,
|
||||
callback_data=callback.data,
|
||||
message_id=callback.message.message_id,
|
||||
)
|
||||
|
||||
await callback.answer()
|
||||
Reference in New Issue
Block a user