refactor: make storage init compliant with MikroORM 6
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 13 Jan 2024 19:28:41 +0000 (20:28 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 13 Jan 2024 19:28:41 +0000 (20:28 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
mikro-orm.config-template.ts
src/performance/storage/MikroOrmStorage.ts
src/performance/storage/Storage.ts
src/performance/storage/StorageFactory.ts
src/types/Storage.ts
src/types/index.ts
src/utils/Utils.ts

index ddfcb4c338d3570221989e3bf1194ad1389a008d..a418c75e7f7c2ca9960d8c7eafb78dd4f2fd8dc6 100644 (file)
@@ -1,10 +1,10 @@
 import { defineConfig } from '@mikro-orm/sqlite'
 
-import { PerformanceData, PerformanceRecord } from './src/types/index.js'
 import { Constants } from './src/utils/index.js'
 
 export default defineConfig({
   dbName: `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`,
-  entities: [PerformanceRecord, PerformanceData],
+  entities: ['./dist/types/orm/entities/*.js'],
+  entitiesTs: ['./src/types/orm/entities/*.ts'],
   debug: true
 })
index b88bee70810681ffe9b5320bd8da3cb5c57db7ec..d5e25bb2c6e7e205a98963bd3bd97195d7dc73cb 100644 (file)
@@ -1,21 +1,15 @@
 // Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
 
-import { type Configuration, MikroORM, type 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 { Storage } from './Storage.js'
-import {
-  type MikroOrmDbType,
-  PerformanceData,
-  PerformanceRecord,
-  type Statistics,
-  StorageType
-} from '../../types/index.js'
+import { type Statistics, StorageType } from '../../types/index.js'
 import { Constants } from '../../utils/index.js'
 
 export class MikroOrmStorage extends Storage {
   private readonly storageType: StorageType
-  private orm?: MikroORM
+  private orm?: SqliteORM | MariaDbORM
 
   constructor (storageUri: string, logPrefix: string, storageType: StorageType) {
     super(storageUri, logPrefix)
@@ -25,8 +19,8 @@ export class MikroOrmStorage extends Storage {
 
   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)
     }
@@ -35,7 +29,15 @@ export class MikroOrmStorage extends Storage {
   public async open (): Promise<void> {
     try {
       if (this.orm == null) {
-        this.orm = await MikroORM.init(this.getOptions(), true)
+        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)
@@ -60,11 +62,11 @@ export class MikroOrmStorage extends Storage {
     return this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '')
   }
 
-  private getOptions (): Configuration | Options {
+  private getOptions (): SqliteOptions | MariaDbOptions {
     return {
-      metadataProvider: TsMorphMetadataProvider,
-      entities: [PerformanceRecord, PerformanceData],
-      type: this.storageType as MikroOrmDbType,
+      dbName: this.dbName,
+      entities: ['./dist/types/orm/entities/*.js'],
+      entitiesTs: ['./src/types/orm/entities/*.ts'],
       clientUrl: this.getClientUrl()
     }
   }
index c6cf28963cfda14dbce33507d5a8e914036edb6d..d9539190cced18006c52d8845dd62ac5ec6b0b37 100644 (file)
@@ -42,14 +42,14 @@ export abstract class Storage {
 
   protected getDBNameFromStorageType (type: StorageType): DBName | undefined {
     switch (type) {
+      case StorageType.SQLITE:
+        return DBName.SQLITE
       case StorageType.MARIA_DB:
         return DBName.MARIA_DB
-      case StorageType.MONGO_DB:
-        return DBName.MONGO_DB
       case StorageType.MYSQL:
         return DBName.MYSQL
-      case StorageType.SQLITE:
-        return DBName.SQLITE
+      case StorageType.MONGO_DB:
+        return DBName.MONGO_DB
     }
   }
 
index a2bfa82bdb3ba3258752a16f1db288c31297e562..e1e42751533c60afc930533484e975c169dda18e 100644 (file)
@@ -27,9 +27,9 @@ export class StorageFactory {
       case StorageType.MONGO_DB:
         storageInstance = new MongoDBStorage(connectionUri, logPrefix)
         break
+      // case StorageType.SQLITE:
       // case StorageType.MYSQL:
       // case StorageType.MARIA_DB:
-      // case StorageType.SQLITE:
       //   storageInstance = new MikroOrmStorage(connectionUri, logPrefix, type)
       //   break
       default:
index 3301f5ca57e673adf5845c452c02e4534b5aa669..4d4a4e4e621b25a98bce2759aab4dd6effd40a4e 100644 (file)
@@ -1,7 +1,3 @@
-import type { Configuration } from '@mikro-orm/core'
-
-export type MikroOrmDbType = keyof typeof Configuration.PLATFORMS
-
 export enum StorageType {
   JSON_FILE = 'jsonfile',
   MONGO_DB = 'mongodb',
index 3b1f799c6d0f4271555f45808296efaf565220c3..600a4c0eb26f5b066edc86968b37f03c4f24b633 100644 (file)
@@ -186,7 +186,7 @@ export {
 } from './ocpp/Configuration.js'
 export type { ConnectorStatus } from './ConnectorStatus.js'
 export { ConnectorStatusEnum, type ConnectorStatusTransition } from './ocpp/ConnectorStatusEnum.js'
-export { DBName, type MikroOrmDbType, StorageType } from './Storage.js'
+export { DBName, StorageType } from './Storage.js'
 export type { EmptyObject } from './EmptyObject.js'
 export { ErrorType } from './ocpp/ErrorType.js'
 export type { EvseTemplate, EvseStatus } from './Evse.js'
index 9d2b92fa4239856b0c064d062168dc5cb121a93d..2472bf617621b87ef3752cc6000447918aa25300 100644 (file)
@@ -14,7 +14,11 @@ import {
 } from 'date-fns'
 
 import { Constants } from './Constants.js'
-import { type TimestampedData, WebSocketCloseEventStatusString } from '../types/index.js'
+import {
+  type EmptyObject,
+  type TimestampedData,
+  WebSocketCloseEventStatusString
+} from '../types/index.js'
 
 export const logPrefix = (prefixString = ''): string => {
   return `${new Date().toLocaleString()}${prefixString}`
@@ -261,7 +265,7 @@ export const isObject = (value: unknown): value is object => {
   return value != null && typeof value === 'object' && !Array.isArray(value)
 }
 
-export const isEmptyObject = (object: object): object is Record<string, never> => {
+export const isEmptyObject = (object: object): object is EmptyObject => {
   if (object.constructor !== Object) {
     return false
   }