Files
Aether/frontend/src/api/users.ts
2025-12-10 20:52:44 +08:00

107 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import apiClient from './client'
export interface User {
id: string // UUID
username: string
email: string
role: 'admin' | 'user'
is_active: boolean
quota_usd: number | null
used_usd: number
total_usd: number
allowed_providers: string[] | null // 允许使用的提供商 ID 列表
allowed_endpoints: string[] | null // 允许使用的端点 ID 列表
allowed_models: string[] | null // 允许使用的模型名称列表
created_at: string
updated_at?: string
}
export interface CreateUserRequest {
username: string
password: string
email: string
role?: 'admin' | 'user'
quota_usd?: number | null
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_models?: string[] | null
}
export interface UpdateUserRequest {
email?: string
is_active?: boolean
role?: 'admin' | 'user'
quota_usd?: number | null
password?: string
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_models?: string[] | null
}
export interface ApiKey {
id: string // UUID
key?: string // 完整的 key只在创建时返回
key_display?: string // 脱敏后的密钥显示
name?: string
created_at: string
last_used_at?: string
expires_at?: string // 过期时间
is_active: boolean
is_standalone: boolean // 是否为独立余额Key
balance_used_usd?: number // 已使用余额仅独立Key
current_balance_usd?: number | null // 当前余额独立Key预付费模式null表示无限制
rate_limit?: number // 速率限制(请求/分钟)
total_requests?: number // 总请求数
total_cost_usd?: number // 总费用
}
export const usersApi = {
async getAllUsers(): Promise<User[]> {
const response = await apiClient.get<User[]>('/api/admin/users')
return response.data
},
async getUser(userId: string): Promise<User> {
const response = await apiClient.get<User>(`/api/admin/users/${userId}`)
return response.data
},
async createUser(user: CreateUserRequest): Promise<User> {
const response = await apiClient.post<User>('/api/admin/users', user)
return response.data
},
async updateUser(userId: string, updates: UpdateUserRequest): Promise<User> {
const response = await apiClient.put<User>(`/api/admin/users/${userId}`, updates)
return response.data
},
async deleteUser(userId: string): Promise<void> {
await apiClient.delete(`/api/admin/users/${userId}`)
},
async getUserApiKeys(userId: string): Promise<ApiKey[]> {
const response = await apiClient.get<{ api_keys: ApiKey[] }>(`/api/admin/users/${userId}/api-keys`)
return response.data.api_keys
},
async createApiKey(userId: string, name?: string): Promise<ApiKey & { key: string }> {
const response = await apiClient.post<ApiKey & { key: string }>(`/api/admin/users/${userId}/api-keys`, { name })
return response.data
},
async deleteApiKey(userId: string, keyId: string): Promise<void> {
await apiClient.delete(`/api/admin/users/${userId}/api-keys/${keyId}`)
},
async resetUserQuota(userId: string): Promise<void> {
await apiClient.patch(`/api/admin/users/${userId}/quota`)
},
// 管理员统计
async getUsageStats(): Promise<any> {
const response = await apiClient.get('/api/admin/usage/stats')
return response.data
}
}