feat: add `deleteChargingStations` SRPC command to UI Services
[e-mobility-charging-stations-simulator.git] / src / charging-station / broadcast-channel / ChargingStationWorkerBroadcastChannel.ts
index d85430f4c16fa6558e63077635b7635b14f32a09..26aa61d38e7c97149877fcb13584715afc430d34 100644 (file)
@@ -37,7 +37,13 @@ import {
   type StopTransactionRequest,
   type StopTransactionResponse
 } from '../../types/index.js'
-import { Constants, convertToInt, isEmptyObject, logger } from '../../utils/index.js'
+import {
+  Constants,
+  convertToInt,
+  isAsyncFunction,
+  isEmptyObject,
+  logger
+} from '../../utils/index.js'
 import type { ChargingStation } from '../ChargingStation.js'
 import { getConfigurationKey } from '../ConfigurationKeyUtils.js'
 import { buildMeterValue } from '../ocpp/index.js'
@@ -56,7 +62,7 @@ type CommandResponse =
 type CommandHandler = (
   requestPayload?: BroadcastChannelRequestPayload
   // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
-) => Promise<CommandResponse | void> | void
+) => Promise<CommandResponse | void> | CommandResponse | void
 
 export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChannel {
   private readonly commandHandlers: Map<BroadcastChannelProcedureName, CommandHandler>
@@ -80,6 +86,12 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
           await this.chargingStation.stop()
         }
       ],
+      [
+        BroadcastChannelProcedureName.DELETE_CHARGING_STATIONS,
+        async (requestPayload?: BroadcastChannelRequestPayload) => {
+          await this.chargingStation.delete(requestPayload?.deleteConfiguration as boolean)
+        }
+      ],
       [
         BroadcastChannelProcedureName.OPEN_CONNECTION,
         () => {
@@ -279,8 +291,6 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
       return
     }
     let responsePayload: BroadcastChannelResponsePayload | undefined
-    // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
-    let commandResponse: CommandResponse | void
     this.commandHandler(command, requestPayload)
       .then(commandResponse => {
         if (commandResponse == null || isEmptyObject(commandResponse)) {
@@ -306,12 +316,10 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
           status: ResponseStatus.FAILURE,
           command,
           requestPayload,
-          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-          commandResponse: commandResponse!,
           errorMessage: (error as OCPPError).message,
           errorStack: (error as OCPPError).stack,
           errorDetails: (error as OCPPError).details
-        }
+        } satisfies BroadcastChannelResponsePayload
       })
       .finally(() => {
         // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -334,7 +342,16 @@ export class ChargingStationWorkerBroadcastChannel extends WorkerBroadcastChanne
     if (this.commandHandlers.has(command)) {
       this.cleanRequestPayload(command, requestPayload)
       // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      return await this.commandHandlers.get(command)!(requestPayload)
+      const commandHandler = this.commandHandlers.get(command)!
+      if (isAsyncFunction(commandHandler)) {
+        return await commandHandler(requestPayload)
+      }
+      return (
+        commandHandler as (
+          requestPayload?: BroadcastChannelRequestPayload
+          // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
+        ) => CommandResponse | void
+      )(requestPayload)
     }
     throw new BaseError(`Unknown worker broadcast channel command: '${command}'`)
   }