import { adminClient } from '@/shared/api/adminClient' import type { ApiResponse } from '@/shared/api/types' import type { AdminCaptcha, AdminDispute, AdminDisputePage, AdminDisputeQuery, AdminListing, AdminListingPage, AdminListingQuery, AdminLoginData, AdminOrderDetail, AdminOrderPage, AdminOrderQuery, AdminUser, AdminUserItem, AdminUserPage, AdminUserQuery, AdminWithdrawal, AdminWithdrawalPage, AdminWithdrawalQuery, DashboardData, } from '@/features/admin/types' export async function fetchAdminCaptcha() { const { data } = await adminClient.get>('/admin/auth/captcha') return data.data } export async function loginAdmin( username: string, password: string, captchaId: string, captchaCode: string ) { const { data } = await adminClient.post>('/admin/auth/login', { username, password, captcha_id: captchaId, captcha_code: captchaCode, }) return data.data } export async function fetchAdminMe() { const { data } = await adminClient.get>('/admin/me') return data.data } export async function logoutAdmin() { await adminClient.post('/admin/auth/logout') } export async function changeAdminPassword(oldPassword: string, newPassword: string) { await adminClient.put('/admin/admin-users/me/password', { old_password: oldPassword, new_password: newPassword, }) } export async function fetchAdminDashboard() { const { data } = await adminClient.get>('/admin/dashboard') return data.data } function compactParams(query: T) { return Object.fromEntries( Object.entries(query).filter(([, value]) => value !== '' && value != null) ) } export async function fetchAdminOrders(query: AdminOrderQuery) { const { data } = await adminClient.get>>('/admin/orders', { params: compactParams(query), }) return { items: data.data.items ?? [], total: data.data.total ?? 0, page: data.data.page ?? query.page ?? 1, page_size: data.data.page_size ?? query.page_size ?? 20, } } export async function fetchAdminOrder(id: number | string) { const { data } = await adminClient.get>(`/admin/orders/${id}`) return data.data } export async function fetchAdminListings(query: AdminListingQuery) { const { data } = await adminClient.get>>('/admin/listings', { params: compactParams(query), }) return { items: data.data.items ?? [], total: data.data.total ?? 0, page: data.data.page ?? query.page ?? 1, page_size: data.data.page_size ?? query.page_size ?? 20, } } export async function fetchAdminListing(id: number | string) { const { data } = await adminClient.get>(`/admin/listings/${id}`) return data.data } /** 审核队列使用独立接口:权限为 listing:approve,且返回全部待审商品。 */ export async function fetchAdminPendingListings() { const { data } = await adminClient.get>( '/admin/listings/pending' ) return data.data.items ?? [] } export async function approveAdminListing(id: number | string) { const { data } = await adminClient.post>(`/admin/listings/${id}/approve`) return data.data } export async function rejectAdminListing(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/listings/${id}/reject`, { reason } ) return data.data } export async function offlineAdminListing(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/listings/${id}/offline`, { reason } ) return data.data } export async function markAbnormalAdminListing(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/listings/${id}/mark-abnormal`, { reason } ) return data.data } export async function fetchAdminUsers(query: AdminUserQuery) { const params: Record = { ...compactParams(query) } if (query.has_deposit_free_quota) { params.has_deposit_free_quota = true } else { delete params.has_deposit_free_quota } const { data } = await adminClient.get>>('/admin/users', { params, }) return { items: data.data.items ?? [], total: data.data.total ?? 0, page: data.data.page ?? query.page ?? 1, page_size: data.data.page_size ?? query.page_size ?? 20, } } export async function freezeAdminUser(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/users/${id}/freeze`, { reason } ) return data.data } export async function unfreezeAdminUser(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/users/${id}/unfreeze`, { reason } ) return data.data } export async function setAdminUserDepositFreeQuota(id: number | string, amountCent: number) { const { data } = await adminClient.post>( `/admin/users/${id}/deposit-free-quota`, { amount_cent: amountCent } ) return data.data } export async function adjustAdminUserGrowthPoints( id: number | string, targetPoints: number, reason: string ) { const { data } = await adminClient.post>( `/admin/users/${id}/growth-points`, { target_points: targetPoints, reason } ) return data.data } export async function manualAdminUserRealname( id: number | string, payload: { name: string; id_no: string; reason: string } ) { const { data } = await adminClient.post>( `/admin/users/${id}/manual-realname`, payload ) return data.data } export async function revokeAdminUserRealname(id: number | string, reason: string) { const { data } = await adminClient.post>( `/admin/users/${id}/revoke-realname`, { reason } ) return data.data } export async function adjustAdminUserWallet( id: number | string, payload: { direction: 'in' | 'out'; amount_cent: number; reason: string; reference_no?: string } ) { const { data } = await adminClient.post>( `/admin/users/${id}/wallet/adjust`, payload ) return data.data } export async function fetchPendingRefundOrders() { const { data } = await adminClient.get>( '/admin/orders/refund-pending' ) return data.data.items ?? [] } export async function approveAdminRefund(id: number | string) { await adminClient.post(`/admin/orders/${id}/refund/approve`) } export async function rejectAdminRefund(id: number | string, action: 'restore' | 'close') { await adminClient.post(`/admin/orders/${id}/refund/reject`, { action }) } export async function fetchAdminWithdrawals(query: AdminWithdrawalQuery) { const { data } = await adminClient.get>>( '/admin/withdrawals', { params: compactParams(query) } ) return { items: data.data.items ?? [], total: data.data.total ?? 0, page: data.data.page ?? query.page ?? 1, page_size: data.data.page_size ?? query.page_size ?? 20, } } export async function fetchAdminWithdrawal(id: number | string) { const { data } = await adminClient.get>( `/admin/withdrawals/${id}` ) return data.data } export async function reviewAdminWithdrawal( id: number | string, approved: boolean, remark: string ) { const { data } = await adminClient.post>( `/admin/withdrawals/${id}/review`, { approved, remark } ) return data.data } export async function confirmAdminWithdrawalPayment( id: number | string, payload: { payment_proof_url?: string; remark?: string } ) { const { data } = await adminClient.post>( `/admin/withdrawals/${id}/confirm-payment`, payload ) return data.data } export async function fetchAdminDisputes(query: AdminDisputeQuery) { const { data } = await adminClient.get>>( '/admin/disputes', { params: compactParams(query) } ) return { items: data.data.items ?? [], total: data.data.total ?? 0, page: data.data.page ?? query.page ?? 1, page_size: data.data.page_size ?? query.page_size ?? 20, } } export async function arbitrateAdminDispute( id: number | string, payload: { result: string remark: string amount_cent?: number actual_coin_consumed_m?: number actual_consumable_amount_cent?: number } ) { const { data } = await adminClient.post>( `/admin/disputes/${id}/arbitrate`, payload ) return data.data }