355dd0ffbb
- Domain: Task, Milestone, TaskIssue entities with business logic - Ports: TaskRepository, MilestoneRepository, TaskIssueRepository interfaces - Adapters: In-Memory and SQLAlchemy implementations - Application: Use cases for task/milestone/issue operations - API: FastAPI routes for project management - Database: Alembic migration 002 for new tables - Tests: 7 integration tests all passing
109 lines
4.9 KiB
Python
109 lines
4.9 KiB
Python
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))
|