Skip to main content

Modules

Overview

A module is a class annotated with a @Module() decorator. The @Module() decorator provides metadata that organizes the application structure. Modules encapsulate related functionality and follow the NestJS module pattern.

Module Structure

A typical module in MBC CQRS Serverless includes:

import { Module } from '@nestjs/common';
import { CommandModule } from '@mbc-cqrs-serverless/core';

import { CatController } from './cat.controller';
import { CatService } from './cat.service';
import { CatDataSyncRdsHandler } from './handler/cat-rds.handler';

@Module({
imports: [
CommandModule.register({
tableName: 'cat',
dataSyncHandlers: [CatDataSyncRdsHandler],
}),
],
controllers: [CatController],
providers: [CatService],
exports: [CatService],
})
export class CatModule {}

Module Components

ComponentDescription
importsList of imported modules that export providers used in this module
controllersControllers that handle HTTP requests
providersServices and other providers available for injection
exportsProviders that should be available in modules that import this module

Framework Modules

MBC CQRS Serverless provides several ready-to-use modules:

Core Modules

ModulePackagePurpose
CommandModule@mbc-cqrs-serverless/coreCQRS command handling and data sync
SequenceModule@mbc-cqrs-serverless/sequenceSequential ID generation
TenantModule@mbc-cqrs-serverless/tenantMulti-tenant management

Feature Modules

ModulePackagePurpose
TaskModule@mbc-cqrs-serverless/taskAsync task execution with Step Functions
MasterModule@mbc-cqrs-serverless/masterMaster data and settings management
ImportModule@mbc-cqrs-serverless/importCSV/API data import

Support Modules

ModulePackagePurpose
NotificationModule@mbc-cqrs-serverless/coreEmail notifications via SES
UISettingModule@mbc-cqrs-serverless/coreUser interface settings storage

Dynamic Module Registration

Most framework modules are dynamic modules that accept configuration:

CommandModule

CommandModule.register({
tableName: 'cat',
dataSyncHandlers: [CatDataSyncRdsHandler],
skipError: false,
disableDefaultHandler: false,
})
OptionTypeDefaultDescription
tableNamestringRequiredDynamoDB table name (without postfix)
dataSyncHandlersType[][]Data sync handler classes
skipErrorbooleanfalseSkip errors during data sync
disableDefaultHandlerbooleanfalseDisable default data sync to data table

SequenceModule

SequenceModule.register({
tableName: 'sequences',
})

MasterModule

MasterModule.register({
enableController: true,
})

Creating Custom Modules

Step 1: Create Module File

// src/order/order.module.ts
import { Module } from '@nestjs/common';
import { CommandModule } from '@mbc-cqrs-serverless/core';
import { SequenceModule } from '@mbc-cqrs-serverless/sequence';

import { OrderController } from './order.controller';
import { OrderService } from './order.service';
import { OrderDataSyncHandler } from './handlers/order-data-sync.handler';

@Module({
imports: [
CommandModule.register({
tableName: 'order',
dataSyncHandlers: [OrderDataSyncHandler],
}),
SequenceModule.register({
tableName: 'sequences',
}),
],
controllers: [OrderController],
providers: [OrderService],
exports: [OrderService],
})
export class OrderModule {}

Step 2: Register in AppModule

// src/app.module.ts
import { Module } from '@nestjs/common';
import { OrderModule } from './order/order.module';

@Module({
imports: [OrderModule],
})
export class AppModule {}

Best Practices

  1. One module per entity: Create a dedicated module for each business entity
  2. Export services, not controllers: Only export providers that other modules need
  3. Use forRoot for global modules: Register global configuration once in AppModule
  4. Keep modules focused: Each module should have a single responsibility