feat: delete & archive projects
This commit is contained in:
@@ -28,6 +28,8 @@ from .creative.update_creative import update_creative
|
||||
from .placement.fetch_placement_post_cycle import fetch_placement_post_cycle
|
||||
from .placement.get_placement import get_placement
|
||||
from .placement.get_placements import get_placements
|
||||
from .project.archive_project import archive_project
|
||||
from .project.delete_project import delete_project
|
||||
from .project.disconnect_project_by_tg_id import disconnect_project_by_tg_id
|
||||
from .project.get_project import get_project
|
||||
from .project.get_workspace_projects import get_workspace_projects
|
||||
@@ -158,9 +160,13 @@ class Database(typing.Protocol):
|
||||
async def update_project(self, project: domain.Project) -> None: ...
|
||||
|
||||
async def get_workspace_projects(
|
||||
self, workspace_id: UUID, allowed_project_ids: set[UUID] | None = None
|
||||
self, workspace_id: UUID, allowed_project_ids: set[UUID] | None = None, include_archived: bool = False
|
||||
) -> list[domain.Project]: ...
|
||||
|
||||
async def archive_project(self, workspace_id: UUID, project_id: UUID) -> None: ...
|
||||
|
||||
async def delete_project(self, workspace_id: UUID, project_id: UUID) -> None: ...
|
||||
|
||||
async def get_active_purchase(self, project_id: UUID, creative_id: UUID) -> domain.Purchase | None: ...
|
||||
|
||||
async def get_purchase(self, workspace_id: UUID, purchase_id: UUID) -> domain.Purchase | None: ...
|
||||
@@ -415,6 +421,8 @@ class Usecase:
|
||||
tg_add_project = tg_add_project
|
||||
get_workspace_projects = get_workspace_projects
|
||||
get_project = get_project
|
||||
archive_project = archive_project
|
||||
delete_project = delete_project
|
||||
disconnect_project_by_tg_id = disconnect_project_by_tg_id
|
||||
update_project_permissions = update_project_permissions
|
||||
update_project_invite_link_type = update_project_invite_link_type
|
||||
|
||||
32
src/usecase/project/archive_project.py
Normal file
32
src/usecase/project/archive_project.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import uuid
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from src import domain, dto
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .. import Usecase
|
||||
|
||||
|
||||
async def archive_project(self: 'Usecase', input: dto.ArchiveProjectInput) -> dto.ProjectOutput:
|
||||
await self.ensure_workspace_permission(
|
||||
input.workspace_id, input.user_id, domain.PermissionKey.PROJECTS_WRITE, for_project_id=input.project_id
|
||||
)
|
||||
|
||||
async with self.database.transaction():
|
||||
await self.database.archive_project(input.workspace_id, input.project_id)
|
||||
project = await self.database.get_project(input.workspace_id, project_id=input.project_id)
|
||||
|
||||
if not project:
|
||||
raise domain.ProjectNotFound()
|
||||
|
||||
await project.fetch_related('channel')
|
||||
|
||||
return dto.ProjectOutput(
|
||||
id=project.id,
|
||||
telegram_id=project.channel.telegram_id,
|
||||
title=project.channel.title,
|
||||
username=project.channel.username,
|
||||
status=project.status,
|
||||
purchase_invite_type_default=project.purchase_invite_type_default,
|
||||
)
|
||||
|
||||
17
src/usecase/project/delete_project.py
Normal file
17
src/usecase/project/delete_project.py
Normal file
@@ -0,0 +1,17 @@
|
||||
import uuid
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from src import domain
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .. import Usecase
|
||||
|
||||
|
||||
async def delete_project(self: 'Usecase', workspace_id: uuid.UUID, project_id: uuid.UUID, user_id: uuid.UUID) -> None:
|
||||
await self.ensure_workspace_permission(
|
||||
workspace_id, user_id, domain.PermissionKey.PROJECTS_WRITE, for_project_id=project_id
|
||||
)
|
||||
|
||||
async with self.database.transaction():
|
||||
await self.database.delete_project(workspace_id, project_id)
|
||||
|
||||
@@ -13,7 +13,9 @@ async def get_workspace_projects(self: 'Usecase', input: dto.GetWorkspaceProject
|
||||
|
||||
allowed_project_ids = context.allowed_project_ids(domain.PermissionKey.PROJECTS_READ)
|
||||
|
||||
projects = await self.database.get_workspace_projects(input.workspace_id, allowed_project_ids=allowed_project_ids)
|
||||
projects = await self.database.get_workspace_projects(
|
||||
input.workspace_id, allowed_project_ids=allowed_project_ids, include_archived=input.include_archived
|
||||
)
|
||||
|
||||
return [
|
||||
dto.ProjectOutput(
|
||||
|
||||
Reference in New Issue
Block a user