File size: 1,218 Bytes
e103642
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from datetime import datetime
from typing import TYPE_CHECKING, Optional, List
from uuid import UUID

from sqlalchemy import event
from sqlmodel import Field, SQLModel, Relationship

if TYPE_CHECKING:
    from .message import Message


class ConversationBase(SQLModel):
    """Base model for Conversation with common fields."""
    title: Optional[str] = Field(default=None, max_length=200)


class Conversation(ConversationBase, table=True):
    """Conversation model for chat sessions."""
    id: Optional[int] = Field(default=None, primary_key=True)
    user_id: UUID = Field(foreign_key="user.id", index=True, nullable=False)
    created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
    updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)

    # Relationship to messages
    messages: List["Message"] = Relationship(
        back_populates="conversation",
        sa_relationship_kwargs={"cascade": "all, delete-orphan"}
    )


# SQLAlchemy event listener to update the updated_at field before each update
@event.listens_for(Conversation, "before_update")
def update_conversation_updated_at(mapper, connection, target):
    target.updated_at = datetime.utcnow()