import { CursorQuery, cursorPage, Id, IdParam } from "../common.ts"; import * as ops from "../ops.ts"; import { crud, del, ep, R } from "./shared.ts"; export const opsApi = { // ── 运维 ── reconcileRuns: crud( "/reconcile-runs", "校验运行", { row: ops.ReconcileRun, filters: { kind: ops.ReconcileKind.optional(), status: ops.ReconcileStatus.optional() }, }, R, ), serverMappings: crud( "/server-mappings", "库存映射", { row: ops.ServerMapping, filters: { mediaServerInstanceId: Id.optional(), mediaEntityId: Id.optional(), matchStatus: ops.ServerMatchStatus.optional(), }, }, R, ), apiKeys: { list: ep({ method: "get", path: "/api-keys", scope: "admin", summary: "API Key 列表", query: CursorQuery, response: cursorPage(ops.ApiKey), }), create: ep({ method: "post", path: "/api-keys", scope: "admin", summary: "新建 API Key(明文只返回一次)", body: ops.ApiKeyCreate, response: ops.ApiKeyCreated, }), update: ep({ method: "patch", path: "/api-keys/{id}", scope: "admin", summary: "修改/撤销 API Key", params: IdParam, body: ops.ApiKeyUpdate, response: ops.ApiKey, }), revoke: del("/api-keys/{id}", "撤销 API Key"), }, auditEvents: { list: ep({ method: "get", path: "/audit-events", scope: "admin", summary: "审计事件(按 actor/action/target 过滤,新→旧)", query: ops.AuditEventQuery, response: cursorPage(ops.AuditEvent), }), }, secrets: { list: ep({ method: "get", path: "/secrets", scope: "admin", summary: "凭证元数据列表", query: CursorQuery, response: cursorPage(ops.Secret), }), create: ep({ method: "post", path: "/secrets", scope: "admin", summary: "新建凭证(只写)", body: ops.SecretCreate, response: ops.Secret, }), update: ep({ method: "patch", path: "/secrets/{id}", scope: "admin", summary: "轮换凭证", params: IdParam, body: ops.SecretUpdate, response: ops.Secret, }), remove: del("/secrets/{id}", "删除凭证(被引用时 409)"), }, } as const;