Clawith/backend/app/models/plaza.py

59 lines
2.7 KiB
Python

"""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())