2022-09-17 13:27:08 -05:00
|
|
|
import { Global, Inject, Module } from '@nestjs/common';
|
2022-09-20 14:54:21 -05:00
|
|
|
import Redis from 'ioredis';
|
2022-09-17 13:27:08 -05:00
|
|
|
import { DataSource } from 'typeorm';
|
|
|
|
import { createRedisConnection } from '@/redis.js';
|
|
|
|
import { DI } from './di-symbols.js';
|
|
|
|
import { loadConfig } from './config.js';
|
|
|
|
import { createPostgreDataSource } from './postgre.js';
|
|
|
|
import { RepositoryModule } from './RepositoryModule.js';
|
|
|
|
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
|
|
|
|
|
|
|
|
const config = loadConfig();
|
|
|
|
|
|
|
|
const $config: Provider = {
|
|
|
|
provide: DI.config,
|
|
|
|
useValue: config,
|
|
|
|
};
|
|
|
|
|
|
|
|
const $db: Provider = {
|
|
|
|
provide: DI.db,
|
2022-09-21 15:11:26 -05:00
|
|
|
useFactory: async (config) => {
|
|
|
|
const db = createPostgreDataSource(config);
|
2022-09-17 13:27:08 -05:00
|
|
|
return await db.initialize();
|
|
|
|
},
|
2022-09-21 15:11:26 -05:00
|
|
|
inject: [DI.config],
|
2022-09-17 13:27:08 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
const $redis: Provider = {
|
|
|
|
provide: DI.redis,
|
2022-09-21 15:11:26 -05:00
|
|
|
useFactory: (config) => {
|
|
|
|
const redisClient = createRedisConnection(config);
|
2022-09-17 13:27:08 -05:00
|
|
|
return redisClient;
|
|
|
|
},
|
2022-09-21 15:11:26 -05:00
|
|
|
inject: [DI.config],
|
2022-09-17 13:27:08 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
const $redisSubscriber: Provider = {
|
|
|
|
provide: DI.redisSubscriber,
|
2022-09-21 15:11:26 -05:00
|
|
|
useFactory: (config) => {
|
|
|
|
const redisSubscriber = createRedisConnection(config);
|
2022-09-17 13:27:08 -05:00
|
|
|
redisSubscriber.subscribe(config.host);
|
|
|
|
return redisSubscriber;
|
|
|
|
},
|
2022-09-21 15:11:26 -05:00
|
|
|
inject: [DI.config],
|
2022-09-17 13:27:08 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
@Global()
|
|
|
|
@Module({
|
|
|
|
imports: [RepositoryModule],
|
|
|
|
providers: [$config, $db, $redis, $redisSubscriber],
|
|
|
|
exports: [$config, $db, $redis, $redisSubscriber, RepositoryModule],
|
|
|
|
})
|
|
|
|
export class GlobalModule implements OnApplicationShutdown {
|
|
|
|
constructor(
|
|
|
|
@Inject(DI.db) private db: DataSource,
|
2022-09-20 14:54:21 -05:00
|
|
|
@Inject(DI.redis) private redisClient: Redis.Redis,
|
|
|
|
@Inject(DI.redisSubscriber) private redisSubscriber: Redis.Redis,
|
2022-09-17 13:27:08 -05:00
|
|
|
) {}
|
|
|
|
|
|
|
|
async onApplicationShutdown(signal: string): Promise<void> {
|
|
|
|
await Promise.all([
|
|
|
|
this.db.destroy(),
|
|
|
|
this.redisClient.disconnect(),
|
|
|
|
this.redisSubscriber.disconnect(),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|