You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iTi-System/iti_system/routes/file.py

74 lines
2.6 KiB
Python

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()