Email changes via PATCH /api/v1/auth/profile now require OTP verification instead of updating immediately. A 6-digit code is sent to the new email address and must be confirmed via POST /api/v1/auth/profile/verify-email within 10 minutes. Also fixes pre-existing web valuation test failures (formatPrice output format, removed comparables section, missing QueryClientProvider wrapper). Co-Authored-By: Paperclip <noreply@paperclip.ing>
121 lines
5.8 KiB
TypeScript
121 lines
5.8 KiB
TypeScript
import { Module } from '@nestjs/common';
|
|
import { CqrsModule } from '@nestjs/cqrs';
|
|
import { JwtModule } from '@nestjs/jwt';
|
|
import { PassportModule } from '@nestjs/passport';
|
|
import { MulterModule } from '@nestjs/platform-express';
|
|
import {
|
|
MEDIA_STORAGE_SERVICE,
|
|
MinioMediaStorageService,
|
|
} from '../listings/infrastructure/services/media-storage.service';
|
|
import { CancelUserDeletionHandler } from './application/commands/cancel-user-deletion/cancel-user-deletion.handler';
|
|
import { DisableMfaHandler } from './application/commands/disable-mfa/disable-mfa.handler';
|
|
import { ExportUserDataHandler } from './application/commands/export-user-data/export-user-data.handler';
|
|
import { ForceDeleteUserHandler } from './application/commands/force-delete-user/force-delete-user.handler';
|
|
import { LoginUserHandler } from './application/commands/login-user/login-user.handler';
|
|
import { ProcessScheduledDeletionsHandler } from './application/commands/process-scheduled-deletions/process-scheduled-deletions.handler';
|
|
import { RefreshTokenHandler } from './application/commands/refresh-token/refresh-token.handler';
|
|
import { RegisterUserHandler } from './application/commands/register-user/register-user.handler';
|
|
import { RequestUserDeletionHandler } from './application/commands/request-user-deletion/request-user-deletion.handler';
|
|
import { SetupMfaHandler } from './application/commands/setup-mfa/setup-mfa.handler';
|
|
import { GenerateKycUploadUrlsHandler } from './application/commands/generate-kyc-upload-urls/generate-kyc-upload-urls.handler';
|
|
import { SubmitKycHandler } from './application/commands/submit-kyc/submit-kyc.handler';
|
|
import { UpdateProfileHandler } from './application/commands/update-profile/update-profile.handler';
|
|
import { UseBackupCodeHandler } from './application/commands/use-backup-code/use-backup-code.handler';
|
|
import { VerifyEmailChangeHandler } from './application/commands/verify-email-change/verify-email-change.handler';
|
|
import { VerifyKycHandler } from './application/commands/verify-kyc/verify-kyc.handler';
|
|
import { VerifyMfaChallengeHandler } from './application/commands/verify-mfa-challenge/verify-mfa-challenge.handler';
|
|
import { VerifyMfaSetupHandler } from './application/commands/verify-mfa-setup/verify-mfa-setup.handler';
|
|
import { GetAgentByUserIdHandler } from './application/queries/get-agent-by-user-id/get-agent-by-user-id.handler';
|
|
import { GetMfaStatusHandler } from './application/queries/get-mfa-status/get-mfa-status.handler';
|
|
import { GetProfileHandler } from './application/queries/get-profile/get-profile.handler';
|
|
import { MFA_CHALLENGE_REPOSITORY } from './domain/repositories/mfa-challenge.repository';
|
|
import { REFRESH_TOKEN_REPOSITORY } from './domain/repositories/refresh-token.repository';
|
|
import { USER_REPOSITORY } from './domain/repositories/user.repository';
|
|
import { PrismaMfaChallengeRepository } from './infrastructure/repositories/prisma-mfa-challenge.repository';
|
|
import { PrismaRefreshTokenRepository } from './infrastructure/repositories/prisma-refresh-token.repository';
|
|
import { PrismaUserRepository } from './infrastructure/repositories/prisma-user.repository';
|
|
import { MfaService } from './infrastructure/services/mfa.service';
|
|
import { OAuthService } from './infrastructure/services/oauth.service';
|
|
import { TokenService } from './infrastructure/services/token.service';
|
|
import { GoogleOAuthStrategy } from './infrastructure/strategies/google-oauth.strategy';
|
|
import { JwtStrategy } from './infrastructure/strategies/jwt.strategy';
|
|
import { LocalStrategy } from './infrastructure/strategies/local.strategy';
|
|
import { ZaloOAuthStrategy } from './infrastructure/strategies/zalo-oauth.strategy';
|
|
import { AuthController } from './presentation/controllers/auth.controller';
|
|
import { MfaController } from './presentation/controllers/mfa.controller';
|
|
import { OAuthController } from './presentation/controllers/oauth.controller';
|
|
import { UserDataController } from './presentation/controllers/user-data.controller';
|
|
|
|
const CommandHandlers = [
|
|
RegisterUserHandler,
|
|
LoginUserHandler,
|
|
RefreshTokenHandler,
|
|
VerifyKycHandler,
|
|
SubmitKycHandler,
|
|
GenerateKycUploadUrlsHandler,
|
|
UpdateProfileHandler,
|
|
VerifyEmailChangeHandler,
|
|
RequestUserDeletionHandler,
|
|
CancelUserDeletionHandler,
|
|
ForceDeleteUserHandler,
|
|
ProcessScheduledDeletionsHandler,
|
|
ExportUserDataHandler,
|
|
// MFA
|
|
SetupMfaHandler,
|
|
VerifyMfaSetupHandler,
|
|
VerifyMfaChallengeHandler,
|
|
DisableMfaHandler,
|
|
UseBackupCodeHandler,
|
|
];
|
|
|
|
const QueryHandlers = [GetProfileHandler, GetAgentByUserIdHandler, GetMfaStatusHandler];
|
|
|
|
@Module({
|
|
imports: [
|
|
CqrsModule,
|
|
PassportModule,
|
|
MulterModule.register({
|
|
limits: { fileSize: 10 * 1024 * 1024 }, // 10 MB — per-type limits enforced by FileValidationPipe
|
|
}),
|
|
JwtModule.registerAsync({
|
|
useFactory: () => {
|
|
const secret = process.env['JWT_SECRET'];
|
|
if (!secret) {
|
|
throw new Error('JWT_SECRET environment variable is required');
|
|
}
|
|
return {
|
|
secret,
|
|
signOptions: { expiresIn: '15m', audience: 'goodgo-api', issuer: 'goodgo-platform' },
|
|
};
|
|
},
|
|
}),
|
|
],
|
|
controllers: [AuthController, MfaController, OAuthController, UserDataController],
|
|
providers: [
|
|
// Repositories
|
|
{ provide: USER_REPOSITORY, useClass: PrismaUserRepository },
|
|
{ provide: REFRESH_TOKEN_REPOSITORY, useClass: PrismaRefreshTokenRepository },
|
|
{ provide: MFA_CHALLENGE_REPOSITORY, useClass: PrismaMfaChallengeRepository },
|
|
|
|
// Storage
|
|
{ provide: MEDIA_STORAGE_SERVICE, useClass: MinioMediaStorageService },
|
|
|
|
// Strategies
|
|
JwtStrategy,
|
|
LocalStrategy,
|
|
GoogleOAuthStrategy,
|
|
ZaloOAuthStrategy,
|
|
|
|
// Services
|
|
TokenService,
|
|
OAuthService,
|
|
MfaService,
|
|
|
|
// CQRS
|
|
...CommandHandlers,
|
|
...QueryHandlers,
|
|
],
|
|
exports: [TokenService, OAuthService, MfaService, USER_REPOSITORY],
|
|
})
|
|
export class AuthModule {}
|