342 lines
8.5 KiB
TypeScript
342 lines
8.5 KiB
TypeScript
/**
|
|
* Admin Accounts API endpoints
|
|
* Handles AI platform account management for administrators
|
|
*/
|
|
|
|
import { apiClient } from '../client'
|
|
import type {
|
|
Account,
|
|
CreateAccountRequest,
|
|
UpdateAccountRequest,
|
|
PaginatedResponse,
|
|
AccountUsageInfo,
|
|
WindowStats,
|
|
ClaudeModel,
|
|
AccountUsageStatsResponse
|
|
} from '@/types'
|
|
|
|
/**
|
|
* List all accounts with pagination
|
|
* @param page - Page number (default: 1)
|
|
* @param pageSize - Items per page (default: 20)
|
|
* @param filters - Optional filters
|
|
* @returns Paginated list of accounts
|
|
*/
|
|
export async function list(
|
|
page: number = 1,
|
|
pageSize: number = 20,
|
|
filters?: {
|
|
platform?: string
|
|
type?: string
|
|
status?: string
|
|
search?: string
|
|
}
|
|
): Promise<PaginatedResponse<Account>> {
|
|
const { data } = await apiClient.get<PaginatedResponse<Account>>('/admin/accounts', {
|
|
params: {
|
|
page,
|
|
page_size: pageSize,
|
|
...filters
|
|
}
|
|
})
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get account by ID
|
|
* @param id - Account ID
|
|
* @returns Account details
|
|
*/
|
|
export async function getById(id: number): Promise<Account> {
|
|
const { data } = await apiClient.get<Account>(`/admin/accounts/${id}`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Create new account
|
|
* @param accountData - Account data
|
|
* @returns Created account
|
|
*/
|
|
export async function create(accountData: CreateAccountRequest): Promise<Account> {
|
|
const { data } = await apiClient.post<Account>('/admin/accounts', accountData)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Update account
|
|
* @param id - Account ID
|
|
* @param updates - Fields to update
|
|
* @returns Updated account
|
|
*/
|
|
export async function update(id: number, updates: UpdateAccountRequest): Promise<Account> {
|
|
const { data } = await apiClient.put<Account>(`/admin/accounts/${id}`, updates)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Delete account
|
|
* @param id - Account ID
|
|
* @returns Success confirmation
|
|
*/
|
|
export async function deleteAccount(id: number): Promise<{ message: string }> {
|
|
const { data } = await apiClient.delete<{ message: string }>(`/admin/accounts/${id}`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Toggle account status
|
|
* @param id - Account ID
|
|
* @param status - New status
|
|
* @returns Updated account
|
|
*/
|
|
export async function toggleStatus(id: number, status: 'active' | 'inactive'): Promise<Account> {
|
|
return update(id, { status })
|
|
}
|
|
|
|
/**
|
|
* Test account connectivity
|
|
* @param id - Account ID
|
|
* @returns Test result
|
|
*/
|
|
export async function testAccount(id: number): Promise<{
|
|
success: boolean
|
|
message: string
|
|
latency_ms?: number
|
|
}> {
|
|
const { data } = await apiClient.post<{
|
|
success: boolean
|
|
message: string
|
|
latency_ms?: number
|
|
}>(`/admin/accounts/${id}/test`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Refresh account credentials
|
|
* @param id - Account ID
|
|
* @returns Updated account
|
|
*/
|
|
export async function refreshCredentials(id: number): Promise<Account> {
|
|
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/refresh`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get account usage statistics
|
|
* @param id - Account ID
|
|
* @param days - Number of days (default: 30)
|
|
* @returns Account usage statistics with history, summary, and models
|
|
*/
|
|
export async function getStats(id: number, days: number = 30): Promise<AccountUsageStatsResponse> {
|
|
const { data } = await apiClient.get<AccountUsageStatsResponse>(`/admin/accounts/${id}/stats`, {
|
|
params: { days }
|
|
})
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Clear account error
|
|
* @param id - Account ID
|
|
* @returns Updated account
|
|
*/
|
|
export async function clearError(id: number): Promise<Account> {
|
|
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/clear-error`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get account usage information (5h/7d window)
|
|
* @param id - Account ID
|
|
* @returns Account usage info
|
|
*/
|
|
export async function getUsage(id: number): Promise<AccountUsageInfo> {
|
|
const { data } = await apiClient.get<AccountUsageInfo>(`/admin/accounts/${id}/usage`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Clear account rate limit status
|
|
* @param id - Account ID
|
|
* @returns Success confirmation
|
|
*/
|
|
export async function clearRateLimit(id: number): Promise<{ message: string }> {
|
|
const { data } = await apiClient.post<{ message: string }>(
|
|
`/admin/accounts/${id}/clear-rate-limit`
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Generate OAuth authorization URL
|
|
* @param endpoint - API endpoint path
|
|
* @param config - Proxy configuration
|
|
* @returns Auth URL and session ID
|
|
*/
|
|
export async function generateAuthUrl(
|
|
endpoint: string,
|
|
config: { proxy_id?: number }
|
|
): Promise<{ auth_url: string; session_id: string }> {
|
|
const { data } = await apiClient.post<{ auth_url: string; session_id: string }>(endpoint, config)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Exchange authorization code for tokens
|
|
* @param endpoint - API endpoint path
|
|
* @param exchangeData - Session ID, code, and optional proxy config
|
|
* @returns Token information
|
|
*/
|
|
export async function exchangeCode(
|
|
endpoint: string,
|
|
exchangeData: { session_id: string; code: string; proxy_id?: number }
|
|
): Promise<Record<string, unknown>> {
|
|
const { data } = await apiClient.post<Record<string, unknown>>(endpoint, exchangeData)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Batch create accounts
|
|
* @param accounts - Array of account data
|
|
* @returns Results of batch creation
|
|
*/
|
|
export async function batchCreate(accounts: CreateAccountRequest[]): Promise<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ success: boolean; account?: Account; error?: string }>
|
|
}> {
|
|
const { data } = await apiClient.post<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ success: boolean; account?: Account; error?: string }>
|
|
}>('/admin/accounts/batch', { accounts })
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Batch update credentials fields for multiple accounts
|
|
* @param request - Batch update request containing account IDs, field name, and value
|
|
* @returns Results of batch update
|
|
*/
|
|
export async function batchUpdateCredentials(request: {
|
|
account_ids: number[]
|
|
field: string
|
|
value: any
|
|
}): Promise<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ account_id: number; success: boolean; error?: string }>
|
|
}> {
|
|
const { data } = await apiClient.post<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ account_id: number; success: boolean; error?: string }>
|
|
}>('/admin/accounts/batch-update-credentials', request)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Bulk update multiple accounts
|
|
* @param accountIds - Array of account IDs
|
|
* @param updates - Fields to update
|
|
* @returns Success confirmation
|
|
*/
|
|
export async function bulkUpdate(
|
|
accountIds: number[],
|
|
updates: Record<string, unknown>
|
|
): Promise<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ account_id: number; success: boolean; error?: string }>
|
|
}> {
|
|
const { data } = await apiClient.post<{
|
|
success: number
|
|
failed: number
|
|
results: Array<{ account_id: number; success: boolean; error?: string }>
|
|
}>('/admin/accounts/bulk-update', {
|
|
account_ids: accountIds,
|
|
...updates
|
|
})
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get account today statistics
|
|
* @param id - Account ID
|
|
* @returns Today's stats (requests, tokens, cost)
|
|
*/
|
|
export async function getTodayStats(id: number): Promise<WindowStats> {
|
|
const { data } = await apiClient.get<WindowStats>(`/admin/accounts/${id}/today-stats`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Set account schedulable status
|
|
* @param id - Account ID
|
|
* @param schedulable - Whether the account should participate in scheduling
|
|
* @returns Updated account
|
|
*/
|
|
export async function setSchedulable(id: number, schedulable: boolean): Promise<Account> {
|
|
const { data } = await apiClient.post<Account>(`/admin/accounts/${id}/schedulable`, {
|
|
schedulable
|
|
})
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get available models for an account
|
|
* @param id - Account ID
|
|
* @returns List of available models for this account
|
|
*/
|
|
export async function getAvailableModels(id: number): Promise<ClaudeModel[]> {
|
|
const { data } = await apiClient.get<ClaudeModel[]>(`/admin/accounts/${id}/models`)
|
|
return data
|
|
}
|
|
|
|
export async function syncFromCrs(params: {
|
|
base_url: string
|
|
username: string
|
|
password: string
|
|
sync_proxies?: boolean
|
|
}): Promise<{
|
|
created: number
|
|
updated: number
|
|
skipped: number
|
|
failed: number
|
|
items: Array<{
|
|
crs_account_id: string
|
|
kind: string
|
|
name: string
|
|
action: string
|
|
error?: string
|
|
}>
|
|
}> {
|
|
const { data } = await apiClient.post('/admin/accounts/sync/crs', params)
|
|
return data
|
|
}
|
|
|
|
export const accountsAPI = {
|
|
list,
|
|
getById,
|
|
create,
|
|
update,
|
|
delete: deleteAccount,
|
|
toggleStatus,
|
|
testAccount,
|
|
refreshCredentials,
|
|
getStats,
|
|
clearError,
|
|
getUsage,
|
|
getTodayStats,
|
|
clearRateLimit,
|
|
setSchedulable,
|
|
getAvailableModels,
|
|
generateAuthUrl,
|
|
exchangeCode,
|
|
batchCreate,
|
|
batchUpdateCredentials,
|
|
bulkUpdate,
|
|
syncFromCrs
|
|
}
|
|
|
|
export default accountsAPI
|