ebcd2ceb63
Phase 6 completion: - Add Analytics page with charts (user growth, revenue, retention) - Add SystemMonitor page (CPU, memory, services health) - Add LogViewer page (log search, filtering, details) - Update sidebar navigation with Admin submenu - Add recharts to package.json for data visualization Phase 7 Day 1-2: - Create Asset and AssetLibrary domain entities - Define AssetRepository and AssetLibraryRepository interfaces - Implement InMemory repositories for testing - Implement PostgreSQL repository adapter - Update SQLAlchemy models for assets and asset_libraries - Add database migration script 004_asset_management.sql Architecture: Strict Clean Architecture compliance Testing: InMemory adapters ready for unit tests Database: Migration script with indexes and foreign keys
124 lines
5.8 KiB
Python
124 lines
5.8 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(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 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))
|