evolution-todo-api / models.py
Asma-yaseen's picture
feat: Deploy all advanced endpoints - Phase 2 complete
80df84c
Raw
History Blame Contribute Delete
4.23 kB
"""
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