diff --git a/libs/common/src/database/database.module.ts b/libs/common/src/database/database.module.ts index a25cf35..3b33ba4 100644 --- a/libs/common/src/database/database.module.ts +++ b/libs/common/src/database/database.module.ts @@ -43,73 +43,84 @@ import { SubspaceProductAllocationEntity } from '../modules/space/entities/subsp import { SubspaceEntity } from '../modules/space/entities/subspace/subspace.entity'; import { TagEntity } from '../modules/space/entities/tag.entity'; import { ClientEntity } from '../modules/client/entities'; +import { createLogger } from 'winston'; +import { winstonLoggerOptions } from 'src/common/filters/http-exception/logger/winston.logger'; + @Module({ imports: [ TypeOrmModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], - useFactory: (configService: ConfigService) => ({ - 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, - SpaceLinkEntity, - SubspaceEntity, - TagEntity, - UserSpaceEntity, - DeviceUserPermissionEntity, - RoleTypeEntity, - UserNotificationEntity, - DeviceNotificationEntity, - RegionEntity, - TimeZoneEntity, - VisitorPasswordEntity, - DeviceStatusLogEntity, - SceneEntity, - SceneIconEntity, - SceneDeviceEntity, - SpaceModelEntity, - SubspaceModelEntity, - TagModel, - InviteUserEntity, - InviteUserSpaceEntity, - InviteSpaceEntity, - AutomationEntity, - SpaceModelProductAllocationEntity, - SubspaceModelProductAllocationEntity, - SpaceProductAllocationEntity, - SubspaceProductAllocationEntity, - ClientEntity, - ], - namingStrategy: new SnakeNamingStrategy(), - synchronize: Boolean(JSON.parse(configService.get('DB_SYNC'))), - logging: false, - extra: { - charset: 'utf8mb4', - max: 20, // set pool max size - idleTimeoutMillis: 5000, // close idle clients after 5 second - connectionTimeoutMillis: 11_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'))), - }), + useFactory: (configService: ConfigService) => { + const sslEnabled = JSON.parse(configService.get('DB_SSL')); + 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'), + synchronize: Boolean(JSON.parse(configService.get('DB_SYNC'))), + logging: ['query', 'error', 'warn', 'schema', 'migration'], + namingStrategy: new SnakeNamingStrategy(), + ssl: sslEnabled ? { rejectUnauthorized: false } : false, + extra: { + charset: 'utf8mb4', + max: 20, + idleTimeoutMillis: 5000, + connectionTimeoutMillis: 11000, + maxUses: 7500, + ...(sslEnabled && { + ssl: { rejectUnauthorized: false }, // Required for Azure PostgreSQL + }), + }, + entities: [ + NewTagEntity, + ProjectEntity, + UserEntity, + UserSessionEntity, + UserOtpEntity, + ProductEntity, + DeviceUserPermissionEntity, + DeviceEntity, + PermissionTypeEntity, + CommunityEntity, + SpaceEntity, + SpaceLinkEntity, + SubspaceEntity, + TagEntity, + UserSpaceEntity, + RoleTypeEntity, + UserNotificationEntity, + DeviceNotificationEntity, + RegionEntity, + TimeZoneEntity, + VisitorPasswordEntity, + DeviceStatusLogEntity, + SceneEntity, + SceneIconEntity, + SceneDeviceEntity, + SpaceModelEntity, + SubspaceModelEntity, + TagModel, + InviteUserEntity, + InviteUserSpaceEntity, + InviteSpaceEntity, + AutomationEntity, + SpaceModelProductAllocationEntity, + SubspaceModelProductAllocationEntity, + SpaceProductAllocationEntity, + SubspaceProductAllocationEntity, + ClientEntity, + ], + }; + }, }), ], + providers: [TypeOrmWinstonLogger], }) export class DatabaseModule {} diff --git a/src/health/controllers/health.controller.ts b/src/health/controllers/health.controller.ts index c7238ae..a16c527 100644 --- a/src/health/controllers/health.controller.ts +++ b/src/health/controllers/health.controller.ts @@ -1,4 +1,5 @@ import { Controller, Get } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; import { HealthCheck, HealthCheckService, @@ -8,6 +9,7 @@ import { HttpHealthIndicator, } from '@nestjs/terminus'; +@ApiTags('Health Module') @Controller('health') export class HealthController { constructor( @@ -29,7 +31,7 @@ export class HealthController { path: '/', }), () => this.memory.checkHeap('memory_heap', 300 * 1024 * 1024), - () => this.http.pingCheck('tuya', 'https://openapi.tuya.com'), + () => this.http.pingCheck('tuya', process.env.TUYA_EU_URL), ]); } } diff --git a/src/health/health.module.ts b/src/health/health.module.ts index de6c36a..2d5e6d1 100644 --- a/src/health/health.module.ts +++ b/src/health/health.module.ts @@ -3,9 +3,9 @@ import { Module } from '@nestjs/common'; import { TerminusModule } from '@nestjs/terminus'; import { TypeOrmModule } from '@nestjs/typeorm'; import { HealthController } from './controllers'; - +import { HttpModule } from '@nestjs/axios'; @Module({ - imports: [TerminusModule, TypeOrmModule], + imports: [TerminusModule, HttpModule, TypeOrmModule], controllers: [HealthController], }) export class HealthModule {}