Switch rollup bundler TS plugin to rollup-plugin-ts
[e-mobility-charging-stations-simulator.git] / src / performance / storage / MikroORMStorage.ts
CommitLineData
a6b3c6c3
JB
1// Copyright Jerome Benoit. 2021. All Rights Reserved.
2
3import { Configuration, Connection, IDatabaseDriver, MikroORM, Options } from '@mikro-orm/core';
4import { MikroORMDBType, StorageType } from '../../types/Storage';
5
6import Constants from '../../utils/Constants';
7import { PerformanceData } from '../../types/orm/entities/PerformanceData';
8import { PerformanceRecord } from '../../types/orm/entities/PerformanceRecord';
9import Statistics from '../../types/Statistics';
10import { Storage } from './Storage';
ae8ee665 11import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
a6b3c6c3
JB
12
13export class MikroORMStorage extends Storage {
14 private storageType: StorageType;
15 private orm: MikroORM;
16
17 constructor(storageURI: string, logPrefix: string, storageType: StorageType) {
18 super(storageURI, logPrefix);
19 this.storageType = storageType;
d5603918 20 this.dbName = this.getDBName();
a6b3c6c3
JB
21 }
22
23 public async storePerformanceStatistics(performanceStatistics: Statistics): Promise<void> {
24 try {
25 const performanceRecord = new PerformanceRecord();
26 await this.orm.em.persistAndFlush(performanceRecord);
27 } catch (error) {
28 this.handleDBError(this.storageType, error, Constants.PERFORMANCE_RECORDS_TABLE);
29 }
30 }
31
32 public async open(): Promise<void> {
33 this.orm = await MikroORM.init(this.getOptions(), true);
34 }
35
36 public async close(): Promise<void> {
37 await this.orm.close();
38 }
39
d5603918
JB
40 private getDBName(): string {
41 if (this.storageType === StorageType.SQLITE) {
ae8ee665 42 return `${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`;
d5603918
JB
43 }
44 return this.storageURI.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ?? Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME;
45 }
46
a6b3c6c3
JB
47 private getOptions(): Configuration<IDatabaseDriver<Connection>> | Options<IDatabaseDriver<Connection>> {
48 return {
ae8ee665 49 metadataProvider: TsMorphMetadataProvider,
a6b3c6c3 50 entities: [PerformanceRecord, PerformanceData],
a6b3c6c3 51 type: this.storageType as MikroORMDBType,
d5603918 52 clientUrl: this.getClientUrl()
a6b3c6c3
JB
53 };
54 }
d5603918
JB
55
56 private getClientUrl(): string {
57 switch (this.storageType) {
58 case StorageType.SQLITE:
d5603918
JB
59 case StorageType.MARIA_DB:
60 case StorageType.MYSQL:
61 return this.storageURI.toString();
62 }
63 }
a6b3c6c3
JB
64}
65