From 3c4ac99ae4db446e30d9d17e755a11fbd00e9061 Mon Sep 17 00:00:00 2001 From: zyycn Date: Sun, 2 Aug 2026 00:08:52 +0800 Subject: [PATCH] feat(api): type request params across admin API modules Replace data: object with precise parameter types derived from call sites, using type inference (Omit/union) over bulk interface declarations where possible. Covers accounts, api-keys, usage, system, auth, dashboard, settings. Co-Authored-By: Claude Fable 5 --- frontend/src/api/modules/accounts.ts | 64 +++++++++++++++++++++------ frontend/src/api/modules/api-keys.ts | 33 +++++++++++--- frontend/src/api/modules/auth.ts | 7 ++- frontend/src/api/modules/dashboard.ts | 8 +++- frontend/src/api/modules/settings.ts | 4 +- frontend/src/api/modules/system.ts | 12 ++++- frontend/src/api/modules/usage.ts | 33 +++++++++++--- 7 files changed, 130 insertions(+), 31 deletions(-) diff --git a/frontend/src/api/modules/accounts.ts b/frontend/src/api/modules/accounts.ts index c5557f072..93032278d 100644 --- a/frontend/src/api/modules/accounts.ts +++ b/frontend/src/api/modules/accounts.ts @@ -171,7 +171,45 @@ export interface AccountOAuthStartResponse { expiresAt: string } -export function getAccounts(data: object) { +// 请求参数类型:仅定义 API 边界的形状,调用方不依赖显式声明。 +interface AccountListParams { + page: number + pageSize: number + search?: string + provider?: string + status?: string + sortBy?: string + sortDirection?: string +} + +interface AccountIdParam { + accountId: string +} + +interface AccountProviderIdParam { + provider: string + accountId: string +} + +interface AccountDeleteParams { + provider: string + accountIds: string[] +} + +interface AccountImportParam { + provider: string + data: unknown +} + +interface AccountOAuthStartParam { + provider: string + name: string + accountId?: string +} + +interface AccountOAuthCompleteParam { flowId: string, callbackUrl: string } + +export function getAccounts(data: AccountListParams) { return request({ url: '/api/admin/accounts', method: 'GET', @@ -179,7 +217,7 @@ export function getAccounts(data: object) { }) } -export function exportAccounts(data: object) { +export function exportAccounts(data: AccountListParams) { return request({ url: '/api/admin/accounts/export', method: 'GET', @@ -187,7 +225,7 @@ export function exportAccounts(data: object) { }) } -export function refreshAccount(data: object) { +export function refreshAccount(data: AccountIdParam) { return request({ url: '/api/admin/accounts/refresh', method: 'POST', @@ -195,7 +233,7 @@ export function refreshAccount(data: object) { }) } -export function getAccountQuota(data: object) { +export function getAccountQuota(data: AccountIdParam) { return request({ url: '/api/admin/accounts/quota', method: 'GET', @@ -203,7 +241,7 @@ export function getAccountQuota(data: object) { }) } -export function refreshAccountQuota(data: object) { +export function refreshAccountQuota(data: AccountIdParam) { return request({ url: '/api/admin/accounts/quota/refresh', method: 'POST', @@ -211,7 +249,7 @@ export function refreshAccountQuota(data: object) { }) } -export function getAccountModels(data: object) { +export function getAccountModels(data: AccountIdParam) { return request({ url: '/api/admin/accounts/models', method: 'GET', @@ -219,7 +257,7 @@ export function getAccountModels(data: object) { }) } -export function refreshAccountModels(data: object) { +export function refreshAccountModels(data: AccountIdParam) { return request({ url: '/api/admin/accounts/models/refresh', method: 'POST', @@ -227,7 +265,7 @@ export function refreshAccountModels(data: object) { }) } -export function importAccounts(data: object) { +export function importAccounts(data: AccountImportParam) { return request({ url: '/api/admin/accounts/import', method: 'POST', @@ -235,7 +273,7 @@ export function importAccounts(data: object) { }) } -export function enableAccount(data: object) { +export function enableAccount(data: AccountProviderIdParam) { return request({ url: '/api/admin/accounts/enable', method: 'POST', @@ -243,7 +281,7 @@ export function enableAccount(data: object) { }) } -export function disableAccount(data: object) { +export function disableAccount(data: AccountProviderIdParam) { return request({ url: '/api/admin/accounts/disable', method: 'POST', @@ -251,7 +289,7 @@ export function disableAccount(data: object) { }) } -export function deleteAccounts(data: object) { +export function deleteAccounts(data: AccountDeleteParams) { return request({ url: '/api/admin/accounts/delete', method: 'POST', @@ -259,7 +297,7 @@ export function deleteAccounts(data: object) { }) } -export function startAccountOAuth(data: object) { +export function startAccountOAuth(data: AccountOAuthStartParam) { return request({ url: '/api/admin/accounts/oauth/start', method: 'POST', @@ -267,7 +305,7 @@ export function startAccountOAuth(data: object) { }) } -export function completeAccountOAuth(data: object) { +export function completeAccountOAuth(data: AccountOAuthCompleteParam) { return request({ url: '/api/admin/accounts/oauth/complete', method: 'POST', diff --git a/frontend/src/api/modules/api-keys.ts b/frontend/src/api/modules/api-keys.ts index e32b3380c..b898053a0 100644 --- a/frontend/src/api/modules/api-keys.ts +++ b/frontend/src/api/modules/api-keys.ts @@ -35,7 +35,28 @@ export interface ApiKeyMutationResponse { id: string } -export function getApiKeys(data: object) { +// 请求参数类型:仅定义 API 边界的形状,调用方不依赖显式声明。 +interface ApiKeyListParams { + cursor?: string + limit: number + search?: string + sortBy?: string + sortDirection?: string +} + +interface ApiKeyCreateParam { + name: string + label?: string + providerKind: string + maxConcurrency: number + requestsPerMinute: number +} + +interface ApiKeyIdParam { + id: string +} + +export function getApiKeys(data: ApiKeyListParams) { return request({ url: '/api/admin/client-keys', method: 'GET', @@ -43,7 +64,7 @@ export function getApiKeys(data: object) { }) } -export function createApiKey(data: object) { +export function createApiKey(data: ApiKeyCreateParam) { return request({ url: '/api/admin/client-keys/create', method: 'POST', @@ -51,7 +72,7 @@ export function createApiKey(data: object) { }) } -export function revealApiKey(data: object) { +export function revealApiKey(data: ApiKeyIdParam) { return request({ url: '/api/admin/client-keys/reveal', method: 'GET', @@ -59,7 +80,7 @@ export function revealApiKey(data: object) { }) } -export function deleteApiKey(data: object) { +export function deleteApiKey(data: ApiKeyIdParam) { return request({ url: '/api/admin/client-keys/delete', method: 'POST', @@ -67,7 +88,7 @@ export function deleteApiKey(data: object) { }) } -export function disableApiKey(data: object) { +export function disableApiKey(data: ApiKeyIdParam) { return request({ url: '/api/admin/client-keys/disable', method: 'POST', @@ -75,7 +96,7 @@ export function disableApiKey(data: object) { }) } -export function enableApiKey(data: object) { +export function enableApiKey(data: ApiKeyIdParam) { return request({ url: '/api/admin/client-keys/enable', method: 'POST', diff --git a/frontend/src/api/modules/auth.ts b/frontend/src/api/modules/auth.ts index b1d8a6d06..37be3a25a 100644 --- a/frontend/src/api/modules/auth.ts +++ b/frontend/src/api/modules/auth.ts @@ -12,7 +12,12 @@ export interface LogoutResponse { message: string } -export function login(data: object) { +interface LoginParam { + username: string + password: string +} + +export function login(data: LoginParam) { return request({ url: '/api/admin/auth/login', method: 'POST', diff --git a/frontend/src/api/modules/dashboard.ts b/frontend/src/api/modules/dashboard.ts index b4a58d337..46d5088ea 100644 --- a/frontend/src/api/modules/dashboard.ts +++ b/frontend/src/api/modules/dashboard.ts @@ -170,7 +170,11 @@ export interface DashboardSummaryResponse { rotationStrategy: string } -export function getDashboardSummary(data: object) { +interface DashboardQuery { + kind: string +} + +export function getDashboardSummary(data: DashboardQuery) { return request({ url: '/api/admin/dashboard/summary', method: 'GET', @@ -178,7 +182,7 @@ export function getDashboardSummary(data: object) { }) } -export function getDashboardTrend(data: object) { +export function getDashboardTrend(data: DashboardQuery) { return request({ url: '/api/admin/dashboard/trend', method: 'GET', diff --git a/frontend/src/api/modules/settings.ts b/frontend/src/api/modules/settings.ts index 77fb9e08e..b57ee1197 100644 --- a/frontend/src/api/modules/settings.ts +++ b/frontend/src/api/modules/settings.ts @@ -34,7 +34,9 @@ export function getSettings() { }) } -export function updateSettings(data: object) { +type UpdateSettingsParam = Omit + +export function updateSettings(data: UpdateSettingsParam) { return request({ url: '/api/admin/settings/update', method: 'POST', diff --git a/frontend/src/api/modules/system.ts b/frontend/src/api/modules/system.ts index 21e0ebb51..bd1b3d9bd 100644 --- a/frontend/src/api/modules/system.ts +++ b/frontend/src/api/modules/system.ts @@ -50,7 +50,15 @@ export function getSystemVersion(timeout = 0) { }) } -export function getSystemUpdateDetail(data: object) { +interface SystemUpdateDetailQuery { + refresh?: boolean +} + +interface SystemUpdateTarget { + targetVersion?: string +} + +export function getSystemUpdateDetail(data: SystemUpdateDetailQuery) { return request({ url: '/api/admin/system/update/detail', method: 'GET', @@ -58,7 +66,7 @@ export function getSystemUpdateDetail(data: object) { }) } -export function performSystemUpdate(data: object) { +export function performSystemUpdate(data: SystemUpdateTarget) { return request({ url: '/api/admin/system/update', method: 'POST', diff --git a/frontend/src/api/modules/usage.ts b/frontend/src/api/modules/usage.ts index 221f0144b..459fdafb8 100644 --- a/frontend/src/api/modules/usage.ts +++ b/frontend/src/api/modules/usage.ts @@ -331,7 +331,28 @@ export interface UsageDiagnosticsResponse { items: UsageDiagnosticItem[] } -export function getUsageRecords(data: object) { +// 请求参数类型:仅定义 API 边界的形状,调用方不依赖显式声明。 +interface UsageRangeQuery { + startTime: string + endTime: string + provider?: string + model?: string + statusCode?: number + search?: string +} + +type UsagePagedQuery = UsageRangeQuery & { + page: number + pageSize: number +} + +interface UsageDetailQuery { + id: string +} + +type UsageDiagnosticsQuery = UsageRangeQuery & { dimension: string } + +export function getUsageRecords(data: UsagePagedQuery) { return request({ url: '/api/admin/usage/records', method: 'GET', @@ -339,7 +360,7 @@ export function getUsageRecords(data: object) { }) } -export function getOpsErrors(data: object) { +export function getOpsErrors(data: UsagePagedQuery) { return request({ url: '/api/admin/operations/errors', method: 'GET', @@ -347,7 +368,7 @@ export function getOpsErrors(data: object) { }) } -export function getUsageRecordDetail(data: object) { +export function getUsageRecordDetail(data: UsageDetailQuery) { return request({ url: '/api/admin/usage/records/detail', method: 'GET', @@ -355,7 +376,7 @@ export function getUsageRecordDetail(data: object) { }) } -export function getUsageRecordSummary(data: object) { +export function getUsageRecordSummary(data: UsageRangeQuery) { return request({ url: '/api/admin/usage/records/summary', method: 'GET', @@ -363,7 +384,7 @@ export function getUsageRecordSummary(data: object) { }) } -export function getUsageRecordInsightsOverview(data: object) { +export function getUsageRecordInsightsOverview(data: UsageRangeQuery) { return request({ url: '/api/admin/usage/insights/overview', method: 'GET', @@ -371,7 +392,7 @@ export function getUsageRecordInsightsOverview(data: object) { }) } -export function getUsageRecordInsightsDiagnostics(data: object) { +export function getUsageRecordInsightsDiagnostics(data: UsageDiagnosticsQuery) { return request({ url: '/api/admin/usage/insights/diagnostics', method: 'GET',