import { adminClient } from './client' import type { AdminCouponFetchParams, AdminCouponGeneratePayload, AdminCouponListItem, AdminConfigGroupKey, AdminConfigMappings, AdminOrderAssignPayload, AdminOrderDetail, AdminOrderFetchParams, AdminOrderListItem, AdminGiftCardCodeGeneratePayload, AdminGiftCardCodeItem, AdminGiftCardCodeStatus, AdminGiftCardCodeUpdatePayload, AdminGiftCardStatistics, AdminGiftCardTemplateItem, AdminGiftCardTemplatePayload, AdminGiftCardTemplateType, AdminGiftCardUsageItem, AdminKnowledgeDetail, AdminKnowledgeListItem, AdminKnowledgeSavePayload, AdminNoticeItem, AdminNoticeSavePayload, AdminNodeItem, AdminNodeBatchUpdatePayload, AdminNodeSavePayload, AdminNodeRouteItem, AdminNodeRouteSavePayload, AdminNodeUpdatePayload, AdminPaymentConfigFields, AdminPaymentListItem, AdminPaymentSavePayload, AdminQueueFailedJobResult, AdminPaginationResult, AdminPlanListItem, AdminPlanSavePayload, AdminThemeConfigRecord, AdminThemeListResult, AdminPluginItem, AdminPluginTypeItem, AdminServerGroupItem, AdminServerGroupSavePayload, AdminTicketDetail, AdminTicketFetchParams, AdminTicketListItem, AdminTrafficLogResult, AdminUserBulkBanPayload, AdminUserBulkMailPayload, AdminUserBulkScopePayload, AdminUserFetchParams, AdminUserGeneratePayload, AdminUserListItem, AdminUserUpdatePayload, ApiResponse, DashboardStats, OrderTrendData, QueueStats, SystemStatus, TrafficRankResponse, } from '@/types/api' function unwrap(url: string, params?: Record): Promise> { return adminClient .get>(url, { params }) .then((res) => res.data) } function unwrapPost(url: string, data?: Record): Promise> { return adminClient .post>(url, data) .then((res) => res.data) } function splitEmail(email: string): { email_prefix: string; email_suffix: string } { const normalized = email.trim() const atIndex = normalized.lastIndexOf('@') if (atIndex <= 0 || atIndex === normalized.length - 1) { throw new Error('请输入有效的邮箱地址') } return { email_prefix: normalized.slice(0, atIndex), email_suffix: normalized.slice(atIndex + 1), } } export function getDashboardStats(): Promise> { return unwrap('/stat/getStats') } export function getOrderTrend(params: { startDate: string endDate: string type?: 'paid_total' | 'paid_count' | 'commission_total' | 'commission_count' }): Promise> { return unwrap('/stat/getOrder', { start_date: params.startDate, end_date: params.endDate, type: params.type, }) } export function getTrafficRank(params: { type: 'node' | 'user' startTime: number endTime: number limit?: 10 | 20 }): Promise { return adminClient .get('/stat/getTrafficRank', { params: { type: params.type, start_time: params.startTime, end_time: params.endTime, limit: params.limit, }, }) .then((res) => res.data) } export function getSystemStatus(): Promise> { return unwrap('/system/getSystemStatus') } export function getQueueStats(): Promise> { return unwrap('/system/getQueueStats') } export function getHorizonFailedJobs(params: { current?: number pageSize?: number } = {}): Promise { return adminClient .get('/system/getHorizonFailedJobs', { params: { current: params.current, page_size: params.pageSize, }, }) .then((res) => res.data) } export function getPlans(): Promise> { return unwrap('/plan/fetch') } export function fetchOrders(params: AdminOrderFetchParams): Promise> { return adminClient .get>('/order/fetch', { params }) .then((res) => res.data) } export function getOrderDetail(id: number): Promise> { return unwrapPost('/order/detail', { id }) } export function assignOrder(payload: AdminOrderAssignPayload): Promise> { return unwrapPost('/order/assign', payload as unknown as Record) } export function markOrderPaid(tradeNo: string): Promise> { return unwrapPost('/order/paid', { trade_no: tradeNo }) } export function cancelOrder(tradeNo: string): Promise> { return unwrapPost('/order/cancel', { trade_no: tradeNo }) } export function updateOrderCommissionStatus(tradeNo: string, commissionStatus: number): Promise> { return unwrapPost('/order/update', { trade_no: tradeNo, commission_status: commissionStatus, }) } export function getThemes(): Promise> { return unwrap('/theme/getThemes') } export function getThemeConfig(name: string): Promise> { return unwrapPost('/theme/getThemeConfig', { name }) } export function saveThemeConfig( name: string, config: AdminThemeConfigRecord, ): Promise> { return unwrapPost('/theme/saveThemeConfig', { name, config }) } export function uploadTheme(file: File): Promise> { const formData = new FormData() formData.append('file', file) return adminClient .post>('/theme/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' }, }) .then((res) => res.data) } export function fetchCoupons(params: AdminCouponFetchParams = {}): Promise> { return adminClient .get>('/coupon/fetch', { params: { current: params.current, pageSize: params.pageSize, }, }) .then((res) => res.data) } export function saveCoupon(payload: AdminCouponGeneratePayload): Promise> { return unwrapPost('/coupon/generate', payload as unknown as Record) } export function updateCoupon(id: number, payload: Pick): Promise> { return unwrapPost('/coupon/update', { id, ...payload, }) } export function deleteCoupon(id: number): Promise> { return unwrapPost('/coupon/drop', { id }) } export function fetchGiftCardTemplates(params: { page?: number per_page?: number type?: AdminGiftCardTemplateType status?: 0 | 1 } = {}): Promise> { return adminClient .get>('/gift-card/templates', { params }) .then((res) => res.data) } export function createGiftCardTemplate(payload: AdminGiftCardTemplatePayload): Promise> { return unwrapPost('/gift-card/create-template', payload as unknown as Record) } export function updateGiftCardTemplate(payload: AdminGiftCardTemplatePayload): Promise> { return unwrapPost('/gift-card/update-template', payload as unknown as Record) } export function deleteGiftCardTemplate(id: number): Promise> { return unwrapPost('/gift-card/delete-template', { id }) } export function fetchGiftCardCodes(params: { page?: number per_page?: number template_id?: number batch_id?: string status?: AdminGiftCardCodeStatus } = {}): Promise> { return adminClient .get>('/gift-card/codes', { params }) .then((res) => res.data) } export function generateGiftCardCodes(payload: AdminGiftCardCodeGeneratePayload): Promise> { return unwrapPost<{ batch_id: string, count: number, message: string }>( '/gift-card/generate-codes', payload as unknown as Record, ) } export function toggleGiftCardCode(id: number, action: 'disable' | 'enable'): Promise> { return unwrapPost<{ message: string }>('/gift-card/toggle-code', { id, action }) } export function exportGiftCardCodes(batchId: string): Promise { return adminClient .get('/gift-card/export-codes', { params: { batch_id: batchId }, responseType: 'blob', }) .then((res) => res.data) } export function updateGiftCardCode(payload: AdminGiftCardCodeUpdatePayload): Promise> { return unwrapPost('/gift-card/update-code', payload as unknown as Record) } export function deleteGiftCardCode(id: number): Promise> { return unwrapPost<{ message: string }>('/gift-card/delete-code', { id }) } export function fetchGiftCardUsages(params: { page?: number per_page?: number template_id?: number user_id?: number } = {}): Promise> { return adminClient .get>('/gift-card/usages', { params }) .then((res) => res.data) } export function getGiftCardStatistics(params: { start_date?: string end_date?: string } = {}): Promise> { return unwrap('/gift-card/statistics', params) } export function getGiftCardTypes(): Promise>> { return unwrap>('/gift-card/types') } export function fetchAdminConfig(key?: AdminConfigGroupKey): Promise> { return unwrap('/config/fetch', key ? { key } : undefined) } export function saveAdminConfig(payload: Record): Promise> { return unwrapPost('/config/save', payload) } export function testAdminMail(): Promise>> { return unwrapPost>('/config/testSendMail', {}) } export function setTelegramWebhook(payload: { telegram_bot_token?: string } = {}): Promise>> { return unwrapPost>('/config/setTelegramWebhook', payload) } export function getKnowledges(): Promise> { return unwrap('/knowledge/fetch') } export function getKnowledgeById(id: number): Promise> { return unwrap('/knowledge/fetch', { id }) } export function getKnowledgeCategories(): Promise> { return unwrap('/knowledge/getCategory') } export function saveKnowledge(payload: AdminKnowledgeSavePayload): Promise> { return unwrapPost('/knowledge/save', payload as unknown as Record) } export function toggleKnowledgeVisibility(id: number): Promise> { return unwrapPost('/knowledge/show', { id }) } export function deleteKnowledge(id: number): Promise> { return unwrapPost('/knowledge/drop', { id }) } export function sortKnowledges(ids: number[]): Promise> { return unwrapPost('/knowledge/sort', { ids }) } export function fetchNotices(): Promise> { return unwrap('/notice/fetch') } export function saveNotice(payload: AdminNoticeSavePayload): Promise> { return unwrapPost('/notice/save', payload as unknown as Record) } export function toggleNoticeVisibility(id: number): Promise> { return unwrapPost('/notice/show', { id }) } export function deleteNotice(id: number): Promise> { return unwrapPost('/notice/drop', { id }) } export function sortNotices(ids: number[]): Promise> { return unwrapPost('/notice/sort', { ids }) } export function fetchPayments(): Promise> { return unwrap('/payment/fetch') } export function getPaymentMethods(): Promise> { return unwrap('/payment/getPaymentMethods') } export function getPaymentForm(payload: { payment: string id?: number }): Promise> { return unwrapPost('/payment/getPaymentForm', payload as unknown as Record) } export function savePayment(payload: AdminPaymentSavePayload): Promise> { return unwrapPost('/payment/save', payload as unknown as Record) } export function togglePaymentVisibility(id: number): Promise> { return unwrapPost('/payment/show', { id }) } export function deletePayment(id: number): Promise> { return unwrapPost('/payment/drop', { id }) } export function sortPayments(ids: number[]): Promise> { return unwrapPost('/payment/sort', { ids }) } export function getPluginTypes(): Promise> { return unwrap('/plugin/types') } export function getPlugins(params: { type?: string } = {}): Promise> { return unwrap('/plugin/getPlugins', params) } export function installPlugin(code: string): Promise> { return unwrapPost('/plugin/install', { code }) } export function uninstallPlugin(code: string): Promise> { return unwrapPost('/plugin/uninstall', { code }) } export function enablePlugin(code: string): Promise> { return unwrapPost('/plugin/enable', { code }) } export function disablePlugin(code: string): Promise> { return unwrapPost('/plugin/disable', { code }) } export function getPluginConfig(code: string): Promise>> { return unwrap>('/plugin/config', { code }) } export function savePluginConfig(code: string, config: Record): Promise> { return unwrapPost('/plugin/config', { code, config }) } export function upgradePlugin(code: string): Promise> { return unwrapPost('/plugin/upgrade', { code }) } export function uploadPluginPackage(file: File): Promise> { const formData = new FormData() formData.append('file', file) return adminClient .post>('/plugin/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }) .then((res) => res.data) } export function savePlan(payload: AdminPlanSavePayload): Promise> { return unwrapPost('/plan/save', payload as unknown as Record) } export function updatePlan(id: number, payload: Partial>): Promise> { return unwrapPost('/plan/update', { id, ...payload, }) } export function deletePlan(id: number): Promise> { return unwrapPost('/plan/drop', { id }) } export function sortPlans(ids: number[]): Promise> { return unwrapPost('/plan/sort', { ids }) } export function getServerGroups(): Promise> { return unwrap('/server/group/fetch') } export function saveServerGroup(payload: AdminServerGroupSavePayload): Promise> { return unwrapPost('/server/group/save', payload as unknown as Record) } export function deleteServerGroup(id: number): Promise> { return unwrapPost('/server/group/drop', { id }) } export function fetchNodes(): Promise> { return unwrap('/server/manage/getNodes') } export function fetchNodeRoutes(): Promise> { return unwrap('/server/route/fetch') } export function saveNodeRoute(payload: AdminNodeRouteSavePayload): Promise> { return unwrapPost('/server/route/save', payload as unknown as Record) } export function deleteNodeRoute(id: number): Promise> { return unwrapPost('/server/route/drop', { id }) } export function updateNode(payload: AdminNodeUpdatePayload): Promise> { return unwrapPost('/server/manage/update', payload as unknown as Record) } export function batchUpdateNodes(payload: AdminNodeBatchUpdatePayload): Promise> { return unwrapPost('/server/manage/batchUpdate', payload as unknown as Record) } export function batchDeleteNodes(ids: number[]): Promise> { return unwrapPost('/server/manage/batchDelete', { ids }) } export function saveNode(payload: AdminNodeSavePayload): Promise> { return unwrapPost('/server/manage/save', payload as unknown as Record) } export function sortNodes(payload: Array<{ id: number; order: number }>): Promise> { return unwrapPost('/server/manage/sort', payload as unknown as Record) } export function copyNode(id: number): Promise> { return unwrapPost('/server/manage/copy', { id }) } export function deleteNode(id: number): Promise> { return unwrapPost('/server/manage/drop', { id }) } export function fetchUsers(params: AdminUserFetchParams): Promise> { return adminClient .get>('/user/fetch', { params }) .then((res) => res.data) } export function getUserById(id: number): Promise> { return unwrap('/user/getUserInfoById', { id }) } export function createUser(payload: AdminUserGeneratePayload): Promise> { const email = splitEmail(payload.email) return unwrapPost('/user/generate', { ...email, password: payload.password, plan_id: payload.plan_id, expired_at: payload.expired_at, }) } export function updateUser(payload: AdminUserUpdatePayload): Promise> { return unwrapPost('/user/update', payload as unknown as Record) } export function resetUserSecret(id: number): Promise> { return unwrapPost('/user/resetSecret', { id }) } export function deleteUser(id: number): Promise> { return unwrapPost('/user/destroy', { id }) } export function exportUsersCsv(payload: AdminUserBulkScopePayload): Promise { return adminClient .post('/user/dumpCSV', payload as unknown as Record, { responseType: 'blob', }) .then((res) => res.data) } export function sendUsersMail(payload: AdminUserBulkMailPayload): Promise> { return unwrapPost('/user/sendMail', payload as unknown as Record) } export function batchUpdateUserBan(payload: AdminUserBulkBanPayload): Promise> { return unwrapPost('/user/ban', payload as unknown as Record) } export function resetUserTraffic(userId: number, reason?: string): Promise>> { return unwrapPost>('/traffic-reset/reset-user', { user_id: userId, reason, }) } export function fetchTickets(params: AdminTicketFetchParams): Promise> { return adminClient .get>('/ticket/fetch', { params }) .then((res) => res.data) } export function getTicketById(id: number): Promise> { return unwrap('/ticket/fetch', { id }) } export function replyTicket(id: number, message: string): Promise> { return unwrapPost('/ticket/reply', { id, message }) } export function closeTicket(id: number): Promise> { return unwrapPost('/ticket/close', { id }) } export function fetchUserTrafficLogs(params: { userId: number pageSize?: number page?: number minTotal?: number startTime?: number endTime?: number }): Promise { return adminClient .get('/stat/getStatUser', { params: { user_id: params.userId, pageSize: params.pageSize, page: params.page, min_total: params.minTotal, start_time: params.startTime, end_time: params.endTime, }, }) .then((res) => res.data) }