new-api/web/default/src/features/keys/lib/api-key-form.ts
Micah-Zheng 2f8637048e
fix: 修复默认主题 API 密钥分组行为
Signed-off-by: Micah-Zheng <102610064+Micah-Zheng@users.noreply.github.com>
2026-04-30 03:09:32 +08:00

100 lines
3.0 KiB
TypeScript
Vendored

import { z } from 'zod'
import { parseQuotaFromDollars, quotaUnitsToDollars } from '@/lib/format'
import { DEFAULT_GROUP } from '../constants'
import { type ApiKeyFormData, type ApiKey } from '../types'
// ============================================================================
// Form Schema
// ============================================================================
export const apiKeyFormSchema = z.object({
name: z.string().min(1, 'Name is required'),
remain_quota_dollars: z.number().min(0).optional(),
expired_time: z.date().optional(),
unlimited_quota: z.boolean(),
model_limits: z.array(z.string()),
allow_ips: z.string().optional(),
group: z.string().optional(),
cross_group_retry: z.boolean().optional(),
tokenCount: z.number().min(1).optional(),
})
export type ApiKeyFormValues = z.infer<typeof apiKeyFormSchema>
// ============================================================================
// Form Defaults
// ============================================================================
export const API_KEY_FORM_DEFAULT_VALUES: ApiKeyFormValues = {
name: '',
remain_quota_dollars: 10,
expired_time: undefined,
unlimited_quota: true,
model_limits: [],
allow_ips: '',
group: DEFAULT_GROUP,
cross_group_retry: true,
tokenCount: 1,
}
export function getApiKeyFormDefaultValues(
defaultUseAutoGroup: boolean
): ApiKeyFormValues {
return {
...API_KEY_FORM_DEFAULT_VALUES,
group: defaultUseAutoGroup ? 'auto' : DEFAULT_GROUP,
cross_group_retry: defaultUseAutoGroup,
}
}
// ============================================================================
// Form Data Transformation
// ============================================================================
/**
* Transform form data to API payload
*/
export function transformFormDataToPayload(
data: ApiKeyFormValues
): ApiKeyFormData {
return {
name: data.name,
remain_quota: data.unlimited_quota
? 0
: parseQuotaFromDollars(data.remain_quota_dollars || 0),
expired_time: data.expired_time
? Math.floor(data.expired_time.getTime() / 1000)
: -1,
unlimited_quota: data.unlimited_quota,
model_limits_enabled: data.model_limits.length > 0,
model_limits: data.model_limits.join(','),
allow_ips: data.allow_ips || '',
group: data.group || '',
cross_group_retry: data.group === 'auto' ? !!data.cross_group_retry : false,
}
}
/**
* Transform API key data to form defaults
*/
export function transformApiKeyToFormDefaults(
apiKey: ApiKey
): ApiKeyFormValues {
return {
name: apiKey.name,
remain_quota_dollars: quotaUnitsToDollars(apiKey.remain_quota),
expired_time:
apiKey.expired_time > 0
? new Date(apiKey.expired_time * 1000)
: undefined,
unlimited_quota: apiKey.unlimited_quota,
model_limits: apiKey.model_limits
? apiKey.model_limits.split(',').filter(Boolean)
: [],
allow_ips: apiKey.allow_ips || '',
group: apiKey.group || DEFAULT_GROUP,
cross_group_retry: !!apiKey.cross_group_retry,
tokenCount: 1,
}
}