下沉后台云触手会话结果组装逻辑
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
import { getCloudtentaclesSourceConfig } from '../../platforms/cloudtentacles/source-config-service.js'
|
import { getCloudtentaclesSourceConfig } from '../../platforms/cloudtentacles/source-config-service.js'
|
||||||
import { getCloudtentaclesSessionState } from '../../platforms/cloudtentacles/session-state-service.js'
|
import { getCloudtentaclesSessionState } from '../../platforms/cloudtentacles/session-state-service.js'
|
||||||
import { pickFirstNonEmpty, resolveCloudtentaclesAdminContext } from './context.js'
|
import { pickFirstNonEmpty, resolveCloudtentaclesAdminContext } from './context.js'
|
||||||
|
import { maskPhone, maskSecret } from './mappers.js'
|
||||||
|
|
||||||
const DEFAULT_CLOUDTENTACLES_BASE_URL = 'https://123.207.217.176'
|
const DEFAULT_CLOUDTENTACLES_BASE_URL = 'https://123.207.217.176'
|
||||||
|
|
||||||
@@ -42,3 +43,62 @@ export function resolveAdminCloudtentaclesSessionPayload(
|
|||||||
defaultBaseUrl: options.defaultBaseUrl || DEFAULT_CLOUDTENTACLES_BASE_URL,
|
defaultBaseUrl: options.defaultBaseUrl || DEFAULT_CLOUDTENTACLES_BASE_URL,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function buildAdminCloudtentaclesPersistedSessionPayload(
|
||||||
|
session = {},
|
||||||
|
options = {},
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
token: String(session.token || '').trim(),
|
||||||
|
baseUrl: String(session.baseUrl || '').trim(),
|
||||||
|
username: pickFirstNonEmpty([options.username, session.username]),
|
||||||
|
phone: pickFirstNonEmpty([options.phone, session.phone]),
|
||||||
|
loggedInAt: String(session.loggedInAt || '').trim(),
|
||||||
|
deviceId: pickFirstNonEmpty([options.deviceId, session.deviceId, '-']),
|
||||||
|
deviceType: options.deviceType ?? session.deviceType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildAdminCloudtentaclesSessionSummary(
|
||||||
|
session = {},
|
||||||
|
savedSession = {},
|
||||||
|
) {
|
||||||
|
const permissions = Array.isArray(session.permissions) ? session.permissions : []
|
||||||
|
|
||||||
|
return {
|
||||||
|
tokenMasked: maskSecret(session.token),
|
||||||
|
permissionCount: permissions.length,
|
||||||
|
permissions,
|
||||||
|
persisted: Boolean(savedSession.token),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildAdminCloudtentaclesLoginResult(
|
||||||
|
session = {},
|
||||||
|
savedSession = {},
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
baseUrl: String(session.baseUrl || '').trim(),
|
||||||
|
username: String(session.username || '').trim(),
|
||||||
|
phoneMasked: maskPhone(session.phone),
|
||||||
|
loggedInAt: String(session.loggedInAt || '').trim(),
|
||||||
|
responseMessage: String(session.responseMessage || '').trim(),
|
||||||
|
token: String(session.token || '').trim(),
|
||||||
|
session: buildAdminCloudtentaclesSessionSummary(session, savedSession),
|
||||||
|
userInfo: session.userInfo,
|
||||||
|
asset: session.asset,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildAdminCloudtentaclesValidateResult(
|
||||||
|
session = {},
|
||||||
|
savedSession = {},
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
baseUrl: String(session.baseUrl || '').trim(),
|
||||||
|
loggedInAt: String(session.loggedInAt || '').trim(),
|
||||||
|
session: buildAdminCloudtentaclesSessionSummary(session, savedSession),
|
||||||
|
userInfo: session.userInfo,
|
||||||
|
asset: session.asset,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ import test from 'node:test'
|
|||||||
import assert from 'node:assert/strict'
|
import assert from 'node:assert/strict'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
buildAdminCloudtentaclesLoginResult,
|
||||||
|
buildAdminCloudtentaclesPersistedSessionPayload,
|
||||||
|
buildAdminCloudtentaclesSessionSummary,
|
||||||
|
buildAdminCloudtentaclesValidateResult,
|
||||||
resolveAdminCloudtentaclesCredentialPayload,
|
resolveAdminCloudtentaclesCredentialPayload,
|
||||||
resolveAdminCloudtentaclesSessionPayload,
|
resolveAdminCloudtentaclesSessionPayload,
|
||||||
} from './cloudtentacles.js'
|
} from './cloudtentacles.js'
|
||||||
@@ -63,3 +67,119 @@ test('resolveAdminCloudtentaclesSessionPayload merges payload source and persist
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('buildAdminCloudtentaclesPersistedSessionPayload prefers explicit overrides', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
buildAdminCloudtentaclesPersistedSessionPayload(
|
||||||
|
{
|
||||||
|
token: ' token-1 ',
|
||||||
|
baseUrl: ' https://cloud.example.com ',
|
||||||
|
username: ' session-user ',
|
||||||
|
phone: ' 13900000000 ',
|
||||||
|
loggedInAt: ' 2026-05-04T12:00:00.000Z ',
|
||||||
|
deviceId: ' session-device ',
|
||||||
|
deviceType: 9,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
username: 'saved-user',
|
||||||
|
phone: '13800138000',
|
||||||
|
deviceId: 'saved-device',
|
||||||
|
deviceType: 3,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
{
|
||||||
|
token: 'token-1',
|
||||||
|
baseUrl: 'https://cloud.example.com',
|
||||||
|
username: 'saved-user',
|
||||||
|
phone: '13800138000',
|
||||||
|
loggedInAt: '2026-05-04T12:00:00.000Z',
|
||||||
|
deviceId: 'saved-device',
|
||||||
|
deviceType: 3,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('buildAdminCloudtentaclesSessionSummary masks token and reports permission count', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
buildAdminCloudtentaclesSessionSummary(
|
||||||
|
{
|
||||||
|
token: 'abcdef1234567890',
|
||||||
|
permissions: ['asset', 'sku'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token: 'persisted-token',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
{
|
||||||
|
tokenMasked: 'abcdef****567890',
|
||||||
|
permissionCount: 2,
|
||||||
|
permissions: ['asset', 'sku'],
|
||||||
|
persisted: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('buildAdminCloudtentaclesLoginResult assembles login response payload', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
buildAdminCloudtentaclesLoginResult(
|
||||||
|
{
|
||||||
|
token: 'abcdef1234567890',
|
||||||
|
baseUrl: ' https://cloud.example.com ',
|
||||||
|
username: ' test-user ',
|
||||||
|
phone: '13812345678',
|
||||||
|
loggedInAt: ' 2026-05-04T12:00:00.000Z ',
|
||||||
|
responseMessage: ' success ',
|
||||||
|
permissions: ['asset'],
|
||||||
|
userInfo: { id: 1 },
|
||||||
|
asset: { balance: 10 },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
token: 'persisted-token',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
{
|
||||||
|
baseUrl: 'https://cloud.example.com',
|
||||||
|
username: 'test-user',
|
||||||
|
phoneMasked: '138****5678',
|
||||||
|
loggedInAt: '2026-05-04T12:00:00.000Z',
|
||||||
|
responseMessage: 'success',
|
||||||
|
token: 'abcdef1234567890',
|
||||||
|
session: {
|
||||||
|
tokenMasked: 'abcdef****567890',
|
||||||
|
permissionCount: 1,
|
||||||
|
permissions: ['asset'],
|
||||||
|
persisted: true,
|
||||||
|
},
|
||||||
|
userInfo: { id: 1 },
|
||||||
|
asset: { balance: 10 },
|
||||||
|
},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('buildAdminCloudtentaclesValidateResult assembles validate response payload', () => {
|
||||||
|
assert.deepEqual(
|
||||||
|
buildAdminCloudtentaclesValidateResult(
|
||||||
|
{
|
||||||
|
token: 'abcdef1234567890',
|
||||||
|
baseUrl: ' https://cloud.example.com ',
|
||||||
|
loggedInAt: ' 2026-05-04T12:00:00.000Z ',
|
||||||
|
permissions: ['asset', 'sku'],
|
||||||
|
userInfo: { id: 2 },
|
||||||
|
asset: { balance: 20 },
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
),
|
||||||
|
{
|
||||||
|
baseUrl: 'https://cloud.example.com',
|
||||||
|
loggedInAt: '2026-05-04T12:00:00.000Z',
|
||||||
|
session: {
|
||||||
|
tokenMasked: 'abcdef****567890',
|
||||||
|
permissionCount: 2,
|
||||||
|
permissions: ['asset', 'sku'],
|
||||||
|
persisted: false,
|
||||||
|
},
|
||||||
|
userInfo: { id: 2 },
|
||||||
|
asset: { balance: 20 },
|
||||||
|
},
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|||||||
@@ -88,6 +88,9 @@ import {
|
|||||||
resolveFulfillmentLookupDetail,
|
resolveFulfillmentLookupDetail,
|
||||||
} from './fulfillment.js'
|
} from './fulfillment.js'
|
||||||
import {
|
import {
|
||||||
|
buildAdminCloudtentaclesLoginResult,
|
||||||
|
buildAdminCloudtentaclesPersistedSessionPayload,
|
||||||
|
buildAdminCloudtentaclesValidateResult,
|
||||||
resolveAdminCloudtentaclesCredentialPayload,
|
resolveAdminCloudtentaclesCredentialPayload,
|
||||||
resolveAdminCloudtentaclesSessionPayload,
|
resolveAdminCloudtentaclesSessionPayload,
|
||||||
} from './cloudtentacles.js'
|
} from './cloudtentacles.js'
|
||||||
@@ -479,32 +482,12 @@ export async function testAdminCloudtentaclesLogin(payload = /** @type {AdminClo
|
|||||||
...credentialContext,
|
...credentialContext,
|
||||||
code: String(payload.code || '').trim(),
|
code: String(payload.code || '').trim(),
|
||||||
})
|
})
|
||||||
const savedSession = saveCloudtentaclesSessionState({
|
const savedSession = saveCloudtentaclesSessionState(buildAdminCloudtentaclesPersistedSessionPayload(session, {
|
||||||
token: session.token,
|
|
||||||
baseUrl: session.baseUrl,
|
|
||||||
username: session.username,
|
|
||||||
phone: session.phone,
|
|
||||||
loggedInAt: session.loggedInAt,
|
|
||||||
deviceId: credentialContext.deviceId,
|
deviceId: credentialContext.deviceId,
|
||||||
deviceType: credentialContext.deviceType,
|
deviceType: credentialContext.deviceType,
|
||||||
})
|
}))
|
||||||
|
|
||||||
return {
|
return buildAdminCloudtentaclesLoginResult(session, savedSession)
|
||||||
baseUrl: session.baseUrl,
|
|
||||||
username: session.username,
|
|
||||||
phoneMasked: maskPhone(session.phone),
|
|
||||||
loggedInAt: session.loggedInAt,
|
|
||||||
responseMessage: session.responseMessage,
|
|
||||||
token: session.token,
|
|
||||||
session: {
|
|
||||||
tokenMasked: maskSecret(session.token),
|
|
||||||
permissionCount: session.permissions.length,
|
|
||||||
permissions: session.permissions,
|
|
||||||
persisted: Boolean(savedSession.token),
|
|
||||||
},
|
|
||||||
userInfo: session.userInfo,
|
|
||||||
asset: session.asset,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {AdminCloudtentaclesValidateSessionInput} [payload] */
|
/** @param {AdminCloudtentaclesValidateSessionInput} [payload] */
|
||||||
@@ -513,28 +496,14 @@ export async function validateAdminCloudtentaclesSession(payload = /** @type {Ad
|
|||||||
const persistedSession = getCloudtentaclesSessionState()
|
const persistedSession = getCloudtentaclesSessionState()
|
||||||
const sessionContext = resolveAdminCloudtentaclesSessionPayload(payload, { savedSource, persistedSession })
|
const sessionContext = resolveAdminCloudtentaclesSessionPayload(payload, { savedSource, persistedSession })
|
||||||
const session = await validateCloudtentaclesSession(sessionContext)
|
const session = await validateCloudtentaclesSession(sessionContext)
|
||||||
const savedSession = saveCloudtentaclesSessionState({
|
const savedSession = saveCloudtentaclesSessionState(buildAdminCloudtentaclesPersistedSessionPayload(session, {
|
||||||
token: session.token,
|
|
||||||
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,
|
|
||||||
deviceId: sessionContext.deviceId,
|
deviceId: sessionContext.deviceId,
|
||||||
deviceType: sessionContext.deviceType,
|
deviceType: sessionContext.deviceType,
|
||||||
})
|
}))
|
||||||
|
|
||||||
return {
|
return buildAdminCloudtentaclesValidateResult(session, savedSession)
|
||||||
baseUrl: session.baseUrl,
|
|
||||||
loggedInAt: session.loggedInAt,
|
|
||||||
session: {
|
|
||||||
tokenMasked: maskSecret(session.token),
|
|
||||||
permissionCount: session.permissions.length,
|
|
||||||
permissions: session.permissions,
|
|
||||||
persisted: Boolean(savedSession.token),
|
|
||||||
},
|
|
||||||
userInfo: session.userInfo,
|
|
||||||
asset: session.asset,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
|
/** @param {AdminCloudtentaclesCatalogQueryInput} [payload] */
|
||||||
|
|||||||
Reference in New Issue
Block a user