feat(config-service): split config-service from iam for plugin/layout config

- new NestJS service on port 3011/gRPC 50059 (ADR-026)
- owns 6 config_ tables (plugin/role-mapping/role-layout/layout-tpl/user-override/outbox)
- GraphQL Federation 2 subgraph with DataLoader + RouterAuthGuard
- gRPC ConfigService + admin REST CRUD + user REST API
- three-layer merge: registry.defaultProps + roleMapping.widget_props + userOverride.props
- Redis cache with 5min TTL
- registered in apollo-router supergraph + docker-compose + port-allocation

Implements M3 of v2.1 migration plan.
This commit is contained in:
SpecialX
2026-07-15 02:13:03 +08:00
parent 163bff6666
commit 1a5fa78fa6
44 changed files with 3538 additions and 33 deletions

125
pnpm-lock.yaml generated
View File

@@ -773,6 +773,109 @@ importers:
specifier: ^2.1.0
version: 2.1.0(@types/node@22.20.1)(jsdom@25.0.0)(msw@2.15.0(@types/node@22.20.1)(typescript@5.6.2))(terser@5.49.0)
services/config-service:
dependencies:
'@apollo/subgraph':
specifier: ^2.2.3
version: 2.14.2(graphql@16.14.2)
'@edu/shared-ts':
specifier: workspace:*
version: link:../../packages/shared-ts
'@grpc/grpc-js':
specifier: ^1.12.0
version: 1.14.4
'@grpc/proto-loader':
specifier: ^0.7.13
version: 0.7.13
'@nestjs/apollo':
specifier: ^12.2.0
version: 12.2.0(@apollo/server@4.13.0(encoding@0.1.13)(graphql@16.14.2))(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(@nestjs/graphql@12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2))(graphql@16.14.2)
'@nestjs/common':
specifier: ^10.4.0
version: 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core':
specifier: ^10.4.0
version: 10.4.22(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/microservices@10.4.22)(@nestjs/platform-express@10.4.22)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/graphql':
specifier: ^12.2.0
version: 12.2.0(@apollo/subgraph@2.14.2(graphql@16.14.2))(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(graphql@16.14.2)(reflect-metadata@0.2.2)
'@nestjs/microservices':
specifier: ^10.4.0
version: 10.4.22(@grpc/grpc-js@1.14.4)(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)(ioredis@5.11.1)(kafkajs@2.2.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/platform-express':
specifier: ^10.4.0
version: 10.4.22(@nestjs/common@10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.22)
'@opentelemetry/api':
specifier: ^1.9.0
version: 1.9.1
'@opentelemetry/auto-instrumentations-node':
specifier: ^0.50.0
version: 0.50.0(@opentelemetry/api@1.9.1)(encoding@0.1.13)
'@opentelemetry/exporter-trace-otlp-http':
specifier: ^0.53.0
version: 0.53.0(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-node':
specifier: ^0.53.0
version: 0.53.0(@opentelemetry/api@1.9.1)
dataloader:
specifier: ^2.2.2
version: 2.2.3
drizzle-orm:
specifier: ^0.31.0
version: 0.31.0(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(@types/react@18.3.31)(better-sqlite3@11.3.0)(mysql2@3.22.6(@types/node@22.20.1))(react@18.3.0)
graphql:
specifier: ^16.9.0
version: 16.14.2
ioredis:
specifier: ^5.4.0
version: 5.11.1
kafkajs:
specifier: ^2.2.4
version: 2.2.4
mysql2:
specifier: ^3.11.0
version: 3.22.6(@types/node@22.20.1)
pino:
specifier: ^9.4.0
version: 9.4.0
prom-client:
specifier: ^15.1.0
version: 15.1.3
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
rxjs:
specifier: ^7.8.0
version: 7.8.2
uuid:
specifier: ^10.0.0
version: 10.0.0
zod:
specifier: ^3.23.0
version: 3.23.0
devDependencies:
'@nestjs/cli':
specifier: ^10.4.0
version: 10.4.0
'@types/express':
specifier: ^4.17.0
version: 4.17.25
'@types/node':
specifier: ^22.0.0
version: 22.20.1
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
eslint:
specifier: ^9.10.0
version: 9.39.5(jiti@2.7.0)
typescript:
specifier: ^5.6.0
version: 5.6.2
vitest:
specifier: ^2.1.0
version: 2.1.0(@types/node@22.20.1)(jsdom@25.0.0)(msw@2.15.0(@types/node@22.20.1)(typescript@5.6.2))(terser@5.49.0)
services/content:
dependencies:
'@apollo/subgraph':
@@ -13482,7 +13585,7 @@ snapshots:
'@opentelemetry/api': 1.9.1
'@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.1)
'@opentelemetry/propagator-aws-xray': 1.3.1(@opentelemetry/api@1.9.1)
'@opentelemetry/resources': 1.24.0(@opentelemetry/api@1.9.1)
'@opentelemetry/resources': 1.9.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.43.0
'@types/aws-lambda': 8.10.143
transitivePeerDependencies:
@@ -13665,8 +13768,8 @@ snapshots:
'@opentelemetry/instrumentation-fastify@0.44.1(@opentelemetry/api@1.9.1)':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.1)
'@opentelemetry/core': 1.8.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.57.0(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.43.0
transitivePeerDependencies:
- supports-color
@@ -13773,8 +13876,8 @@ snapshots:
'@opentelemetry/instrumentation-hapi@0.45.1(@opentelemetry/api@1.9.1)':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.1)
'@opentelemetry/core': 1.8.0(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.57.0(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.43.0
transitivePeerDependencies:
- supports-color
@@ -14067,7 +14170,7 @@ snapshots:
'@opentelemetry/instrumentation-redis-4@0.46.0(@opentelemetry/api@1.9.1)':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/instrumentation': 0.57.1(@opentelemetry/api@1.9.1)
'@opentelemetry/instrumentation': 0.57.0(@opentelemetry/api@1.9.1)
'@opentelemetry/redis-common': 0.36.2
'@opentelemetry/semantic-conventions': 1.43.0
transitivePeerDependencies:
@@ -14462,7 +14565,7 @@ snapshots:
'@opentelemetry/resource-detector-alibaba-cloud@0.29.1(@opentelemetry/api@1.9.1)':
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/resources': 1.24.0(@opentelemetry/api@1.9.1)
'@opentelemetry/resources': 1.9.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.43.0
'@opentelemetry/resource-detector-alibaba-cloud@0.29.7(@opentelemetry/api@1.9.1)':
@@ -14517,7 +14620,7 @@ snapshots:
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/core': 1.0.0(@opentelemetry/api@1.9.1)
'@opentelemetry/resources': 1.24.0(@opentelemetry/api@1.9.1)
'@opentelemetry/resources': 1.9.1(@opentelemetry/api@1.9.1)
'@opentelemetry/semantic-conventions': 1.43.0
gcp-metadata: 6.0.0(encoding@0.1.13)
transitivePeerDependencies:
@@ -14923,7 +15026,7 @@ snapshots:
dependencies:
'@opentelemetry/api': 1.9.1
'@opentelemetry/instrumentation': 0.49.0(@opentelemetry/api-logs@0.46.0)(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.1)
'@opentelemetry/sdk-trace-base': 1.25.0(@opentelemetry/api@1.9.1)
transitivePeerDependencies:
- '@opentelemetry/api-logs'
- supports-color
@@ -16664,7 +16767,7 @@ snapshots:
cliui@8.0.1:
dependencies:
string-width: 4.2.3
string-width: 4.2.0
strip-ansi: 6.0.1
wrap-ansi: 7.0.0
@@ -21455,7 +21558,7 @@ snapshots:
wide-align@1.1.5:
dependencies:
string-width: 4.2.3
string-width: 4.1.0
wonka@4.0.14: {}