penisularhr / src / app.module.ts
app.module.ts
Raw
import './boilerplate.polyfill';

import path from 'node:path';

import { BullModule } from '@nestjs/bull';
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ScheduleModule } from '@nestjs/schedule';
import { TypeOrmModule } from '@nestjs/typeorm';
import {
  AcceptLanguageResolver,
  HeaderResolver,
  I18nModule,
  QueryResolver,
} from 'nestjs-i18n';
import { DataSource } from 'typeorm';
import { addTransactionalDataSource } from 'typeorm-transactional';

import { ActivityRecordModule } from './modules/activity-record/activity-record.module';
import { AdminConfigModule } from './modules/admin-config/admin-config.module';
import { AuditLogModule } from './modules/audit-log/audit-log.module';
import { AuthModule } from './modules/auth/auth.module';
import { BlockModule } from './modules/block/block.module';
import { CronModule } from './modules/cron/cron.module';
import { EmployeeModule } from './modules/employee/employee.module';
import { HealthCheckerModule } from './modules/health-checker/health-checker.module';
import { IncentiveModule } from './modules/incentive/incentive.module';
import { MonthlyRecordModule } from './modules/monthly-record/monthly-record.module';
import { OtModule } from './modules/ot/ot.module';
import { PublicHolidayModule } from './modules/public-holiday/public-holiday.module';
import { RainfallModule } from './modules/rainfall/rainfall.module';
import { ReportModule } from './modules/report/report.module';
import { SectorModule } from './modules/sector/sector.module';
import { UserModule } from './modules/user/user.module';
import { VehicleModule } from './modules/vehicle/vehicle.module';
import { ApiConfigService } from './shared/services/api-config.service';
import { SharedModule } from './shared/shared.module';

@Module({
  imports: [
    AuthModule,
    AuditLogModule,
    AdminConfigModule,
    BlockModule,
    UserModule,
    ActivityRecordModule,
    EmployeeModule,
    OtModule,
    IncentiveModule,
    MonthlyRecordModule,
    CronModule,
    PublicHolidayModule,
    ReportModule,
    RainfallModule,
    VehicleModule,
    SectorModule,
    ScheduleModule.forRoot(),
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: '.env',
    }),
    TypeOrmModule.forRootAsync({
      imports: [SharedModule],
      useFactory: (configService: ApiConfigService) =>
        configService.postgresConfig,
      inject: [ApiConfigService],
      dataSourceFactory: (options) => {
        if (!options) {
          throw new Error('Invalid options passed');
        }

        return Promise.resolve(
          addTransactionalDataSource(new DataSource(options)),
        );
      },
    }),
    I18nModule.forRootAsync({
      useFactory: (configService: ApiConfigService) => ({
        fallbackLanguage: configService.fallbackLanguage,
        loaderOptions: {
          path: path.join(__dirname, '/i18n/'),
          watch: configService.isDevelopment,
        },
        resolvers: [
          { use: QueryResolver, options: ['lang'] },
          AcceptLanguageResolver,
          new HeaderResolver(['x-lang']),
        ],
      }),
      imports: [SharedModule],
      inject: [ApiConfigService],
    }),
    BullModule.forRootAsync({
      useFactory: (configService: ApiConfigService) => ({
        redis: configService.redisConfig,
      }),
      imports: [SharedModule],
      inject: [ApiConfigService],
    }),
    HealthCheckerModule,
  ],
  providers: [],
})
export class AppModule {}