Files
goodgo-platform/apps/api/src/modules/queues/queues.module.ts
Ho Ngoc Hai 89826858ac feat(api): mount Bull Board behind admin auth (RFC-004 Phase 3 WS3b)
Adds the Bull Board BullMQ dashboard at /api/v1/admin/queues,
guarded by a JWT + ADMIN-role middleware that mirrors the existing
JwtAuthGuard + RolesGuard contract. The dashboard registers all
queues in QUEUE_METRICS_QUEUE_NAMES automatically.

- New QueuesModule with BullBoardModule.forRoot/forFeature wiring
- BullBoardAuthMiddleware (cookie-first JWT extraction, ADMIN-only)
- CSRF exclusion for dashboard routes in AppModule
- 8 unit tests covering auth contract
- Dependencies: @bull-board/api, @bull-board/express, @bull-board/nestjs

Refs: GOO-175

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-26 08:23:00 +07:00

37 lines
1.2 KiB
TypeScript

import { BullModule } from '@nestjs/bullmq';
import { type MiddlewareConsumer, Module, type NestModule, RequestMethod } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter';
import { ExpressAdapter } from '@bull-board/express';
import { BullBoardModule } from '@bull-board/nestjs';
import { QUEUE_METRICS_QUEUE_NAMES } from '../metrics/infrastructure/queue-metrics.constants';
import { BullBoardAuthMiddleware } from './bull-board-auth.middleware';
@Module({
imports: [
JwtModule.register({}),
BullBoardModule.forRoot({
route: '/admin/queues',
adapter: ExpressAdapter,
}),
...QUEUE_METRICS_QUEUE_NAMES.map((name) => BullModule.registerQueue({ name })),
BullBoardModule.forFeature(
...QUEUE_METRICS_QUEUE_NAMES.map((name) => ({
name,
adapter: BullMQAdapter,
})),
),
],
providers: [BullBoardAuthMiddleware],
})
export class QueuesModule implements NestModule {
configure(consumer: MiddlewareConsumer): void {
consumer
.apply(BullBoardAuthMiddleware)
.forRoutes(
{ path: 'admin/queues', method: RequestMethod.ALL },
{ path: 'admin/queues/(.*)', method: RequestMethod.ALL },
);
}
}