refactor(storage): move file management routes from user to admin namespace

- Remove file list, stats, download, and deletion routes from '/api/v1/upload'
- Move these endpoints under '/api/v1/admin/uploads'
- Remove user-specific filtering from files query and statistics to aggregate system-wide uploads by default
- Allow admins to bypass ownership check when downloading private files
- Update backend unit tests, Swagger documentation, and frontend service client and components
This commit is contained in:
ryan
2026-06-13 16:04:21 +08:00
parent dbabe8b8d7
commit 8b19ffed90
13 changed files with 908 additions and 818 deletions
@@ -1,6 +1,7 @@
import {BaseService} from '../core/base.service'
import type {ListUploadsResponse, Upload, UploadImageResponse, FileStatsResponse} from './types'
import type {InternalAxiosRequestConfig} from 'axios'
import apiClient from '../core/api-client'
export type ImageQuality = 'low' | 'medium' | 'high' | 'origin'
@@ -35,7 +36,7 @@ export function formatFileSize(bytes: number): string {
* 处理文件上传相关的 API 请求
*/
export class UploadService extends BaseService {
protected static readonly basePath = '/api/v1/upload'
protected static readonly basePath = '/api/v1/admin/uploads'
/**
* 通用文件上传
@@ -59,20 +60,21 @@ export class UploadService extends BaseService {
formData.append('access_mode', String(accessMode))
}
return this.post<Upload>('', formData, {
const response = await apiClient.post<{ data: Upload }>('/api/v1/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
} as InternalAxiosRequestConfig)
return response.data.data
}
/**
* 获取我的文件列表
* 获取文件列表
* @param page - 页码(1-based)
* @param pageSize - 每页数量
* @param keyword - 搜索关键词(文件名模糊)
* @param type - 业务分类过滤
* @param extension - 扩展名过滤
*/
static async listMyFiles(
static async listUploads(
page = 1,
pageSize = 20,
keyword?: string,
@@ -83,7 +85,7 @@ export class UploadService extends BaseService {
if (keyword) params.keyword = keyword
if (type) params.type = type
if (extension) params.extension = extension
return this.get<ListUploadsResponse>('/my', params)
return this.get<ListUploadsResponse>('', params)
}
/**
@@ -104,7 +106,7 @@ export class UploadService extends BaseService {
* 获取单文件下载 URL(触发 attachment 下载)
*/
static getDownloadUrl(id: string): string {
return `/api/v1/upload/download/${id}`
return `/api/v1/admin/uploads/download/${id}`
}
/**