feat: delete & archive projects

This commit is contained in:
ivannoskov
2026-01-07 17:32:20 +03:00
parent 89f4d6bf69
commit 30791d7f76
9 changed files with 128 additions and 8 deletions

View File

@@ -246,7 +246,7 @@ class Postgres(DatabaseBase, Database):
async def get_project(
self, workspace_id: uuid.UUID, project_id: uuid.UUID | None = None, channel_id: uuid.UUID | None = None
) -> domain.Project | None:
query = domain.Project.filter(workspace_id=workspace_id).prefetch_related('channel')
query = domain.Project.filter(workspace_id=workspace_id, deleted_at__isnull=True).prefetch_related('channel')
if project_id:
query = query.filter(id=project_id)
if channel_id:
@@ -274,17 +274,39 @@ class Postgres(DatabaseBase, Database):
await project.save()
async def get_workspace_projects(
self, workspace_id: uuid.UUID, allowed_project_ids: set[uuid.UUID] | None = None
self,
workspace_id: uuid.UUID,
allowed_project_ids: set[uuid.UUID] | None = None,
include_archived: bool = False,
) -> list[domain.Project]:
query = domain.Project.filter(workspace_id=workspace_id).prefetch_related('channel')
query = domain.Project.filter(workspace_id=workspace_id, deleted_at__isnull=True).prefetch_related('channel')
if allowed_project_ids is not None:
if not allowed_project_ids:
return []
query = query.filter(id__in=list(allowed_project_ids))
if not include_archived:
query = query.filter(status=domain.ProjectStatus.ACTIVE)
return await query.order_by('created_at').all()
async def archive_project(self, workspace_id: uuid.UUID, project_id: uuid.UUID) -> None:
project = await domain.Project.get_or_none(id=project_id, workspace_id=workspace_id)
if not project:
raise domain.ProjectNotFound()
project.status = domain.ProjectStatus.ARCHIVED
await project.save()
async def delete_project(self, workspace_id: uuid.UUID, project_id: uuid.UUID) -> None:
project = await domain.Project.get_or_none(id=project_id, workspace_id=workspace_id)
if not project:
raise domain.ProjectNotFound()
import datetime
project.deleted_at = datetime.datetime.now()
await project.save()
async def get_active_purchase(self, project_id: uuid.UUID, creative_id: uuid.UUID) -> domain.Purchase | None:
return await domain.Purchase.get_or_none(
project_id=project_id, creative_id=creative_id, status=domain.PurchaseStatus.ACTIVE