From 1a07431887b373a94c5ecbd6224687dd8ffc8000 Mon Sep 17 00:00:00 2001 From: yml Date: Thu, 21 May 2026 14:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=E8=BF=81=E7=A7=BBAgiso?= =?UTF-8?q?=E5=BA=97=E9=93=BA=E9=85=8D=E7=BD=AE=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nfig-service.js => shop-config-service.ts} | 59 +++++++++++++------ docs/backend-typescript-migration-plan.md | 8 +++ 2 files changed, 50 insertions(+), 17 deletions(-) rename apps/backend/src/services/platforms/agiso/{shop-config-service.js => shop-config-service.ts} (65%) diff --git a/apps/backend/src/services/platforms/agiso/shop-config-service.js b/apps/backend/src/services/platforms/agiso/shop-config-service.ts similarity index 65% rename from apps/backend/src/services/platforms/agiso/shop-config-service.js rename to apps/backend/src/services/platforms/agiso/shop-config-service.ts index 12e360ce..decce936 100644 --- a/apps/backend/src/services/platforms/agiso/shop-config-service.js +++ b/apps/backend/src/services/platforms/agiso/shop-config-service.ts @@ -1,5 +1,3 @@ -// @ts-nocheck - import fs from 'node:fs' import path from 'node:path' @@ -20,11 +18,37 @@ const AGISO_SHOP_CONFIG_KEYS = [ 'tradeDetailTimeoutMs', ] -export function getAgisoShopsFilePath() { +type JsonObject = Record + +export type AgisoMessagingDefaults = { + messageTemplate?: string + autoDeliveryMessageTemplate?: string +} + +export type AgisoShopConfig = { + enabled?: boolean + shopName?: string + accessToken?: string + messageTemplate?: string + autoDeliveryMessageTemplate?: string + appSecret?: string + apiVersion?: string + sendMessageEndpoint?: string + tradeDetailEndpoint?: string + tradeDetailApiVersion?: string + tradeDetailTimeoutMs?: string +} + +export type AgisoMessagingConfigDocument = { + defaults: AgisoMessagingDefaults + shops: Record +} + +export function getAgisoShopsFilePath(): string { return AGISO_SHOPS_FILE_PATH } -export function getAgisoShopConfigMap() { +export function getAgisoShopConfigMap(): Record { const envConfig = normalizeAgisoShopConfigMap(runtimeConfig.platforms?.agiso?.messaging?.shops || {}) const fileConfig = loadAgisoMessagingConfigDocumentFromFile() @@ -34,7 +58,7 @@ export function getAgisoShopConfigMap() { } } -export function getAgisoShopConfig(shopId) { +export function getAgisoShopConfig(shopId: unknown): AgisoShopConfig | null { const normalizedShopId = String(shopId || '').trim() if (!normalizedShopId) { return null @@ -43,18 +67,18 @@ export function getAgisoShopConfig(shopId) { return getAgisoShopConfigMap()[normalizedShopId] || null } -export function getAgisoMessagingDefaults() { +export function getAgisoMessagingDefaults(): AgisoMessagingDefaults { return loadAgisoMessagingConfigDocumentFromFile().defaults } -export function saveAgisoMessagingConfig(rawValue) { +export function saveAgisoMessagingConfig(rawValue: unknown): AgisoMessagingConfigDocument { const normalized = normalizeAgisoMessagingConfigDocument(rawValue) fs.mkdirSync(path.dirname(AGISO_SHOPS_FILE_PATH), { recursive: true }) fs.writeFileSync(AGISO_SHOPS_FILE_PATH, `${JSON.stringify(normalized, null, 2)}\n`, 'utf8') return normalized } -function loadAgisoMessagingConfigDocumentFromFile() { +function loadAgisoMessagingConfigDocumentFromFile(): AgisoMessagingConfigDocument { if (!fs.existsSync(AGISO_SHOPS_FILE_PATH)) { return { defaults: {}, @@ -74,16 +98,17 @@ function loadAgisoMessagingConfigDocumentFromFile() { } } -function normalizeAgisoShopConfigMap(rawValue) { - const output = {} +function normalizeAgisoShopConfigMap(rawValue: unknown): Record { + const output: Record = {} - for (const [shopId, config] of Object.entries(rawValue || {})) { + const entries = isPlainObject(rawValue) ? Object.entries(rawValue) : [] + for (const [shopId, config] of entries) { const normalizedShopId = String(shopId || '').trim() if (!normalizedShopId || !isPlainObject(config)) { continue } - const next = {} + const next: AgisoShopConfig = {} const enabled = normalizeBooleanLike(config.enabled) if (enabled !== null) { next.enabled = enabled @@ -102,8 +127,8 @@ function normalizeAgisoShopConfigMap(rawValue) { return output } -function normalizeAgisoMessagingDefaults(rawValue) { - const output = {} +function normalizeAgisoMessagingDefaults(rawValue: unknown): AgisoMessagingDefaults { + const output: AgisoMessagingDefaults = {} if (!isPlainObject(rawValue)) { return output @@ -119,7 +144,7 @@ function normalizeAgisoMessagingDefaults(rawValue) { return output } -function normalizeAgisoMessagingConfigDocument(rawValue) { +function normalizeAgisoMessagingConfigDocument(rawValue: unknown): AgisoMessagingConfigDocument { const normalizedValue = isPlainObject(rawValue) ? rawValue : {} const hasStructuredShape = Object.prototype.hasOwnProperty.call(normalizedValue, 'defaults') || Object.prototype.hasOwnProperty.call(normalizedValue, 'shops') @@ -130,7 +155,7 @@ function normalizeAgisoMessagingConfigDocument(rawValue) { } } -function normalizeBooleanLike(value) { +function normalizeBooleanLike(value: unknown): boolean | null { if (typeof value === 'boolean') { return value } @@ -151,6 +176,6 @@ function normalizeBooleanLike(value) { return null } -function isPlainObject(value) { +function isPlainObject(value: unknown): value is JsonObject { return Object.prototype.toString.call(value) === '[object Object]' } diff --git a/docs/backend-typescript-migration-plan.md b/docs/backend-typescript-migration-plan.md index 07394dfa..5a4f4bb7 100644 --- a/docs/backend-typescript-migration-plan.md +++ b/docs/backend-typescript-migration-plan.md @@ -357,6 +357,14 @@ - `npm run typecheck` - `npm run build` - `npm test` 共 136 个用例通过 +60. Agiso 店铺配置服务迁移到 `.ts`: + - `src/services/platforms/agiso/shop-config-service.ts` +61. Agiso 店铺配置文档、默认消息模板、店铺 token/API 配置、配置 map 归一化结果已显式类型化 +62. Docker 内验证通过: + - Agiso 配置 / 自动发货 / 消息 / 订单详情相关 5 个测试文件共 26 个用例通过 + - `npm run typecheck` + - `npm run build` + - `npm test` 共 136 个用例通过 ## 下一步建议