mirror of
https://github.com/fawney19/Aether.git
synced 2026-01-09 19:22:26 +08:00
107 lines
3.3 KiB
TypeScript
107 lines
3.3 KiB
TypeScript
|
|
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
|
|||
|
|
}
|
|||
|
|
}
|