from __future__ import annotations from datetime import datetime from sqlalchemy import BigInteger, DateTime, Integer, String, Text, func from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base PRIMARY_KEY_TYPE = BigInteger().with_variant(Integer, "sqlite") class AiRequestLog(Base): __tablename__ = "sys_ai_request_log" id: Mapped[int] = mapped_column(PRIMARY_KEY_TYPE, primary_key=True, autoincrement=True) session_id: Mapped[int | None] = mapped_column(BigInteger, index=True, nullable=True) message_id: Mapped[int | None] = mapped_column(BigInteger, index=True, nullable=True) user_id: Mapped[int | None] = mapped_column(BigInteger, index=True, nullable=True) model_name: Mapped[str | None] = mapped_column(String(100), nullable=True) prompt: Mapped[str | None] = mapped_column(Text, nullable=True) knowledge_ids: Mapped[str | None] = mapped_column(String(500), nullable=True) retrieve_count: Mapped[int] = mapped_column(Integer, default=0, nullable=False) retrieved_chunks: Mapped[str | None] = mapped_column(Text, nullable=True) input_token: Mapped[int | None] = mapped_column(Integer, nullable=True) output_token: Mapped[int | None] = mapped_column(Integer, nullable=True) total_token: Mapped[int | None] = mapped_column(Integer, nullable=True) cost_ms: Mapped[int | None] = mapped_column(Integer, nullable=True) status: Mapped[str] = mapped_column(String(20), nullable=False) error_message: Mapped[str | None] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), nullable=False) class OperationLog(Base): __tablename__ = "sys_operation_log" id: Mapped[int] = mapped_column(PRIMARY_KEY_TYPE, primary_key=True, autoincrement=True) admin_id: Mapped[int | None] = mapped_column(BigInteger, index=True, nullable=True) module: Mapped[str] = mapped_column(String(50), nullable=False) action: Mapped[str] = mapped_column(String(50), nullable=False) target_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True) before_json: Mapped[str | None] = mapped_column(Text, nullable=True) after_json: Mapped[str | None] = mapped_column(Text, nullable=True) ip: Mapped[str | None] = mapped_column(String(50), nullable=True) result: Mapped[str] = mapped_column(String(20), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), nullable=False) class LogRetentionPolicy(Base): __tablename__ = "sys_log_retention_policy" id: Mapped[int] = mapped_column(PRIMARY_KEY_TYPE, primary_key=True, autoincrement=True) retention_days: Mapped[int | None] = mapped_column(Integer, nullable=True) enabled: Mapped[int] = mapped_column(Integer, default=0, nullable=False) last_run_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) last_result: Mapped[str | None] = mapped_column(Text, nullable=True) updated_by: Mapped[int | None] = mapped_column(BigInteger, nullable=True) updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False) class StorageSnapshot(Base): __tablename__ = "sys_storage_snapshot" id: Mapped[int] = mapped_column(PRIMARY_KEY_TYPE, primary_key=True, autoincrement=True) scope: Mapped[str] = mapped_column(String(50), nullable=False) total_bytes: Mapped[int | None] = mapped_column(BigInteger, nullable=True) detail_json: Mapped[str] = mapped_column(Text, nullable=False) status: Mapped[str] = mapped_column(String(20), nullable=False) error_message: Mapped[str | None] = mapped_column(Text, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), nullable=False)