176 lines
5.2 KiB
TypeScript
176 lines
5.2 KiB
TypeScript
import { Router } from 'express'
|
|
|
|
import {
|
|
cancelAdminSemiAutoTask,
|
|
claimAdminSemiAutoTask,
|
|
completeAdminSemiAutoTask,
|
|
consumeSemiAutoInjectionTicket,
|
|
createAdminBrowserSession,
|
|
exportAdminSemiAutoCredential,
|
|
getAdminSemiAutoTask,
|
|
listAdminSemiAutoTasks,
|
|
requestAdminSemiAutoCustomerReauth,
|
|
syncAdminSemiAutoTask,
|
|
} from '../../services/semi-auto/semi-auto-task-service.js'
|
|
import { bodyOf, sessionOf } from './request-helpers.js'
|
|
import { createJsonHandler, requireAdminRoles } from './session.js'
|
|
|
|
const router = Router()
|
|
|
|
router.use('/semi-auto', requireAdminRoles(['admin', 'operator', 'support']))
|
|
|
|
router.get(
|
|
'/semi-auto/tasks',
|
|
createJsonHandler((req) => listAdminSemiAutoTasks(req.query as Record<string, unknown>), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取半自动履约任务失败',
|
|
scope: '[admin/semi-auto/tasks]',
|
|
}),
|
|
)
|
|
|
|
router.get(
|
|
'/semi-auto/tasks/:taskId',
|
|
createJsonHandler((req) => getAdminSemiAutoTask(req.params.taskId), {
|
|
successMessage: 'ok',
|
|
errorMessage: '读取半自动履约任务详情失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId]',
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/credential/export',
|
|
createJsonHandler(
|
|
(req, res) => {
|
|
res.setHeader('Cache-Control', 'no-store, max-age=0')
|
|
res.setHeader('Pragma', 'no-cache')
|
|
res.setHeader('Expires', '0')
|
|
return exportAdminSemiAutoCredential(req.params.taskId)
|
|
},
|
|
{
|
|
successMessage: '账号 CK 已导出',
|
|
errorMessage: '导出半自动履约账号 CK 失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/credential/export]',
|
|
audit: (req, data) => {
|
|
const result =
|
|
data && typeof data === 'object' ? (data as Record<string, unknown>) : undefined
|
|
return {
|
|
action: 'semi_auto_credential_exported',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {
|
|
credentialId: Number(result?.credentialId || 0),
|
|
platform: String(result?.platform || ''),
|
|
},
|
|
}
|
|
},
|
|
},
|
|
),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/claim',
|
|
createJsonHandler((req) => claimAdminSemiAutoTask(req.params.taskId, sessionOf(req)), {
|
|
successMessage: '任务已领取',
|
|
errorMessage: '领取半自动履约任务失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/claim]',
|
|
audit: (req) => ({
|
|
action: 'semi_auto_task_claimed',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {},
|
|
}),
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/sync',
|
|
createJsonHandler((req) => syncAdminSemiAutoTask(req.params.taskId), {
|
|
successMessage: '状态已刷新',
|
|
errorMessage: '刷新半自动履约状态失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/sync]',
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/reauthorize',
|
|
createJsonHandler(
|
|
(req) => requestAdminSemiAutoCustomerReauth(req.params.taskId, sessionOf(req)),
|
|
{
|
|
successMessage: '已重新发起客户授权',
|
|
errorMessage: '重新发起客户授权失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/reauthorize]',
|
|
audit: (req) => ({
|
|
action: 'semi_auto_task_reauth_requested',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/browser-session',
|
|
createJsonHandler(
|
|
(req) => createAdminBrowserSession(req.params.taskId, bodyOf(req).targetUrl, sessionOf(req)),
|
|
{
|
|
successMessage: '注入票据已生成',
|
|
errorMessage: '生成浏览器登录态失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/browser-session]',
|
|
audit: (req) => ({
|
|
action: 'semi_auto_browser_session_created',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
router.get(
|
|
'/semi-auto/injections/:ticket',
|
|
createJsonHandler((req) => consumeSemiAutoInjectionTicket(req.params.ticket), {
|
|
successMessage: 'ok',
|
|
errorMessage: '消费浏览器注入票据失败',
|
|
scope: '[admin/semi-auto/injections/:ticket]',
|
|
}),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/complete',
|
|
createJsonHandler(
|
|
(req) => completeAdminSemiAutoTask(req.params.taskId, bodyOf(req), sessionOf(req)),
|
|
{
|
|
successMessage: '半自动履约已完成',
|
|
errorMessage: '完成半自动履约失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/complete]',
|
|
audit: (req) => ({
|
|
action: 'semi_auto_task_completed',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
router.post(
|
|
'/semi-auto/tasks/:taskId/cancel',
|
|
createJsonHandler(
|
|
(req) => cancelAdminSemiAutoTask(req.params.taskId, bodyOf(req), sessionOf(req)),
|
|
{
|
|
successMessage: '半自动履约任务已取消',
|
|
errorMessage: '取消半自动履约任务失败',
|
|
scope: '[admin/semi-auto/tasks/:taskId/cancel]',
|
|
audit: (req) => ({
|
|
action: 'semi_auto_task_cancelled',
|
|
targetType: 'semi_auto_task',
|
|
targetId: String(req.params.taskId || ''),
|
|
data: {},
|
|
}),
|
|
},
|
|
),
|
|
)
|
|
|
|
export default router
|