"""Минимальные модели для индексер-воркера.""" from datetime import datetime from sqlalchemy import JSON, BigInteger, ForeignKey, Integer, String, Text, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(Integer, primary_key=True) email: Mapped[str] = mapped_column(String(255)) name: Mapped[str] = mapped_column(String(255)) plan: Mapped[str] = mapped_column(String(20), default="free") class Task(Base): __tablename__ = "tasks" id: Mapped[str] = mapped_column(String(36), primary_key=True) user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) type: Mapped[str] = mapped_column(String(20)) status: Mapped[str] = mapped_column(String(20), default="queued") celery_task_id: Mapped[str | None] = mapped_column(String(255), nullable=True) input_data: Mapped[dict] = mapped_column(JSON, default=dict) result: Mapped[dict | None] = mapped_column(JSON, nullable=True) error: Mapped[str | None] = mapped_column(Text, nullable=True) queue_position: Mapped[int | None] = mapped_column(nullable=True) created_at: Mapped[datetime] = mapped_column(server_default=func.now()) updated_at: Mapped[datetime | None] = mapped_column(nullable=True) class Document(Base): __tablename__ = "documents" id: Mapped[int] = mapped_column(Integer, primary_key=True) source: Mapped[str] = mapped_column(String(50)) ext_id: Mapped[str] = mapped_column(String(255), unique=True) doi: Mapped[str | None] = mapped_column(String(255), nullable=True) title: Mapped[str] = mapped_column(Text) authors: Mapped[list] = mapped_column(JSON, default=list) year: Mapped[int | None] = mapped_column(nullable=True) lang: Mapped[str | None] = mapped_column(String(10), nullable=True) journal: Mapped[str | None] = mapped_column(Text, nullable=True) volume: Mapped[str | None] = mapped_column(String(50), nullable=True) issue: Mapped[str | None] = mapped_column(String(50), nullable=True) pages: Mapped[str | None] = mapped_column(String(50), nullable=True) abstract: Mapped[str | None] = mapped_column(Text, nullable=True) url: Mapped[str | None] = mapped_column(Text, nullable=True) minio_key: Mapped[str | None] = mapped_column(Text, nullable=True) faiss_id: Mapped[int | None] = mapped_column(nullable=True) indexed_at: Mapped[datetime] = mapped_column(server_default=func.now()) class Fingerprint(Base): __tablename__ = "fingerprints" id: Mapped[int] = mapped_column(Integer, primary_key=True) doc_id: Mapped[int] = mapped_column(ForeignKey("documents.id")) hash_value: Mapped[int] = mapped_column(BigInteger) position: Mapped[int] = mapped_column() class ParseSource(Base): __tablename__ = "parse_sources" id: Mapped[int] = mapped_column(Integer, primary_key=True) source_type: Mapped[str] = mapped_column(String(50)) name: Mapped[str] = mapped_column(String(255)) query: Mapped[str | None] = mapped_column(Text, nullable=True) lang: Mapped[str | None] = mapped_column(String(10), nullable=True) year_from: Mapped[int | None] = mapped_column(nullable=True) year_to: Mapped[int | None] = mapped_column(nullable=True) limit: Mapped[int] = mapped_column(default=1000) enabled: Mapped[bool] = mapped_column(default=True) last_status: Mapped[str] = mapped_column(String(20), default="idle") last_error: Mapped[str | None] = mapped_column(Text, nullable=True) last_run_at: Mapped[datetime | None] = mapped_column(nullable=True) docs_added: Mapped[int] = mapped_column(default=0) created_at: Mapped[datetime] = mapped_column(server_default=func.now()) class StagedWork(Base): __tablename__ = "staged_works" id: Mapped[int] = mapped_column(Integer, primary_key=True) user_id: Mapped[int | None] = mapped_column(nullable=True) task_id: Mapped[str | None] = mapped_column(String(36), nullable=True) filename: Mapped[str | None] = mapped_column(Text, nullable=True) minio_key: Mapped[str | None] = mapped_column(Text, nullable=True) text_key: Mapped[str | None] = mapped_column(Text, nullable=True) title: Mapped[str | None] = mapped_column(Text, nullable=True) authors: Mapped[list] = mapped_column(JSON, default=list) year: Mapped[int | None] = mapped_column(nullable=True) lang: Mapped[str | None] = mapped_column(String(10), nullable=True) word_count: Mapped[int | None] = mapped_column(nullable=True) status: Mapped[str] = mapped_column(String(20), default="pending") document_id: Mapped[int | None] = mapped_column(nullable=True) reviewed_by: Mapped[int | None] = mapped_column(nullable=True) reviewed_at: Mapped[datetime | None] = mapped_column(nullable=True) created_at: Mapped[datetime] = mapped_column(server_default=func.now()) __all__ = ["Base", "User", "Task", "Document", "Fingerprint", "ParseSource", "StagedWork"]