Improve OCPP error handling, fix performance storage default file path
[e-mobility-charging-stations-simulator.git] / src / performance / storage / MikroORMStorage.ts
1 // Copyright Jerome Benoit. 2021. All Rights Reserved.
2
3 import { Configuration, Connection, IDatabaseDriver, MikroORM, Options } from '@mikro-orm/core';
4 import { MikroORMDBType, StorageType } from '../../types/Storage';
5
6 import Constants from '../../utils/Constants';
7 import { PerformanceData } from '../../types/orm/entities/PerformanceData';
8 import { PerformanceRecord } from '../../types/orm/entities/PerformanceRecord';
9 import Statistics from '../../types/Statistics';
10 import { Storage } from './Storage';
11
12 export class MikroORMStorage extends Storage {
13 private storageType: StorageType;
14 private orm: MikroORM;
15
16 constructor(storageURI: string, logPrefix: string, storageType: StorageType) {
17 super(storageURI, logPrefix);
18 this.storageType = storageType;
19 this.dbName = this.storageURI.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ?? Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME;
20 }
21
22 public async storePerformanceStatistics(performanceStatistics: Statistics): Promise<void> {
23 try {
24 const performanceRecord = new PerformanceRecord();
25 await this.orm.em.persistAndFlush(performanceRecord);
26 } catch (error) {
27 this.handleDBError(this.storageType, error, Constants.PERFORMANCE_RECORDS_TABLE);
28 }
29 }
30
31 public async open(): Promise<void> {
32 this.orm = await MikroORM.init(this.getOptions(), true);
33 }
34
35 public async close(): Promise<void> {
36 await this.orm.close();
37 }
38
39 private getOptions(): Configuration<IDatabaseDriver<Connection>> | Options<IDatabaseDriver<Connection>> {
40 return {
41 entities: [PerformanceRecord, PerformanceData],
42 dbName: this.dbName,
43 type: this.storageType as MikroORMDBType,
44 clientUrl: this.storageURI.toString()
45 };
46 }
47 }
48