feat: parser, refactoring

This commit is contained in:
Artem Tsyrulnikov
2025-12-07 22:17:24 +03:00
parent e90c6bfb75
commit 2af23f84fe
39 changed files with 503 additions and 822 deletions

View File

@@ -34,8 +34,6 @@ __all__ = (
'PlacementViewsHistoryOutput',
'GetViewsHistoryInput',
'GetViewsHistoryOutput',
'FetchViewsInputManually',
'FetchViewsManuallyOutput',
'UpdateViewsManuallyInput',
'UserOutput',
'DateGrouping',
@@ -51,6 +49,11 @@ __all__ = (
'SpendingDataPoint',
'GetSpendingAnalyticsInput',
'GetSpendingAnalyticsOutput',
'ParserTrackTaskRequest',
'ParserGetViewsRequest',
'ParserPostFoundEvent',
'ParserPostDeletedEvent',
'ParserViewsUpdatedEvent',
)
from .analytics import (
@@ -86,6 +89,13 @@ from .external_channel import (
UpdateExternalChannelInput,
UpdateExternalChannelLinksInput,
)
from .nats_messages import (
ParserGetViewsRequest,
ParserPostDeletedEvent,
ParserPostFoundEvent,
ParserTrackTaskRequest,
ParserViewsUpdatedEvent,
)
from .placement import (
CreatePlacementInput,
DeletePlacementInput,
@@ -109,8 +119,6 @@ from .telegram_login import TelegramLoginInput
from .user import UserOutput
from .validate_login_token import ValidateLoginTokenInput, ValidateLoginTokenOutput
from .views import (
FetchViewsInputManually,
FetchViewsManuallyOutput,
GetViewsHistoryInput,
GetViewsHistoryOutput,
PlacementViewsHistoryOutput,

48
src/dto/nats_messages.py Normal file
View File

@@ -0,0 +1,48 @@
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

@@ -52,7 +52,6 @@ class CreatePlacementInput(pydantic.BaseModel):
placement_date: datetime.datetime
cost: float | None = None
comment: str | None = None
ad_post_url: str | None = None
invite_link_type: domain.InviteLinkType = domain.InviteLinkType.PUBLIC

View File

@@ -3,8 +3,6 @@ import uuid
import pydantic
from src import domain
class PlacementViewsHistoryOutput(pydantic.BaseModel):
"""История просмотров placement."""
@@ -31,21 +29,6 @@ class GetViewsHistoryOutput(pydantic.BaseModel):
histories: list[PlacementViewsHistoryOutput]
class FetchViewsInputManually(pydantic.BaseModel):
"""Запросить обновление просмотров для закупа."""
placement_id: uuid.UUID
user_id: uuid.UUID
class FetchViewsManuallyOutput(pydantic.BaseModel):
placement_id: uuid.UUID
views_count: int | None # None если не удалось получить
views_availability: domain.PostViewsAvailability
fetched_at: datetime.datetime
error_message: str | None = None # Сообщение об ошибке если не удалось
class UpdateViewsManuallyInput(pydantic.BaseModel):
"""Ручное обновление просмотров."""