feat: add workspace

This commit is contained in:
Artem Tsyrulnikov
2025-12-13 22:09:55 +03:00
parent 2fdd56c3e0
commit af32e2a507
55 changed files with 677 additions and 227 deletions

View File

@@ -53,6 +53,11 @@ __all__ = (
'ParserPostFoundEvent',
'ParserPostDeletedEvent',
'ParserViewsUpdatedEvent',
'WorkspaceMembershipOutput',
'GetWorkspacesOutput',
'CreateWorkspaceInput',
'CreateWorkspaceOutput',
'UpdateWorkspaceInput',
)
from .analytics import (
@@ -122,3 +127,10 @@ from .views import (
PlacementViewsHistoryOutput,
UpdateViewsManuallyInput,
)
from .workspace import (
CreateWorkspaceInput,
CreateWorkspaceOutput,
GetWorkspacesOutput,
UpdateWorkspaceInput,
WorkspaceMembershipOutput,
)

View File

@@ -54,6 +54,7 @@ class ExternalChannelAnalyticsOutput(pydantic.BaseModel):
class GetPlacementsAnalyticsInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
@@ -63,6 +64,7 @@ class GetPlacementsAnalyticsOutput(pydantic.BaseModel):
class GetCreativesAnalyticsInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
@@ -72,6 +74,7 @@ class GetCreativesAnalyticsOutput(pydantic.BaseModel):
class GetExternalChannelsAnalyticsInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
@@ -90,6 +93,7 @@ class SpendingDataPoint(pydantic.BaseModel):
class GetSpendingAnalyticsInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
date_from: datetime.datetime | None = None
date_to: datetime.datetime | None = None

View File

@@ -19,6 +19,7 @@ class CreativeOutput(pydantic.BaseModel):
class GetCreativesInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
include_archived: bool = False
@@ -30,6 +31,7 @@ class GetCreativesOutput(pydantic.BaseModel):
class GetCreativeInput(pydantic.BaseModel):
creative_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
class CreateCreativeInput(pydantic.BaseModel):
@@ -47,3 +49,4 @@ class UpdateCreativeInput(pydantic.BaseModel):
class DeleteCreativeInput(pydantic.BaseModel):
creative_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID

View File

@@ -15,6 +15,7 @@ class ExternalChannelOutput(pydantic.BaseModel):
class GetExternalChannelsInput(pydantic.BaseModel):
target_channel_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
class GetExternalChannelsOutput(pydantic.BaseModel):
@@ -33,6 +34,7 @@ class CreateExternalChannelInput(pydantic.BaseModel):
class DeleteExternalChannelInput(pydantic.BaseModel):
channel_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
class UpdateExternalChannelInput(pydantic.BaseModel):

View File

@@ -1,48 +0,0 @@
import pydantic
# Исходящие сообщения (к tgex-parser)
class ParserTrackTaskRequest(pydantic.BaseModel):
"""Сообщение для parser.track - добавить задачу на отслеживание канала"""
task_id: str # UUID placement
channel: str # username внешнего канала
target_text: str # invite_link для поиска в постах
class ParserGetViewsRequest(pydantic.BaseModel):
"""Сообщение для parser.get_views - синхронно получить просмотры поста"""
channel: str
message_id: int
# Входящие события (от tgex-parser)
class ParserPostFoundEvent(pydantic.BaseModel):
"""Событие parser.event.post_found - найден новый пост с target_text"""
task_id: str # UUID placement
channel: str
message_id: int
link: str # полная ссылка https://t.me/channel/message_id
text: str # текст поста
views: int
class ParserPostDeletedEvent(pydantic.BaseModel):
"""Событие parser.event.post_deleted - отслеживаемый пост удален"""
task_id: str
channel: str
message_id: int
link: str
views: int
class ParserViewsUpdatedEvent(pydantic.BaseModel):
"""Событие parser.event.views_updated - обновилось количество просмотров"""
task_id: str
channel: str
message_id: int
views: int

View File

@@ -30,6 +30,7 @@ class PlacementOutput(pydantic.BaseModel):
class GetPlacementsInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
target_channel_id: uuid.UUID | None = None
external_channel_id: uuid.UUID | None = None
creative_id: uuid.UUID | None = None
@@ -43,6 +44,7 @@ class GetPlacementsOutput(pydantic.BaseModel):
class GetPlacementInput(pydantic.BaseModel):
placement_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
class CreatePlacementInput(pydantic.BaseModel):
@@ -65,3 +67,4 @@ class UpdatePlacementInput(pydantic.BaseModel):
class DeletePlacementInput(pydantic.BaseModel):
placement_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID

View File

@@ -37,6 +37,7 @@ class ConnectTargetChanOutput(pydantic.BaseModel):
class GetUserTargetChansInput(pydantic.BaseModel):
user_id: uuid.UUID
workspace_id: uuid.UUID
class GetUserTargetChansOutput(pydantic.BaseModel):

View File

@@ -19,6 +19,7 @@ class GetViewsHistoryInput(pydantic.BaseModel):
placement_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
from_date: datetime.datetime | None = None # Фильтр: с какой даты
to_date: datetime.datetime | None = None # Фильтр: по какую дату
@@ -34,4 +35,5 @@ class UpdateViewsManuallyInput(pydantic.BaseModel):
placement_id: uuid.UUID
user_id: uuid.UUID
workspace_id: uuid.UUID
views_count: int

23
src/dto/workspace.py Normal file
View File

@@ -0,0 +1,23 @@
import uuid
import pydantic
class WorkspaceMembershipOutput(pydantic.BaseModel):
id: uuid.UUID
name: str
class CreateWorkspaceOutput(WorkspaceMembershipOutput): ...
class GetWorkspacesOutput(pydantic.BaseModel):
workspaces: list[WorkspaceMembershipOutput]
class CreateWorkspaceInput(pydantic.BaseModel):
name: str
class UpdateWorkspaceInput(pydantic.BaseModel):
name: str | None = None