refactor: cleanup MikroORM entities
[e-mobility-charging-stations-simulator.git] / src / performance / storage / MikroOrmStorage.ts
index 0c2b28ad920b1a256b1119b0f9c7e24a05cd62e6..d5e25bb2c6e7e205a98963bd3bd97195d7dc73cb 100644 (file)
@@ -1,82 +1,82 @@
-// Copyright Jerome Benoit. 2021. All Rights Reserved.
+// Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
 
-import { Configuration, Connection, IDatabaseDriver, MikroORM, Options } from '@mikro-orm/core';
-import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
+import { MikroORM as MariaDbORM, type Options as MariaDbOptions } from '@mikro-orm/mariadb'
+import { MikroORM as SqliteORM, type Options as SqliteOptions } from '@mikro-orm/sqlite'
 
-import { PerformanceData } from '../../types/orm/entities/PerformanceData';
-import { PerformanceRecord } from '../../types/orm/entities/PerformanceRecord';
-import type { Statistics } from '../../types/Statistics';
-import { MikroORMDBType, StorageType } from '../../types/Storage';
-import Constants from '../../utils/Constants';
-import { Storage } from './Storage';
+import { Storage } from './Storage.js'
+import { type Statistics, StorageType } from '../../types/index.js'
+import { Constants } from '../../utils/index.js'
 
 export class MikroOrmStorage extends Storage {
-  private storageType: StorageType;
-  private orm: MikroORM | null;
+  private readonly storageType: StorageType
+  private orm?: SqliteORM | MariaDbORM
 
-  constructor(storageUri: string, logPrefix: string, storageType: StorageType) {
-    super(storageUri, logPrefix);
-    this.storageType = storageType;
-    this.dbName = this.getDBName();
+  constructor (storageUri: string, logPrefix: string, storageType: StorageType) {
+    super(storageUri, logPrefix)
+    this.storageType = storageType
+    this.dbName = this.getDBName()
   }
 
-  public async storePerformanceStatistics(performanceStatistics: Statistics): Promise<void> {
+  public async storePerformanceStatistics (performanceStatistics: Statistics): Promise<void> {
     try {
-      const performanceRecord = new PerformanceRecord();
-      await this.orm.em.persistAndFlush(performanceRecord);
+      // TODO: build PerformanceRecord entity
+      await this.orm?.em.persistAndFlush({})
     } catch (error) {
-      this.handleDBError(this.storageType, error as Error, Constants.PERFORMANCE_RECORDS_TABLE);
+      this.handleDBError(this.storageType, error as Error, Constants.PERFORMANCE_RECORDS_TABLE)
     }
   }
 
-  public async open(): Promise<void> {
+  public async open (): Promise<void> {
     try {
-      if (!this?.orm) {
-        this.orm = await MikroORM.init(this.getOptions(), true);
+      if (this.orm == null) {
+        switch (this.storageType) {
+          case StorageType.SQLITE:
+            this.orm = await SqliteORM.init(this.getOptions() as SqliteOptions)
+            break
+          case StorageType.MARIA_DB:
+          case StorageType.MYSQL:
+            this.orm = await MariaDbORM.init(this.getOptions() as MariaDbOptions)
+            break
+        }
       }
     } catch (error) {
-      this.handleDBError(this.storageType, error as Error);
+      this.handleDBError(this.storageType, error as Error)
     }
   }
 
-  public async close(): Promise<void> {
+  public async close (): Promise<void> {
     try {
-      if (this?.orm) {
-        await this.orm.close();
-        this.orm = null;
+      if (this.orm != null) {
+        await this.orm.close()
+        delete this.orm
       }
     } catch (error) {
-      this.handleDBError(this.storageType, error as Error);
+      this.handleDBError(this.storageType, error as Error)
     }
   }
 
-  private getDBName(): string {
+  private getDBName (): string {
     if (this.storageType === StorageType.SQLITE) {
-      return `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`;
+      return `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
     }
-    return (
-      this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ??
-      Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME
-    );
+    return this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '')
   }
 
-  private getOptions():
-    | Configuration<IDatabaseDriver<Connection>>
-    | Options<IDatabaseDriver<Connection>> {
+  private getOptions (): SqliteOptions | MariaDbOptions {
     return {
-      metadataProvider: TsMorphMetadataProvider,
-      entities: [PerformanceRecord, PerformanceData],
-      type: this.storageType as MikroORMDBType,
-      clientUrl: this.getClientUrl(),
-    };
+      dbName: this.dbName,
+      entities: ['./dist/types/orm/entities/*.js'],
+      entitiesTs: ['./src/types/orm/entities/*.ts'],
+      clientUrl: this.getClientUrl()
+    }
   }
 
-  private getClientUrl(): string {
+  private getClientUrl (): string | undefined {
     switch (this.storageType) {
       case StorageType.SQLITE:
       case StorageType.MARIA_DB:
       case StorageType.MYSQL:
-        return this.storageUri.toString();
+        return this.storageUri.toString()
     }
   }
 }