抽离后台云触手上下文组装逻辑

This commit is contained in:
yml
2026-05-04 15:18:45 +08:00
parent 9b4a3039fa
commit 132dd75efc
3 changed files with 136 additions and 85 deletions
@@ -0,0 +1,44 @@
// @ts-check
import { getCloudtentaclesSourceConfig } from '../platforms/cloudtentacles/source-config-service.js'
import { getCloudtentaclesSessionState } from '../platforms/cloudtentacles/session-state-service.js'
import { pickFirstNonEmpty, resolveCloudtentaclesAdminContext } from './admin-platform-config-context.js'
const DEFAULT_CLOUDTENTACLES_BASE_URL = 'https://123.207.217.176'
export function resolveAdminCloudtentaclesCredentialPayload(
payload = {},
options = {},
) {
const savedSource = /** @type {Record<string, unknown>} */ (
options.savedSource || getCloudtentaclesSourceConfig()
)
const defaultBaseUrl = String(options.defaultBaseUrl || DEFAULT_CLOUDTENTACLES_BASE_URL).trim()
return {
baseUrl: pickFirstNonEmpty([payload.baseUrl, savedSource.baseUrl, defaultBaseUrl]),
username: pickFirstNonEmpty([payload.username, savedSource.username]),
password: pickFirstNonEmpty([payload.password, savedSource.password]),
phone: pickFirstNonEmpty([payload.phone, savedSource.phone]),
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, '-']),
deviceType: payload.deviceType ?? savedSource.deviceType,
}
}
export function resolveAdminCloudtentaclesSessionPayload(
payload = {},
options = {},
) {
const savedSource = /** @type {Record<string, unknown>} */ (
options.savedSource || getCloudtentaclesSourceConfig()
)
const persistedSession = /** @type {Record<string, unknown>} */ (
options.persistedSession || getCloudtentaclesSessionState()
)
return resolveCloudtentaclesAdminContext(payload, {
savedSource,
persistedSession,
defaultBaseUrl: options.defaultBaseUrl || DEFAULT_CLOUDTENTACLES_BASE_URL,
})
}
@@ -0,0 +1,65 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import {
resolveAdminCloudtentaclesCredentialPayload,
resolveAdminCloudtentaclesSessionPayload,
} from './admin-platform-config-cloudtentacles.js'
test('resolveAdminCloudtentaclesCredentialPayload merges payload and saved source defaults', () => {
assert.deepEqual(
resolveAdminCloudtentaclesCredentialPayload(
{
baseUrl: ' https://override.example.com ',
phone: ' 13800138000 ',
deviceId: ' custom-device ',
},
{
savedSource: {
baseUrl: 'https://saved.example.com',
username: 'saved-user',
password: 'saved-pass',
phone: '13900000000',
deviceId: 'saved-device',
deviceType: 2,
},
},
),
{
baseUrl: 'https://override.example.com',
username: 'saved-user',
password: 'saved-pass',
phone: '13800138000',
deviceId: 'custom-device',
deviceType: 2,
},
)
})
test('resolveAdminCloudtentaclesSessionPayload merges payload source and persisted session defaults', () => {
assert.deepEqual(
resolveAdminCloudtentaclesSessionPayload(
{
token: ' payload-token ',
},
{
savedSource: {
baseUrl: 'https://saved.example.com',
deviceId: 'saved-device',
deviceType: 3,
},
persistedSession: {
token: 'session-token',
deviceId: 'session-device',
deviceType: 5,
},
},
),
{
baseUrl: 'https://saved.example.com',
token: 'payload-token',
deviceId: 'saved-device',
deviceType: 3,
},
)
})
@@ -81,7 +81,6 @@ import {
hasCloudtentaclesCredentialContextChanged, hasCloudtentaclesCredentialContextChanged,
isPlainObject, isPlainObject,
pickFirstNonEmpty, pickFirstNonEmpty,
resolveCloudtentaclesAdminContext,
resolveKuaishouEticketAdminContext, resolveKuaishouEticketAdminContext,
} from './admin-platform-config-context.js' } from './admin-platform-config-context.js'
import { import {
@@ -89,6 +88,10 @@ import {
normalizeFulfillmentLookupPayload, normalizeFulfillmentLookupPayload,
resolveFulfillmentLookupDetail, resolveFulfillmentLookupDetail,
} from './admin-platform-config-fulfillment.js' } from './admin-platform-config-fulfillment.js'
import {
resolveAdminCloudtentaclesCredentialPayload,
resolveAdminCloudtentaclesSessionPayload,
} from './admin-platform-config-cloudtentacles.js'
import { listAdminObservedProducts } from './admin-platform-config-observed-products.js' import { listAdminObservedProducts } from './admin-platform-config-observed-products.js'
import { import {
assertAdminFulfillmentBindingsInput, assertAdminFulfillmentBindingsInput,
@@ -463,14 +466,7 @@ export function updateAdminCloudtentaclesSourceConfig(payload = /** @type {Admin
/** @param {AdminCloudtentaclesSendSmsCodeInput} [payload] */ /** @param {AdminCloudtentaclesSendSmsCodeInput} [payload] */
export async function sendAdminCloudtentaclesSmsCode(payload = /** @type {AdminCloudtentaclesSendSmsCodeInput} */ ({})) { export async function sendAdminCloudtentaclesSmsCode(payload = /** @type {AdminCloudtentaclesSendSmsCodeInput} */ ({})) {
const savedSource = getCloudtentaclesSourceConfig() const result = await sendCloudtentaclesSmsCode(resolveAdminCloudtentaclesCredentialPayload(payload))
const result = await sendCloudtentaclesSmsCode({
baseUrl: pickFirstNonEmpty([payload.baseUrl, savedSource.baseUrl, 'https://123.207.217.176']),
username: pickFirstNonEmpty([payload.username, savedSource.username]),
phone: pickFirstNonEmpty([payload.phone, savedSource.phone]),
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, '-']),
deviceType: payload.deviceType ?? savedSource.deviceType,
})
return { return {
...result, ...result,
@@ -481,14 +477,10 @@ export async function sendAdminCloudtentaclesSmsCode(payload = /** @type {AdminC
/** @param {AdminCloudtentaclesTestLoginInput} [payload] */ /** @param {AdminCloudtentaclesTestLoginInput} [payload] */
export async function testAdminCloudtentaclesLogin(payload = /** @type {AdminCloudtentaclesTestLoginInput} */ ({})) { export async function testAdminCloudtentaclesLogin(payload = /** @type {AdminCloudtentaclesTestLoginInput} */ ({})) {
const savedSource = getCloudtentaclesSourceConfig() const savedSource = getCloudtentaclesSourceConfig()
const credentialContext = resolveAdminCloudtentaclesCredentialPayload(payload, { savedSource })
const session = await loginCloudtentaclesSession({ const session = await loginCloudtentaclesSession({
baseUrl: pickFirstNonEmpty([payload.baseUrl, savedSource.baseUrl, 'https://123.207.217.176']), ...credentialContext,
username: pickFirstNonEmpty([payload.username, savedSource.username]),
password: pickFirstNonEmpty([payload.password, savedSource.password]),
phone: pickFirstNonEmpty([payload.phone, savedSource.phone]),
code: String(payload.code || '').trim(), code: String(payload.code || '').trim(),
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, '-']),
deviceType: payload.deviceType ?? savedSource.deviceType,
}) })
const savedSession = saveCloudtentaclesSessionState({ const savedSession = saveCloudtentaclesSessionState({
token: session.token, token: session.token,
@@ -496,8 +488,8 @@ export async function testAdminCloudtentaclesLogin(payload = /** @type {AdminClo
username: session.username, username: session.username,
phone: session.phone, phone: session.phone,
loggedInAt: session.loggedInAt, loggedInAt: session.loggedInAt,
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, '-']), deviceId: credentialContext.deviceId,
deviceType: payload.deviceType ?? savedSource.deviceType, deviceType: credentialContext.deviceType,
}) })
return { return {
@@ -522,20 +514,16 @@ export async function testAdminCloudtentaclesLogin(payload = /** @type {AdminClo
export async function validateAdminCloudtentaclesSession(payload = /** @type {AdminCloudtentaclesValidateSessionInput} */ ({})) { export async function validateAdminCloudtentaclesSession(payload = /** @type {AdminCloudtentaclesValidateSessionInput} */ ({})) {
const savedSource = getCloudtentaclesSourceConfig() const savedSource = getCloudtentaclesSourceConfig()
const persistedSession = getCloudtentaclesSessionState() const persistedSession = getCloudtentaclesSessionState()
const session = await validateCloudtentaclesSession({ const sessionContext = resolveAdminCloudtentaclesSessionPayload(payload, { savedSource, persistedSession })
baseUrl: pickFirstNonEmpty([payload.baseUrl, savedSource.baseUrl, 'https://123.207.217.176']), const session = await validateCloudtentaclesSession(sessionContext)
token: pickFirstNonEmpty([payload.token, persistedSession.token]),
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, '-']),
deviceType: payload.deviceType ?? savedSource.deviceType,
})
const savedSession = saveCloudtentaclesSessionState({ const savedSession = saveCloudtentaclesSessionState({
token: session.token, token: session.token,
baseUrl: session.baseUrl, baseUrl: session.baseUrl,
username: pickFirstNonEmpty([persistedSession.username, savedSource.username]), username: pickFirstNonEmpty([persistedSession.username, savedSource.username]),
phone: pickFirstNonEmpty([persistedSession.phone, savedSource.phone]), phone: pickFirstNonEmpty([persistedSession.phone, savedSource.phone]),
loggedInAt: session.loggedInAt, loggedInAt: session.loggedInAt,
deviceId: pickFirstNonEmpty([payload.deviceId, savedSource.deviceId, persistedSession.deviceId, '-']), deviceId: sessionContext.deviceId,
deviceType: payload.deviceType ?? savedSource.deviceType ?? persistedSession.deviceType, deviceType: sessionContext.deviceType,
}) })
return { return {
@@ -554,37 +542,22 @@ export async function validateAdminCloudtentaclesSession(payload = /** @type {Ad
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */ /** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
export async function getAdminCloudtentaclesAsset(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) { export async function getAdminCloudtentaclesAsset(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { return getCloudtentaclesAsset(resolveAdminCloudtentaclesSessionPayload(payload))
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return getCloudtentaclesAsset(context)
} }
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */ /** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
export async function getAdminCloudtentaclesCategories(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) { export async function getAdminCloudtentaclesCategories(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { return getCloudtentaclesCategories(resolveAdminCloudtentaclesSessionPayload(payload))
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return getCloudtentaclesCategories(context)
} }
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */ /** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
export async function getAdminCloudtentaclesSkuList(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) { export async function getAdminCloudtentaclesSkuList(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { return listCloudtentaclesSku(resolveAdminCloudtentaclesSessionPayload(payload))
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return listCloudtentaclesSku(context)
} }
/** @param {AdminCloudtentaclesSkuBuyInput} [payload] */ /** @param {AdminCloudtentaclesSkuBuyInput} [payload] */
export async function buyAdminCloudtentaclesSku(payload = /** @type {AdminCloudtentaclesSkuBuyInput} */ ({})) { export async function buyAdminCloudtentaclesSku(payload = /** @type {AdminCloudtentaclesSkuBuyInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return buyCloudtentaclesSku({ return buyCloudtentaclesSku({
...context, ...context,
id: payload.id, id: payload.id,
@@ -594,10 +567,7 @@ export async function buyAdminCloudtentaclesSku(payload = /** @type {AdminCloudt
/** @param {AdminCloudtentaclesSkuUseInput} [payload] */ /** @param {AdminCloudtentaclesSkuUseInput} [payload] */
export async function useAdminCloudtentaclesSku(payload = /** @type {AdminCloudtentaclesSkuUseInput} */ ({})) { export async function useAdminCloudtentaclesSku(payload = /** @type {AdminCloudtentaclesSkuUseInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return useCloudtentaclesSku({ return useCloudtentaclesSku({
...context, ...context,
id: payload.id, id: payload.id,
@@ -608,19 +578,12 @@ export async function useAdminCloudtentaclesSku(payload = /** @type {AdminCloudt
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */ /** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
export async function getAdminCloudtentaclesKnapsack(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) { export async function getAdminCloudtentaclesKnapsack(payload = /** @type {AdminCloudtentaclesCatalogQueryInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { return getCloudtentaclesKnapsack(resolveAdminCloudtentaclesSessionPayload(payload))
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return getCloudtentaclesKnapsack(context)
} }
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function listAdminCloudtentaclesVirtualNumbers(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function listAdminCloudtentaclesVirtualNumbers(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return listCloudtentaclesVirtualNumbers({ return listCloudtentaclesVirtualNumbers({
...context, ...context,
key: payload.key, key: payload.key,
@@ -629,10 +592,7 @@ export async function listAdminCloudtentaclesVirtualNumbers(payload = /** @type
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function appointAdminCloudtentaclesVirtualNumber(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function appointAdminCloudtentaclesVirtualNumber(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return appointCloudtentaclesVirtualNumber({ return appointCloudtentaclesVirtualNumber({
...context, ...context,
key: payload.key, key: payload.key,
@@ -641,10 +601,7 @@ export async function appointAdminCloudtentaclesVirtualNumber(payload = /** @typ
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function generateAdminCloudtentaclesLoginCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function generateAdminCloudtentaclesLoginCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return generateCloudtentaclesLoginCode({ return generateCloudtentaclesLoginCode({
...context, ...context,
key: payload.key, key: payload.key,
@@ -654,10 +611,7 @@ export async function generateAdminCloudtentaclesLoginCode(payload = /** @type {
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function fetchAdminCloudtentaclesVirtualNumberCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function fetchAdminCloudtentaclesVirtualNumberCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return fetchCloudtentaclesVirtualNumberCode({ return fetchCloudtentaclesVirtualNumberCode({
...context, ...context,
key: payload.key, key: payload.key,
@@ -667,10 +621,7 @@ export async function fetchAdminCloudtentaclesVirtualNumberCode(payload = /** @t
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function verifyAdminCloudtentaclesLoginCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function verifyAdminCloudtentaclesLoginCode(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return verifyCloudtentaclesLoginCode({ return verifyCloudtentaclesLoginCode({
...context, ...context,
key: payload.key, key: payload.key,
@@ -681,10 +632,7 @@ export async function verifyAdminCloudtentaclesLoginCode(payload = /** @type {Ad
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function getAdminCloudtentaclesBindUrl(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function getAdminCloudtentaclesBindUrl(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return getCloudtentaclesBindUrl({ return getCloudtentaclesBindUrl({
...context, ...context,
key: payload.key, key: payload.key,
@@ -694,10 +642,7 @@ export async function getAdminCloudtentaclesBindUrl(payload = /** @type {AdminCl
/** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */ /** @param {AdminCloudtentaclesVirtualNumberInput} [payload] */
export async function backAdminCloudtentaclesVirtualNumber(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) { export async function backAdminCloudtentaclesVirtualNumber(payload = /** @type {AdminCloudtentaclesVirtualNumberInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return backCloudtentaclesVirtualNumber({ return backCloudtentaclesVirtualNumber({
...context, ...context,
key: payload.key, key: payload.key,
@@ -707,10 +652,7 @@ export async function backAdminCloudtentaclesVirtualNumber(payload = /** @type {
/** @param {AdminCloudtentaclesFullFlowInput} [payload] */ /** @param {AdminCloudtentaclesFullFlowInput} [payload] */
export async function runAdminCloudtentaclesFullFlow(payload = /** @type {AdminCloudtentaclesFullFlowInput} */ ({})) { export async function runAdminCloudtentaclesFullFlow(payload = /** @type {AdminCloudtentaclesFullFlowInput} */ ({})) {
const context = resolveCloudtentaclesAdminContext(payload, { const context = resolveAdminCloudtentaclesSessionPayload(payload)
savedSource: getCloudtentaclesSourceConfig(),
persistedSession: getCloudtentaclesSessionState(),
})
return runCloudtentaclesFullDebugFlow({ return runCloudtentaclesFullDebugFlow({
...context, ...context,
skuId: payload.skuId, skuId: payload.skuId,