Files
photo-live/services/api/src/app-ov.module.ts
T
2026-09-20 22:22:19 +08:00

73 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// services/api/src/app-ov.module.ts —— OV(海外观众)部署根模块(P2 Task 2
// 骨架 + Task 3 起装配收件箱)。与 app-cn.module.ts 同一管线骨架(日志 +
// request-id + 全局异常过滤器 + 全局校验管道 + /v1/health),但**显式挑选**
// ov 角色模块:cn 专属域(auth/albums/uploads/photos/admin——写路径与 MinIO
// 上传)不装配;P2 Task 3 加入 sync-inbox(内容事件接收 + 副本投影);Task 5
// 加入 emergency(海外紧急停用通道,独立于同步);公开读自 Task 6 起装配
// (public-ov:读 photos_ov 副本的同形契约端点 + hot 排序);Task 7 起加入
// interactions(点赞批次幂等 + Redis ov 限速)与 realtime(WS 网关:契约帧
// 分发见 main-ov 的 ContractWsAdapter),EventEmitter2 全局总线承接「事务提交
// → 实时广播」(ov-events.ts,单进程——多实例 P5);Task 8 起 interactions
// 增浏览上报(visits:窗口去重 + requestId 幂等)并加入 cleanup(互动流水
// 超窗口行回收调度);P4a Task 4 起 interactions 增公开照片下载(downloads:
// 两级开关 + 水印模式键 browse + 原图现签凭证)。cn 模块保持原样,两入口互不影响。
import {
type MiddlewareConsumer,
Module,
type NestModule,
ValidationPipe,
} from '@nestjs/common';
import { APP_FILTER, APP_PIPE } from '@nestjs/core';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { LoggerModule } from 'nestjs-pino';
import { AllExceptionsFilter } from './all-exceptions.filter';
import { CleanupModule } from './cleanup/cleanup.module';
import { EmbedOvModule } from './embed-ov/embed-ov.module';
import { EmergencyModule } from './emergency/emergency.module';
import { HealthController } from './health.controller';
import { InteractionsModule } from './interactions/interactions.module';
import { PublicOvModule } from './public-ov/public-ov.module';
import { RealtimeModule } from './realtime/realtime.module';
import { RequestIdMiddleware } from './request-id.middleware';
import { createLoggerOptions } from './shared/logger-options';
import { SyncInboxModule } from './sync-inbox/sync-inbox.module';
@Module({
imports: [
LoggerModule.forRoot(createLoggerOptions()),
// 进程内事件总线(Task 7):interactions/sync-inbox 发布 → realtime 网关
// 消费。forRoot 缺省 global——子模块直接注入 EventEmitter2。
EventEmitterModule.forRoot(),
// ov 内容事件收件箱(P2 Task 3):POST /v1/internal/sync/content-batches。
SyncInboxModule,
// 海外紧急停用通道(P2 Task 5):POST /v1/internal/emergency/disable|enable。
EmergencyModule,
// ov 公开读(P2 Task 6):/public/albums/* 读 ov 副本(含 sort=hot 快照)。
PublicOvModule,
// 展示位公开读(P4b Task 2):/public/embed-slots/* 读 slot-state 副本
// (嵌入组件数据源:近期照片 + ETag/304 + slotToken+IP 限速)。
EmbedOvModule,
// ov 公开互动(P2 Task 7):POST /public/albums/*/photos/*/likes。
InteractionsModule,
// ov 实时广播(P2 Task 7):WS /v1/realtime(适配器见 main-ov)。
RealtimeModule,
// ov 互动流水清理调度(P2 Task 8):like_batches/visit_requests/
// visit_sessions 超窗口行回收(累计总数永不清理)。
CleanupModule,
],
controllers: [HealthController],
providers: [
{ provide: APP_FILTER, useClass: AllExceptionsFilter },
{
provide: APP_PIPE,
useFactory: () => new ValidationPipe({ whitelist: true }),
},
],
})
export class AppOvModule implements NestModule {
configure(consumer: MiddlewareConsumer): void {
consumer.apply(RequestIdMiddleware).forRoutes('*');
}
}