// @ts-check import { Router } from 'express' import { closeAdminManualRedeemSession, closeAdminManualRedeemTask, confirmAdminManualRedeemRole, createAdminManualRedeemSession, createAdminManualRedeemTask, getAdminManualRedeemDetail, getAdminManualRedeemSessionSummary, reloadAdminManualRedeemSession, redeemAdminManualRedeemTask, } from '../../services/admin/admin-manual-redeem-service.js' import { getAdminInventorySkuSuggestions } from '../../services/admin/admin-read-service.js' import { createJsonHandler, requireAdminRoles } from './shared.js' /** @typedef {import('../../types/admin-route-inputs.js').AdminInventorySkuSuggestionRouteQuery} AdminInventorySkuSuggestionRouteQuery */ /** @typedef {import('../../types/admin-route-inputs.js').AdminManualRedeemCreateRouteBody} AdminManualRedeemCreateRouteBody */ /** @typedef {import('../../types/admin-route-inputs.js').AdminManualRedeemRouteParams} AdminManualRedeemRouteParams */ const router = Router() router.use('/manual-redeem', requireAdminRoles(['admin', 'operator', 'support'])) router.get('/manual-redeem/sku-suggestions', createJsonHandler( (req) => getAdminInventorySkuSuggestions( /** @type {AdminInventorySkuSuggestionRouteQuery} */ (req.query), req.adminSession || null, ), { successMessage: 'ok', errorMessage: '读取人工兑换 SKU 建议失败', scope: '[admin/manual-redeem/sku-suggestions]', }, )) router.post('/manual-redeem', createJsonHandler( (req) => createAdminManualRedeemTask( /** @type {AdminManualRedeemCreateRouteBody} */ (req.body), req.adminSession || null, ), { successMessage: '人工兑换任务已创建', errorMessage: '创建人工兑换任务失败', scope: '[admin/manual-redeem]', audit: (req, data) => { const result = /** @type {{ task?: { taskId?: number, taskNo?: string }, manualRequest?: { proofValue?: string }, order?: { platformOrderId?: string }, orderItem?: { skuCode?: string } }} */ (data) return { action: 'manual_redeem_created', targetType: 'task', targetId: String(result.task?.taskId || ''), data: { taskId: result.task?.taskId, taskNo: result.task?.taskNo, proofValue: result.manualRequest?.proofValue || result.order?.platformOrderId || '', skuCode: result.orderItem?.skuCode || '', }, } }, }, )) router.get('/manual-redeem/:taskId', createJsonHandler( (req) => getAdminManualRedeemDetail( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: 'ok', errorMessage: '读取人工兑换详情失败', scope: '[admin/manual-redeem/:taskId]', }, )) router.post('/manual-redeem/:taskId/session', createJsonHandler( (req) => createAdminManualRedeemSession( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, /** @type {{ loginType?: string, forceRecreate?: boolean }} */ (req.body), req.adminSession || null, ), { successMessage: '人工兑换登录会话已创建', errorMessage: '创建人工兑换登录会话失败', scope: '[admin/manual-redeem/:taskId/session]', }, )) router.get('/manual-redeem/:taskId/session/summary', createJsonHandler( (req) => getAdminManualRedeemSessionSummary( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: 'ok', errorMessage: '读取人工兑换会话摘要失败', scope: '[admin/manual-redeem/:taskId/session/summary]', }, )) router.post('/manual-redeem/:taskId/session/refresh', createJsonHandler( (req) => reloadAdminManualRedeemSession( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: '人工兑换会话已刷新', errorMessage: '刷新人工兑换会话失败', scope: '[admin/manual-redeem/:taskId/session/refresh]', }, )) router.delete('/manual-redeem/:taskId/session', createJsonHandler( (req) => closeAdminManualRedeemSession( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: '人工兑换会话已关闭', errorMessage: '关闭人工兑换会话失败', scope: '[admin/manual-redeem/:taskId/session]', }, )) router.post('/manual-redeem/:taskId/confirm-role', createJsonHandler( (req) => confirmAdminManualRedeemRole( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: '角色已确认', errorMessage: '确认人工兑换角色失败', scope: '[admin/manual-redeem/:taskId/confirm-role]', audit: (req, data) => { const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string } }} */ (data) return { action: 'manual_redeem_role_confirmed', targetType: 'task', targetId: String(result.task?.taskId || ''), data: { taskId: result.task?.taskId, taskNo: result.task?.taskNo, status: result.task?.status, }, } }, }, )) router.post('/manual-redeem/:taskId/redeem', createJsonHandler( (req) => redeemAdminManualRedeemTask( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: '人工兑换任务已启动', errorMessage: '执行人工兑换失败', scope: '[admin/manual-redeem/:taskId/redeem]', audit: (req, data) => { const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string, deliveryStatus?: string } }} */ (data) return { action: 'manual_redeem_started', targetType: 'task', targetId: String(result.task?.taskId || ''), data: { taskId: result.task?.taskId, taskNo: result.task?.taskNo, status: result.task?.status, deliveryStatus: result.task?.deliveryStatus, }, } }, }, )) router.post('/manual-redeem/:taskId/close', createJsonHandler( (req) => closeAdminManualRedeemTask( (/** @type {AdminManualRedeemRouteParams} */ (req.params)).taskId, req.adminSession || null, ), { successMessage: '人工兑换任务已关闭', errorMessage: '关闭人工兑换任务失败', scope: '[admin/manual-redeem/:taskId/close]', audit: (req, data) => { const result = /** @type {{ task?: { taskId?: number, taskNo?: string, status?: string } }} */ (data) return { action: 'manual_redeem_closed', targetType: 'task', targetId: String(result.task?.taskId || ''), data: { taskId: result.task?.taskId, taskNo: result.task?.taskNo, status: result.task?.status, }, } }, }, )) export default router