| |
| |
| |
| |
|
|
| import { apiClient } from '../client' |
| import type { AdminUser, UpdateUserRequest, PaginatedResponse, ApiKey } from '@/types' |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export async function list( |
| page: number = 1, |
| pageSize: number = 20, |
| filters?: { |
| status?: 'active' | 'disabled' |
| role?: 'admin' | 'user' |
| search?: string |
| group_name?: string // fuzzy filter by allowed group name |
| attributes?: Record<number, string> // attributeId -> value |
| include_subscriptions?: boolean |
| }, |
| options?: { |
| signal?: AbortSignal |
| } |
| ): Promise<PaginatedResponse<AdminUser>> { |
| |
| const params: Record<string, any> = { |
| page, |
| page_size: pageSize, |
| status: filters?.status, |
| role: filters?.role, |
| search: filters?.search, |
| group_name: filters?.group_name, |
| include_subscriptions: filters?.include_subscriptions |
| } |
|
|
| |
| if (filters?.attributes) { |
| for (const [attrId, value] of Object.entries(filters.attributes)) { |
| if (value) { |
| params[`attr[${attrId}]`] = value |
| } |
| } |
| } |
| const { data } = await apiClient.get<PaginatedResponse<AdminUser>>('/admin/users', { |
| params, |
| signal: options?.signal |
| }) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function getById(id: number): Promise<AdminUser> { |
| const { data } = await apiClient.get<AdminUser>(`/admin/users/${id}`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function create(userData: { |
| email: string |
| password: string |
| balance?: number |
| concurrency?: number |
| allowed_groups?: number[] | null |
| }): Promise<AdminUser> { |
| const { data } = await apiClient.post<AdminUser>('/admin/users', userData) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export async function update(id: number, updates: UpdateUserRequest): Promise<AdminUser> { |
| const { data } = await apiClient.put<AdminUser>(`/admin/users/${id}`, updates) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function deleteUser(id: number): Promise<{ message: string }> { |
| const { data } = await apiClient.delete<{ message: string }>(`/admin/users/${id}`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export async function updateBalance( |
| id: number, |
| balance: number, |
| operation: 'set' | 'add' | 'subtract' = 'set', |
| notes?: string |
| ): Promise<AdminUser> { |
| const { data } = await apiClient.post<AdminUser>(`/admin/users/${id}/balance`, { |
| balance, |
| operation, |
| notes: notes || '' |
| }) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export async function updateConcurrency(id: number, concurrency: number): Promise<AdminUser> { |
| return update(id, { concurrency }) |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export async function toggleStatus(id: number, status: 'active' | 'disabled'): Promise<AdminUser> { |
| return update(id, { status }) |
| } |
|
|
| |
| |
| |
| |
| |
| export async function getUserApiKeys(id: number): Promise<PaginatedResponse<ApiKey>> { |
| const { data } = await apiClient.get<PaginatedResponse<ApiKey>>(`/admin/users/${id}/api-keys`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export async function getUserUsageStats( |
| id: number, |
| period: string = 'month' |
| ): Promise<{ |
| total_requests: number |
| total_cost: number |
| total_tokens: number |
| }> { |
| const { data } = await apiClient.get<{ |
| total_requests: number |
| total_cost: number |
| total_tokens: number |
| }>(`/admin/users/${id}/usage`, { |
| params: { period } |
| }) |
| return data |
| } |
|
|
| |
| |
| |
| export interface BalanceHistoryItem { |
| id: number |
| code: string |
| type: string |
| value: number |
| status: string |
| used_by: number | null |
| used_at: string | null |
| created_at: string |
| group_id: number | null |
| validity_days: number |
| notes: string |
| user?: { id: number; email: string } | null |
| group?: { id: number; name: string } | null |
| } |
|
|
| |
| export interface BalanceHistoryResponse extends PaginatedResponse<BalanceHistoryItem> { |
| total_recharged: number |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export async function getUserBalanceHistory( |
| id: number, |
| page: number = 1, |
| pageSize: number = 20, |
| type?: string |
| ): Promise<BalanceHistoryResponse> { |
| const params: Record<string, any> = { page, page_size: pageSize } |
| if (type) params.type = type |
| const { data } = await apiClient.get<BalanceHistoryResponse>( |
| `/admin/users/${id}/balance-history`, |
| { params } |
| ) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| export async function replaceGroup( |
| userId: number, |
| oldGroupId: number, |
| newGroupId: number |
| ): Promise<{ migrated_keys: number }> { |
| const { data } = await apiClient.post<{ migrated_keys: number }>( |
| `/admin/users/${userId}/replace-group`, |
| { old_group_id: oldGroupId, new_group_id: newGroupId } |
| ) |
| return data |
| } |
|
|
| export const usersAPI = { |
| list, |
| getById, |
| create, |
| update, |
| delete: deleteUser, |
| updateBalance, |
| updateConcurrency, |
| toggleStatus, |
| getUserApiKeys, |
| getUserUsageStats, |
| getUserBalanceHistory, |
| replaceGroup |
| } |
|
|
| export default usersAPI |
|
|