统一前后端代码格式化配置

This commit is contained in:
yml2213
2026-08-16 17:27:12 +08:00
parent 8705f6a6a1
commit 5c7c3e14e3
278 changed files with 6386 additions and 5500 deletions
+5 -5
View File
@@ -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
+31 -26
View File
@@ -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) {
+10 -10
View File
@@ -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
+1 -5
View File
@@ -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,
+22 -22
View File
@@ -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
+9 -2
View File
@@ -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()
+2 -7
View File
@@ -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: '重发电子凭证发码回调失败',
+85 -66
View File
@@ -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: '扣减待解冻押金失败',