统一前后端代码格式化配置
This commit is contained in:
@@ -10,13 +10,13 @@ const router = Router()
|
||||
|
||||
router.use('/audit-logs', requireAdminRoles(['admin']))
|
||||
|
||||
router.get('/audit-logs', createJsonHandler(
|
||||
(req) => getAdminAuditLogs(req.query as AdminAuditLogRouteQuery),
|
||||
{
|
||||
router.get(
|
||||
'/audit-logs',
|
||||
createJsonHandler((req) => getAdminAuditLogs(req.query as AdminAuditLogRouteQuery), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取操作审计日志失败',
|
||||
scope: '[admin/audit-logs]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
@@ -11,40 +11,45 @@ import { createJsonHandler, extractBearerToken } from './session.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.post('/auth/login', createRateLimitMiddleware({
|
||||
scope: 'admin:login',
|
||||
windowMs: 60_000,
|
||||
max: 10,
|
||||
key: getBodyFieldRateLimitKey('username'),
|
||||
}), createJsonHandler(
|
||||
(req) => loginAdmin(req.body?.username, req.body?.password, {
|
||||
ip: resolveClientIp(req),
|
||||
userAgent: resolveUserAgent(req),
|
||||
location: resolveClientLocation(req),
|
||||
router.post(
|
||||
'/auth/login',
|
||||
createRateLimitMiddleware({
|
||||
scope: 'admin:login',
|
||||
windowMs: 60_000,
|
||||
max: 10,
|
||||
key: getBodyFieldRateLimitKey('username'),
|
||||
}),
|
||||
{
|
||||
successMessage: '登录成功',
|
||||
errorMessage: '后台登录失败',
|
||||
scope: '[admin/auth/login]',
|
||||
},
|
||||
))
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
loginAdmin(req.body?.username, req.body?.password, {
|
||||
ip: resolveClientIp(req),
|
||||
userAgent: resolveUserAgent(req),
|
||||
location: resolveClientLocation(req),
|
||||
}),
|
||||
{
|
||||
successMessage: '登录成功',
|
||||
errorMessage: '后台登录失败',
|
||||
scope: '[admin/auth/login]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.get('/auth/session', createJsonHandler(
|
||||
(req) => getAdminSessionSummary(extractBearerToken(req)),
|
||||
{
|
||||
router.get(
|
||||
'/auth/session',
|
||||
createJsonHandler((req) => getAdminSessionSummary(extractBearerToken(req)), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取后台登录态失败',
|
||||
scope: '[admin/auth/session]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
router.post('/auth/logout', createJsonHandler(
|
||||
() => ({ success: true }),
|
||||
{
|
||||
router.post(
|
||||
'/auth/logout',
|
||||
createJsonHandler(() => ({ success: true }), {
|
||||
successMessage: '已退出登录',
|
||||
errorMessage: '后台退出失败',
|
||||
scope: '[admin/auth/logout]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
@@ -14,7 +14,12 @@ import { createHttpError, sendRouteError } from '../../utils/http.js'
|
||||
import type { AdminCloudtentaclesDeliveryRecordQueryRouteBody } from '../../types/admin/route-inputs.js'
|
||||
|
||||
const router = Router()
|
||||
const RECORD_IMAGE_CACHE_DIR = path.join(PROJECT_ROOT, 'data', 'cache', 'cloudtentacles-record-images')
|
||||
const RECORD_IMAGE_CACHE_DIR = path.join(
|
||||
PROJECT_ROOT,
|
||||
'data',
|
||||
'cache',
|
||||
'cloudtentacles-record-images',
|
||||
)
|
||||
|
||||
router.get(
|
||||
'/cloudtentacles-records/sources',
|
||||
@@ -155,7 +160,10 @@ function buildRecordImageCacheMeta(imageUrl: string) {
|
||||
return {
|
||||
candidateFilePaths: candidateTypes.map((contentType) => ({
|
||||
contentType,
|
||||
filePath: path.join(RECORD_IMAGE_CACHE_DIR, `${digest}.${extensionForContentType(contentType)}`),
|
||||
filePath: path.join(
|
||||
RECORD_IMAGE_CACHE_DIR,
|
||||
`${digest}.${extensionForContentType(contentType)}`,
|
||||
),
|
||||
})),
|
||||
filePathForContentType(contentType: string) {
|
||||
return path.join(RECORD_IMAGE_CACHE_DIR, `${digest}.${extensionForContentType(contentType)}`)
|
||||
@@ -164,7 +172,12 @@ function buildRecordImageCacheMeta(imageUrl: string) {
|
||||
}
|
||||
|
||||
function normalizeImageContentType(contentType: string) {
|
||||
return String(contentType || 'image/jpeg').split(';')[0]?.trim().toLowerCase() || 'image/jpeg'
|
||||
return (
|
||||
String(contentType || 'image/jpeg')
|
||||
.split(';')[0]
|
||||
?.trim()
|
||||
.toLowerCase() || 'image/jpeg'
|
||||
)
|
||||
}
|
||||
|
||||
function extensionForContentType(contentType: string) {
|
||||
|
||||
@@ -7,22 +7,22 @@ import { createJsonHandler } from './session.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/dashboard/summary', createJsonHandler(
|
||||
() => getAdminDashboardSummary(),
|
||||
{
|
||||
router.get(
|
||||
'/dashboard/summary',
|
||||
createJsonHandler(() => getAdminDashboardSummary(), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取后台概览失败',
|
||||
scope: '[admin/dashboard/summary]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
router.get('/dashboard/login-logs', createJsonHandler(
|
||||
(req) => getAdminLoginLogs(req.query as JsonObject),
|
||||
{
|
||||
router.get(
|
||||
'/dashboard/login-logs',
|
||||
createJsonHandler((req) => getAdminLoginLogs(req.query as JsonObject), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取登录记录失败',
|
||||
scope: '[admin/dashboard/login-logs]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
@@ -15,11 +15,7 @@ import { createJsonHandler, requireAdminRoles } from './session.js'
|
||||
const router = Router()
|
||||
|
||||
function requireDevMockEnabled() {
|
||||
return (
|
||||
_req: unknown,
|
||||
_res: unknown,
|
||||
next: (error?: unknown) => void,
|
||||
) => {
|
||||
return (_req: unknown, _res: unknown, next: (error?: unknown) => void) => {
|
||||
if (!isDevMockEnabled()) {
|
||||
next(
|
||||
createHttpError('开发 Mock 仅在非 production 环境可用(或设置 ENABLE_DEV_MOCK=1)', {
|
||||
|
||||
@@ -57,7 +57,8 @@ router.post(
|
||||
successMessage: '售后单列表已查询',
|
||||
errorMessage: '查询快手售后单列表失败',
|
||||
scope: '[admin/kuaishou-industry/refunds/list]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_refund_list', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_refund_list', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -72,7 +73,8 @@ router.post(
|
||||
successMessage: '同意退款接口已执行',
|
||||
errorMessage: '执行同意退款失败',
|
||||
scope: '[admin/kuaishou-industry/refunds/approve]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_refund_approve', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_refund_approve', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -87,7 +89,8 @@ router.post(
|
||||
successMessage: '不同意退款接口已执行',
|
||||
errorMessage: '执行不同意退款失败',
|
||||
scope: '[admin/kuaishou-industry/refunds/disagree]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_refund_disagree', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_refund_disagree', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -104,7 +107,8 @@ router.post(
|
||||
successMessage: '电子凭证有效性已检查',
|
||||
errorMessage: '检查电子凭证有效性失败',
|
||||
scope: '[admin/kuaishou-industry/vouchers/check-available]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_voucher_check_available', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_voucher_check_available', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -119,7 +123,8 @@ router.post(
|
||||
successMessage: '电子凭证冲正回调已执行',
|
||||
errorMessage: '执行电子凭证冲正失败',
|
||||
scope: '[admin/kuaishou-industry/vouchers/reverse]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_voucher_reverse', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_voucher_reverse', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -136,7 +141,8 @@ router.post(
|
||||
successMessage: '电子凭证已手动核销',
|
||||
errorMessage: '手动核销电子凭证失败',
|
||||
scope: '[admin/kuaishou-industry/vouchers/consume]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_voucher_consume', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_voucher_consume', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -153,7 +159,8 @@ router.post(
|
||||
successMessage: '电子凭证发码回调已重发',
|
||||
errorMessage: '重发电子凭证发码回调失败',
|
||||
scope: '[admin/kuaishou-industry/vouchers/resend-code]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_voucher_resend_code', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_voucher_resend_code', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
@@ -170,14 +177,15 @@ router.post(
|
||||
successMessage: '电子凭证已手动销毁',
|
||||
errorMessage: '手动销毁电子凭证失败',
|
||||
scope: '[admin/kuaishou-industry/vouchers/destroy]',
|
||||
audit: (req, data) => buildKuaishouIndustryAudit('kuaishou_industry_voucher_destroy', req.body, data),
|
||||
audit: (req, data) =>
|
||||
buildKuaishouIndustryAudit('kuaishou_industry_voucher_destroy', req.body, data),
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
function buildKuaishouIndustryAudit(action: string, body: unknown, data: unknown) {
|
||||
const payload = body && typeof body === 'object' ? body as Record<string, unknown> : {}
|
||||
const result = data && typeof data === 'object' ? data as Record<string, unknown> : {}
|
||||
const payload = body && typeof body === 'object' ? (body as Record<string, unknown>) : {}
|
||||
const result = data && typeof data === 'object' ? (data as Record<string, unknown>) : {}
|
||||
|
||||
return {
|
||||
action,
|
||||
|
||||
@@ -3,34 +3,34 @@ import { Router } from 'express'
|
||||
import { getAdminOrderDetail, getAdminOrders } from '../../services/admin/admin-read-service.js'
|
||||
import { resendAdminOrderKuaishouIndustryVoucherCodes } from '../../services/admin/write/kuaishou-cloud-actions.js'
|
||||
import { createJsonHandler, requireAdminRoles } from './session.js'
|
||||
import type {
|
||||
AdminOrderRouteParams,
|
||||
AdminOrderRouteQuery,
|
||||
} from '../../types/admin/route-inputs.js'
|
||||
import type { AdminOrderRouteParams, AdminOrderRouteQuery } from '../../types/admin/route-inputs.js'
|
||||
|
||||
const router = Router()
|
||||
|
||||
router.get('/orders', createJsonHandler(
|
||||
(req) => getAdminOrders(req.query as AdminOrderRouteQuery),
|
||||
{
|
||||
router.get(
|
||||
'/orders',
|
||||
createJsonHandler((req) => getAdminOrders(req.query as AdminOrderRouteQuery), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取订单列表失败',
|
||||
scope: '[admin/orders]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
router.get('/orders/:orderId', createJsonHandler(
|
||||
(req) =>
|
||||
getAdminOrderDetail(
|
||||
String((req.params as AdminOrderRouteParams).orderId || ''),
|
||||
req.adminSession || null,
|
||||
),
|
||||
{
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取订单详情失败',
|
||||
scope: '[admin/orders/:orderId]',
|
||||
},
|
||||
))
|
||||
router.get(
|
||||
'/orders/:orderId',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminOrderDetail(
|
||||
String((req.params as AdminOrderRouteParams).orderId || ''),
|
||||
req.adminSession || null,
|
||||
),
|
||||
{
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取订单详情失败',
|
||||
scope: '[admin/orders/:orderId]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/orders/:orderId/kuaishou-industry/resend-code',
|
||||
@@ -49,7 +49,7 @@ router.post(
|
||||
action: 'order_kuaishou_industry_resend_code',
|
||||
targetType: 'order',
|
||||
targetId: String((req.params as AdminOrderRouteParams).orderId || ''),
|
||||
data: data && typeof data === 'object' ? data as Record<string, unknown> : {},
|
||||
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
||||
}),
|
||||
},
|
||||
),
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import { requireAdminRoles } from "./session.js";
|
||||
import cloudtentaclesRouter from "./platform-config/cloudtentacles.js";
|
||||
import kuaishouIndustryRouter from "./platform-config/kuaishou-industry.js";
|
||||
import kuaishouFeifeiRouter from "./platform-config/kuaishou-feifei.js";
|
||||
import ninetyoneRouter from "./platform-config/ninetyone.js";
|
||||
import notificationsRouter from "./platform-config/notifications.js";
|
||||
import fulfillmentRoutingRouter from "./platform-config/fulfillment-routing.js";
|
||||
import affiliateDashRouter from "./platform-config/affiliate-dash.js";
|
||||
import { requireAdminRoles } from './session.js'
|
||||
import cloudtentaclesRouter from './platform-config/cloudtentacles.js'
|
||||
import kuaishouIndustryRouter from './platform-config/kuaishou-industry.js'
|
||||
import kuaishouFeifeiRouter from './platform-config/kuaishou-feifei.js'
|
||||
import ninetyoneRouter from './platform-config/ninetyone.js'
|
||||
import notificationsRouter from './platform-config/notifications.js'
|
||||
import fulfillmentRoutingRouter from './platform-config/fulfillment-routing.js'
|
||||
import affiliateDashRouter from './platform-config/affiliate-dash.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.use("/platform-config", kuaishouIndustryRouter);
|
||||
router.use("/platform-config", requireAdminRoles(["admin"]));
|
||||
router.use("/platform-config", notificationsRouter);
|
||||
router.use("/platform-config", kuaishouFeifeiRouter);
|
||||
router.use("/platform-config", ninetyoneRouter);
|
||||
router.use("/platform-config", fulfillmentRoutingRouter);
|
||||
router.use("/platform-config", cloudtentaclesRouter);
|
||||
router.use("/platform-config", affiliateDashRouter);
|
||||
router.use('/platform-config', kuaishouIndustryRouter)
|
||||
router.use('/platform-config', requireAdminRoles(['admin']))
|
||||
router.use('/platform-config', notificationsRouter)
|
||||
router.use('/platform-config', kuaishouFeifeiRouter)
|
||||
router.use('/platform-config', ninetyoneRouter)
|
||||
router.use('/platform-config', fulfillmentRoutingRouter)
|
||||
router.use('/platform-config', cloudtentaclesRouter)
|
||||
router.use('/platform-config', affiliateDashRouter)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
getAdminAffiliateDashConfig,
|
||||
@@ -6,84 +6,77 @@ import {
|
||||
listAdminAffiliateDashProducts,
|
||||
matchAdminAffiliateDashSku,
|
||||
updateAdminAffiliateDashConfig,
|
||||
} from "../../../services/admin/platform-config/affiliate-dash-service.js";
|
||||
import { createJsonHandler } from "../session.js";
|
||||
import type { JsonRecord } from "../../../types/json.js";
|
||||
} from '../../../services/admin/platform-config/affiliate-dash-service.js'
|
||||
import { createJsonHandler } from '../session.js'
|
||||
import type { JsonRecord } from '../../../types/json.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.get(
|
||||
"/affiliate-dash",
|
||||
'/affiliate-dash',
|
||||
createJsonHandler(() => getAdminAffiliateDashConfig(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取 affiliate-dash 配置失败",
|
||||
scope: "[admin/platform-config/affiliate-dash]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取 affiliate-dash 配置失败',
|
||||
scope: '[admin/platform-config/affiliate-dash]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/affiliate-dash",
|
||||
createJsonHandler(
|
||||
(req) => updateAdminAffiliateDashConfig(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "affiliate-dash 配置已保存",
|
||||
errorMessage: "保存 affiliate-dash 配置失败",
|
||||
scope: "[admin/platform-config/affiliate-dash]",
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const source = result.source as JsonRecord | undefined;
|
||||
const effective = result.effective as JsonRecord | undefined;
|
||||
'/affiliate-dash',
|
||||
createJsonHandler((req) => updateAdminAffiliateDashConfig(req.body as JsonRecord), {
|
||||
successMessage: 'affiliate-dash 配置已保存',
|
||||
errorMessage: '保存 affiliate-dash 配置失败',
|
||||
scope: '[admin/platform-config/affiliate-dash]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
const source = result.source as JsonRecord | undefined
|
||||
const effective = result.effective as JsonRecord | undefined
|
||||
|
||||
return {
|
||||
action: "platform_affiliate_dash_config_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "affiliate_dash",
|
||||
data: {
|
||||
enabled: effective?.enabled !== false,
|
||||
hasAppKey: Boolean(effective?.hasAppKey),
|
||||
hasAppSecret: Boolean(effective?.hasAppSecret),
|
||||
hasCallbackSecret: Boolean(effective?.hasCallbackSecret),
|
||||
skuMappingCount: Number(source?.skuMapping && typeof source.skuMapping === "object"
|
||||
return {
|
||||
action: 'platform_affiliate_dash_config_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'affiliate_dash',
|
||||
data: {
|
||||
enabled: effective?.enabled !== false,
|
||||
hasAppKey: Boolean(effective?.hasAppKey),
|
||||
hasAppSecret: Boolean(effective?.hasAppSecret),
|
||||
hasCallbackSecret: Boolean(effective?.hasCallbackSecret),
|
||||
skuMappingCount: Number(
|
||||
source?.skuMapping && typeof source.skuMapping === 'object'
|
||||
? Object.keys(source.skuMapping).length
|
||||
: 0),
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
: 0,
|
||||
),
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/affiliate-dash/match",
|
||||
createJsonHandler(
|
||||
(req) => matchAdminAffiliateDashSku(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "ok",
|
||||
errorMessage: "匹配 affiliate-dash sku 失败",
|
||||
scope: "[admin/platform-config/affiliate-dash/match]",
|
||||
}
|
||||
)
|
||||
);
|
||||
'/affiliate-dash/match',
|
||||
createJsonHandler((req) => matchAdminAffiliateDashSku(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '匹配 affiliate-dash sku 失败',
|
||||
scope: '[admin/platform-config/affiliate-dash/match]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/affiliate-dash/products",
|
||||
createJsonHandler(
|
||||
(req) => listAdminAffiliateDashProducts(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "ok",
|
||||
errorMessage: "查询 affiliate-dash 商品失败",
|
||||
scope: "[admin/platform-config/affiliate-dash/products]",
|
||||
}
|
||||
)
|
||||
);
|
||||
'/affiliate-dash/products',
|
||||
createJsonHandler((req) => listAdminAffiliateDashProducts(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '查询 affiliate-dash 商品失败',
|
||||
scope: '[admin/platform-config/affiliate-dash/products]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/affiliate-dash/wallet",
|
||||
'/affiliate-dash/wallet',
|
||||
createJsonHandler(() => getAdminAffiliateDashWallet(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "查询 affiliate-dash 钱包失败",
|
||||
scope: "[admin/platform-config/affiliate-dash/wallet]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '查询 affiliate-dash 钱包失败',
|
||||
scope: '[admin/platform-config/affiliate-dash/wallet]',
|
||||
}),
|
||||
)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
appointAdminCloudtentaclesVirtualNumber,
|
||||
@@ -23,7 +23,7 @@ import {
|
||||
useAdminCloudtentaclesSku,
|
||||
validateAdminCloudtentaclesSession,
|
||||
verifyAdminCloudtentaclesLoginCode,
|
||||
} from "../../../services/admin/platform-config/cloudtentacles/index.js";
|
||||
} from '../../../services/admin/platform-config/cloudtentacles/index.js'
|
||||
import type {
|
||||
AdminCloudtentaclesCatalogQueryRouteBody,
|
||||
AdminCloudtentaclesFullFlowRouteBody,
|
||||
@@ -35,398 +35,353 @@ import type {
|
||||
AdminCloudtentaclesTestLoginRouteBody,
|
||||
AdminCloudtentaclesValidateSessionRouteBody,
|
||||
AdminCloudtentaclesVirtualNumberRouteBody,
|
||||
} from "../../../types/admin/route-inputs.js";
|
||||
import { createJsonHandler } from "../session.js";
|
||||
import type { JsonRecord } from "../../../types/json.js";
|
||||
} from '../../../types/admin/route-inputs.js'
|
||||
import { createJsonHandler } from '../session.js'
|
||||
import type { JsonRecord } from '../../../types/json.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.get(
|
||||
"/cloudtentacles-source",
|
||||
'/cloudtentacles-source',
|
||||
createJsonHandler(() => listAdminCloudtentaclesSources(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取 cloudtentacles 履约平台配置失败",
|
||||
scope: "[admin/platform-config/cloudtentacles-source]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取 cloudtentacles 履约平台配置失败',
|
||||
scope: '[admin/platform-config/cloudtentacles-source]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.delete(
|
||||
"/cloudtentacles-source/:sourceKey",
|
||||
'/cloudtentacles-source/:sourceKey',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
deleteAdminCloudtentaclesSource(
|
||||
String(req.params.sourceKey || "").trim()
|
||||
),
|
||||
(req) => deleteAdminCloudtentaclesSource(String(req.params.sourceKey || '').trim()),
|
||||
{
|
||||
successMessage: "cloudtentacles 履约平台配置已删除",
|
||||
errorMessage: "删除 cloudtentacles 履约平台配置失败",
|
||||
scope: "[admin/platform-config/cloudtentacles-source/:sourceKey]",
|
||||
successMessage: 'cloudtentacles 履约平台配置已删除',
|
||||
errorMessage: '删除 cloudtentacles 履约平台配置失败',
|
||||
scope: '[admin/platform-config/cloudtentacles-source/:sourceKey]',
|
||||
audit: (req) => ({
|
||||
action: "platform_cloudtentacles_source_deleted",
|
||||
targetType: "platform_config",
|
||||
targetId: String(req.params.sourceKey || "").trim(),
|
||||
action: 'platform_cloudtentacles_source_deleted',
|
||||
targetType: 'platform_config',
|
||||
targetId: String(req.params.sourceKey || '').trim(),
|
||||
data: {},
|
||||
}),
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles-source",
|
||||
'/cloudtentacles-source',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateAdminCloudtentaclesSourceConfig(
|
||||
req.body as AdminCloudtentaclesSourceConfigRouteBody
|
||||
),
|
||||
updateAdminCloudtentaclesSourceConfig(req.body as AdminCloudtentaclesSourceConfigRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 履约平台配置已保存",
|
||||
errorMessage: "保存 cloudtentacles 履约平台配置失败",
|
||||
scope: "[admin/platform-config/cloudtentacles-source]",
|
||||
successMessage: 'cloudtentacles 履约平台配置已保存',
|
||||
errorMessage: '保存 cloudtentacles 履约平台配置失败',
|
||||
scope: '[admin/platform-config/cloudtentacles-source]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_cloudtentacles_source_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "cloudtentacles_source",
|
||||
action: 'platform_cloudtentacles_source_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'cloudtentacles_source',
|
||||
data: {
|
||||
filePath: String(result.filePath || "").trim(),
|
||||
username: String(result.source?.username || "").trim(),
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
username: String(result.source?.username || '').trim(),
|
||||
enabled: Boolean(result.source?.enabled),
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.get(
|
||||
"/cloudtentacles/override-rules",
|
||||
'/cloudtentacles/override-rules',
|
||||
createJsonHandler(() => getAdminCloudtentaclesOverrideRules(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取 cloudtentacles 覆盖规则失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/override-rules]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取 cloudtentacles 覆盖规则失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/override-rules]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/override-rules",
|
||||
'/cloudtentacles/override-rules',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateAdminCloudtentaclesOverrideRules(
|
||||
req.body as AdminCloudtentaclesOverrideRuleConfigRouteBody
|
||||
req.body as AdminCloudtentaclesOverrideRuleConfigRouteBody,
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 覆盖规则已保存",
|
||||
errorMessage: "保存 cloudtentacles 覆盖规则失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/override-rules]",
|
||||
successMessage: 'cloudtentacles 覆盖规则已保存',
|
||||
errorMessage: '保存 cloudtentacles 覆盖规则失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/override-rules]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_cloudtentacles_override_rules_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "cloudtentacles_override_rules",
|
||||
action: 'platform_cloudtentacles_override_rules_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'cloudtentacles_override_rules',
|
||||
data: {
|
||||
filePath: String(result.filePath || "").trim(),
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: result.enabled !== false,
|
||||
ruleCount: Array.isArray(result.rules) ? result.rules.length : 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/send-sms-code",
|
||||
'/cloudtentacles/send-sms-code',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
sendAdminCloudtentaclesSmsCode(
|
||||
req.body as AdminCloudtentaclesSendSmsCodeRouteBody
|
||||
),
|
||||
(req) => sendAdminCloudtentaclesSmsCode(req.body as AdminCloudtentaclesSendSmsCodeRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 短信验证码已发送",
|
||||
errorMessage: "cloudtentacles 发送短信验证码失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/send-sms-code]",
|
||||
successMessage: 'cloudtentacles 短信验证码已发送',
|
||||
errorMessage: 'cloudtentacles 发送短信验证码失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/send-sms-code]',
|
||||
audit: (req, data) => {
|
||||
const body = req.body as AdminCloudtentaclesSendSmsCodeRouteBody;
|
||||
const result = data as JsonRecord;
|
||||
const body = req.body as AdminCloudtentaclesSendSmsCodeRouteBody
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_cloudtentacles_send_sms_code",
|
||||
targetType: "platform_config",
|
||||
targetId:
|
||||
String(result.username || body.username || "").trim() ||
|
||||
"cloudtentacles",
|
||||
action: 'platform_cloudtentacles_send_sms_code',
|
||||
targetType: 'platform_config',
|
||||
targetId: String(result.username || body.username || '').trim() || 'cloudtentacles',
|
||||
data: {
|
||||
baseUrl: result.baseUrl || String(body.baseUrl || "").trim(),
|
||||
phoneMasked: result.phoneMasked || "",
|
||||
baseUrl: result.baseUrl || String(body.baseUrl || '').trim(),
|
||||
phoneMasked: result.phoneMasked || '',
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/test-login",
|
||||
'/cloudtentacles/test-login',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
testAdminCloudtentaclesLogin(
|
||||
req.body as AdminCloudtentaclesTestLoginRouteBody
|
||||
),
|
||||
(req) => testAdminCloudtentaclesLogin(req.body as AdminCloudtentaclesTestLoginRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 登录测试成功",
|
||||
errorMessage: "cloudtentacles 登录测试失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/test-login]",
|
||||
successMessage: 'cloudtentacles 登录测试成功',
|
||||
errorMessage: 'cloudtentacles 登录测试失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/test-login]',
|
||||
audit: (req, data) => {
|
||||
const body = req.body as AdminCloudtentaclesTestLoginRouteBody;
|
||||
const result = data as JsonRecord;
|
||||
const body = req.body as AdminCloudtentaclesTestLoginRouteBody
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_cloudtentacles_test_login",
|
||||
targetType: "platform_config",
|
||||
targetId:
|
||||
String(result.username || body.username || "").trim() ||
|
||||
"cloudtentacles",
|
||||
action: 'platform_cloudtentacles_test_login',
|
||||
targetType: 'platform_config',
|
||||
targetId: String(result.username || body.username || '').trim() || 'cloudtentacles',
|
||||
data: {
|
||||
baseUrl: result.baseUrl || String(body.baseUrl || "").trim(),
|
||||
baseUrl: result.baseUrl || String(body.baseUrl || '').trim(),
|
||||
permissionCount: Number(result.session?.permissionCount || 0),
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/validate-session",
|
||||
'/cloudtentacles/validate-session',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
validateAdminCloudtentaclesSession(
|
||||
req.body as AdminCloudtentaclesValidateSessionRouteBody
|
||||
),
|
||||
validateAdminCloudtentaclesSession(req.body as AdminCloudtentaclesValidateSessionRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 会话校验成功",
|
||||
errorMessage: "cloudtentacles 会话校验失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/validate-session]",
|
||||
successMessage: 'cloudtentacles 会话校验成功',
|
||||
errorMessage: 'cloudtentacles 会话校验失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/validate-session]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_cloudtentacles_validate_session",
|
||||
targetType: "platform_config",
|
||||
targetId: "cloudtentacles_session",
|
||||
action: 'platform_cloudtentacles_validate_session',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'cloudtentacles_session',
|
||||
data: {
|
||||
baseUrl: String(result.baseUrl || "").trim(),
|
||||
baseUrl: String(result.baseUrl || '').trim(),
|
||||
permissionCount: Number(result.session?.permissionCount || 0),
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/asset",
|
||||
'/cloudtentacles/asset',
|
||||
createJsonHandler(
|
||||
(req) => getAdminCloudtentaclesAsset(req.body as AdminCloudtentaclesCatalogQueryRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles 余额查询成功',
|
||||
errorMessage: 'cloudtentacles 余额查询失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/asset]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/categories',
|
||||
createJsonHandler(
|
||||
(req) => getAdminCloudtentaclesCategories(req.body as AdminCloudtentaclesCatalogQueryRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles 分类查询成功',
|
||||
errorMessage: 'cloudtentacles 分类查询失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/categories]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/sku/list',
|
||||
createJsonHandler(
|
||||
(req) => getAdminCloudtentaclesSkuList(req.body as AdminCloudtentaclesCatalogQueryRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles SKU 列表查询成功',
|
||||
errorMessage: 'cloudtentacles SKU 列表查询失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/sku/list]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/sku/buy',
|
||||
createJsonHandler(
|
||||
(req) => buyAdminCloudtentaclesSku(req.body as AdminCloudtentaclesSkuBuyRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles SKU 购买成功',
|
||||
errorMessage: 'cloudtentacles SKU 购买失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/sku/buy]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/sku/use',
|
||||
createJsonHandler(
|
||||
(req) => useAdminCloudtentaclesSku(req.body as AdminCloudtentaclesSkuUseRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles 发货成功',
|
||||
errorMessage: 'cloudtentacles 发货失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/sku/use]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/knapsack',
|
||||
createJsonHandler(
|
||||
(req) => getAdminCloudtentaclesKnapsack(req.body as AdminCloudtentaclesCatalogQueryRouteBody),
|
||||
{
|
||||
successMessage: 'cloudtentacles 背包查询成功',
|
||||
errorMessage: 'cloudtentacles 背包查询失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/knapsack]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/cloudtentacles/vn/list',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminCloudtentaclesAsset(
|
||||
req.body as AdminCloudtentaclesCatalogQueryRouteBody
|
||||
),
|
||||
listAdminCloudtentaclesVirtualNumbers(req.body as AdminCloudtentaclesVirtualNumberRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 余额查询成功",
|
||||
errorMessage: "cloudtentacles 余额查询失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/asset]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 虚拟号列表查询成功',
|
||||
errorMessage: 'cloudtentacles 虚拟号列表查询失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/list]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/categories",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminCloudtentaclesCategories(
|
||||
req.body as AdminCloudtentaclesCatalogQueryRouteBody
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 分类查询成功",
|
||||
errorMessage: "cloudtentacles 分类查询失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/categories]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/sku/list",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminCloudtentaclesSkuList(
|
||||
req.body as AdminCloudtentaclesCatalogQueryRouteBody
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles SKU 列表查询成功",
|
||||
errorMessage: "cloudtentacles SKU 列表查询失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/sku/list]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/sku/buy",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
buyAdminCloudtentaclesSku(req.body as AdminCloudtentaclesSkuBuyRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles SKU 购买成功",
|
||||
errorMessage: "cloudtentacles SKU 购买失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/sku/buy]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/sku/use",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
useAdminCloudtentaclesSku(req.body as AdminCloudtentaclesSkuUseRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 发货成功",
|
||||
errorMessage: "cloudtentacles 发货失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/sku/use]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/knapsack",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminCloudtentaclesKnapsack(
|
||||
req.body as AdminCloudtentaclesCatalogQueryRouteBody
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 背包查询成功",
|
||||
errorMessage: "cloudtentacles 背包查询失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/knapsack]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/list",
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
listAdminCloudtentaclesVirtualNumbers(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 虚拟号列表查询成功",
|
||||
errorMessage: "cloudtentacles 虚拟号列表查询失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/list]",
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/appoint",
|
||||
'/cloudtentacles/vn/appoint',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
appointAdminCloudtentaclesVirtualNumber(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody,
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 虚拟号申请成功",
|
||||
errorMessage: "cloudtentacles 虚拟号申请失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/appoint]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 虚拟号申请成功',
|
||||
errorMessage: 'cloudtentacles 虚拟号申请失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/appoint]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/generate-login-code",
|
||||
'/cloudtentacles/vn/generate-login-code',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
generateAdminCloudtentaclesLoginCode(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
),
|
||||
generateAdminCloudtentaclesLoginCode(req.body as AdminCloudtentaclesVirtualNumberRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 登录码生成成功",
|
||||
errorMessage: "cloudtentacles 登录码生成失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/generate-login-code]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 登录码生成成功',
|
||||
errorMessage: 'cloudtentacles 登录码生成失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/generate-login-code]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/fetch-code",
|
||||
'/cloudtentacles/vn/fetch-code',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
fetchAdminCloudtentaclesVirtualNumberCode(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody,
|
||||
),
|
||||
{
|
||||
successMessage: "cloudtentacles 验证码获取成功",
|
||||
errorMessage: "cloudtentacles 验证码获取失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/fetch-code]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 验证码获取成功',
|
||||
errorMessage: 'cloudtentacles 验证码获取失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/fetch-code]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/verify-code",
|
||||
'/cloudtentacles/vn/verify-code',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
verifyAdminCloudtentaclesLoginCode(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
),
|
||||
verifyAdminCloudtentaclesLoginCode(req.body as AdminCloudtentaclesVirtualNumberRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 登录码校验成功",
|
||||
errorMessage: "cloudtentacles 登录码校验失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/verify-code]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 登录码校验成功',
|
||||
errorMessage: 'cloudtentacles 登录码校验失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/verify-code]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/bind-url",
|
||||
'/cloudtentacles/vn/bind-url',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
getAdminCloudtentaclesBindUrl(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
),
|
||||
(req) => getAdminCloudtentaclesBindUrl(req.body as AdminCloudtentaclesVirtualNumberRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 兑换链接获取成功",
|
||||
errorMessage: "cloudtentacles 兑换链接获取失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/bind-url]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 兑换链接获取成功',
|
||||
errorMessage: 'cloudtentacles 兑换链接获取失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/bind-url]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/vn/back",
|
||||
'/cloudtentacles/vn/back',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
backAdminCloudtentaclesVirtualNumber(
|
||||
req.body as AdminCloudtentaclesVirtualNumberRouteBody
|
||||
),
|
||||
backAdminCloudtentaclesVirtualNumber(req.body as AdminCloudtentaclesVirtualNumberRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 号码退还成功",
|
||||
errorMessage: "cloudtentacles 号码退还失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/vn/back]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 号码退还成功',
|
||||
errorMessage: 'cloudtentacles 号码退还失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/vn/back]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/cloudtentacles/debug/full-flow",
|
||||
'/cloudtentacles/debug/full-flow',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
runAdminCloudtentaclesFullFlow(
|
||||
req.body as AdminCloudtentaclesFullFlowRouteBody
|
||||
),
|
||||
(req) => runAdminCloudtentaclesFullFlow(req.body as AdminCloudtentaclesFullFlowRouteBody),
|
||||
{
|
||||
successMessage: "cloudtentacles 完整调试流程执行成功",
|
||||
errorMessage: "cloudtentacles 完整调试流程执行失败",
|
||||
scope: "[admin/platform-config/cloudtentacles/debug/full-flow]",
|
||||
}
|
||||
)
|
||||
);
|
||||
successMessage: 'cloudtentacles 完整调试流程执行成功',
|
||||
errorMessage: 'cloudtentacles 完整调试流程执行失败',
|
||||
scope: '[admin/platform-config/cloudtentacles/debug/full-flow]',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -21,39 +21,33 @@ router.get(
|
||||
|
||||
router.post(
|
||||
'/fulfillment-routing',
|
||||
createJsonHandler(
|
||||
(req) => updateAdminFulfillmentRoutingConfig(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: '履约路由配置已保存',
|
||||
errorMessage: '保存履约路由配置失败',
|
||||
scope: '[admin/platform-config/fulfillment-routing]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: 'platform_fulfillment_routing_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'fulfillment_routing',
|
||||
data: {
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: result.enabled !== false,
|
||||
ruleCount: Array.isArray(result.rules) ? result.rules.length : 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
createJsonHandler((req) => updateAdminFulfillmentRoutingConfig(req.body as JsonRecord), {
|
||||
successMessage: '履约路由配置已保存',
|
||||
errorMessage: '保存履约路由配置失败',
|
||||
scope: '[admin/platform-config/fulfillment-routing]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: 'platform_fulfillment_routing_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'fulfillment_routing',
|
||||
data: {
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: result.enabled !== false,
|
||||
ruleCount: Array.isArray(result.rules) ? result.rules.length : 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
),
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
'/fulfillment-routing/preview',
|
||||
createJsonHandler(
|
||||
(req) => previewAdminFulfillmentRouting(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: 'ok',
|
||||
errorMessage: '预览履约路由失败',
|
||||
scope: '[admin/platform-config/fulfillment-routing/preview]',
|
||||
},
|
||||
),
|
||||
createJsonHandler((req) => previewAdminFulfillmentRouting(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '预览履约路由失败',
|
||||
scope: '[admin/platform-config/fulfillment-routing/preview]',
|
||||
}),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
createAdminKuaishouFeifeiTestOrder,
|
||||
@@ -8,137 +8,117 @@ import {
|
||||
queryAdminKuaishouFeifeiTestOrder,
|
||||
syncAdminKuaishouFeifeiProductRules,
|
||||
updateAdminKuaishouFeifeiConfig,
|
||||
} from "../../../services/admin/platform-config/kuaishou-feifei-service.js";
|
||||
import { createJsonHandler } from "../session.js";
|
||||
import type { JsonRecord } from "../../../types/json.js";
|
||||
} from '../../../services/admin/platform-config/kuaishou-feifei-service.js'
|
||||
import { createJsonHandler } from '../session.js'
|
||||
import type { JsonRecord } from '../../../types/json.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.get(
|
||||
"/kuaishou-feifei",
|
||||
'/kuaishou-feifei',
|
||||
createJsonHandler(() => getAdminKuaishouFeifeiConfig(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取 kuaishou-feifei 配置失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取 kuaishou-feifei 配置失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei",
|
||||
createJsonHandler(
|
||||
(req) => updateAdminKuaishouFeifeiConfig(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "kuaishou-feifei 配置已保存",
|
||||
errorMessage: "保存 kuaishou-feifei 配置失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei]",
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const source = result.source as JsonRecord | undefined;
|
||||
return {
|
||||
action: "platform_kuaishou_feifei_config_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "kuaishou_feifei",
|
||||
data: {
|
||||
filePath: String(result.filePath || "").trim(),
|
||||
enabled: source?.enabled !== false,
|
||||
ruleCount: Array.isArray(source?.productRules)
|
||||
? source.productRules.length
|
||||
: 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
'/kuaishou-feifei',
|
||||
createJsonHandler((req) => updateAdminKuaishouFeifeiConfig(req.body as JsonRecord), {
|
||||
successMessage: 'kuaishou-feifei 配置已保存',
|
||||
errorMessage: '保存 kuaishou-feifei 配置失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
const source = result.source as JsonRecord | undefined
|
||||
return {
|
||||
action: 'platform_kuaishou_feifei_config_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'kuaishou_feifei',
|
||||
data: {
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: source?.enabled !== false,
|
||||
ruleCount: Array.isArray(source?.productRules) ? source.productRules.length : 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei/match",
|
||||
createJsonHandler(
|
||||
(req) => matchAdminKuaishouFeifeiProduct(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "ok",
|
||||
errorMessage: "匹配 kuaishou-feifei 商品失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei/match]",
|
||||
}
|
||||
)
|
||||
);
|
||||
'/kuaishou-feifei/match',
|
||||
createJsonHandler((req) => matchAdminKuaishouFeifeiProduct(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '匹配 kuaishou-feifei 商品失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei/match]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei/products",
|
||||
createJsonHandler(
|
||||
(req) => listAdminKuaishouFeifeiProducts(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "ok",
|
||||
errorMessage: "查询 kuaishou-feifei 商品失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei/products]",
|
||||
}
|
||||
)
|
||||
);
|
||||
'/kuaishou-feifei/products',
|
||||
createJsonHandler((req) => listAdminKuaishouFeifeiProducts(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '查询 kuaishou-feifei 商品失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei/products]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei/sync-products",
|
||||
createJsonHandler(
|
||||
(req) => syncAdminKuaishouFeifeiProductRules(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "kuaishou-feifei 商品映射已同步",
|
||||
errorMessage: "同步 kuaishou-feifei 商品映射失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei/sync-products]",
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const sync = result.sync as JsonRecord | undefined;
|
||||
'/kuaishou-feifei/sync-products',
|
||||
createJsonHandler((req) => syncAdminKuaishouFeifeiProductRules(req.body as JsonRecord), {
|
||||
successMessage: 'kuaishou-feifei 商品映射已同步',
|
||||
errorMessage: '同步 kuaishou-feifei 商品映射失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei/sync-products]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
const sync = result.sync as JsonRecord | undefined
|
||||
|
||||
return {
|
||||
action: "platform_kuaishou_feifei_products_synced",
|
||||
targetType: "platform_config",
|
||||
targetId: "kuaishou_feifei",
|
||||
data: {
|
||||
productCount: Number(sync?.productCount || 0) || 0,
|
||||
ruleCount: Number(sync?.ruleCount || 0) || 0,
|
||||
status: String(sync?.status || "").trim(),
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
return {
|
||||
action: 'platform_kuaishou_feifei_products_synced',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'kuaishou_feifei',
|
||||
data: {
|
||||
productCount: Number(sync?.productCount || 0) || 0,
|
||||
ruleCount: Number(sync?.ruleCount || 0) || 0,
|
||||
status: String(sync?.status || '').trim(),
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei/test-order",
|
||||
createJsonHandler(
|
||||
(req) => createAdminKuaishouFeifeiTestOrder(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "kuaishou-feifei 测试单已创建",
|
||||
errorMessage: "创建 kuaishou-feifei 测试单失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei/test-order]",
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
'/kuaishou-feifei/test-order',
|
||||
createJsonHandler((req) => createAdminKuaishouFeifeiTestOrder(req.body as JsonRecord), {
|
||||
successMessage: 'kuaishou-feifei 测试单已创建',
|
||||
errorMessage: '创建 kuaishou-feifei 测试单失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei/test-order]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
|
||||
return {
|
||||
action: "platform_kuaishou_feifei_test_order_created",
|
||||
targetType: "platform_config",
|
||||
targetId: "kuaishou_feifei",
|
||||
data: {
|
||||
orderNo: String(result.orderNo || "").trim(),
|
||||
platformOrderNo: String(result.platformOrderNo || "").trim(),
|
||||
productCode: String(result.productCode || "").trim(),
|
||||
rechargeStatus: Number(result.rechargeStatus || 0) || 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
return {
|
||||
action: 'platform_kuaishou_feifei_test_order_created',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'kuaishou_feifei',
|
||||
data: {
|
||||
orderNo: String(result.orderNo || '').trim(),
|
||||
platformOrderNo: String(result.platformOrderNo || '').trim(),
|
||||
productCode: String(result.productCode || '').trim(),
|
||||
rechargeStatus: Number(result.rechargeStatus || 0) || 0,
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/kuaishou-feifei/query-order",
|
||||
createJsonHandler(
|
||||
(req) => queryAdminKuaishouFeifeiTestOrder(req.body as JsonRecord),
|
||||
{
|
||||
successMessage: "ok",
|
||||
errorMessage: "查询 kuaishou-feifei 订单失败",
|
||||
scope: "[admin/platform-config/kuaishou-feifei/query-order]",
|
||||
}
|
||||
)
|
||||
);
|
||||
'/kuaishou-feifei/query-order',
|
||||
createJsonHandler((req) => queryAdminKuaishouFeifeiTestOrder(req.body as JsonRecord), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '查询 kuaishou-feifei 订单失败',
|
||||
scope: '[admin/platform-config/kuaishou-feifei/query-order]',
|
||||
}),
|
||||
)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -1,77 +1,75 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
failAdminNinetyoneOrder,
|
||||
getAdminNinetyoneOrders,
|
||||
retryAdminNinetyoneOrder,
|
||||
} from "../../../services/admin/platform-config/ninetyone-service.js";
|
||||
import type { AdminEntityRouteParams } from "../../../types/admin/route-inputs.js";
|
||||
import { createJsonHandler } from "../session.js";
|
||||
import type { JsonRecord } from "../../../types/json.js";
|
||||
} from '../../../services/admin/platform-config/ninetyone-service.js'
|
||||
import type { AdminEntityRouteParams } from '../../../types/admin/route-inputs.js'
|
||||
import { createJsonHandler } from '../session.js'
|
||||
import type { JsonRecord } from '../../../types/json.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.get(
|
||||
"/ninetyone/orders",
|
||||
'/ninetyone/orders',
|
||||
createJsonHandler((req) => getAdminNinetyoneOrders(req.query), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取 91卡券订单失败",
|
||||
scope: "[admin/platform-config/ninetyone/orders]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取 91卡券订单失败',
|
||||
scope: '[admin/platform-config/ninetyone/orders]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/ninetyone/orders/:id/retry",
|
||||
'/ninetyone/orders/:id/retry',
|
||||
createJsonHandler(
|
||||
(req) => retryAdminNinetyoneOrder(String((req.params as AdminEntityRouteParams).id || "")),
|
||||
(req) => retryAdminNinetyoneOrder(String((req.params as AdminEntityRouteParams).id || '')),
|
||||
{
|
||||
successMessage: "91卡券订单已重试",
|
||||
errorMessage: "重试 91卡券订单失败",
|
||||
scope: "[admin/platform-config/ninetyone/orders/:id/retry]",
|
||||
successMessage: '91卡券订单已重试',
|
||||
errorMessage: '重试 91卡券订单失败',
|
||||
scope: '[admin/platform-config/ninetyone/orders/:id/retry]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_ninetyone_order_retried",
|
||||
targetType: "order",
|
||||
targetId: String(result.orderId || "").trim(),
|
||||
action: 'platform_ninetyone_order_retried',
|
||||
targetType: 'order',
|
||||
targetId: String(result.orderId || '').trim(),
|
||||
data: {
|
||||
orderNo: String(result.orderNo || "").trim(),
|
||||
orderNo: String(result.orderNo || '').trim(),
|
||||
taskCount: Number(result.taskCount || 0),
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/ninetyone/orders/:id/fail",
|
||||
'/ninetyone/orders/:id/fail',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
failAdminNinetyoneOrder(
|
||||
String((req.params as AdminEntityRouteParams).id || ""),
|
||||
req.body as { reason?: string }
|
||||
String((req.params as AdminEntityRouteParams).id || ''),
|
||||
req.body as { reason?: string },
|
||||
),
|
||||
{
|
||||
successMessage: "91卡券订单已标记失败",
|
||||
errorMessage: "标记 91卡券订单失败",
|
||||
scope: "[admin/platform-config/ninetyone/orders/:id/fail]",
|
||||
successMessage: '91卡券订单已标记失败',
|
||||
errorMessage: '标记 91卡券订单失败',
|
||||
scope: '[admin/platform-config/ninetyone/orders/:id/fail]',
|
||||
audit: (req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_ninetyone_order_failed",
|
||||
targetType: "order",
|
||||
targetId: String(result.orderId || "").trim(),
|
||||
action: 'platform_ninetyone_order_failed',
|
||||
targetType: 'order',
|
||||
targetId: String(result.orderId || '').trim(),
|
||||
data: {
|
||||
orderNo: String(result.orderNo || "").trim(),
|
||||
reason: String(
|
||||
(req.body as { reason?: string }).reason || ""
|
||||
).trim(),
|
||||
orderNo: String(result.orderNo || '').trim(),
|
||||
reason: String((req.body as { reason?: string }).reason || '').trim(),
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Router } from "express";
|
||||
import { Router } from 'express'
|
||||
|
||||
import {
|
||||
getAdminNotificationConfig,
|
||||
@@ -7,152 +7,132 @@ import {
|
||||
testAdminNotification,
|
||||
updateAdminNotificationConfig,
|
||||
updateAdminScheduledJobsConfig,
|
||||
} from "../../../services/admin/platform-config/notification-service.js";
|
||||
} from '../../../services/admin/platform-config/notification-service.js'
|
||||
import type {
|
||||
AdminEntityRouteParams,
|
||||
AdminNotificationConfigRouteBody,
|
||||
AdminNotificationTestRouteBody,
|
||||
AdminScheduledJobsConfigRouteBody,
|
||||
} from "../../../types/admin/route-inputs.js";
|
||||
import { createJsonHandler } from "../session.js";
|
||||
import type { JsonRecord } from "../../../types/json.js";
|
||||
} from '../../../types/admin/route-inputs.js'
|
||||
import { createJsonHandler } from '../session.js'
|
||||
import type { JsonRecord } from '../../../types/json.js'
|
||||
|
||||
const router = Router();
|
||||
const router = Router()
|
||||
|
||||
router.get(
|
||||
"/notifications",
|
||||
'/notifications',
|
||||
createJsonHandler(() => getAdminNotificationConfig(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取内部通知配置失败",
|
||||
scope: "[admin/platform-config/notifications]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取内部通知配置失败',
|
||||
scope: '[admin/platform-config/notifications]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/notifications",
|
||||
'/notifications',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateAdminNotificationConfig(
|
||||
req.body as AdminNotificationConfigRouteBody
|
||||
),
|
||||
(req) => updateAdminNotificationConfig(req.body as AdminNotificationConfigRouteBody),
|
||||
{
|
||||
successMessage: "内部通知配置已保存",
|
||||
errorMessage: "保存内部通知配置失败",
|
||||
scope: "[admin/platform-config/notifications]",
|
||||
successMessage: '内部通知配置已保存',
|
||||
errorMessage: '保存内部通知配置失败',
|
||||
scope: '[admin/platform-config/notifications]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_notification_config_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "notifications",
|
||||
action: 'platform_notification_config_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'notifications',
|
||||
data: {
|
||||
filePath: String(result.filePath || "").trim(),
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: Boolean(result.source?.enabled),
|
||||
barkRecipientCount: Array.isArray(
|
||||
result.source?.channels?.bark?.recipients
|
||||
)
|
||||
barkRecipientCount: Array.isArray(result.source?.channels?.bark?.recipients)
|
||||
? result.source.channels.bark.recipients.length
|
||||
: 0,
|
||||
wpushRecipientCount: Array.isArray(
|
||||
result.source?.channels?.wpush?.recipients
|
||||
)
|
||||
wpushRecipientCount: Array.isArray(result.source?.channels?.wpush?.recipients)
|
||||
? result.source.channels.wpush.recipients.length
|
||||
: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/notifications/test",
|
||||
createJsonHandler(
|
||||
(req) => testAdminNotification(req.body as AdminNotificationTestRouteBody),
|
||||
{
|
||||
successMessage: "内部通知测试已执行",
|
||||
errorMessage: "内部通知测试失败",
|
||||
scope: "[admin/platform-config/notifications/test]",
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
return {
|
||||
action: "platform_notification_test_sent",
|
||||
targetType: "platform_config",
|
||||
targetId: "notifications",
|
||||
data: {
|
||||
channel: String(result.channel || "").trim(),
|
||||
successCount: Number(result.successCount || 0),
|
||||
failedCount: Number(result.failedCount || 0),
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
'/notifications/test',
|
||||
createJsonHandler((req) => testAdminNotification(req.body as AdminNotificationTestRouteBody), {
|
||||
successMessage: '内部通知测试已执行',
|
||||
errorMessage: '内部通知测试失败',
|
||||
scope: '[admin/platform-config/notifications/test]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: 'platform_notification_test_sent',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'notifications',
|
||||
data: {
|
||||
channel: String(result.channel || '').trim(),
|
||||
successCount: Number(result.successCount || 0),
|
||||
failedCount: Number(result.failedCount || 0),
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
router.get(
|
||||
"/scheduled-jobs",
|
||||
'/scheduled-jobs',
|
||||
createJsonHandler(() => getAdminScheduledJobsConfig(), {
|
||||
successMessage: "ok",
|
||||
errorMessage: "读取定时任务配置失败",
|
||||
scope: "[admin/platform-config/scheduled-jobs]",
|
||||
})
|
||||
);
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取定时任务配置失败',
|
||||
scope: '[admin/platform-config/scheduled-jobs]',
|
||||
}),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/scheduled-jobs",
|
||||
'/scheduled-jobs',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateAdminScheduledJobsConfig(
|
||||
req.body as AdminScheduledJobsConfigRouteBody
|
||||
),
|
||||
(req) => updateAdminScheduledJobsConfig(req.body as AdminScheduledJobsConfigRouteBody),
|
||||
{
|
||||
successMessage: "定时任务配置已保存",
|
||||
errorMessage: "保存定时任务配置失败",
|
||||
scope: "[admin/platform-config/scheduled-jobs]",
|
||||
successMessage: '定时任务配置已保存',
|
||||
errorMessage: '保存定时任务配置失败',
|
||||
scope: '[admin/platform-config/scheduled-jobs]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: "platform_scheduled_jobs_updated",
|
||||
targetType: "platform_config",
|
||||
targetId: "scheduled_jobs",
|
||||
action: 'platform_scheduled_jobs_updated',
|
||||
targetType: 'platform_config',
|
||||
targetId: 'scheduled_jobs',
|
||||
data: {
|
||||
filePath: String(result.filePath || "").trim(),
|
||||
filePath: String(result.filePath || '').trim(),
|
||||
enabled: Boolean(result.source?.enabled),
|
||||
jobCount: Array.isArray(result.source?.jobs)
|
||||
? result.source.jobs.length
|
||||
: 0,
|
||||
jobCount: Array.isArray(result.source?.jobs) ? result.source.jobs.length : 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.post(
|
||||
"/scheduled-jobs/:id/run",
|
||||
createJsonHandler(
|
||||
(req) => runAdminScheduledJobNow((req.params as AdminEntityRouteParams).id),
|
||||
{
|
||||
successMessage: "定时任务已执行",
|
||||
errorMessage: "执行定时任务失败",
|
||||
scope: "[admin/platform-config/scheduled-jobs/:id/run]",
|
||||
audit: (req, data) => {
|
||||
const result = data as JsonRecord;
|
||||
return {
|
||||
action: "platform_scheduled_job_run",
|
||||
targetType: "platform_config",
|
||||
targetId: String(
|
||||
(req.params as AdminEntityRouteParams).id || ""
|
||||
).trim(),
|
||||
data: {
|
||||
status: String(result.result?.status || "").trim(),
|
||||
message: String(result.result?.message || "").trim(),
|
||||
},
|
||||
};
|
||||
},
|
||||
}
|
||||
)
|
||||
);
|
||||
'/scheduled-jobs/:id/run',
|
||||
createJsonHandler((req) => runAdminScheduledJobNow((req.params as AdminEntityRouteParams).id), {
|
||||
successMessage: '定时任务已执行',
|
||||
errorMessage: '执行定时任务失败',
|
||||
scope: '[admin/platform-config/scheduled-jobs/:id/run]',
|
||||
audit: (req, data) => {
|
||||
const result = data as JsonRecord
|
||||
return {
|
||||
action: 'platform_scheduled_job_run',
|
||||
targetType: 'platform_config',
|
||||
targetId: String((req.params as AdminEntityRouteParams).id || '').trim(),
|
||||
data: {
|
||||
status: String(result.result?.status || '').trim(),
|
||||
message: String(result.result?.message || '').trim(),
|
||||
},
|
||||
}
|
||||
},
|
||||
}),
|
||||
)
|
||||
|
||||
export default router;
|
||||
export default router
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import type { Request, Response, NextFunction } from 'express'
|
||||
import { requireAdminRole, verifyAdminSessionToken } from '../../services/admin/admin-auth-service.js'
|
||||
import {
|
||||
requireAdminRole,
|
||||
verifyAdminSessionToken,
|
||||
} from '../../services/admin/admin-auth-service.js'
|
||||
import { writeAdminAuditLog } from '../../services/admin/admin-audit-service.js'
|
||||
import { buildSuccessPayload, createHttpError, sendRouteError } from '../../utils/http.js'
|
||||
import { logWarn } from '../../utils/logger.js'
|
||||
@@ -53,7 +56,11 @@ export function createFileHandler(
|
||||
}
|
||||
}
|
||||
|
||||
export async function requireAdminSession(req: Request, res: Response, next: NextFunction): Promise<void> {
|
||||
export async function requireAdminSession(
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction,
|
||||
): Promise<void> {
|
||||
try {
|
||||
req.adminSession = await verifyAdminSessionToken(extractBearerToken(req))
|
||||
next()
|
||||
|
||||
@@ -105,11 +105,7 @@ router.post(
|
||||
'/tasks/:taskId/kuaishou-cloud/dispatch',
|
||||
requireAdminRoles(['admin', 'operator']),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
dispatchAdminTaskKuaishouCloudFulfillment(
|
||||
getTaskId(req),
|
||||
req.adminSession || null,
|
||||
),
|
||||
(req) => dispatchAdminTaskKuaishouCloudFulfillment(getTaskId(req), req.adminSession || null),
|
||||
{
|
||||
successMessage: '已完成绑定确认并发货',
|
||||
errorMessage: '执行发货失败',
|
||||
@@ -152,8 +148,7 @@ router.post(
|
||||
'/tasks/:taskId/kuaishou-industry/resend-code',
|
||||
requireAdminRoles(['admin', 'operator', 'support']),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
resendAdminTaskKuaishouIndustryVoucherCode(getTaskId(req), req.adminSession || null),
|
||||
(req) => resendAdminTaskKuaishouIndustryVoucherCode(getTaskId(req), req.adminSession || null),
|
||||
{
|
||||
successMessage: '电子凭证发码回调已重发',
|
||||
errorMessage: '重发电子凭证发码回调失败',
|
||||
|
||||
@@ -22,18 +22,18 @@ const router = Router()
|
||||
|
||||
router.use('/users', requireAdminRoles(['admin']))
|
||||
|
||||
router.get('/users', createJsonHandler(
|
||||
(req) => getAdminUserList(req.query),
|
||||
{
|
||||
router.get(
|
||||
'/users',
|
||||
createJsonHandler((req) => getAdminUserList(req.query), {
|
||||
successMessage: 'ok',
|
||||
errorMessage: '读取后台用户列表失败',
|
||||
scope: '[admin/users]',
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
router.post('/users', createJsonHandler(
|
||||
(req) => createManagedAdminUser(req.body),
|
||||
{
|
||||
router.post(
|
||||
'/users',
|
||||
createJsonHandler((req) => createManagedAdminUser(req.body), {
|
||||
successMessage: '后台用户已创建',
|
||||
errorMessage: '创建后台用户失败',
|
||||
scope: '[admin/users:create]',
|
||||
@@ -50,69 +50,88 @@ router.post('/users', createJsonHandler(
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
))
|
||||
}),
|
||||
)
|
||||
|
||||
router.post('/users/:userId/role', createJsonHandler(
|
||||
(req) => updateManagedAdminUserRole(String(req.params.userId || ''), req.body, getRequiredAdminSession(req)),
|
||||
{
|
||||
successMessage: '用户角色已更新',
|
||||
errorMessage: '更新用户角色失败',
|
||||
scope: '[admin/users/:userId/role]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_role_updated',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
role: result.user.role,
|
||||
},
|
||||
}
|
||||
router.post(
|
||||
'/users/:userId/role',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateManagedAdminUserRole(
|
||||
String(req.params.userId || ''),
|
||||
req.body,
|
||||
getRequiredAdminSession(req),
|
||||
),
|
||||
{
|
||||
successMessage: '用户角色已更新',
|
||||
errorMessage: '更新用户角色失败',
|
||||
scope: '[admin/users/:userId/role]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_role_updated',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
role: result.user.role,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
))
|
||||
),
|
||||
)
|
||||
|
||||
router.post('/users/:userId/status', createJsonHandler(
|
||||
(req) => updateManagedAdminUserStatus(String(req.params.userId || ''), req.body, getRequiredAdminSession(req)),
|
||||
{
|
||||
successMessage: '用户状态已更新',
|
||||
errorMessage: '更新用户状态失败',
|
||||
scope: '[admin/users/:userId/status]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_status_updated',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
status: result.user.status,
|
||||
},
|
||||
}
|
||||
router.post(
|
||||
'/users/:userId/status',
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
updateManagedAdminUserStatus(
|
||||
String(req.params.userId || ''),
|
||||
req.body,
|
||||
getRequiredAdminSession(req),
|
||||
),
|
||||
{
|
||||
successMessage: '用户状态已更新',
|
||||
errorMessage: '更新用户状态失败',
|
||||
scope: '[admin/users/:userId/status]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_status_updated',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
status: result.user.status,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
))
|
||||
),
|
||||
)
|
||||
|
||||
router.post('/users/:userId/reset-password', createJsonHandler(
|
||||
(req) => resetManagedAdminUserPassword(String(req.params.userId || ''), req.body),
|
||||
{
|
||||
successMessage: '用户密码已重置',
|
||||
errorMessage: '重置用户密码失败',
|
||||
scope: '[admin/users/:userId/reset-password]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_password_reset',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
},
|
||||
}
|
||||
router.post(
|
||||
'/users/:userId/reset-password',
|
||||
createJsonHandler(
|
||||
(req) => resetManagedAdminUserPassword(String(req.params.userId || ''), req.body),
|
||||
{
|
||||
successMessage: '用户密码已重置',
|
||||
errorMessage: '重置用户密码失败',
|
||||
scope: '[admin/users/:userId/reset-password]',
|
||||
audit: (_req, data) => {
|
||||
const result = data as AdminUserMutationResult
|
||||
return {
|
||||
action: 'admin_user_password_reset',
|
||||
targetType: 'admin_user',
|
||||
targetId: String(result.user.userId),
|
||||
data: {
|
||||
username: result.user.username,
|
||||
},
|
||||
}
|
||||
},
|
||||
},
|
||||
},
|
||||
))
|
||||
),
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
@@ -266,8 +266,7 @@ router.post(
|
||||
'/worker-platform/finance-requests/:requestId/review',
|
||||
requireAdminRoles(['admin', 'operator']),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
reviewAdminWorkerFinanceRequest(String(req.params.requestId || ''), req.body || {}),
|
||||
(req) => reviewAdminWorkerFinanceRequest(String(req.params.requestId || ''), req.body || {}),
|
||||
{
|
||||
successMessage: '资金申请已处理',
|
||||
errorMessage: '处理资金申请失败',
|
||||
@@ -387,20 +386,23 @@ router.post(
|
||||
router.post(
|
||||
'/worker-platform/orders/:workOrderId/cancel',
|
||||
requireAdminRoles(['admin', 'operator', 'support']),
|
||||
createJsonHandler((req) => cancelAdminWorkOrder(String(req.params.workOrderId || ''), req.body || {}), {
|
||||
successMessage: '撤单处理完成,打手额度已恢复',
|
||||
errorMessage: '撤单失败',
|
||||
scope: '[admin/worker-platform/orders/:workOrderId/cancel]',
|
||||
audit: (req, data) => ({
|
||||
action:
|
||||
String(req.body?.action || '').trim() === 'return_to_hall'
|
||||
? 'work_order_returned_to_hall'
|
||||
: 'work_order_cancelled',
|
||||
targetType: 'work_order',
|
||||
targetId: String(req.params.workOrderId || ''),
|
||||
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
||||
}),
|
||||
}),
|
||||
createJsonHandler(
|
||||
(req) => cancelAdminWorkOrder(String(req.params.workOrderId || ''), req.body || {}),
|
||||
{
|
||||
successMessage: '撤单处理完成,打手额度已恢复',
|
||||
errorMessage: '撤单失败',
|
||||
scope: '[admin/worker-platform/orders/:workOrderId/cancel]',
|
||||
audit: (req, data) => ({
|
||||
action:
|
||||
String(req.body?.action || '').trim() === 'return_to_hall'
|
||||
? 'work_order_returned_to_hall'
|
||||
: 'work_order_cancelled',
|
||||
targetType: 'work_order',
|
||||
targetId: String(req.params.workOrderId || ''),
|
||||
data: data && typeof data === 'object' ? (data as Record<string, unknown>) : {},
|
||||
}),
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
router.delete(
|
||||
@@ -576,10 +578,7 @@ router.post(
|
||||
requireAdminRoles(['admin', 'operator']),
|
||||
createJsonHandler(
|
||||
(req) =>
|
||||
deductAdminWorkOrderPendingDeposit(
|
||||
String(req.params.workOrderId || ''),
|
||||
req.body || {},
|
||||
),
|
||||
deductAdminWorkOrderPendingDeposit(String(req.params.workOrderId || ''), req.body || {}),
|
||||
{
|
||||
successMessage: '待解冻押金已扣减',
|
||||
errorMessage: '扣减待解冻押金失败',
|
||||
|
||||
Reference in New Issue
Block a user