"""PdfJob 的 DAO。 所有写操作均在该层 commit,service 不直接操作 session。 用户/管理两条查询路径分别按 user_deleted 过滤。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import func, select from sqlalchemy.orm import Session from ..models.pdf_job import PdfJob class PdfJobDAO: def __init__(self, db: Session) -> None: self.db = db def create(self, job: PdfJob) -> PdfJob: self.db.add(job) self.db.commit() self.db.refresh(job) return job def get(self, job_id: int) -> PdfJob | None: return self.db.get(PdfJob, job_id) def update(self, job: PdfJob) -> PdfJob: """提交对 job 的就地修改并刷新。""" self.db.commit() self.db.refresh(job) return job def list_for_user(self, owner_cookie: str, limit: int = 100, offset: int = 0) -> list[PdfJob]: """用户视角:仅未软删的任务,按创建时间倒序。""" stmt = ( select(PdfJob) .where(PdfJob.owner_cookie == owner_cookie) .where(PdfJob.user_deleted == False) # noqa: E712 .order_by(PdfJob.created_at.desc()) .limit(limit) .offset(offset) ) return list(self.db.scalars(stmt).all()) def count_for_user(self, owner_cookie: str) -> int: stmt = ( select(func.count()) .select_from(PdfJob) .where(PdfJob.owner_cookie == owner_cookie) .where(PdfJob.user_deleted == False) # noqa: E712 ) return self.db.scalar(stmt) or 0 def list_all(self, limit: int = 100, offset: int = 0) -> list[PdfJob]: """管理视角:全部任务(含已软删),按创建时间倒序。""" stmt = ( select(PdfJob) .order_by(PdfJob.created_at.desc()) .limit(limit) .offset(offset) ) return list(self.db.scalars(stmt).all()) def count_all(self) -> int: return self.db.scalar(select(func.count()).select_from(PdfJob)) or 0