build(deps-dev): apply updates
[e-mobility-charging-stations-simulator.git] / src / performance / storage / MongoDBStorage.ts
index 6bc43bbb8d16e15850aceda9a9b503cd6e1af00b..c3c98022d4204c63aa6d940f7cac887d2424ed58 100644 (file)
@@ -1,59 +1,73 @@
-// Copyright Jerome Benoit. 2021. All Rights Reserved.
+// Copyright Jerome Benoit. 2021-2024. All Rights Reserved.
 
-import Constants from '../../utils/Constants';
-import { MongoClient } from 'mongodb';
-import Statistics from '../../types/Statistics';
-import { Storage } from './Storage';
-import { StorageType } from '../../types/Storage';
+import { MongoClient } from 'mongodb'
+
+import { BaseError } from '../../exception/index.js'
+import { type Statistics, StorageType } from '../../types/index.js'
+import { Constants } from '../../utils/index.js'
+import { Storage } from './Storage.js'
 
 export class MongoDBStorage extends Storage {
-  private readonly client: MongoClient | null;
-  private connected: boolean;
-
-  constructor(storageUri: string, logPrefix: string) {
-    super(storageUri, logPrefix);
-    this.client = new MongoClient(this.storageUri.toString());
-    this.connected = false;
-    this.dbName = this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '') ?? Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME;
+  private readonly client?: MongoClient
+  private connected: boolean
+
+  constructor (storageUri: string, logPrefix: string) {
+    super(storageUri, logPrefix)
+    this.client = new MongoClient(this.storageUri.toString())
+    this.connected = false
+    this.dbName = this.storageUri.pathname.replace(/(?:^\/)|(?:\/$)/g, '')
   }
 
-  public async storePerformanceStatistics(performanceStatistics: Statistics): Promise<void> {
+  public async storePerformanceStatistics (performanceStatistics: Statistics): Promise<void> {
     try {
-      this.checkDBConnection();
-      await this.client.db(this.dbName).collection<Statistics>(Constants.PERFORMANCE_RECORDS_TABLE).insertOne(performanceStatistics);
+      this.setPerformanceStatistics(performanceStatistics)
+      this.checkDBConnection()
+      await this.client
+        ?.db(this.dbName)
+        .collection<Statistics>(Constants.PERFORMANCE_RECORDS_TABLE)
+        .replaceOne({ id: performanceStatistics.id }, performanceStatistics, { upsert: true })
     } catch (error) {
-      this.handleDBError(StorageType.MONGO_DB, error as Error, Constants.PERFORMANCE_RECORDS_TABLE);
+      this.handleDBError(StorageType.MONGO_DB, error as Error, Constants.PERFORMANCE_RECORDS_TABLE)
     }
   }
 
-  public async open(): Promise<void> {
+  public async open (): Promise<void> {
     try {
-      if (!this.connected && this?.client) {
-        await this.client.connect();
-        this.connected = true;
+      if (!this.connected && this.client != null) {
+        await this.client.connect()
+        this.connected = true
       }
     } catch (error) {
-      this.handleDBError(StorageType.MONGO_DB, error as Error);
+      this.handleDBError(StorageType.MONGO_DB, error as Error)
     }
   }
 
-  public async close(): Promise<void> {
+  public async close (): Promise<void> {
+    this.clearPerformanceStatistics()
     try {
-      if (this.connected && this?.client) {
-        await this.client.close();
-        this.connected = false;
+      if (this.connected && this.client != null) {
+        await this.client.close()
+        this.connected = false
       }
     } catch (error) {
-      this.handleDBError(StorageType.MONGO_DB, error as Error);
+      this.handleDBError(StorageType.MONGO_DB, error as Error)
     }
   }
 
-  private checkDBConnection() {
-    if (!this?.client) {
-      throw new Error(`${this.logPrefix} ${this.getDBNameFromStorageType(StorageType.MONGO_DB)} client initialization failed while trying to issue a request`);
+  private checkDBConnection (): void {
+    if (this.client == null) {
+      throw new BaseError(
+        `${this.logPrefix} ${this.getDBNameFromStorageType(
+          StorageType.MONGO_DB
+        )} client initialization failed while trying to issue a request`
+      )
     }
     if (!this.connected) {
-      throw new Error(`${this.logPrefix} ${this.getDBNameFromStorageType(StorageType.MONGO_DB)} connection not opened while trying to issue a request`);
+      throw new BaseError(
+        `${this.logPrefix} ${this.getDBNameFromStorageType(
+          StorageType.MONGO_DB
+        )} connection not opened while trying to issue a request`
+      )
     }
   }
 }