import uuid from typing import TYPE_CHECKING from sqlalchemy import ForeignKey, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import Base, TimestampMixin, UUIDMixin if TYPE_CHECKING: from app.models.repository import Repository from app.models.tool_instance import ToolInstance from app.models.user import User from app.models.workspace import Workspace class Project(Base, UUIDMixin, TimestampMixin): __tablename__ = "project" __table_args__ = (UniqueConstraint("owner_id", "slug"),) owner_id: Mapped[uuid.UUID] = mapped_column( ForeignKey("user.id"), index=True ) name: Mapped[str] = mapped_column(String(255)) slug: Mapped[str] = mapped_column(String(255)) description: Mapped[str | None] = mapped_column(Text, nullable=True) owner: Mapped["User"] = relationship(back_populates="projects") repositories: Mapped[list["Repository"]] = relationship( back_populates="project" ) workspaces: Mapped[list["Workspace"]] = relationship( back_populates="project" ) tool_instances: Mapped[list["ToolInstance"]] = relationship( back_populates="project" )