feat: add admin batch file deletion

This commit is contained in:
Lan
2026-06-03 04:24:16 +08:00
parent 1eb69e4cc5
commit 0ced9b1f38
3 changed files with 71 additions and 3 deletions
+4
View File
@@ -8,6 +8,10 @@ class IDData(BaseModel):
id: int id: int
class IDsData(BaseModel):
ids: list[int]
class ShareItem(BaseModel): class ShareItem(BaseModel):
expire_value: int expire_value: int
expire_style: str = "day" expire_style: str = "day"
+40 -2
View File
@@ -30,10 +30,48 @@ class FileService:
def __init__(self): def __init__(self):
self.file_storage: FileStorageInterface = storages[settings.file_storage]() self.file_storage: FileStorageInterface = storages[settings.file_storage]()
async def _delete_file_code(self, file_code: FileCodes):
if file_code.text is None:
await self.file_storage.delete_file(file_code)
await file_code.delete()
async def delete_file(self, file_id: int): async def delete_file(self, file_id: int):
file_code = await FileCodes.get(id=file_id) file_code = await FileCodes.get(id=file_id)
await self.file_storage.delete_file(file_code) await self._delete_file_code(file_code)
await file_code.delete()
async def delete_files(self, file_ids: list[int]):
unique_ids = list(dict.fromkeys(file_ids))
deleted = []
failed = []
missing = []
for file_id in unique_ids:
file_code = await FileCodes.filter(id=file_id).first()
if not file_code:
missing.append(file_id)
continue
try:
await self._delete_file_code(file_code)
deleted.append(file_id)
except Exception as exc:
failed.append({"id": file_id, "reason": str(exc)})
return {
"requestedCount": len(file_ids),
"requested_count": len(file_ids),
"uniqueCount": len(unique_ids),
"unique_count": len(unique_ids),
"deletedCount": len(deleted),
"deleted_count": len(deleted),
"missingCount": len(missing),
"missing_count": len(missing),
"failedCount": len(failed),
"failed_count": len(failed),
"deleted": deleted,
"missing": missing,
"failed": failed,
}
async def list_files( async def list_files(
self, self,
+27 -1
View File
@@ -14,7 +14,7 @@ from apps.admin.dependencies import (
get_config_service, get_config_service,
get_local_file_service, get_local_file_service,
) )
from apps.admin.schemas import IDData, ShareItem, DeleteItem, LoginData, UpdateFileData from apps.admin.schemas import IDData, IDsData, ShareItem, DeleteItem, LoginData, UpdateFileData
from core.response import APIResponse from core.response import APIResponse
from apps.base.models import FileCodes, KeyValue from apps.base.models import FileCodes, KeyValue
from apps.admin.dependencies import create_token from apps.admin.dependencies import create_token
@@ -137,6 +137,32 @@ async def file_delete(
return APIResponse() return APIResponse()
async def batch_delete_files(
data: IDsData,
file_service: FileService,
):
if not data.ids:
raise HTTPException(status_code=400, detail="请选择要删除的文件")
result = await file_service.delete_files(data.ids)
return APIResponse(detail=result)
@admin_api.delete("/file/batch-delete")
async def file_batch_delete(
data: IDsData,
file_service: FileService = Depends(get_file_service),
):
return await batch_delete_files(data, file_service)
@admin_api.post("/file/batch-delete")
async def file_batch_delete_post(
data: IDsData,
file_service: FileService = Depends(get_file_service),
):
return await batch_delete_files(data, file_service)
@admin_api.get("/file/list") @admin_api.get("/file/list")
async def file_list( async def file_list(
page: int = 1, page: int = 1,