from __future__ import annotations from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from iti.auth import require_permission from iti.db import get_db from iti.responses import ok from iti_system.models import SysFile from iti_system.schemas import FileShareIn from iti_system.services import dump_file, get_or_404, make_share_code, share_expire router = APIRouter(prefix="/sys/file", tags=["system.file"]) @router.post("/recycle/clear", dependencies=[Depends(require_permission("system:file:delete"))]) def clear_recycle(db: Session = Depends(get_db)): for item in db.query(SysFile).filter(SysFile.is_deleted.is_(True)).all(): db.delete(item) db.commit() return ok() @router.get("/{file_id}", dependencies=[Depends(require_permission("system:file:list"))]) def get_file(file_id: str, db: Session = Depends(get_db)): return ok(dump_file(get_or_404(db, SysFile, file_id, "文件不存在"))) @router.delete("/{file_id}", dependencies=[Depends(require_permission("system:file:delete"))]) def recycle_file(file_id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysFile, file_id, "文件不存在") item.is_deleted = True db.commit() return ok() @router.post("/{file_id}/restore", dependencies=[Depends(require_permission("system:file:edit"))]) def restore_file(file_id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysFile, file_id, "文件不存在") item.is_deleted = False db.commit() return ok(dump_file(item)) @router.delete("/{file_id}/permanent", dependencies=[Depends(require_permission("system:file:delete"))]) def delete_file(file_id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysFile, file_id, "文件不存在") db.delete(item) db.commit() return ok() @router.post("/{file_id}/share", dependencies=[Depends(require_permission("system:file:edit"))]) def create_share(file_id: str, payload: FileShareIn, db: Session = Depends(get_db)): item = get_or_404(db, SysFile, file_id, "文件不存在") item.share_code = make_share_code() item.share_password = payload.password item.share_expire_at = share_expire(payload.expires_seconds) db.commit() db.refresh(item) return ok(dump_file(item)) @router.delete("/{file_id}/share", dependencies=[Depends(require_permission("system:file:edit"))]) def delete_share(file_id: str, db: Session = Depends(get_db)): item = get_or_404(db, SysFile, file_id, "文件不存在") item.share_code = None item.share_password = None item.share_expire_at = None db.commit() return ok()