from __future__ import annotations from apiflask import APIBlueprint from flask import request from flask_jwt_extended import jwt_required, get_jwt_identity from iti.applications.common.utils import success from iti.applications.models import SysFileSchema from iti.applications.service.sys.sys_file import SysFileService bp = APIBlueprint("sys_file", __name__, url_prefix="/file", tag="系统.文件管理") # --------------------------------------------------------------------------- # 文件信息查询 # --------------------------------------------------------------------------- @bp.get("/") @jwt_required(optional=True) @bp.output(SysFileSchema) def get_file(file_id: str): """获取文件详情""" file_obj = SysFileService.get_file_by_id(file_id) return success(file_obj) # --------------------------------------------------------------------------- # 回收站功能 # --------------------------------------------------------------------------- @bp.delete("/") @jwt_required() def delete_file(file_id: str): """ 删除文件(移动到回收站) 如果回收站功能启用,文件将被移动到回收站;否则直接物理删除 """ user_id = get_jwt_identity() SysFileService.move_to_recycle(file_id, user_id) return success(message="文件已删除") @bp.post("//restore") @jwt_required() def restore_file(file_id: str): """从回收站恢复文件""" SysFileService.restore_from_recycle(file_id) return success(message="文件已恢复") @bp.delete("//permanent") @jwt_required() def delete_file_permanent(file_id: str): """永久删除文件(物理删除)""" SysFileService.delete_file_permanently(file_id) return success(message="文件已永久删除") @bp.post("/recycle/clear") @jwt_required() def clear_recycle_bin(): """ 清空回收站 删除30天前的回收站文件 """ count = SysFileService.clear_recycle_bin(days=30) return success(message=f"已清理 {count} 个文件") # --------------------------------------------------------------------------- # 分享管理功能 # --------------------------------------------------------------------------- @bp.post("//share") @jwt_required() def create_share(file_id: str): """ 创建文件分享 请求示例: ```json { "password": "1234", // 可选 "expireHours": 24 // 可选,不传表示永久 } ``` 响应示例: ```json { "success": true, "data": { "shareCode": "abc123", "shareUrl": "http://example.com/share/abc123", "password": "1234", "expireAt": "2024-01-01 12:00:00" } } ``` """ data = request.get_json() or {} password = data.get("password") expire_hours = data.get("expireHours") or data.get("expire_hours") result = SysFileService.create_share( file_id=file_id, password=password, expire_hours=expire_hours, ) return success(result) @bp.delete("//share") @jwt_required() def cancel_share(file_id: str): """取消文件分享""" SysFileService.cancel_share(file_id) return success(message="分享已取消")