from datetime import datetime from decimal import Decimal from typing import Any from sqlalchemy import JSON, BigInteger, DateTime, Integer, Numeric, SmallInteger, String, Text from sqlalchemy.dialects.mysql import BIGINT, DATETIME from sqlalchemy.orm import Mapped, mapped_column from app.model.base import Base class ConversationMessage(Base): __tablename__ = "conversation_message" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) session_id: Mapped[str] = mapped_column(String(64), nullable=False) message_no: Mapped[int | None] = mapped_column(Integer) customer_id: Mapped[int | None] = mapped_column(BigInteger) portal: Mapped[str] = mapped_column(String(32), nullable=False) role: Mapped[str] = mapped_column(String(16), nullable=False) content: Mapped[str] = mapped_column(Text, nullable=False) tool_calls: Mapped[dict[str, Any] | None] = mapped_column(JSON) trace_id: Mapped[str | None] = mapped_column(String(64)) intent: Mapped[str | None] = mapped_column(String(32)) confidence: Mapped[Decimal | None] = mapped_column(Numeric(5, 4)) source_references: Mapped[list[dict[str, Any]] | None] = mapped_column(JSON) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) class ConversationFeedback(Base): __tablename__ = "conversation_feedback" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) feedback_no: Mapped[str] = mapped_column(String(32), unique=True, nullable=False) session_id: Mapped[str] = mapped_column(String(64), nullable=False) message_id: Mapped[int] = mapped_column(BigInteger, nullable=False) customer_id: Mapped[int | None] = mapped_column(BigInteger) rating: Mapped[int] = mapped_column(SmallInteger, nullable=False) feedback_type: Mapped[str | None] = mapped_column(String(32)) feedback_content: Mapped[str | None] = mapped_column(String(1000)) status: Mapped[str] = mapped_column(String(16), nullable=False, default="open") handler_id: Mapped[int | None] = mapped_column(BIGINT(unsigned=True)) handled_at: Mapped[datetime | None] = mapped_column(DATETIME(fsp=6)) handling_note: Mapped[str | None] = mapped_column(String(1000)) created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) updated_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)