80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
"""Composite read models assembled for board and board-group views."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from sqlmodel import Field, SQLModel
|
|
|
|
from app.schemas.agents import AgentRead
|
|
from app.schemas.approvals import ApprovalRead
|
|
from app.schemas.board_groups import BoardGroupRead
|
|
from app.schemas.board_memory import BoardMemoryRead
|
|
from app.schemas.boards import BoardRead
|
|
from app.schemas.tags import TagRef
|
|
from app.schemas.tasks import TaskRead
|
|
|
|
RUNTIME_ANNOTATION_TYPES = (
|
|
datetime,
|
|
UUID,
|
|
AgentRead,
|
|
ApprovalRead,
|
|
BoardGroupRead,
|
|
BoardMemoryRead,
|
|
BoardRead,
|
|
TagRef,
|
|
)
|
|
|
|
|
|
class TaskCardRead(TaskRead):
|
|
"""Task read model enriched with assignee and approval counters."""
|
|
|
|
assignee: str | None = None
|
|
approvals_count: int = 0
|
|
approvals_pending_count: int = 0
|
|
|
|
|
|
class BoardSnapshot(SQLModel):
|
|
"""Aggregated board payload used by board snapshot endpoints."""
|
|
|
|
board: BoardRead
|
|
tasks: list[TaskCardRead]
|
|
agents: list[AgentRead]
|
|
approvals: list[ApprovalRead]
|
|
chat_messages: list[BoardMemoryRead]
|
|
pending_approvals_count: int = 0
|
|
|
|
|
|
class BoardGroupTaskSummary(SQLModel):
|
|
"""Task summary row used inside board-group snapshot responses."""
|
|
|
|
id: UUID
|
|
board_id: UUID
|
|
board_name: str
|
|
title: str
|
|
status: str
|
|
priority: str
|
|
assigned_agent_id: UUID | None = None
|
|
assignee: str | None = None
|
|
due_at: datetime | None = None
|
|
in_progress_at: datetime | None = None
|
|
tags: list[TagRef] = Field(default_factory=list)
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class BoardGroupBoardSnapshot(SQLModel):
|
|
"""Board-level rollup embedded within a board-group snapshot."""
|
|
|
|
board: BoardRead
|
|
task_counts: dict[str, int] = Field(default_factory=dict)
|
|
tasks: list[BoardGroupTaskSummary] = Field(default_factory=list)
|
|
|
|
|
|
class BoardGroupSnapshot(SQLModel):
|
|
"""Top-level board-group snapshot response payload."""
|
|
|
|
group: BoardGroupRead | None = None
|
|
boards: list[BoardGroupBoardSnapshot] = Field(default_factory=list)
|