from sqlalchemy import Boolean, Column, DateTime, Float, String, Text, create_engine from sqlalchemy.orm import declarative_base from datetime import datetime, timezone Base = declarative_base() class ProjectModel(Base): __tablename__ = "projects" id = Column(String(32), primary_key=True) workspace_id = Column(String(32), nullable=False, index=True) name = Column(String(100), nullable=False) description = Column(Text, nullable=False, default="") created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class AssetLibraryModel(Base): __tablename__ = "asset_libraries" id = Column(String(32), primary_key=True) workspace_id = Column(String(32), nullable=False, index=True) project_id = Column(String(32), nullable=False, index=True) name = Column(String(100), nullable=False) kind = Column(String(20), nullable=False) created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class AssetModel(Base): __tablename__ = "assets" id = Column(String(32), primary_key=True) workspace_id = Column(String(32), nullable=False, index=True) project_id = Column(String(32), nullable=False, index=True) library_id = Column(String(32), nullable=False, index=True) name = Column(String(100), nullable=False) storage_key = Column(String(255), nullable=False) mime_type = Column(String(100), nullable=False) metadata_json = Column(Text, nullable=False, default="{}") created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class IngestJobModel(Base): __tablename__ = "ingest_jobs" id = Column(String(32), primary_key=True) workspace_id = Column(String(32), nullable=False, index=True) project_id = Column(String(32), nullable=False, index=True) library_id = Column(String(32), nullable=False, index=True) storage_key = Column(String(255), nullable=False) status = Column(String(20), nullable=False, default="pending") error_message = Column(Text, nullable=False, default="") result_asset_id = Column(String(32), nullable=False, default="") created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class TaskModel(Base): __tablename__ = "tasks" id = Column(String(32), primary_key=True) project_id = Column(String(32), nullable=False, index=True) workspace_id = Column(String(32), nullable=False, index=True) name = Column(String(200), nullable=False) description = Column(Text, nullable=False, default="") status = Column(String(20), nullable=False, default="pending", index=True) priority = Column(String(20), nullable=False, default="medium") parent_task_id = Column(String(32), nullable=False, default="", index=True) assignee_user_id = Column(String(32), nullable=False, default="") progress = Column(Float, nullable=False, default=0.0) planned_start_date = Column(DateTime, nullable=True) planned_end_date = Column(DateTime, nullable=True) actual_start_date = Column(DateTime, nullable=True) actual_end_date = Column(DateTime, nullable=True) tags_json = Column(Text, nullable=False, default="[]") created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class MilestoneModel(Base): __tablename__ = "milestones" id = Column(String(32), primary_key=True) project_id = Column(String(32), nullable=False, index=True) workspace_id = Column(String(32), nullable=False, index=True) name = Column(String(200), nullable=False) description = Column(Text, nullable=False, default="") target_date = Column(DateTime, nullable=True) completed = Column(Boolean, nullable=False, default=False) completed_at = Column(DateTime, nullable=True) created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) class TaskIssueModel(Base): __tablename__ = "task_issues" id = Column(String(32), primary_key=True) task_id = Column(String(32), nullable=False, index=True) project_id = Column(String(32), nullable=False, index=True) workspace_id = Column(String(32), nullable=False, index=True) title = Column(String(200), nullable=False) description = Column(Text, nullable=False, default="") resolved = Column(Boolean, nullable=False, default=False) resolved_at = Column(DateTime, nullable=True) created_by_user_id = Column(String(32), nullable=False, default="") created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) updated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc))