from datetime import datetime, timezone from sqlalchemy import Boolean, Column, DateTime, Float, String, Text, create_engine from sqlalchemy.orm import declarative_base Base = declarative_base() class UserModel(Base): __tablename__ = "users" id = Column(String(36), primary_key=True) email = Column(String(255), nullable=False, unique=True, index=True) username = Column(String(100), nullable=True, unique=True, index=True) display_name = Column(String(255), nullable=False) password_hash = Column(String(255), nullable=False) email_verified = Column(Boolean, nullable=False, default=False) email_verification_token = Column(String(255), nullable=True) password_reset_token = Column(String(255), nullable=True) password_reset_expires_at = Column(DateTime, nullable=True) last_login_at = Column(DateTime, nullable=True) last_login_ip = Column(String(50), nullable=True) created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) 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(36), primary_key=True) workspace_id = Column(String(36), nullable=False, index=True) project_id = Column(String(36), nullable=True, index=True) name = Column(String(255), nullable=False) kind = Column(String(20), nullable=False, index=True) asset_count = Column(Float, nullable=False, default=0) total_size = Column(Float, nullable=False, default=0) 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 AssetModel(Base): __tablename__ = "assets" id = Column(String(36), primary_key=True) workspace_id = Column(String(36), nullable=False, index=True) project_id = Column(String(36), nullable=False, index=True) asset_library_id = Column(String(36), nullable=False, index=True) name = Column(String(500), nullable=False) file_type = Column(String(20), nullable=False, index=True) file_size = Column(Float, nullable=False) file_url = Column(String(1000), nullable=False) thumbnail_url = Column(String(1000), nullable=True) duration = Column(Float, nullable=True) width = Column(Float, nullable=True) height = Column(Float, nullable=True) fps = Column(Float, nullable=True) codec = Column(String(50), nullable=True) status = Column(String(20), nullable=False, default="uploading", index=True) classification_status = Column(String(20), nullable=False, default="pending", index=True) classification_result = Column(Text, nullable=True) quality_score = Column(Float, nullable=True) uploaded_by_user_id = Column(String(36), nullable=False) created_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc), index=True) updated_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 ClassificationJobModel(Base): __tablename__ = "classification_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) asset_id = Column(String(32), nullable=False, index=True) status = Column(String(20), nullable=False, default="pending") classification = Column(String(50), nullable=False, default="") confidence = Column(Float, nullable=False, default=0.0) error_message = 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 GenerationTaskModel(Base): __tablename__ = "generation_tasks" 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) strategy_id = Column(String(32), nullable=False, default="") asset_library_id = Column(String(32), nullable=False, index=True) voice_library_id = Column(String(32), nullable=False, default="") status = Column(String(20), nullable=False, default="pending", index=True) progress = Column(Float, nullable=False, default=0.0) result_count = Column(Float, nullable=False, default=0) error_message = Column(Text, nullable=False, default="") started_at = Column(DateTime, nullable=True) completed_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)) class GeneratedVideoModel(Base): __tablename__ = "generated_videos" 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) generation_task_id = Column(String(32), nullable=False, index=True) name = Column(String(255), nullable=False) file_url = Column(String(1000), nullable=False) file_size = Column(Float, nullable=False) duration = Column(Float, nullable=False) thumbnail_url = Column(String(1000), nullable=True) width = Column(Float, nullable=False) height = Column(Float, nullable=False) fps = Column(Float, nullable=False) generated_at = Column(DateTime, nullable=False, default=lambda: datetime.now(timezone.utc)) created_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))