import { Module, Scope } from '@nestjs/common'; import { RefreshTokenInterceptor, SessionModule } from './core/sessions'; import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core'; import { HttpExceptionFilter, TransformInterceptor } from './core/response'; import { ApmModule } from './core/apm'; import { CONNECTION_NAME } from './core/strings/constants/base.constants'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule } from '@nestjs/config'; import { UserPrivilegeModule } from './modules/user-related/user-privilege/user-privilege.module'; import { CqrsModule } from '@nestjs/cqrs'; import { CouchModule } from './modules/configuration/couch/couch.module'; import { UserPrivilegeModels } from './modules/user-related/user-privilege/constants'; import { RolesGuard } from './core/guards/domain/roles.guard'; import { PrivilegeService } from './core/guards/domain/services/privilege.service'; import { UserModel } from './modules/user-related/user/data/models/user.model'; import { AuthModule } from './modules/configuration/auth/auth.module'; import { UserModule } from './modules/user-related/user/user.module'; import { LogModel } from './modules/configuration/log/data/models/log.model'; import { ErrorLogModel } from './modules/configuration/log/data/models/error-log.model'; import { LogModule } from './modules/configuration/log/log.module'; import { TenantModule } from './modules/user-related/tenant/tenant.module'; import { ItemCategoryModule } from './modules/item-related/item-category/item-category.module'; import { ItemCategoryModel } from './modules/item-related/item-category/data/models/item-category.model'; import { ConstantModule } from './modules/configuration/constant/constant.module'; import { VipCategoryModule } from './modules/transaction/vip-category/vip-category.module'; import { VipCategoryModel } from './modules/transaction/vip-category/data/models/vip-category.model'; import { VipCodeModule } from './modules/transaction/vip-code/vip-code.module'; import { VipCodeModel } from './modules/transaction/vip-code/data/models/vip-code.model'; import { ItemModule } from './modules/item-related/item/item.module'; import { ItemModel } from './modules/item-related/item/data/models/item.model'; import { SeasonTypeModule } from './modules/season-related/season-type/season-type.module'; import { SeasonTypeModel } from './modules/season-related/season-type/data/models/season-type.model'; import { TaxModule } from './modules/transaction/tax/tax.module'; import { TaxModel } from './modules/transaction/tax/data/models/tax.model'; import { SalesPriceFormulaModule } from './modules/transaction/sales-price-formula/sales-price-formula.module'; import { SalesPriceFormulaModel } from './modules/transaction/sales-price-formula/data/models/sales-price-formula.model'; import { ProfitShareFormulaModule } from './modules/transaction/profit-share-formula/profit-share-formula.module'; import { PaymentMethodModule } from './modules/transaction/payment-method/payment-method.module'; import { PaymentMethodModel } from './modules/transaction/payment-method/data/models/payment-method.model'; import { SeasonPeriodModule } from './modules/season-related/season-period/season-period.module'; import { SeasonPeriodModel } from './modules/season-related/season-period/data/models/season-period.model'; import { ItemRateModule } from './modules/item-related/item-rate/item-rate.module'; import { ItemRateModel } from './modules/item-related/item-rate/data/models/item-rate.model'; import { GoogleCalendarModule } from './modules/configuration/google-calendar/google-calendar.module'; import { TransactionModule } from './modules/transaction/transaction/transaction.module'; import { TransactionModel } from './modules/transaction/transaction/data/models/transaction.model'; import { TransactionItemModel } from './modules/transaction/transaction/data/models/transaction-item.model'; import { TransactionTaxModel } from './modules/transaction/transaction/data/models/transaction-tax.model'; import { ReconciliationModule } from './modules/transaction/reconciliation/reconciliation.module'; import { ReportModule } from './modules/reports/report/report.module'; import { ReportBookmarkModule } from './modules/reports/report-bookmark/report-bookmark.module'; import { ReportExportModule } from './modules/reports/report-export/report-export.module'; import { ReportBookmarkModel } from './modules/reports/shared/models/report-bookmark.model'; import { ExportReportHistoryModel } from './modules/reports/shared/models/export-report-history.model'; @Module({ imports: [ ApmModule.register(), ConfigModule.forRoot({ isGlobal: true, }), TypeOrmModule.forRoot({ name: CONNECTION_NAME.DEFAULT, type: 'postgres', host: process.env.DEFAULT_DB_HOST, port: parseInt(process.env.DEFAULT_DB_PORT), username: process.env.DEFAULT_DB_USER, password: process.env.DEFAULT_DB_PASS, database: process.env.DEFAULT_DB_NAME, entities: [ ...UserPrivilegeModels, ErrorLogModel, ItemModel, ItemCategoryModel, ItemRateModel, LogModel, PaymentMethodModel, SalesPriceFormulaModel, SeasonPeriodModel, SeasonTypeModel, TaxModel, TransactionModel, TransactionItemModel, TransactionTaxModel, UserModel, VipCategoryModel, VipCodeModel, // report ReportBookmarkModel, ExportReportHistoryModel, ], synchronize: false, }), AuthModule, ConstantModule, CqrsModule, CouchModule, GoogleCalendarModule, LogModule, SessionModule, // user TenantModule, UserModule, UserPrivilegeModule, // Item ItemCategoryModule, ItemModule, ItemRateModule, // transaction PaymentMethodModule, ProfitShareFormulaModule, ReconciliationModule, SalesPriceFormulaModule, TaxModule, TransactionModule, VipCategoryModule, VipCodeModule, // session SeasonTypeModule, SeasonPeriodModule, // report ReportModule, ReportBookmarkModule, ReportExportModule, ], controllers: [], providers: [ PrivilegeService, /** * By default all request from client will protect by JWT * if there is some endpoint/function that does'nt require authentication * please add `@Unprotected()` decorator to the function */ { provide: APP_GUARD, scope: Scope.REQUEST, useClass: RolesGuard, }, { provide: APP_INTERCEPTOR, scope: Scope.REQUEST, useClass: RefreshTokenInterceptor, }, { provide: APP_INTERCEPTOR, scope: Scope.REQUEST, useClass: TransformInterceptor, }, { provide: APP_FILTER, scope: Scope.REQUEST, useClass: HttpExceptionFilter, }, ], }) export class AppModule {}