Files
zTools2/app/dao/uploaded_file_dao.py
zikai 6c7d3f1272 feat: 增加 /api/files/exists 与 /api/files/register-sftp 接口
- DAO 增加 get_by_sha256
- UploadService 抽出 _to_response 复用;新增 find_by_sha256、register_sftp
- 控制器新增两条路由(注意排在 /{file_id} 之前以避免被吞)
- 引入 SftpRegisterRequest schema
- SFTP 服务启动时自动创建 uploads/incoming/
- 行为:路径穿越 400、文件不存在 404、sha256 已存在则去重返回已有行
2026-06-23 16:22:03 +00:00

44 lines
1.2 KiB
Python

"""UploadedFile 的 DAO。"""
from __future__ import annotations
from sqlalchemy import select
from sqlalchemy.orm import Session
from ..models.uploaded_file import UploadedFile
class UploadedFileDAO:
def __init__(self, db: Session) -> None:
self.db = db
def create(self, file: UploadedFile) -> UploadedFile:
self.db.add(file)
self.db.commit()
self.db.refresh(file)
return file
def get_by_id(self, file_id: int) -> UploadedFile | None:
return self.db.get(UploadedFile, file_id)
def get_by_sha256(self, sha256: str) -> UploadedFile | None:
stmt = select(UploadedFile).where(UploadedFile.sha256 == sha256).limit(1)
return self.db.scalars(stmt).first()
def list(self, limit: int = 100, offset: int = 0) -> list[UploadedFile]:
stmt = (
select(UploadedFile)
.order_by(UploadedFile.uploaded_at.desc())
.limit(limit)
.offset(offset)
)
return list(self.db.scalars(stmt).all())
def delete(self, file_id: int) -> bool:
file = self.get_by_id(file_id)
if file is None:
return False
self.db.delete(file)
self.db.commit()
return True