import { Module } from '@nestjs/common'; import { APP_GUARD } from '@nestjs/core'; import { JwtModule } from '@nestjs/jwt'; import { ACCOUNT_READER } from './account-reader'; import { AccessTokenGuard } from './access-token.guard'; import { JwtTokenService } from './jwt-token.service'; import { DatabaseModule } from '../database/database.module'; import { AccountRepository } from './account.repository'; import { WECHAT_FETCH, WECHAT_DIAGNOSTICS, WechatClient, type WechatDiagnostics, } from './wechat-client'; import { SERVER_CONFIG, type ServerConfig } from '../config/server-config'; import { AppLogger } from '../logging/app-logger'; import { LoginRateLimiter } from './login-rate-limiter'; import { LoginService } from './login.service'; import { LoginController } from './login.controller'; import { CurrentUserController } from './current-user.controller'; @Module({ // 签名和验证参数由 JwtTokenService 统一提供,避免不同调用点使用不同策略。 imports: [JwtModule.register({}), DatabaseModule], controllers: [LoginController, CurrentUserController], providers: [ JwtTokenService, AccountRepository, { provide: ACCOUNT_READER, useExisting: AccountRepository }, { provide: WECHAT_FETCH, useValue: fetch }, { provide: WECHAT_DIAGNOSTICS, inject: [SERVER_CONFIG], useFactory: (config: ServerConfig): WechatDiagnostics => { const logger = new AppLogger(config.logLevel); return (entry) => logger.warn('wechat_exchange_failed', entry); }, }, WechatClient, LoginRateLimiter, LoginService, // 注册为全局守卫,新路由默认受保护,无需逐个添加 @UseGuards。 { provide: APP_GUARD, useClass: AccessTokenGuard }, ], exports: [JwtTokenService, ACCOUNT_READER, AccountRepository], }) /** 微信静默登录、本人读取与全局鉴权;身份始终来自可信微信兑换或本站凭证。 */ export class AuthModule {}