diff --git a/src/common/constants/index.ts b/src/common/constants/index.ts index 4116392..4795fd8 100644 --- a/src/common/constants/index.ts +++ b/src/common/constants/index.ts @@ -4,3 +4,5 @@ export const DEFAULT_PAGE_SIZE = 20; export const DEFAULT_PAGE = 1; export const TOKEN_EXPIRATION_TIME = '30d'; + +export const MINT_MANAGEMENT_QUEUE = 'mint_management'; diff --git a/src/common/rabbitmq/index.ts b/src/common/rabbitmq/index.ts index c43814d..7beb89a 100644 --- a/src/common/rabbitmq/index.ts +++ b/src/common/rabbitmq/index.ts @@ -1,6 +1,12 @@ import { ConfigService } from '@nestjs/config'; -import { ClientsProviderAsyncOptions, Transport } from '@nestjs/microservices'; +import { NestFactory } from '@nestjs/core'; +import { + ClientsProviderAsyncOptions, + MicroserviceOptions, + Transport, +} from '@nestjs/microservices'; +import { AppModule } from 'src/app.module'; import { NFT_GENERATION_QUEUE, RABBITMQ_SERVICE_NAME, @@ -22,3 +28,18 @@ export const rabbitmqConnectionFactory = { }), inject: [ConfigService], } as ClientsProviderAsyncOptions; + +export const createRMQMicroservice = ( + queueName: string, + configService: ConfigService, +) => { + return NestFactory.createMicroservice(AppModule, { + transport: Transport.RMQ, + options: { + urls: [configService.get('RABBITMQ_URL') as string], // TODO: Change path + queue: queueName, + prefetchCount: 1, + queueOptions: { durable: false }, + }, + }); +}; diff --git a/src/features/campaigns/controllers/campaign-pledge/campaigns-pledge.controller.ts b/src/features/campaigns/controllers/campaign-pledge/campaigns-pledge.controller.ts index 8731948..9f0bad0 100644 --- a/src/features/campaigns/controllers/campaign-pledge/campaigns-pledge.controller.ts +++ b/src/features/campaigns/controllers/campaign-pledge/campaigns-pledge.controller.ts @@ -1,9 +1,11 @@ import { Controller, Get, Query } from '@nestjs/common'; +import { EventPattern } from '@nestjs/microservices'; import { CampaignPledgeService } from '../../services/campaign-pledge/campaign-pledge.service'; import { APIResponse } from 'src/common/types'; import { CampaignPledgeQueryDto } from '../../dto/campaigns-pledge-query-dto'; import { CurrentUser } from 'src/decorators/currentUser.decorator'; +import { MINT_MANAGEMENT_QUEUE } from 'src/common/constants'; @Controller('campaigns-pledge') export class CampaignsPledgeController { @@ -25,4 +27,9 @@ export class CampaignsPledgeController { }); return { data: campaigns }; } + + @EventPattern(MINT_MANAGEMENT_QUEUE) + async handleMint(data) { + console.log('Received data: ', data); + } } diff --git a/src/main.ts b/src/main.ts index 0bda9b7..86e59fd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,6 +7,9 @@ import mongoose from 'mongoose'; import { AppModule } from './app.module'; import { AllExceptionsFilter } from './middlewares/filters/exception.filter'; import { JwtAuthGuard } from './features/auth/guards/auth.guard'; +import { createRMQMicroservice } from './common/rabbitmq'; +import { MINT_MANAGEMENT_QUEUE } from './common/constants'; +import { ConfigService } from '@nestjs/config'; const { API_PORT, NODE_ENV } = process.env; @@ -14,6 +17,10 @@ async function bootstrap() { const isProductionEnv = NODE_ENV === 'production'; const app = await NestFactory.create(AppModule); const adapterHost = app.get(HttpAdapterHost); + const queue = await createRMQMicroservice( + MINT_MANAGEMENT_QUEUE, + new ConfigService(), + ); app.use(helmet()); app.use(morgan('combined')); @@ -39,6 +46,9 @@ async function bootstrap() { await app.listen(API_PORT); console.log(`NestJS API listening on port ${API_PORT}`); + + await queue.listen(); + console.log('RabbitMQ service running'); } catch (err) { console.log('Error starting app!', err); process.exit(1);