170 lines
4.8 KiB
JavaScript
170 lines
4.8 KiB
JavaScript
import { createRechargeService } from '../billing-recharge.mjs';
|
|
import {
|
|
createPlanCatalogService,
|
|
createSubscriptionService,
|
|
ensurePlanCatalogSchema,
|
|
} from '../billing-subscription.mjs';
|
|
import { resolveNormalizedRouterDecisionMode } from '../chat-intent-router.mjs';
|
|
import {
|
|
createSessionAccess,
|
|
isSessionBrokerEnabled,
|
|
} from '../session-broker.mjs';
|
|
import { isSessionBrokerMetricsEnabled } from '../session-broker-metrics.mjs';
|
|
import { isSessionStreamReplayEnabled } from '../session-stream.mjs';
|
|
import { createUserAuth } from '../user-auth.mjs';
|
|
import { createUserDataSpaceService } from '../user-data-space-service.mjs';
|
|
import {
|
|
createWechatOAuthService,
|
|
loadWechatOAuthConfig,
|
|
} from '../wechat-oauth.mjs';
|
|
import {
|
|
createWechatPayClient,
|
|
loadWechatPayConfig,
|
|
} from '../wechat-pay.mjs';
|
|
|
|
function isEnabledFlag(value) {
|
|
return ['1', 'true', 'yes', 'on'].includes(
|
|
String(value ?? '').trim().toLowerCase(),
|
|
);
|
|
}
|
|
|
|
export async function bootstrapPortalAuthServices({
|
|
pool,
|
|
h5Root,
|
|
usersRoot,
|
|
mindSearchConfigService,
|
|
env = process.env,
|
|
logger = console,
|
|
ensurePlanCatalogSchemaFn = ensurePlanCatalogSchema,
|
|
createPlanCatalogServiceFn = createPlanCatalogService,
|
|
createSubscriptionServiceFn = createSubscriptionService,
|
|
createUserAuthFn = createUserAuth,
|
|
createUserDataSpaceServiceFn = createUserDataSpaceService,
|
|
createSessionAccessFn = createSessionAccess,
|
|
isSessionBrokerEnabledFn = isSessionBrokerEnabled,
|
|
isSessionBrokerMetricsEnabledFn =
|
|
isSessionBrokerMetricsEnabled,
|
|
resolveNormalizedRouterDecisionModeFn =
|
|
resolveNormalizedRouterDecisionMode,
|
|
isSessionStreamReplayEnabledFn =
|
|
isSessionStreamReplayEnabled,
|
|
loadWechatPayConfigFn = loadWechatPayConfig,
|
|
createWechatPayClientFn = createWechatPayClient,
|
|
loadWechatOAuthConfigFn = loadWechatOAuthConfig,
|
|
createWechatOAuthServiceFn = createWechatOAuthService,
|
|
createRechargeServiceFn = createRechargeService,
|
|
} = {}) {
|
|
if (
|
|
!pool ||
|
|
!h5Root ||
|
|
!usersRoot ||
|
|
typeof mindSearchConfigService?.getEffectiveConfig !==
|
|
'function'
|
|
) {
|
|
throw new Error(
|
|
'bootstrapPortalAuthServices requires pool, roots, and MindSearch config',
|
|
);
|
|
}
|
|
|
|
await ensurePlanCatalogSchemaFn(pool);
|
|
const planCatalogService =
|
|
createPlanCatalogServiceFn(pool);
|
|
const subscriptionService =
|
|
createSubscriptionServiceFn(pool, {
|
|
getPlanAsync: (planType) =>
|
|
planCatalogService.getPlan(planType),
|
|
});
|
|
subscriptionService._planCatalogService =
|
|
planCatalogService;
|
|
|
|
const userAuth = createUserAuthFn(pool, {
|
|
usersRoot,
|
|
h5Root,
|
|
defaultSignupBalanceCents: Number(
|
|
env.H5_SIGNUP_BALANCE_CENTS ?? 500,
|
|
),
|
|
subscriptionService,
|
|
getMindSearchConfig: () =>
|
|
mindSearchConfigService.getEffectiveConfig(),
|
|
provisionUserDataSpace: async ({
|
|
userId,
|
|
workspaceRoot,
|
|
}) => {
|
|
const service = createUserDataSpaceServiceFn({
|
|
workspaceRoot,
|
|
userId,
|
|
query: pool,
|
|
});
|
|
return service.ensureReady();
|
|
},
|
|
});
|
|
|
|
const sessionAccess = createSessionAccessFn({
|
|
userAuth,
|
|
enabled: isSessionBrokerEnabledFn(),
|
|
});
|
|
if (sessionAccess.enabled) {
|
|
logger.log(
|
|
'[Portal] Session Broker enabled (MEMIND_SESSION_BROKER_ENABLED=1)',
|
|
);
|
|
}
|
|
|
|
const routerDecisionMode =
|
|
resolveNormalizedRouterDecisionModeFn(env);
|
|
const h5SessionFlags = [
|
|
sessionAccess.enabled &&
|
|
'MEMIND_SESSION_BROKER_ENABLED',
|
|
isSessionBrokerMetricsEnabledFn() &&
|
|
'MEMIND_SESSION_BROKER_METRICS',
|
|
routerDecisionMode !== 'off' &&
|
|
`MEMIND_ROUTER_NORMALIZED_DECISION=${routerDecisionMode}`,
|
|
isSessionStreamReplayEnabledFn() &&
|
|
'MEMIND_SESSION_STREAM_REPLAY',
|
|
isEnabledFlag(env.MEMIND_SSE_EVENT_TAXONOMY) &&
|
|
'MEMIND_SSE_EVENT_TAXONOMY',
|
|
isEnabledFlag(env.MEMIND_RUN_STREAM_REPLAY) &&
|
|
'MEMIND_RUN_STREAM_REPLAY',
|
|
isEnabledFlag(env.MEMIND_H5_HTML_FINISH_GUARD) &&
|
|
'MEMIND_H5_HTML_FINISH_GUARD',
|
|
].filter(Boolean);
|
|
if (h5SessionFlags.length) {
|
|
logger.log(
|
|
`[Portal] H5 session flags: ${h5SessionFlags.join(', ')}`,
|
|
);
|
|
}
|
|
|
|
const wechatPayClient = createWechatPayClientFn(
|
|
loadWechatPayConfigFn(),
|
|
);
|
|
const wechatOAuthService =
|
|
createWechatOAuthServiceFn(
|
|
pool,
|
|
loadWechatOAuthConfigFn(),
|
|
{ userAuth },
|
|
);
|
|
const rechargeService = createRechargeServiceFn(pool, {
|
|
userAuth,
|
|
wechatPay: wechatPayClient,
|
|
});
|
|
if (wechatPayClient.enabled) {
|
|
logger.log(
|
|
`WeChat Pay recharge enabled (${wechatPayClient.apiVersion ?? 'unknown'})`,
|
|
);
|
|
}
|
|
if (wechatOAuthService.enabled) {
|
|
logger.log('WeChat OAuth login enabled');
|
|
}
|
|
|
|
return {
|
|
planCatalogService,
|
|
subscriptionService,
|
|
userAuth,
|
|
sessionAccess,
|
|
routerDecisionMode,
|
|
h5SessionFlags,
|
|
wechatPayClient,
|
|
wechatOAuthService,
|
|
rechargeService,
|
|
};
|
|
}
|