""" Database models for Evolution Todo API. Task: 1.2, T009-T015 Spec: specs/database/schema.md, specs/1-phase2-advanced-features/data-model.md """ from sqlmodel import SQLModel, Field, Column, JSON from datetime import datetime from typing import Optional, List from enum import Enum class Priority(str, Enum): """Task priority levels.""" HIGH = "high" MEDIUM = "medium" LOW = "low" NONE = "none" class Theme(str, Enum): """User interface theme options.""" LIGHT = "light" DARK = "dark" class User(SQLModel, table=True): """User model (managed by Better Auth).""" __tablename__ = "users" id: str = Field(primary_key=True) email: str = Field(unique=True, index=True, max_length=255) name: str = Field(max_length=255) password_hash: str = Field(max_length=255) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) class Task(SQLModel, table=True): """Task model for todo items with Phase 2 advanced features.""" __tablename__ = "tasks" # Existing fields id: Optional[int] = Field(default=None, primary_key=True) user_id: str = Field(foreign_key="users.id", index=True) title: str = Field(min_length=1, max_length=200) description: Optional[str] = Field(default=None) completed: bool = Field(default=False) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) # Phase 2 Advanced Features (T009) due_date: Optional[datetime] = None priority: str = Field(default="none") tags: List[str] = Field(default=[], sa_column=Column(JSON)) recurrence_pattern: Optional[str] = None reminder_offset: Optional[int] = None is_recurring: bool = Field(default=False) parent_recurring_id: Optional[int] = Field(default=None, foreign_key="tasks.id") class TaskHistory(SQLModel, table=True): """Task modification history for audit log (T010).""" __tablename__ = "task_history" id: Optional[int] = Field(default=None, primary_key=True) task_id: int = Field(foreign_key="tasks.id") user_id: str = Field(foreign_key="users.id") action: str old_value: Optional[dict] = Field(default=None, sa_column=Column(JSON)) new_value: Optional[dict] = Field(default=None, sa_column=Column(JSON)) timestamp: datetime = Field(default_factory=datetime.utcnow) class UserPreferences(SQLModel, table=True): """User settings and preferences (T011).""" __tablename__ = "user_preferences" user_id: str = Field(primary_key=True, foreign_key="users.id") theme: str = Field(default="light") notifications_enabled: bool = Field(default=True) notification_sound: bool = Field(default=True) default_priority: str = Field(default="none") default_view: str = Field(default="all") language: str = Field(default="en") timezone: str = Field(default="UTC") created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) class Tag(SQLModel, table=True): """Tag model for task categorization (T012).""" __tablename__ = "tags" id: Optional[int] = Field(default=None, primary_key=True) user_id: str = Field(foreign_key="users.id") name: str = Field(max_length=50) color: str = Field(default="#6B7280", max_length=7) usage_count: int = Field(default=1) created_at: datetime = Field(default_factory=datetime.utcnow) last_used_at: datetime = Field(default_factory=datetime.utcnow) class Notification(SQLModel, table=True): """Scheduled notification reminders (T013).""" __tablename__ = "notifications" id: Optional[int] = Field(default=None, primary_key=True) task_id: int = Field(foreign_key="tasks.id") user_id: str = Field(foreign_key="users.id") scheduled_time: datetime sent: bool = Field(default=False) notification_type: str = Field(default="reminder") created_at: datetime = Field(default_factory=datetime.utcnow) sent_at: Optional[datetime] = None