/** * 23-回收站 API(4 端点) * 路径前缀:/trash * * 对齐后端 Router:backend/server/routers/external_systems/trash_router.py * 关键对齐点: * - 后端所有端点使用 get_admin_user(管理员鉴权,高危操作),前端全部用 apiAdmin* * - list 端点带 params,改用 buildQueryString 拼接,避免把 params 误传为 fetch options * * 后端 GET /trash 有两种查询模式(见 trash_service.list_trash): * - 摘要模式(不传 resource_type):返回 {items: [], total: 0, by_type: {11种类型计数}}, * 用于展示各资源类型的待恢复数量 * - 明细模式(传 resource_type):返回 {items: [...], total: N, by_type: {该类型: N}}, * items 中每项为 TrashItemOutput(含 days_in_trash 字段) * * 后端支持的资源类型(11 种,对齐 _RESOURCE_REPO_MAP): * system / environment / tool / token / asset / webhook_subscription / * quota / notification_channel / secret_rotation_policy / access_rule / test_case * * 统一响应结构:{success: true, data: {...}} */ import { apiAdminGet, apiAdminPost, apiAdminDelete } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.RECYCLE_BIN) /** * 查询回收站列表 * * @param {Object} params - 查询参数 * @param {string} [params.resource_type] - 资源类型。不传时返回摘要,传时返回明细 * @param {number} [params.limit=50] - 每页条数(1-200) * @param {number} [params.offset=0] - 偏移量 * @param {string} [params.start_time] - 起始时间(ISO8601),按 deleted_at 过滤 * @param {string} [params.end_time] - 结束时间(ISO8601),按 deleted_at 过滤 * @returns {Promise<{success: boolean, data: {items: Array, total: number, limit: number, offset: number, by_type: Object}}>} */ export const getTrashListApi = (params = {}) => apiAdminGet(`${URL}${buildQueryString(params)}`) /** * 清理过期回收站(物理删除超过保留期的软删除资源) * * @param {Object} data - 请求体 * @param {number} data.older_than_days - 保留期天数(≥1,默认 30) * @returns {Promise<{success: boolean, data: {purged_count: number, by_type: Object, cutoff_at: string}}>} */ export const purgeTrashApi = (data) => apiAdminPost(`${URL}/purge`, data) /** * 恢复软删除资源 * * @param {string} resourceType - 资源类型 * @param {number} resourceId - 资源 ID * @returns {Promise<{success: boolean, data: {resource_type: string, resource_id: number, restored: boolean, restored_at: string}}>} */ export const restoreTrashApi = (resourceType, resourceId) => apiAdminPost(`${URL}/${resourceType}/${resourceId}/restore`) /** * 物理删除资源(不可恢复) * * @param {string} resourceType - 资源类型 * @param {number} resourceId - 资源 ID * @returns {Promise<{success: boolean, data: {resource_type: string, resource_id: number, deleted: boolean}}>} */ export const hardDeleteTrashApi = (resourceType, resourceId) => apiAdminDelete(`${URL}/${resourceType}/${resourceId}`)