1- import { Snowflake } from 'discord.js' ;
2- import mongoose , { Connection } from 'mongoose' ;
1+ /* eslint-disable no-console */
2+ import { type Snowflake } from 'discord.js' ;
3+ import mongoose , { type Connection } from 'mongoose' ;
34
4- import { IChannel , IGuildMember , IHeatMap , IMemberActivity , IRawInfo , IRole } from './interfaces' ;
5+ import {
6+ type IChannel ,
7+ type IGuildMember ,
8+ type IHeatMap ,
9+ type IMemberActivity ,
10+ type IRawInfo ,
11+ type IRole ,
12+ } from './interfaces' ;
513import {
614 channelSchema ,
715 guildMemberSchema ,
@@ -12,55 +20,62 @@ import {
1220} from './models/schemas' ;
1321
1422export default class DatabaseManager {
15- private static instance : DatabaseManager ;
16- private modelCache : Record < string , boolean > = { } ;
23+ private static instance : DatabaseManager | undefined ;
24+
25+ private readonly modelCache = new Map < string , Promise < void > > ( ) ;
1726
1827 public static getInstance ( ) : DatabaseManager {
19- if ( typeof DatabaseManager . instance === ' undefined' ) {
28+ if ( DatabaseManager . instance === undefined ) {
2029 DatabaseManager . instance = new DatabaseManager ( ) ;
2130 }
2231 return DatabaseManager . instance ;
2332 }
2433
2534 public async getGuildDb ( guildId : Snowflake ) : Promise < Connection > {
26- const dbName = guildId ;
27- const db = mongoose . connection . useDb ( dbName , { useCache : true } ) ;
35+ const db = mongoose . connection . useDb ( guildId , { useCache : true } ) ;
2836 await this . setupModels ( db , 'guild' ) ;
2937 return db ;
3038 }
3139
3240 public async getPlatformDb ( platformId : string ) : Promise < Connection > {
33- const dbName = platformId ;
34- const db = mongoose . connection . useDb ( dbName , { useCache : true } ) ;
41+ const db = mongoose . connection . useDb ( platformId , { useCache : true } ) ;
3542 await this . setupModels ( db , 'platform' ) ;
3643 return db ;
3744 }
3845
3946 private async setupModels ( db : Connection , dbType : 'guild' | 'platform' ) : Promise < void > {
40- if ( ! this . modelCache [ db . name ] ) {
41- try {
42- if ( dbType === 'platform' ) {
43- db . model < IHeatMap > ( 'HeatMap' , heatMapSchema ) ;
44- db . model < IMemberActivity > ( 'MemberActivity' , MemberActivitySchema ) ;
45- } else if ( dbType === 'guild' ) {
46- db . model < IRawInfo > ( 'RawInfo' , rawInfoSchema ) ;
47- db . model < IGuildMember > ( 'GuildMember' , guildMemberSchema ) ;
48- db . model < IChannel > ( 'Channel' , channelSchema ) ;
49- db . model < IRole > ( 'Role' , roleSchema ) ;
47+ let compilePromise : Promise < void > | undefined = this . modelCache . get ( db . name ) ;
48+
49+ if ( compilePromise === undefined ) {
50+ compilePromise = ( async ( ) : Promise < void > => {
51+ try {
52+ if ( dbType === 'platform' ) {
53+ db . model < IHeatMap > ( 'HeatMap' , heatMapSchema ) ;
54+ db . model < IMemberActivity > ( 'MemberActivity' , MemberActivitySchema ) ;
55+ } else {
56+ db . model < IRawInfo > ( 'RawInfo' , rawInfoSchema ) ;
57+ db . model < IGuildMember > ( 'GuildMember' , guildMemberSchema ) ;
58+ db . model < IChannel > ( 'Channel' , channelSchema ) ;
59+ db . model < IRole > ( 'Role' , roleSchema ) ;
60+ }
61+ } catch ( err ) {
62+ console . error ( `Error setting up models for ${ db . name } :` , err ) ;
5063 }
51- this . modelCache [ db . name ] = true ;
52- } catch ( error ) {
53- console . error ( `Error setting up models for ${ db . name } :` , error ) ;
54- }
64+ } ) ( ) ;
65+
66+ this . modelCache . set ( db . name , compilePromise ) ;
5567 }
68+
69+ await compilePromise ;
5670 }
5771
5872 public async deleteDatabase ( db : Connection ) : Promise < void > {
59- const dbName = db . name ;
6073 try {
6174 await db . dropDatabase ( ) ;
62- } catch ( error ) {
63- console . error ( `Error deleting database ${ dbName } :` , error ) ;
75+ await db . close ( ) ;
76+ this . modelCache . delete ( db . name ) ;
77+ } catch ( err ) {
78+ console . error ( `Error deleting database ${ db . name } :` , err ) ;
6479 }
6580 }
6681}
0 commit comments