From 413a5cbcf5d6b09e4757a99ceeea25bc6f772672 Mon Sep 17 00:00:00 2001
From: Dennis Postma <dennis@directonline.io>
Date: Tue, 24 Dec 2024 23:14:08 +0100
Subject: [PATCH] Made database class to call entity manager with

---
 src/repositories/userRepository.ts |  2 +-
 src/server.ts                      | 32 +++++--------------
 src/utilities/database.ts          | 49 ++++++++++++++++++++++++++++++
 3 files changed, 57 insertions(+), 26 deletions(-)
 create mode 100644 src/utilities/database.ts

diff --git a/src/repositories/userRepository.ts b/src/repositories/userRepository.ts
index a11986c..2132775 100644
--- a/src/repositories/userRepository.ts
+++ b/src/repositories/userRepository.ts
@@ -1,6 +1,6 @@
 import prisma from '../utilities/prisma' // Import the global Prisma instance
 import { User } from '@prisma/client'
-import { appLogger } from '../utilities/logger'
+import { appLogger } from '#utilities/logger'
 
 class UserRepository {
   async getById(id: number): Promise<User | null> {
diff --git a/src/server.ts b/src/server.ts
index 17ea7e9..3d84bc7 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -1,24 +1,22 @@
 import fs from 'fs'
 import express, { Application } from 'express'
-import config from './utilities/config'
-import { getAppPath } from './utilities/storage'
+import config from '#utilities/config'
+import { getAppPath } from '#utilities/storage'
 import { createServer as httpServer, Server as HTTPServer } from 'http'
 import { addHttpRoutes } from './http'
 import cors from 'cors'
 import { Server as SocketServer } from 'socket.io'
 import { Authentication } from './middleware/authentication'
-import { TSocket } from './utilities/types'
-import { MariaDbDriver, MikroORM } from '@mikro-orm/mariadb'
-import prisma from './utilities/prisma'
-import { appLogger, watchLogs } from './utilities/logger'
+import { TSocket } from '#utilities/types'
+import prisma from '#utilities/prisma'
+import { appLogger, watchLogs } from '#utilities/logger'
 import ZoneManager from './managers/zoneManager'
 import UserManager from './managers/userManager'
 import CommandManager from './managers/commandManager'
 import QueueManager from './managers/queueManager'
 import DateManager from './managers/dateManager'
 import WeatherManager from './managers/weatherManager'
-import { Migrator } from '@mikro-orm/migrations'
-import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
+import { Database } from '#utilities/database'
 
 export class Server {
   private readonly app: Application
@@ -62,23 +60,7 @@ export class Server {
 
     // MikroORM
     try {
-      const orm = await MikroORM.init({
-        extensions: [Migrator],
-        metadataProvider: TsMorphMetadataProvider,
-        entities: ['./src/entities/**/*.js'],
-        entitiesTs: ['./src/entities/**/*.ts'],
-        driver: MariaDbDriver,
-        dbName: config.DB_NAME,
-        host: config.DB_HOST,
-        port: config.DB_PORT,
-        user: config.DB_USER,
-        password: config.DB_PASS,
-        debug: config.ENV !== 'production',
-        driverOptions: {
-          allowPublicKeyRetrieval: true
-        }
-      });
-      appLogger.info('Database 2 connected')
+      await Database.getInstance()
     } catch (error: any) {
       appLogger.error(`Database 2 connection failed: ${error.message}`)
     }
diff --git a/src/utilities/database.ts b/src/utilities/database.ts
new file mode 100644
index 0000000..0d45f6e
--- /dev/null
+++ b/src/utilities/database.ts
@@ -0,0 +1,49 @@
+import { MariaDbDriver, MikroORM } from '@mikro-orm/mariadb'
+import { Migrator } from '@mikro-orm/migrations'
+import { TsMorphMetadataProvider } from '@mikro-orm/reflection'
+import config from '#utilities/config'
+import { appLogger } from '#utilities/logger'
+
+export class Database {
+  private static instance: MikroORM | undefined
+
+  private static async init(): Promise<MikroORM> {
+    try {
+      const orm = await MikroORM.init({
+        extensions: [Migrator],
+        metadataProvider: TsMorphMetadataProvider,
+        entities: ['./src/entities/**/*.js'],
+        entitiesTs: ['./src/entities/**/*.ts'],
+        driver: MariaDbDriver,
+        dbName: config.DB_NAME,
+        host: config.DB_HOST,
+        port: config.DB_PORT,
+        user: config.DB_USER,
+        password: config.DB_PASS,
+        debug: config.ENV !== 'production',
+        driverOptions: {
+          allowPublicKeyRetrieval: true
+        }
+      })
+      appLogger.info('MikroORM connected successfully')
+      return orm
+    } catch (error) {
+      appLogger.error(`MikroORM connection failed: ${error}`)
+      throw error
+    }
+  }
+
+  public static async getInstance(): Promise<MikroORM> {
+    if (!Database.instance) {
+      Database.instance = await Database.init()
+    }
+    return Database.instance
+  }
+
+  public static async close() {
+    if (Database.instance) {
+      await Database.instance.close()
+      Database.instance = undefined
+    }
+  }
+}
\ No newline at end of file