import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { DeviceEntity } from '../modules/device/entities'; import { PermissionTypeEntity } from '../modules/permission/entities'; import { ProductEntity } from '../modules/product/entities'; import { UserSessionEntity } from '../modules/session/entities/session.entity'; import { UserOtpEntity } from '../modules/user/entities'; import { UserEntity } from '../modules/user/entities/user.entity'; import { SnakeNamingStrategy } from './strategies'; import { TypeOrmWinstonLogger } from '@app/common/logger/services/typeorm.logger'; import { createLogger } from 'winston'; import { winstonLoggerOptions } from '../logger/services/winston.logger'; import { AqiSpaceDailyPollutantStatsEntity } from '../modules/aqi/entities'; import { AutomationEntity } from '../modules/automation/entities'; import { ClientEntity } from '../modules/client/entities'; import { CommunityEntity } from '../modules/community/entities'; import { DeviceStatusLogEntity } from '../modules/device-status-log/entities'; import { DeviceNotificationEntity, DeviceUserPermissionEntity, } from '../modules/device/entities'; import { InviteUserEntity, InviteUserSpaceEntity, } from '../modules/Invite-user/entities'; import { SpaceDailyOccupancyDurationEntity } from '../modules/occupancy/entities'; import { PowerClampDailyEntity, PowerClampHourlyEntity, PowerClampMonthlyEntity, } from '../modules/power-clamp/entities/power-clamp.entity'; import { PresenceSensorDailyDeviceEntity, PresenceSensorDailySpaceEntity, } from '../modules/presence-sensor/entities'; import { ProjectEntity } from '../modules/project/entities'; import { RegionEntity } from '../modules/region/entities'; import { RoleTypeEntity } from '../modules/role-type/entities'; import { SceneDeviceEntity } from '../modules/scene-device/entities'; import { SceneEntity, SceneIconEntity } from '../modules/scene/entities'; import { SpaceModelEntity, SpaceModelProductAllocationEntity, SubspaceModelEntity, SubspaceModelProductAllocationEntity, } from '../modules/space-model/entities'; import { InviteSpaceEntity } from '../modules/space/entities/invite-space.entity'; import { SpaceProductAllocationEntity } from '../modules/space/entities/space-product-allocation.entity'; import { SpaceEntity } from '../modules/space/entities/space.entity'; import { SubspaceProductAllocationEntity } from '../modules/space/entities/subspace/subspace-product-allocation.entity'; import { SubspaceEntity } from '../modules/space/entities/subspace/subspace.entity'; import { NewTagEntity } from '../modules/tag/entities/tag.entity'; import { TimeZoneEntity } from '../modules/timezone/entities'; import { UserNotificationEntity, UserSpaceEntity, } from '../modules/user/entities'; import { VisitorPasswordEntity } from '../modules/visitor-password/entities'; @Module({ imports: [ TypeOrmModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (configService: ConfigService) => { const winstonLogger = createLogger(winstonLoggerOptions); const typeOrmLogger = new TypeOrmWinstonLogger(winstonLogger); return { name: 'default', type: 'postgres', host: configService.get('DB_HOST'), port: configService.get('DB_PORT'), username: configService.get('DB_USER'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_NAME'), entities: [ NewTagEntity, ProjectEntity, UserEntity, UserSessionEntity, UserOtpEntity, ProductEntity, DeviceUserPermissionEntity, DeviceEntity, PermissionTypeEntity, CommunityEntity, SpaceEntity, SubspaceEntity, UserSpaceEntity, DeviceUserPermissionEntity, RoleTypeEntity, UserNotificationEntity, DeviceNotificationEntity, RegionEntity, TimeZoneEntity, VisitorPasswordEntity, DeviceStatusLogEntity, SceneEntity, SceneIconEntity, SceneDeviceEntity, SpaceModelEntity, SubspaceModelEntity, InviteUserEntity, InviteUserSpaceEntity, InviteSpaceEntity, AutomationEntity, SpaceModelProductAllocationEntity, SubspaceModelProductAllocationEntity, SpaceProductAllocationEntity, SubspaceProductAllocationEntity, ClientEntity, PowerClampHourlyEntity, PowerClampDailyEntity, PowerClampMonthlyEntity, PresenceSensorDailyDeviceEntity, PresenceSensorDailySpaceEntity, AqiSpaceDailyPollutantStatsEntity, SpaceDailyOccupancyDurationEntity, ], namingStrategy: new SnakeNamingStrategy(), synchronize: Boolean(JSON.parse(configService.get('DB_SYNC'))), logging: ['query', 'error', 'warn', 'schema', 'migration'], logger: typeOrmLogger, extra: { charset: 'utf8mb4', max: 20, // set pool max size idleTimeoutMillis: 5000, // close idle clients after 5 second connectionTimeoutMillis: 12_000, // return an error after 11 second if connection could not be established maxUses: 7500, // close (and replace) a connection after it has been used 7500 times (see below for discussion) }, continuationLocalStorage: true, ssl: Boolean(JSON.parse(configService.get('DB_SSL'))), }; }, }), ], providers: [TypeOrmWinstonLogger], }) export class DatabaseModule {}