todo-fastapi / models.py
MuhammedSuhaib's picture
Deployment via uv
a900820 verified
Raw
History Blame Contribute Delete
2.42 kB
from sqlmodel import SQLModel, Field, Relationship
from typing import Optional, List
from datetime import datetime
from enum import Enum
from sqlalchemy import JSON, Column, TEXT
from pydantic import BaseModel
class TaskPriority(str, Enum):
low = "low"
medium = "medium"
high = "high"
class UserContext(BaseModel):
name: str
uid: str
personalization_data: Optional[str] = None
class Task(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
user_id: str = Field(index=True)
title: str
description: Optional[str] = None
completed: bool = False
priority: TaskPriority = TaskPriority.medium
category: Optional[str] = None
tags: List[str] = Field(default_factory=list, sa_type=JSON)
due_date: Optional[datetime] = Field(default=None)
is_recurring: bool = Field(default=False)
recurrence_pattern: Optional[str] = Field(default=None) # e.g., "daily", "weekly"
reminder_sent: bool = Field(default=False)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class Conversation(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
user_id: str = Field(index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationship to messages
messages: List["Message"] = Relationship(
back_populates="conversation",
sa_relationship_kwargs={"cascade": "all, delete-orphan"}
)
class PushSubscription(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
user_id: str = Field(index=True)
endpoint: str
p256dh: str
auth: str
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class Message(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
conversation_id: int = Field(foreign_key="conversation.id", index=True)
user_id: str = Field(index=True)
role: str # 'user', 'assistant', or 'system'
content: str = Field(sa_column=Column(TEXT))
created_at: datetime = Field(default_factory=datetime.utcnow)
# Relationship back to conversation
conversation: Conversation = Relationship(back_populates="messages")