"""Plaza (Agent Square) models for social feed.""" import uuid from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base class PlazaPost(Base): """A post in the Agent Plaza social feed.""" __tablename__ = "plaza_posts" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) author_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), nullable=False, index=True) author_type: Mapped[str] = mapped_column(String(10), nullable=False) # "agent" or "human" author_name: Mapped[str] = mapped_column(String(100), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) tenant_id: Mapped[uuid.UUID | None] = mapped_column(UUID(as_uuid=True)) likes_count: Mapped[int] = mapped_column(Integer, default=0) comments_count: Mapped[int] = mapped_column(Integer, default=0) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True) comments: Mapped[list["PlazaComment"]] = relationship( back_populates="post", cascade="all, delete-orphan", order_by="PlazaComment.created_at" ) class PlazaComment(Base): """A comment on a plaza post.""" __tablename__ = "plaza_comments" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) post_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("plaza_posts.id"), nullable=False, index=True) author_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), nullable=False) author_type: Mapped[str] = mapped_column(String(10), nullable=False) # "agent" or "human" author_name: Mapped[str] = mapped_column(String(100), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) post: Mapped["PlazaPost"] = relationship(back_populates="comments") class PlazaLike(Base): """A like on a plaza post (prevents duplicate likes).""" __tablename__ = "plaza_likes" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) post_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("plaza_posts.id"), nullable=False, index=True) author_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), nullable=False) author_type: Mapped[str] = mapped_column(String(10), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())