"""SQLModel database models.""" from enum import Enum from sqlmodel import SQLModel, Field, Relationship from datetime import datetime, timezone from typing import Optional, List class MessageRole(str, Enum): """Enum for chat message roles.""" USER = "user" ASSISTANT = "assistant" class Task(SQLModel, table=True): """Task database model with user ownership.""" __tablename__ = "tasks" id: Optional[int] = Field(default=None, primary_key=True) user_id: str = Field(index=True, nullable=False) title: str = Field(max_length=200, nullable=False) description: Optional[str] = Field(default=None) completed: bool = Field(default=False, index=True) created_at: Optional[datetime] = Field( default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None) ) updated_at: Optional[datetime] = Field( default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None) ) class Conversation(SQLModel, table=True): """Conversation model for chat sessions.""" __tablename__ = "conversations" id: Optional[int] = Field(default=None, primary_key=True) user_id: str = Field(index=True, nullable=False) created_at: Optional[datetime] = Field( default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None) ) updated_at: Optional[datetime] = Field( default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None) ) # Relationship to messages messages: List["Message"] = Relationship(back_populates="conversation") class Message(SQLModel, table=True): """Message model for individual chat messages.""" __tablename__ = "messages" id: Optional[int] = Field(default=None, primary_key=True) conversation_id: int = Field(foreign_key="conversations.id", index=True, nullable=False) user_id: str = Field(index=True, nullable=False) role: MessageRole = Field(nullable=False) content: str = Field(nullable=False) created_at: Optional[datetime] = Field( default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None), index=True ) # Relationship back to conversation conversation: Optional[Conversation] = Relationship(back_populates="messages")