| |
| |
| |
| |
|
|
| import { apiClient } from '../client' |
| import type { |
| RedeemCode, |
| GenerateRedeemCodesRequest, |
| RedeemCodeType, |
| PaginatedResponse |
| } from '@/types' |
|
|
| |
| |
| |
| |
| |
| |
| |
| export async function list( |
| page: number = 1, |
| pageSize: number = 20, |
| filters?: { |
| type?: RedeemCodeType |
| status?: 'active' | 'used' | 'expired' | 'unused' |
| search?: string |
| }, |
| options?: { |
| signal?: AbortSignal |
| } |
| ): Promise<PaginatedResponse<RedeemCode>> { |
| const { data } = await apiClient.get<PaginatedResponse<RedeemCode>>('/admin/redeem-codes', { |
| params: { |
| page, |
| page_size: pageSize, |
| ...filters |
| }, |
| signal: options?.signal |
| }) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function getById(id: number): Promise<RedeemCode> { |
| const { data } = await apiClient.get<RedeemCode>(`/admin/redeem-codes/${id}`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export async function generate( |
| count: number, |
| type: RedeemCodeType, |
| value: number, |
| groupId?: number | null, |
| validityDays?: number |
| ): Promise<RedeemCode[]> { |
| 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<RedeemCode[]>('/admin/redeem-codes/generate', payload) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function deleteCode(id: number): Promise<{ message: string }> { |
| const { data } = await apiClient.delete<{ message: string }>(`/admin/redeem-codes/${id}`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| 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 |
| } |
|
|
| |
| |
| |
| |
| |
| export async function expire(id: number): Promise<RedeemCode> { |
| const { data } = await apiClient.post<RedeemCode>(`/admin/redeem-codes/${id}/expire`) |
| return data |
| } |
|
|
| |
| |
| |
| |
| export async function getStats(): Promise<{ |
| total_codes: number |
| active_codes: number |
| used_codes: number |
| expired_codes: number |
| total_value_distributed: number |
| by_type: Record<RedeemCodeType, number> |
| }> { |
| const { data } = await apiClient.get<{ |
| total_codes: number |
| active_codes: number |
| used_codes: number |
| expired_codes: number |
| total_value_distributed: number |
| by_type: Record<RedeemCodeType, number> |
| }>('/admin/redeem-codes/stats') |
| return data |
| } |
|
|
| |
| |
| |
| |
| |
| export async function exportCodes(filters?: { |
| type?: RedeemCodeType |
| status?: 'active' | 'used' | 'expired' |
| }): Promise<Blob> { |
| 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 |
|
|