File size: 4,231 Bytes
be04e86
 
 
80df84c
 
be04e86
80df84c
be04e86
80df84c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be04e86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80df84c
be04e86
 
80df84c
be04e86
 
 
 
 
 
 
80df84c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""

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