Files
order_site/apps/backend/src/routes/admin/semi-auto.ts
T
yml d178556f03 收敛半自动平台为登录获取 CK 流程
移除角色绑定对客户页、状态展示和完成门禁的阻塞;虎牙与微博统一保存并直接导出 CK;同步精简客服工作台、配置项和权威文档。
2026-11-14 01:13:00 +08:00

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