fix: resolve E2E test failures and API runtime issues for Docker dev environment

- Fix DI issues: circular MCP module dependency, EventBus type import,
  SearchModule provider, CacheService metric counters placement
- Fix Express 5 readonly req.query in SanitizeInputMiddleware
- Fix Typesense client lazy initialization (getter instead of constructor)
- Fix MinIO bucket init error handling (non-fatal on 403)
- Fix missing class-validator decorators on bigint DTO fields (priceVND, amountVND)
- Fix subscription plan 404 (was returning 500 for invalid tier)
- Disable CSRF and raise rate limits in test environment
- Update E2E tests to match actual API response shapes
- Update CI workflow with Redis, Typesense, MinIO services and env vars

All 101 API E2E tests now pass against Docker dev environment.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 05:44:00 +07:00
parent 00d2f26e25
commit 271ad76e6f
28 changed files with 197 additions and 114 deletions

View File

@@ -1,6 +1,7 @@
import { Global, type MiddlewareConsumer, Module, type NestModule, RequestMethod } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { EventEmitterModule } from '@nestjs/event-emitter';
import { makeCounterProvider } from '@willsoto/nestjs-prometheus';
import { EventBusService } from './infrastructure/event-bus.service';
import { GlobalExceptionFilter } from './infrastructure/filters/global-exception.filter';
import { LoggerService } from './infrastructure/logger.service';
@@ -10,7 +11,7 @@ import { RequestLoggingMiddleware } from './infrastructure/middleware/request-lo
import { SanitizeInputMiddleware } from './infrastructure/middleware/sanitize-input.middleware';
import { PrismaService } from './infrastructure/prisma.service';
import { RedisService } from './infrastructure/redis.service';
import { CacheService } from './infrastructure/cache.service';
import { CacheService, CACHE_HIT_TOTAL, CACHE_MISS_TOTAL } from './infrastructure/cache.service';
@Global()
@Module({
@@ -21,6 +22,16 @@ import { CacheService } from './infrastructure/cache.service';
CacheService,
LoggerService,
EventBusService,
makeCounterProvider({
name: CACHE_HIT_TOTAL,
help: 'Total number of cache hits',
labelNames: ['resource'],
}),
makeCounterProvider({
name: CACHE_MISS_TOTAL,
help: 'Total number of cache misses',
labelNames: ['resource'],
}),
{
provide: APP_FILTER,
useClass: GlobalExceptionFilter,
@@ -34,9 +45,11 @@ export class SharedModule implements NestModule {
.apply(CorrelationIdMiddleware, SanitizeInputMiddleware, RequestLoggingMiddleware)
.forRoutes('*');
consumer
.apply(CsrfMiddleware)
.exclude({ path: 'payments/callback/(.*)', method: RequestMethod.POST })
.forRoutes('*');
if (process.env['NODE_ENV'] !== 'test') {
consumer
.apply(CsrfMiddleware)
.exclude({ path: 'payments/callback/(.*)', method: RequestMethod.POST })
.forRoutes('*');
}
}
}