full-stack-todo-app / models.py
uzairbinasif's picture
add chatbot
5097f27
"""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")