后端迁移后台平台配置路由

This commit is contained in:
yml
2026-05-21 17:30:26 +08:00
parent 7be787c232
commit 1effd53378
2 changed files with 94 additions and 144 deletions
@@ -1,5 +1,3 @@
// @ts-check
import { Router } from "express"; import { Router } from "express";
import { import {
@@ -46,32 +44,35 @@ import {
validateAdminCloudtentaclesSession, validateAdminCloudtentaclesSession,
} from "../../services/admin/platform-config/service.js"; } from "../../services/admin/platform-config/service.js";
import { createJsonHandler, requireAdminRoles } from "./shared.js"; import { createJsonHandler, requireAdminRoles } from "./shared.js";
import type { AdminAgisoShopConfigSaveResponse } from "../../types/admin-write-models.js";
/** @typedef {import('../../types/admin-route-inputs.js').AdminAgisoShopConfigRouteBody} AdminAgisoShopConfigRouteBody */ import type {
/** @typedef {import('../../types/admin-route-inputs.js').AdminFulfillmentBindingConfigRouteBody} AdminFulfillmentBindingConfigRouteBody */ AdminAgisoShopConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminFulfillmentBindingLookupRouteBody} AdminFulfillmentBindingLookupRouteBody */ AdminCloudtentaclesCatalogQueryRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminEntityRouteParams} AdminEntityRouteParams */ AdminCloudtentaclesFullFlowRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminKuaishouEticketSourceConfigRouteBody} AdminKuaishouEticketSourceConfigRouteBody */ AdminCloudtentaclesSendSmsCodeRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminNotificationConfigRouteBody} AdminNotificationConfigRouteBody */ AdminCloudtentaclesSkuBuyRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminNotificationTestRouteBody} AdminNotificationTestRouteBody */ AdminCloudtentaclesSkuUseRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminScheduledJobsConfigRouteBody} AdminScheduledJobsConfigRouteBody */ AdminCloudtentaclesSourceConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminKuaishouEticketDetailQueryRouteBody} AdminKuaishouEticketDetailQueryRouteBody */ AdminCloudtentaclesTestLoginRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminKuaishouEticketConsumeRouteBody} AdminKuaishouEticketConsumeRouteBody */ AdminCloudtentaclesValidateSessionRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminKuaishouEticketShopInfoRouteBody} AdminKuaishouEticketShopInfoRouteBody */ AdminCloudtentaclesVirtualNumberRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesSourceConfigRouteBody} AdminCloudtentaclesSourceConfigRouteBody */ AdminEntityRouteParams,
/** @typedef {import('../../types/admin-route-inputs.js').AdminKuaishouCloudFulfillmentConfigRouteBody} AdminKuaishouCloudFulfillmentConfigRouteBody */ AdminFulfillmentBindingConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesSendSmsCodeRouteBody} AdminCloudtentaclesSendSmsCodeRouteBody */ AdminFulfillmentBindingLookupRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesTestLoginRouteBody} AdminCloudtentaclesTestLoginRouteBody */ AdminKuaishouCloudFulfillmentConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesValidateSessionRouteBody} AdminCloudtentaclesValidateSessionRouteBody */ AdminKuaishouEticketConsumeRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesCatalogQueryRouteBody} AdminCloudtentaclesCatalogQueryRouteBody */ AdminKuaishouEticketDetailQueryRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesSkuBuyRouteBody} AdminCloudtentaclesSkuBuyRouteBody */ AdminKuaishouEticketShopInfoRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesSkuUseRouteBody} AdminCloudtentaclesSkuUseRouteBody */ AdminKuaishouEticketSourceConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesVirtualNumberRouteBody} AdminCloudtentaclesVirtualNumberRouteBody */ AdminNotificationConfigRouteBody,
/** @typedef {import('../../types/admin-route-inputs.js').AdminCloudtentaclesFullFlowRouteBody} AdminCloudtentaclesFullFlowRouteBody */ AdminNotificationTestRouteBody,
/** @typedef {import('../../types/admin-write-models.js').AdminAgisoShopConfigSaveResponse} AdminAgisoShopConfigSaveResponse */ AdminScheduledJobsConfigRouteBody,
} from "../../types/admin-route-inputs.js";
const router = Router(); const router = Router();
type JsonRecord = Record<string, any>;
router.use("/platform-config", requireAdminRoles(["admin"])); router.use("/platform-config", requireAdminRoles(["admin"]));
router.get( router.get(
@@ -88,14 +89,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminAgisoShopConfigs( updateAdminAgisoShopConfigs(
/** @type {AdminAgisoShopConfigRouteBody} */ (req.body) req.body as AdminAgisoShopConfigRouteBody
), ),
{ {
successMessage: "Agiso 店铺配置已保存", successMessage: "Agiso 店铺配置已保存",
errorMessage: "保存 Agiso 店铺配置失败", errorMessage: "保存 Agiso 店铺配置失败",
scope: "[admin/platform-config/agiso-shops]", scope: "[admin/platform-config/agiso-shops]",
audit: (_req, data) => { audit: (_req, data) => {
const result = /** @type {AdminAgisoShopConfigSaveResponse} */ (data); const result = data as AdminAgisoShopConfigSaveResponse;
return { return {
action: "platform_shop_config_updated", action: "platform_shop_config_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -124,17 +125,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminNotificationConfig( updateAdminNotificationConfig(
/** @type {AdminNotificationConfigRouteBody} */ (req.body) req.body as AdminNotificationConfigRouteBody
), ),
{ {
successMessage: "内部通知配置已保存", successMessage: "内部通知配置已保存",
errorMessage: "保存内部通知配置失败", errorMessage: "保存内部通知配置失败",
scope: "[admin/platform-config/notifications]", scope: "[admin/platform-config/notifications]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ filePath?: string, source?: { enabled?: boolean, channels?: { bark?: { recipients?: unknown[] } } } }} */ (
data
);
return { return {
action: "platform_notification_config_updated", action: "platform_notification_config_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -159,17 +157,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
testAdminNotification( testAdminNotification(
/** @type {AdminNotificationTestRouteBody} */ (req.body) req.body as AdminNotificationTestRouteBody
), ),
{ {
successMessage: "内部通知测试已执行", successMessage: "内部通知测试已执行",
errorMessage: "内部通知测试失败", errorMessage: "内部通知测试失败",
scope: "[admin/platform-config/notifications/test]", scope: "[admin/platform-config/notifications/test]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ successCount?: number, failedCount?: number, channel?: string }} */ (
data
);
return { return {
action: "platform_notification_test_sent", action: "platform_notification_test_sent",
targetType: "platform_config", targetType: "platform_config",
@@ -199,17 +194,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminScheduledJobsConfig( updateAdminScheduledJobsConfig(
/** @type {AdminScheduledJobsConfigRouteBody} */ (req.body) req.body as AdminScheduledJobsConfigRouteBody
), ),
{ {
successMessage: "定时任务配置已保存", successMessage: "定时任务配置已保存",
errorMessage: "保存定时任务配置失败", errorMessage: "保存定时任务配置失败",
scope: "[admin/platform-config/scheduled-jobs]", scope: "[admin/platform-config/scheduled-jobs]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ filePath?: string, source?: { enabled?: boolean, jobs?: unknown[] } }} */ (
data
);
return { return {
action: "platform_scheduled_jobs_updated", action: "platform_scheduled_jobs_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -232,22 +224,19 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
runAdminScheduledJobNow( runAdminScheduledJobNow(
/** @type {AdminEntityRouteParams} */ (req.params).id (req.params as AdminEntityRouteParams).id
), ),
{ {
successMessage: "定时任务已执行", successMessage: "定时任务已执行",
errorMessage: "执行定时任务失败", errorMessage: "执行定时任务失败",
scope: "[admin/platform-config/scheduled-jobs/:id/run]", scope: "[admin/platform-config/scheduled-jobs/:id/run]",
audit: (req, data) => { audit: (req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ result?: { status?: string, message?: string } }} */ (
data
);
return { return {
action: "platform_scheduled_job_run", action: "platform_scheduled_job_run",
targetType: "platform_config", targetType: "platform_config",
targetId: String( targetId: String(
/** @type {AdminEntityRouteParams} */ (req.params).id || "" (req.params as AdminEntityRouteParams).id || ""
).trim(), ).trim(),
data: { data: {
status: String(result.result?.status || "").trim(), status: String(result.result?.status || "").trim(),
@@ -273,17 +262,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminKuaishouEticketSourceConfig( updateAdminKuaishouEticketSourceConfig(
/** @type {AdminKuaishouEticketSourceConfigRouteBody} */ (req.body) req.body as AdminKuaishouEticketSourceConfigRouteBody
), ),
{ {
successMessage: "快手小店核销配置已保存", successMessage: "快手小店核销配置已保存",
errorMessage: "保存快手小店核销配置失败", errorMessage: "保存快手小店核销配置失败",
scope: "[admin/platform-config/kuaishou-eticket-source]", scope: "[admin/platform-config/kuaishou-eticket-source]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ filePath?: string, source?: { enabled?: boolean, shops?: unknown[] } }} */ (
data
);
return { return {
action: "platform_kuaishou_eticket_source_updated", action: "platform_kuaishou_eticket_source_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -315,17 +301,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
retryAdminNinetyoneOrder( retryAdminNinetyoneOrder(
/** @type {AdminEntityRouteParams} */ (req.params).id (req.params as AdminEntityRouteParams).id
), ),
{ {
successMessage: "91卡券订单已重试", successMessage: "91卡券订单已重试",
errorMessage: "重试 91卡券订单失败", errorMessage: "重试 91卡券订单失败",
scope: "[admin/platform-config/ninetyone/orders/:id/retry]", scope: "[admin/platform-config/ninetyone/orders/:id/retry]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ orderId?: number, orderNo?: string, taskCount?: number }} */ (
data
);
return { return {
action: "platform_ninetyone_order_retried", action: "platform_ninetyone_order_retried",
targetType: "order", targetType: "order",
@@ -345,17 +328,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
failAdminNinetyoneOrder( failAdminNinetyoneOrder(
/** @type {AdminEntityRouteParams} */ (req.params).id, (req.params as AdminEntityRouteParams).id,
/** @type {{ reason?: string }} */ (req.body) req.body as { reason?: string }
), ),
{ {
successMessage: "91卡券订单已标记失败", successMessage: "91卡券订单已标记失败",
errorMessage: "标记 91卡券订单失败", errorMessage: "标记 91卡券订单失败",
scope: "[admin/platform-config/ninetyone/orders/:id/fail]", scope: "[admin/platform-config/ninetyone/orders/:id/fail]",
audit: (req, data) => { audit: (req, data) => {
const result = /** @type {{ orderId?: number, orderNo?: string }} */ ( const result = data as JsonRecord;
data
);
return { return {
action: "platform_ninetyone_order_failed", action: "platform_ninetyone_order_failed",
targetType: "order", targetType: "order",
@@ -363,7 +344,7 @@ router.post(
data: { data: {
orderNo: String(result.orderNo || "").trim(), orderNo: String(result.orderNo || "").trim(),
reason: String( reason: String(
/** @type {{ reason?: string }} */ (req.body).reason || "" (req.body as { reason?: string }).reason || ""
).trim(), ).trim(),
}, },
}; };
@@ -377,20 +358,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
queryAdminKuaishouEticketDetail( queryAdminKuaishouEticketDetail(
/** @type {AdminKuaishouEticketDetailQueryRouteBody} */ (req.body) req.body as AdminKuaishouEticketDetailQueryRouteBody
), ),
{ {
successMessage: "快手小店核销信息查询成功", successMessage: "快手小店核销信息查询成功",
errorMessage: "查询快手小店核销信息失败", errorMessage: "查询快手小店核销信息失败",
scope: "[admin/platform-config/kuaishou-eticket/query-detail]", scope: "[admin/platform-config/kuaishou-eticket/query-detail]",
audit: (req, data) => { audit: (req, data) => {
const body = /** @type {AdminKuaishouEticketDetailQueryRouteBody} */ ( const body = req.body as AdminKuaishouEticketDetailQueryRouteBody;
req.body const result = data as JsonRecord;
);
const result =
/** @type {{ eTicketId?: string, result?: number, ok?: boolean, alreadyConsumed?: boolean }} */ (
data
);
return { return {
action: "platform_kuaishou_eticket_query_detail", action: "platform_kuaishou_eticket_query_detail",
targetType: "platform_config", targetType: "platform_config",
@@ -413,20 +389,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
queryAdminKuaishouEticketShopInfo( queryAdminKuaishouEticketShopInfo(
/** @type {AdminKuaishouEticketShopInfoRouteBody} */ (req.body) req.body as AdminKuaishouEticketShopInfoRouteBody
), ),
{ {
successMessage: "快手小店店铺信息查询成功", successMessage: "快手小店店铺信息查询成功",
errorMessage: "查询快手小店店铺信息失败", errorMessage: "查询快手小店店铺信息失败",
scope: "[admin/platform-config/kuaishou-eticket/query-shop-info]", scope: "[admin/platform-config/kuaishou-eticket/query-shop-info]",
audit: (req, data) => { audit: (req, data) => {
const body = /** @type {AdminKuaishouEticketShopInfoRouteBody} */ ( const body = req.body as AdminKuaishouEticketShopInfoRouteBody;
req.body const result = data as JsonRecord;
);
const result =
/** @type {{ shop?: { shopId?: string, kshopName?: string }, result?: number, ok?: boolean }} */ (
data
);
return { return {
action: "platform_kuaishou_eticket_query_shop_info", action: "platform_kuaishou_eticket_query_shop_info",
targetType: "platform_config", targetType: "platform_config",
@@ -449,20 +420,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
consumeAdminKuaishouEticket( consumeAdminKuaishouEticket(
/** @type {AdminKuaishouEticketConsumeRouteBody} */ (req.body) req.body as AdminKuaishouEticketConsumeRouteBody
), ),
{ {
successMessage: "快手小店核销请求已执行", successMessage: "快手小店核销请求已执行",
errorMessage: "执行快手小店核销失败", errorMessage: "执行快手小店核销失败",
scope: "[admin/platform-config/kuaishou-eticket/consume]", scope: "[admin/platform-config/kuaishou-eticket/consume]",
audit: (req, data) => { audit: (req, data) => {
const body = /** @type {AdminKuaishouEticketConsumeRouteBody} */ ( const body = req.body as AdminKuaishouEticketConsumeRouteBody;
req.body const result = data as JsonRecord;
);
const result =
/** @type {{ eTicketId?: string, result?: number, consumed?: boolean, alreadyConsumed?: boolean }} */ (
data
);
return { return {
action: "platform_kuaishou_eticket_consume", action: "platform_kuaishou_eticket_consume",
targetType: "platform_config", targetType: "platform_config",
@@ -515,17 +481,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminCloudtentaclesSourceConfig( updateAdminCloudtentaclesSourceConfig(
/** @type {AdminCloudtentaclesSourceConfigRouteBody} */ (req.body) req.body as AdminCloudtentaclesSourceConfigRouteBody
), ),
{ {
successMessage: "cloudtentacles 履约平台配置已保存", successMessage: "cloudtentacles 履约平台配置已保存",
errorMessage: "保存 cloudtentacles 履约平台配置失败", errorMessage: "保存 cloudtentacles 履约平台配置失败",
scope: "[admin/platform-config/cloudtentacles-source]", scope: "[admin/platform-config/cloudtentacles-source]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ filePath?: string, source?: { username?: string, enabled?: boolean } }} */ (
data
);
return { return {
action: "platform_cloudtentacles_source_updated", action: "platform_cloudtentacles_source_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -546,20 +509,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
sendAdminCloudtentaclesSmsCode( sendAdminCloudtentaclesSmsCode(
/** @type {AdminCloudtentaclesSendSmsCodeRouteBody} */ (req.body) req.body as AdminCloudtentaclesSendSmsCodeRouteBody
), ),
{ {
successMessage: "cloudtentacles 短信验证码已发送", successMessage: "cloudtentacles 短信验证码已发送",
errorMessage: "cloudtentacles 发送短信验证码失败", errorMessage: "cloudtentacles 发送短信验证码失败",
scope: "[admin/platform-config/cloudtentacles/send-sms-code]", scope: "[admin/platform-config/cloudtentacles/send-sms-code]",
audit: (req, data) => { audit: (req, data) => {
const body = /** @type {AdminCloudtentaclesSendSmsCodeRouteBody} */ ( const body = req.body as AdminCloudtentaclesSendSmsCodeRouteBody;
req.body const result = data as JsonRecord;
);
const result =
/** @type {{ username?: string, phoneMasked?: string, baseUrl?: string }} */ (
data
);
return { return {
action: "platform_cloudtentacles_send_sms_code", action: "platform_cloudtentacles_send_sms_code",
targetType: "platform_config", targetType: "platform_config",
@@ -581,20 +539,15 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
testAdminCloudtentaclesLogin( testAdminCloudtentaclesLogin(
/** @type {AdminCloudtentaclesTestLoginRouteBody} */ (req.body) req.body as AdminCloudtentaclesTestLoginRouteBody
), ),
{ {
successMessage: "cloudtentacles 登录测试成功", successMessage: "cloudtentacles 登录测试成功",
errorMessage: "cloudtentacles 登录测试失败", errorMessage: "cloudtentacles 登录测试失败",
scope: "[admin/platform-config/cloudtentacles/test-login]", scope: "[admin/platform-config/cloudtentacles/test-login]",
audit: (req, data) => { audit: (req, data) => {
const body = /** @type {AdminCloudtentaclesTestLoginRouteBody} */ ( const body = req.body as AdminCloudtentaclesTestLoginRouteBody;
req.body const result = data as JsonRecord;
);
const result =
/** @type {{ baseUrl?: string, username?: string, session?: { permissionCount?: number } }} */ (
data
);
return { return {
action: "platform_cloudtentacles_test_login", action: "platform_cloudtentacles_test_login",
targetType: "platform_config", targetType: "platform_config",
@@ -616,17 +569,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
validateAdminCloudtentaclesSession( validateAdminCloudtentaclesSession(
/** @type {AdminCloudtentaclesValidateSessionRouteBody} */ (req.body) req.body as AdminCloudtentaclesValidateSessionRouteBody
), ),
{ {
successMessage: "cloudtentacles 会话校验成功", successMessage: "cloudtentacles 会话校验成功",
errorMessage: "cloudtentacles 会话校验失败", errorMessage: "cloudtentacles 会话校验失败",
scope: "[admin/platform-config/cloudtentacles/validate-session]", scope: "[admin/platform-config/cloudtentacles/validate-session]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ baseUrl?: string, session?: { permissionCount?: number } }} */ (
data
);
return { return {
action: "platform_cloudtentacles_validate_session", action: "platform_cloudtentacles_validate_session",
targetType: "platform_config", targetType: "platform_config",
@@ -646,7 +596,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
getAdminCloudtentaclesAsset( getAdminCloudtentaclesAsset(
/** @type {AdminCloudtentaclesCatalogQueryRouteBody} */ (req.body) req.body as AdminCloudtentaclesCatalogQueryRouteBody
), ),
{ {
successMessage: "cloudtentacles 余额查询成功", successMessage: "cloudtentacles 余额查询成功",
@@ -661,7 +611,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
getAdminCloudtentaclesCategories( getAdminCloudtentaclesCategories(
/** @type {AdminCloudtentaclesCatalogQueryRouteBody} */ (req.body) req.body as AdminCloudtentaclesCatalogQueryRouteBody
), ),
{ {
successMessage: "cloudtentacles 分类查询成功", successMessage: "cloudtentacles 分类查询成功",
@@ -676,7 +626,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
getAdminCloudtentaclesSkuList( getAdminCloudtentaclesSkuList(
/** @type {AdminCloudtentaclesCatalogQueryRouteBody} */ (req.body) req.body as AdminCloudtentaclesCatalogQueryRouteBody
), ),
{ {
successMessage: "cloudtentacles SKU 列表查询成功", successMessage: "cloudtentacles SKU 列表查询成功",
@@ -691,7 +641,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
buyAdminCloudtentaclesSku( buyAdminCloudtentaclesSku(
/** @type {AdminCloudtentaclesSkuBuyRouteBody} */ (req.body) req.body as AdminCloudtentaclesSkuBuyRouteBody
), ),
{ {
successMessage: "cloudtentacles SKU 购买成功", successMessage: "cloudtentacles SKU 购买成功",
@@ -706,7 +656,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
useAdminCloudtentaclesSku( useAdminCloudtentaclesSku(
/** @type {AdminCloudtentaclesSkuUseRouteBody} */ (req.body) req.body as AdminCloudtentaclesSkuUseRouteBody
), ),
{ {
successMessage: "cloudtentacles 发货成功", successMessage: "cloudtentacles 发货成功",
@@ -721,7 +671,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
getAdminCloudtentaclesKnapsack( getAdminCloudtentaclesKnapsack(
/** @type {AdminCloudtentaclesCatalogQueryRouteBody} */ (req.body) req.body as AdminCloudtentaclesCatalogQueryRouteBody
), ),
{ {
successMessage: "cloudtentacles 背包查询成功", successMessage: "cloudtentacles 背包查询成功",
@@ -736,7 +686,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
listAdminCloudtentaclesVirtualNumbers( listAdminCloudtentaclesVirtualNumbers(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 虚拟号列表查询成功", successMessage: "cloudtentacles 虚拟号列表查询成功",
@@ -751,7 +701,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
appointAdminCloudtentaclesVirtualNumber( appointAdminCloudtentaclesVirtualNumber(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 虚拟号申请成功", successMessage: "cloudtentacles 虚拟号申请成功",
@@ -766,7 +716,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
generateAdminCloudtentaclesLoginCode( generateAdminCloudtentaclesLoginCode(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 登录码生成成功", successMessage: "cloudtentacles 登录码生成成功",
@@ -781,7 +731,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
fetchAdminCloudtentaclesVirtualNumberCode( fetchAdminCloudtentaclesVirtualNumberCode(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 验证码获取成功", successMessage: "cloudtentacles 验证码获取成功",
@@ -796,7 +746,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
verifyAdminCloudtentaclesLoginCode( verifyAdminCloudtentaclesLoginCode(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 登录码校验成功", successMessage: "cloudtentacles 登录码校验成功",
@@ -811,7 +761,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
getAdminCloudtentaclesBindUrl( getAdminCloudtentaclesBindUrl(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 兑换链接获取成功", successMessage: "cloudtentacles 兑换链接获取成功",
@@ -826,7 +776,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
backAdminCloudtentaclesVirtualNumber( backAdminCloudtentaclesVirtualNumber(
/** @type {AdminCloudtentaclesVirtualNumberRouteBody} */ (req.body) req.body as AdminCloudtentaclesVirtualNumberRouteBody
), ),
{ {
successMessage: "cloudtentacles 号码退还成功", successMessage: "cloudtentacles 号码退还成功",
@@ -841,7 +791,7 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
runAdminCloudtentaclesFullFlow( runAdminCloudtentaclesFullFlow(
/** @type {AdminCloudtentaclesFullFlowRouteBody} */ (req.body) req.body as AdminCloudtentaclesFullFlowRouteBody
), ),
{ {
successMessage: "cloudtentacles 完整调试流程执行成功", successMessage: "cloudtentacles 完整调试流程执行成功",
@@ -865,17 +815,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
lookupAdminFulfillmentBindingOrder( lookupAdminFulfillmentBindingOrder(
/** @type {AdminFulfillmentBindingLookupRouteBody} */ (req.body) req.body as AdminFulfillmentBindingLookupRouteBody
), ),
{ {
successMessage: "订单商品查询成功", successMessage: "订单商品查询成功",
errorMessage: "手动查询订单商品失败", errorMessage: "手动查询订单商品失败",
scope: "[admin/platform-config/fulfillment-bindings/lookup-order]", scope: "[admin/platform-config/fulfillment-bindings/lookup-order]",
audit: (req, data) => { audit: (req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ order?: { provider?: string, platform?: string, shopId?: string, platformOrderId?: string }, items?: unknown[] }} */ (
data
);
return { return {
action: "platform_fulfillment_order_lookup", action: "platform_fulfillment_order_lookup",
targetType: "platform_config", targetType: "platform_config",
@@ -890,13 +837,12 @@ router.post(
shopId: shopId:
result.order?.shopId || result.order?.shopId ||
String( String(
/** @type {AdminFulfillmentBindingLookupRouteBody} */ (req.body) (req.body as AdminFulfillmentBindingLookupRouteBody)?.shopId || ""
?.shopId || ""
).trim(), ).trim(),
platformOrderId: platformOrderId:
result.order?.platformOrderId || result.order?.platformOrderId ||
String( String(
/** @type {AdminFulfillmentBindingLookupRouteBody} */ (req.body) (req.body as AdminFulfillmentBindingLookupRouteBody)
?.platformOrderId || "" ?.platformOrderId || ""
).trim(), ).trim(),
}, },
@@ -911,15 +857,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminFulfillmentBindingConfigs( updateAdminFulfillmentBindingConfigs(
/** @type {AdminFulfillmentBindingConfigRouteBody} */ (req.body) req.body as AdminFulfillmentBindingConfigRouteBody
), ),
{ {
successMessage: "履约配置已保存", successMessage: "履约配置已保存",
errorMessage: "保存履约配置失败", errorMessage: "保存履约配置失败",
scope: "[admin/platform-config/fulfillment-bindings]", scope: "[admin/platform-config/fulfillment-bindings]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ bindings?: unknown[], filePath?: string }} */ (data);
return { return {
action: "platform_fulfillment_config_updated", action: "platform_fulfillment_config_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -950,17 +895,14 @@ router.post(
createJsonHandler( createJsonHandler(
(req) => (req) =>
updateAdminKuaishouCloudFulfillmentConfig( updateAdminKuaishouCloudFulfillmentConfig(
/** @type {AdminKuaishouCloudFulfillmentConfigRouteBody} */ (req.body) req.body as AdminKuaishouCloudFulfillmentConfigRouteBody
), ),
{ {
successMessage: "新履约配置已保存", successMessage: "新履约配置已保存",
errorMessage: "保存新履约配置失败", errorMessage: "保存新履约配置失败",
scope: "[admin/platform-config/kuaishou-cloud-fulfillment]", scope: "[admin/platform-config/kuaishou-cloud-fulfillment]",
audit: (_req, data) => { audit: (_req, data) => {
const result = const result = data as JsonRecord;
/** @type {{ filePath?: string, source?: { items?: unknown[] } }} */ (
data
);
return { return {
action: "platform_kuaishou_cloud_fulfillment_updated", action: "platform_kuaishou_cloud_fulfillment_updated",
targetType: "platform_config", targetType: "platform_config",
@@ -843,6 +843,14 @@
- `npm run typecheck` - `npm run typecheck`
- `npm run build` - `npm run build`
- `npm test` 共 139 个用例通过 - `npm test` 共 139 个用例通过
221. 后台平台配置路由迁移到 `.ts`
- `src/routes/admin/platform-config.ts`
222. Agiso 店铺、通知、定时任务、快手电子券、91 卡券订单、cloudtentacles 来源 / 登录 / 商品 / 背包 / 虚拟号 / debug flow、履约绑定和快手 Cloud 履约配置路由已进入 TS 编译链路;route body / params、Agiso 保存响应和审计动态结果补齐类型,并移除旧 JSDoc cast
223. Docker 内验证通过:
- `npm run typecheck`
- `npm run build`
- `npm test` 共 139 个用例通过
224. `src/routes/admin` 目录下非测试 `.js` 路由文件已全部迁移为 `.ts`
## 下一步建议 ## 下一步建议