P1 修复内容: - F7: health handler 连接池容量检查 (80%阈值返回503 degraded) - F9: SSE spawned task 并发限制 (Semaphore 16 permits) - F10: Key Pool 单次 JOIN 查询优化 (消除 N+1) - F12: CORS panic → 配置错误 - F14: 连接池使用率计算修正 (ratio = used*100/total) - F15: SQL 迁移解析器替换为状态机 (支持 $$, DO $body$, 存储过程) - Worker 重试机制: 失败任务通过 mpsc channel 重新入队 - DOMPurify XSS 防护 (PipelineResultPreview) - Admin V2: ErrorBoundary + SWR全局配置 + 请求优化
32 lines
1.8 KiB
TypeScript
32 lines
1.8 KiB
TypeScript
import request, { withSignal } from './request'
|
|
import type { Provider, ProviderKey, PaginatedResponse } from '@/types'
|
|
|
|
export const providerService = {
|
|
list: (params?: Record<string, unknown>, signal?: AbortSignal) =>
|
|
request.get<PaginatedResponse<Provider>>('/providers', withSignal({ params }, signal)).then((r) => r.data),
|
|
|
|
create: (data: Partial<Omit<Provider, 'id' | 'created_at' | 'updated_at'>>, signal?: AbortSignal) =>
|
|
request.post<Provider>('/providers', data, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
update: (id: string, data: Partial<Omit<Provider, 'id' | 'created_at' | 'updated_at'>>, signal?: AbortSignal) =>
|
|
request.patch<Provider>(`/providers/${id}`, data, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
delete: (id: string, signal?: AbortSignal) =>
|
|
request.delete(`/providers/${id}`, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
listKeys: (providerId: string, signal?: AbortSignal) =>
|
|
request.get<ProviderKey[]>(`/providers/${providerId}/keys`, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
addKey: (providerId: string, data: {
|
|
key_label: string; key_value: string; priority?: number
|
|
max_rpm?: number; max_tpm?: number; quota_reset_interval?: string
|
|
}, signal?: AbortSignal) =>
|
|
request.post<{ ok: boolean; key_id: string }>(`/providers/${providerId}/keys`, data, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
toggleKey: (providerId: string, keyId: string, active: boolean, signal?: AbortSignal) =>
|
|
request.put<{ ok: boolean }>(`/providers/${providerId}/keys/${keyId}/toggle`, { active }, withSignal({}, signal)).then((r) => r.data),
|
|
|
|
deleteKey: (providerId: string, keyId: string, signal?: AbortSignal) =>
|
|
request.delete<{ ok: boolean }>(`/providers/${providerId}/keys/${keyId}`, withSignal({}, signal)).then((r) => r.data),
|
|
}
|