/** * Admin Redeem Codes API endpoints * Handles redeem code generation and management for administrators */ import { apiClient } from '../client' import type { RedeemCode, GenerateRedeemCodesRequest, RedeemCodeType, PaginatedResponse } from '@/types' /** * List all redeem codes with pagination * @param page - Page number (default: 1) * @param pageSize - Items per page (default: 20) * @param filters - Optional filters * @returns Paginated list of redeem codes */ export async function list( page: number = 1, pageSize: number = 20, filters?: { type?: RedeemCodeType status?: 'active' | 'used' | 'expired' | 'unused' search?: string }, options?: { signal?: AbortSignal } ): Promise> { const { data } = await apiClient.get>('/admin/redeem-codes', { params: { page, page_size: pageSize, ...filters }, signal: options?.signal }) return data } /** * Get redeem code by ID * @param id - Redeem code ID * @returns Redeem code details */ export async function getById(id: number): Promise { const { data } = await apiClient.get(`/admin/redeem-codes/${id}`) return data } /** * Generate new redeem codes * @param count - Number of codes to generate * @param type - Type of redeem code * @param value - Value of the code * @param groupId - Group ID (required for subscription type) * @param validityDays - Validity days (for subscription type) * @returns Array of generated redeem codes */ export async function generate( count: number, type: RedeemCodeType, value: number, groupId?: number | null, validityDays?: number ): Promise { const payload: GenerateRedeemCodesRequest = { count, type, value } // 订阅类型专用字段 if (type === 'subscription') { payload.group_id = groupId if (validityDays && validityDays > 0) { payload.validity_days = validityDays } } const { data } = await apiClient.post('/admin/redeem-codes/generate', payload) return data } /** * Delete redeem code * @param id - Redeem code ID * @returns Success confirmation */ export async function deleteCode(id: number): Promise<{ message: string }> { const { data } = await apiClient.delete<{ message: string }>(`/admin/redeem-codes/${id}`) return data } /** * Batch delete redeem codes * @param ids - Array of redeem code IDs * @returns Success confirmation */ export async function batchDelete(ids: number[]): Promise<{ deleted: number message: string }> { const { data } = await apiClient.post<{ deleted: number message: string }>('/admin/redeem-codes/batch-delete', { ids }) return data } /** * Expire redeem code * @param id - Redeem code ID * @returns Updated redeem code */ export async function expire(id: number): Promise { const { data } = await apiClient.post(`/admin/redeem-codes/${id}/expire`) return data } /** * Get redeem code statistics * @returns Statistics about redeem codes */ export async function getStats(): Promise<{ total_codes: number active_codes: number used_codes: number expired_codes: number total_value_distributed: number by_type: Record }> { const { data } = await apiClient.get<{ total_codes: number active_codes: number used_codes: number expired_codes: number total_value_distributed: number by_type: Record }>('/admin/redeem-codes/stats') return data } /** * Export redeem codes to CSV * @param filters - Optional filters * @returns CSV data as blob */ export async function exportCodes(filters?: { type?: RedeemCodeType status?: 'active' | 'used' | 'expired' }): Promise { const response = await apiClient.get('/admin/redeem-codes/export', { params: filters, responseType: 'blob' }) return response.data } export const redeemAPI = { list, getById, generate, delete: deleteCode, batchDelete, expire, getStats, exportCodes } export default redeemAPI