/** * Admin Groups API endpoints * Handles API key group management for administrators */ import { apiClient } from '../client' import type { AdminGroup, GroupPlatform, CreateGroupRequest, UpdateGroupRequest, PaginatedResponse } from '@/types' /** * List all groups with pagination * @param page - Page number (default: 1) * @param pageSize - Items per page (default: 20) * @param filters - Optional filters (platform, status, is_exclusive, search) * @returns Paginated list of groups */ export async function list( page: number = 1, pageSize: number = 20, filters?: { platform?: GroupPlatform status?: 'active' | 'inactive' is_exclusive?: boolean search?: string }, options?: { signal?: AbortSignal } ): Promise> { const { data } = await apiClient.get>('/admin/groups', { params: { page, page_size: pageSize, ...filters }, signal: options?.signal }) return data } /** * Get all active groups (without pagination) * @param platform - Optional platform filter * @returns List of all active groups */ export async function getAll(platform?: GroupPlatform): Promise { const { data } = await apiClient.get('/admin/groups/all', { params: platform ? { platform } : undefined }) return data } /** * Get active groups by platform * @param platform - Platform to filter by * @returns List of groups for the specified platform */ export async function getByPlatform(platform: GroupPlatform): Promise { return getAll(platform) } /** * Get group by ID * @param id - Group ID * @returns Group details */ export async function getById(id: number): Promise { const { data } = await apiClient.get(`/admin/groups/${id}`) return data } /** * Create new group * @param groupData - Group data * @returns Created group */ export async function create(groupData: CreateGroupRequest): Promise { const { data } = await apiClient.post('/admin/groups', groupData) return data } /** * Update group * @param id - Group ID * @param updates - Fields to update * @returns Updated group */ export async function update(id: number, updates: UpdateGroupRequest): Promise { const { data } = await apiClient.put(`/admin/groups/${id}`, updates) return data } /** * Delete group * @param id - Group ID * @returns Success confirmation */ export async function deleteGroup(id: number): Promise<{ message: string }> { const { data } = await apiClient.delete<{ message: string }>(`/admin/groups/${id}`) return data } /** * Toggle group status * @param id - Group ID * @param status - New status * @returns Updated group */ export async function toggleStatus(id: number, status: 'active' | 'inactive'): Promise { return update(id, { status }) } /** * Get group statistics * @param id - Group ID * @returns Group usage statistics */ export async function getStats(id: number): Promise<{ total_api_keys: number active_api_keys: number total_requests: number total_cost: number }> { const { data } = await apiClient.get<{ total_api_keys: number active_api_keys: number total_requests: number total_cost: number }>(`/admin/groups/${id}/stats`) return data } /** * Get API keys in a group * @param id - Group ID * @param page - Page number * @param pageSize - Items per page * @returns Paginated list of API keys in the group */ export async function getGroupApiKeys( id: number, page: number = 1, pageSize: number = 20 ): Promise> { const { data } = await apiClient.get>(`/admin/groups/${id}/api-keys`, { params: { page, page_size: pageSize } }) return data } /** * Update group sort orders * @param updates - Array of { id, sort_order } objects * @returns Success confirmation */ export async function updateSortOrder( updates: Array<{ id: number; sort_order: number }> ): Promise<{ message: string }> { const { data } = await apiClient.put<{ message: string }>('/admin/groups/sort-order', { updates }) return data } export const groupsAPI = { list, getAll, getByPlatform, getById, create, update, delete: deleteGroup, toggleStatus, getStats, getGroupApiKeys, updateSortOrder } export default groupsAPI