From a4fcfe91b3c3f4f8e1af266d3d16c1d57eac31ed Mon Sep 17 00:00:00 2001 From: markov Date: Wed, 25 Feb 2026 13:56:15 +0100 Subject: [PATCH] fix: unified message format (author object), CASCADE delete tasks, author_id nullable --- src/tracker/api/messages.py | 9 ++++----- src/tracker/api/tasks.py | 2 +- src/tracker/models/chat.py | 2 +- src/tracker/models/task.py | 2 +- src/tracker/ws/handler.py | 4 ++-- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/tracker/api/messages.py b/src/tracker/api/messages.py index 8887f46..ad4bbdc 100644 --- a/src/tracker/api/messages.py +++ b/src/tracker/api/messages.py @@ -34,8 +34,8 @@ class MessageOut(BaseModel): task_id: str | None = None parent_id: str | None = None author_type: str - author_id: str - author: dict | None = None # Member object for display + author_id: str | None = None + author: dict | None = None # {id, slug, name} — None for system messages content: str mentions: list[str] = [] voice_url: str | None = None @@ -174,9 +174,8 @@ async def create_message(req: MessageCreate, request: Request, db: AsyncSession "chat_id": req.chat_id, "task_id": req.task_id, "author_type": msg.author_type, - "author_id": str(msg.author_id), - "author_slug": author_slug, - "author_name": author_name, + "author_id": str(msg.author_id) if msg.author_id else None, + "author": {"id": str(msg.author.id), "slug": msg.author.slug, "name": msg.author.name} if msg.author else None, "content": msg.content, "mentions": msg.mentions or [], "attachments": [ diff --git a/src/tracker/api/tasks.py b/src/tracker/api/tasks.py index 599628a..ca39108 100644 --- a/src/tracker/api/tasks.py +++ b/src/tracker/api/tasks.py @@ -545,7 +545,7 @@ async def reject_task( comment = Message( task_id=task.id, author_type=AuthorType.SYSTEM, - author_id=current_member.id, + author_id=None, content=f"Задача отклонена: {req.reason}", mentions=[], ) diff --git a/src/tracker/models/chat.py b/src/tracker/models/chat.py index 94a9df4..df9c693 100644 --- a/src/tracker/models/chat.py +++ b/src/tracker/models/chat.py @@ -35,7 +35,7 @@ class Message(Base): # Context: one of chat_id or task_id must be set chat_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("chats.id")) - task_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("tasks.id")) + task_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("tasks.id", ondelete="CASCADE")) # Thread support parent_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True), ForeignKey("messages.id")) diff --git a/src/tracker/models/task.py b/src/tracker/models/task.py index 603e263..dab1573 100644 --- a/src/tracker/models/task.py +++ b/src/tracker/models/task.py @@ -45,7 +45,7 @@ class Task(Base): class Step(Base): __tablename__ = "steps" - task_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("tasks.id"), nullable=False) + task_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("tasks.id", ondelete="CASCADE"), nullable=False) title: Mapped[str] = mapped_column(String(500), nullable=False) done: Mapped[bool] = mapped_column(Boolean, default=False) position: Mapped[int] = mapped_column(Integer, default=0) diff --git a/src/tracker/ws/handler.py b/src/tracker/ws/handler.py index 08f0e31..59743bc 100644 --- a/src/tracker/ws/handler.py +++ b/src/tracker/ws/handler.py @@ -290,10 +290,10 @@ async def _handle_chat_send(session_id: str, data: dict): "task_id": task_id, "author_type": member.type, "author_id": str(member.id), - "author_slug": member.slug, - "author_name": member.name, + "author": {"id": str(member.id), "slug": member.slug, "name": member.name}, "content": content, "mentions": mentions, + "attachments": [], "created_at": msg.created_at.isoformat(), }