Remove uneeded type usage
[e-mobility-charging-stations-simulator.git] / src / charging-station / ocpp / 1.6 / OCPP16RequestService.ts
CommitLineData
c8eeb62b
JB
1// Partial Copyright Jerome Benoit. 2021. All Rights Reserved.
2
73b9adec 3import type ChargingStation from '../../ChargingStation';
c0560973 4import Constants from '../../../utils/Constants';
14763b46 5import { ErrorType } from '../../../types/ocpp/ErrorType';
e3822d6f 6import { JsonObject } from '../../../types/JsonType';
f22266fd 7import { OCPP16RequestCommand } from '../../../types/ocpp/1.6/Requests';
6ed92bc1 8import { OCPP16ServiceUtils } from './OCPP16ServiceUtils';
e58068fd 9import OCPPError from '../../../exception/OCPPError';
c0560973 10import OCPPRequestService from '../OCPPRequestService';
73b9adec 11import type OCPPResponseService from '../OCPPResponseService';
be9b0d50 12import { RequestParams } from '../../../types/ocpp/Requests';
c0560973 13import Utils from '../../../utils/Utils';
c0560973 14
909dcf2d
JB
15const moduleName = 'OCPP16RequestService';
16
c0560973 17export default class OCPP16RequestService extends OCPPRequestService {
9f2e3130 18 public constructor(chargingStation: ChargingStation, ocppResponseService: OCPPResponseService) {
909dcf2d 19 if (new.target?.name === moduleName) {
06127450 20 throw new TypeError(`Cannot construct ${new.target?.name} instances directly`);
9f2e3130
JB
21 }
22 super(chargingStation, ocppResponseService);
23 }
24
e3822d6f 25 public async requestHandler<Request extends JsonObject, Response extends JsonObject>(
94a464f9 26 commandName: OCPP16RequestCommand,
e3822d6f 27 commandParams?: JsonObject,
be9b0d50 28 params?: RequestParams
f22266fd 29 ): Promise<Response> {
94a464f9 30 if (Object.values(OCPP16RequestCommand).includes(commandName)) {
f22266fd 31 return (await this.sendMessage(
94a464f9 32 Utils.generateUUID(),
f7f98c68 33 this.buildRequestPayload<Request>(commandName, commandParams),
94a464f9
JB
34 commandName,
35 params
f22266fd 36 )) as unknown as Response;
94a464f9
JB
37 }
38 throw new OCPPError(
39 ErrorType.NOT_SUPPORTED,
1c959f1f 40 `${moduleName}.requestHandler: Unsupported OCPP command ${commandName}`,
94a464f9
JB
41 commandName,
42 { commandName }
43 );
c0560973
JB
44 }
45
e3822d6f 46 private buildRequestPayload<Request extends JsonObject>(
78085c42 47 commandName: OCPP16RequestCommand,
e3822d6f 48 commandParams?: JsonObject
f22266fd 49 ): Request {
68c993d5 50 let connectorId: number;
78085c42
JB
51 switch (commandName) {
52 case OCPP16RequestCommand.AUTHORIZE:
53 return {
54 ...(!Utils.isUndefined(commandParams?.idTag)
55 ? { idTag: commandParams.idTag }
56 : { idTag: Constants.DEFAULT_IDTAG }),
f22266fd 57 } as unknown as Request;
78085c42
JB
58 case OCPP16RequestCommand.BOOT_NOTIFICATION:
59 return {
60 chargePointModel: commandParams?.chargePointModel,
61 chargePointVendor: commandParams?.chargePointVendor,
62 ...(!Utils.isUndefined(commandParams?.chargeBoxSerialNumber) && {
63 chargeBoxSerialNumber: commandParams.chargeBoxSerialNumber,
64 }),
65 ...(!Utils.isUndefined(commandParams?.chargePointSerialNumber) && {
66 chargePointSerialNumber: commandParams.chargePointSerialNumber,
67 }),
68 ...(!Utils.isUndefined(commandParams?.firmwareVersion) && {
69 firmwareVersion: commandParams.firmwareVersion,
70 }),
71 ...(!Utils.isUndefined(commandParams?.iccid) && { iccid: commandParams.iccid }),
72 ...(!Utils.isUndefined(commandParams?.imsi) && { imsi: commandParams.imsi }),
73 ...(!Utils.isUndefined(commandParams?.meterSerialNumber) && {
74 meterSerialNumber: commandParams.meterSerialNumber,
75 }),
76 ...(!Utils.isUndefined(commandParams?.meterType) && {
77 meterType: commandParams.meterType,
78 }),
f22266fd 79 } as unknown as Request;
78085c42
JB
80 case OCPP16RequestCommand.DIAGNOSTICS_STATUS_NOTIFICATION:
81 return {
82 status: commandParams?.diagnosticsStatus,
f22266fd 83 } as unknown as Request;
78085c42 84 case OCPP16RequestCommand.HEARTBEAT:
f22266fd 85 return {} as unknown as Request;
78085c42
JB
86 case OCPP16RequestCommand.METER_VALUES:
87 return {
88 connectorId: commandParams?.connectorId,
89 transactionId: commandParams?.transactionId,
5e62b119
JB
90 meterValue: Array.isArray(commandParams?.meterValue)
91 ? commandParams?.meterValue
78085c42 92 : [commandParams?.meterValue],
f22266fd 93 } as unknown as Request;
78085c42
JB
94 case OCPP16RequestCommand.STATUS_NOTIFICATION:
95 return {
96 connectorId: commandParams?.connectorId,
78085c42 97 status: commandParams?.status,
93b4a429 98 errorCode: commandParams?.errorCode,
f22266fd 99 } as unknown as Request;
78085c42
JB
100 case OCPP16RequestCommand.START_TRANSACTION:
101 return {
102 connectorId: commandParams?.connectorId,
103 ...(!Utils.isUndefined(commandParams?.idTag)
104 ? { idTag: commandParams?.idTag }
105 : { idTag: Constants.DEFAULT_IDTAG }),
106 meterStart: this.chargingStation.getEnergyActiveImportRegisterByConnectorId(
107 commandParams?.connectorId as number
108 ),
109 timestamp: new Date().toISOString(),
f22266fd 110 } as unknown as Request;
78085c42 111 case OCPP16RequestCommand.STOP_TRANSACTION:
f479a792
JB
112 connectorId = this.chargingStation.getConnectorIdByTransactionId(
113 commandParams?.transactionId as number
114 );
78085c42
JB
115 return {
116 transactionId: commandParams?.transactionId,
117 ...(!Utils.isUndefined(commandParams?.idTag) && { idTag: commandParams.idTag }),
118 meterStop: commandParams?.meterStop,
119 timestamp: new Date().toISOString(),
120 ...(commandParams?.reason && { reason: commandParams.reason }),
121 ...(this.chargingStation.getTransactionDataMeterValues() && {
122 transactionData: OCPP16ServiceUtils.buildTransactionDataMeterValues(
68c993d5 123 this.chargingStation.getConnectorStatus(connectorId).transactionBeginMeterValue,
78085c42
JB
124 OCPP16ServiceUtils.buildTransactionEndMeterValue(
125 this.chargingStation,
68c993d5 126 connectorId,
78085c42
JB
127 commandParams?.meterStop as number
128 )
129 ),
130 }),
f22266fd 131 } as unknown as Request;
78085c42
JB
132 default:
133 throw new OCPPError(
134 ErrorType.NOT_SUPPORTED,
135 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
1c959f1f 136 `${moduleName}.buildRequestPayload: Unsupported OCPP command: ${commandName}`,
78085c42
JB
137 commandName,
138 { commandName }
139 );
140 }
141 }
c0560973 142}