Improve OCPP error handling, fix performance storage default file path
[e-mobility-charging-stations-simulator.git] / src / performance / storage / MongoDBStorage.ts
1 // Copyright Jerome Benoit. 2021. All Rights Reserved.
2
3 import Constants from '../../utils/Constants';
4 import { MongoClient } from 'mongodb';
5 import Statistics from '../../types/Statistics';
6 import { Storage } from './Storage';
7 import { StorageType } from '../../types/Storage';
8
9 export class MongoDBStorage extends Storage {
10 private client: MongoClient;
11 private connected: boolean;
12
13 constructor(storageURI: string, logPrefix: string) {
14 super(storageURI, logPrefix);
15 this.client = new MongoClient(this.storageURI.toString());
16 this.connected = false;
17 this.dbName = this.storageURI.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ?? Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME;
18 }
19
20 public async storePerformanceStatistics(performanceStatistics: Statistics): Promise<void> {
21 try {
22 this.checkDBConnection();
23 await this.client.db(this.dbName).collection<Statistics>(Constants.PERFORMANCE_RECORDS_TABLE).insertOne(performanceStatistics);
24 } catch (error) {
25 this.handleDBError(StorageType.MONGO_DB, error, Constants.PERFORMANCE_RECORDS_TABLE);
26 }
27 }
28
29 public async open(): Promise<void> {
30 try {
31 if (!this.connected) {
32 await this.client.connect();
33 this.connected = true;
34 }
35 } catch (error) {
36 this.handleDBError(StorageType.MONGO_DB, error);
37 }
38 }
39
40 public async close(): Promise<void> {
41 try {
42 if (this.connected) {
43 await this.client.close();
44 this.connected = false;
45 }
46 } catch (error) {
47 this.handleDBError(StorageType.MONGO_DB, error);
48 }
49 }
50
51 private checkDBConnection() {
52 if (!this.connected) {
53 throw new Error(`${this.logPrefix} ${this.getDBNameFromStorageType(StorageType.MONGO_DB)} connection not opened while trying to issue a request`);
54 }
55 }
56 }