From 8c255eb7477e20b561969211e48e3eefc5d52387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 22 Sep 2026 16:28:55 +0800 Subject: [PATCH] feat(api): USER_SYNC_SOURCE switch wires mock/http user source (G4) Co-Authored-By: Claude Code --- .env.example | 6 ++++++ .env.production.example-cn | 6 ++++++ .../api/src/user-sync/user-sync.module.ts | 20 +++++++++++-------- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index 134041e..d3ddc31 100644 --- a/.env.example +++ b/.env.example @@ -74,3 +74,9 @@ EMBED_POLL_BACKOFF_MULTIPLIER=5 # 含 304 命中——轮询本身 30s/次,余量给页面重载突发,P5 速率层接真实防护)。 EMBED_WINDOW_REQUESTS=120 EMBED_WINDOW_SECONDS=60 + +# ── 用户信息开放接口(uniservice)── +OPEN_API_USERS_URL=https://uniservice.server.hnxinyouhe.com/open/v1/users +OPEN_API_USERS_KEY=CHANGE_ME +# 用户同步源:mock(默认,e2e/本地)/ http(uniservice 真实接口) +USER_SYNC_SOURCE=mock diff --git a/.env.production.example-cn b/.env.production.example-cn index 660e12d..8fa96a3 100644 --- a/.env.production.example-cn +++ b/.env.production.example-cn @@ -69,3 +69,9 @@ ADMIN_PASSWORD=CHANGE_ME_强密码 # ── 日志 ── # pino 级别(logger-options/worker/sync;生产建议 info,排障临时 debug)。 LOG_LEVEL=info + +# ── 用户信息开放接口(uniservice)── +OPEN_API_USERS_URL=https://uniservice.server.hnxinyouhe.com/open/v1/users +OPEN_API_USERS_KEY=CHANGE_ME +# 用户同步源:mock(默认)/ http(uniservice 真实接口——生产开) +USER_SYNC_SOURCE=http diff --git a/services/api/src/user-sync/user-sync.module.ts b/services/api/src/user-sync/user-sync.module.ts index 75fb08b..5a2cf54 100644 --- a/services/api/src/user-sync/user-sync.module.ts +++ b/services/api/src/user-sync/user-sync.module.ts @@ -1,12 +1,13 @@ // services/api/src/user-sync/user-sync.module.ts —— 用户同步域模块(P4a Task 7)。 // 仅 cn 装配(AppCnModule import;ov 入口不碰——用户身份是 cn 单域事实)。 -// 装配:SyncLock(cn Redis 互斥)、MockUserSource(USER_SOURCE 端口实现, -// G4 后替换 provider 即切真实源)、UserSyncEngine(批次引擎)、 -// UserSyncScheduler(setInterval 定时触发,仅 cn bootstrap 启动)、 -// UserSyncAdminService + UserSyncController(/admin/user-sync 端点)。 -// useExisting 装配端口:引擎只依赖 UserSourcePort 符号,e2e 经 -// app.get(MockUserSource) 注入场景(mock-user-source.ts 文件头)。 +// 源装配(G4 后双源):USER_SYNC_SOURCE=http → HttpUserSource(uniservice +// 真实接口),否则/缺省 → MockUserSource(e2e/本地默认——test 经 +// app.get(MockUserSource) 注入场景,见 mock-user-source.ts 文件头)。 +// 其余:SyncLock(cn Redis 互斥)、UserSyncEngine、UserSyncScheduler +// (setInterval 定时触发,仅 cn bootstrap 启动)、UserSyncAdminService + +// UserSyncController(/admin/user-sync 端点)。 import { Module } from '@nestjs/common'; +import { HttpUserSource } from './http-user-source'; import { MockUserSource } from './mock-user-source'; import { SyncLock } from './sync-lock'; import { UserSyncAdminService } from './user-sync-admin.service'; @@ -14,12 +15,15 @@ import { UserSyncController } from './user-sync.controller'; import { UserSyncEngine, UserSyncScheduler } from './user-sync.service'; import { USER_SOURCE } from './user-source.port'; +const useHttpSource = process.env.USER_SYNC_SOURCE === 'http'; + @Module({ controllers: [UserSyncController], providers: [ SyncLock, - MockUserSource, - { provide: USER_SOURCE, useExisting: MockUserSource }, + ...(useHttpSource + ? [HttpUserSource, { provide: USER_SOURCE, useExisting: HttpUserSource }] + : [MockUserSource, { provide: USER_SOURCE, useExisting: MockUserSource }]), UserSyncEngine, UserSyncScheduler, UserSyncAdminService,