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>
This commit is contained in:
36
apps/api/src/modules/queues/queues.module.ts
Normal file
36
apps/api/src/modules/queues/queues.module.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
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 },
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user