Add and use helper to convert Ajv JSON schema validation errors to OCPP
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 20 Aug 2022 13:11:11 +0000 (15:11 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 20 Aug 2022 13:11:11 +0000 (15:11 +0200)
error type

Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/charging-station/ocpp/OCPPIncomingRequestService.ts
src/charging-station/ocpp/OCPPRequestService.ts
src/charging-station/ocpp/OCPPResponseService.ts
src/charging-station/ocpp/OCPPServiceUtils.ts

index d55a745353db4e5939ad3ec1264b3ae407d8322c..ef05c3af725a2902461d8996d8caeb2a4f3800af 100644 (file)
@@ -5,10 +5,10 @@ import ajvFormats from 'ajv-formats';
 import OCPPError from '../../exception/OCPPError';
 import { HandleErrorParams } from '../../types/Error';
 import { JsonType } from '../../types/JsonType';
-import { ErrorType } from '../../types/ocpp/ErrorType';
 import { IncomingRequestCommand } from '../../types/ocpp/Requests';
 import logger from '../../utils/Logger';
 import type ChargingStation from '../ChargingStation';
+import { OCPP16ServiceUtils } from './1.6/OCPP16ServiceUtils';
 
 const moduleName = 'OCPPIncomingRequestService';
 
@@ -68,7 +68,7 @@ export default abstract class OCPPIncomingRequestService {
       validate.errors
     );
     throw new OCPPError(
-      ErrorType.FORMATION_VIOLATION,
+      OCPP16ServiceUtils.AjvErrorsToErrorType(validate.errors),
       'Incoming request PDU is invalid',
       commandName,
       JSON.stringify(validate.errors, null, 2)
index 74ea7a8d547f8eada5b202b6d178b53f4835544a..e4ac7868b496e9a19951d0ddb1319336d79fa84b 100644 (file)
@@ -21,6 +21,7 @@ import Constants from '../../utils/Constants';
 import logger from '../../utils/Logger';
 import Utils from '../../utils/Utils';
 import type ChargingStation from '../ChargingStation';
+import { OCPP16ServiceUtils } from './1.6/OCPP16ServiceUtils';
 import type OCPPResponseService from './OCPPResponseService';
 
 const moduleName = 'OCPPRequestService';
@@ -132,7 +133,7 @@ export default abstract class OCPPRequestService {
       validate.errors
     );
     throw new OCPPError(
-      ErrorType.FORMATION_VIOLATION,
+      OCPP16ServiceUtils.AjvErrorsToErrorType(validate.errors),
       'Request PDU is invalid',
       commandName,
       JSON.stringify(validate.errors, null, 2)
index afef76b6df7360aac48e644dab255e6ae1b73d92..8c9cd984b2e318a8149576a2d848a50d766007da 100644 (file)
@@ -4,10 +4,10 @@ import ajvFormats from 'ajv-formats';
 
 import OCPPError from '../../exception/OCPPError';
 import { JsonType } from '../../types/JsonType';
-import { ErrorType } from '../../types/ocpp/ErrorType';
 import { RequestCommand } from '../../types/ocpp/Requests';
 import logger from '../../utils/Logger';
 import type ChargingStation from '../ChargingStation';
+import { OCPP16ServiceUtils } from './1.6/OCPP16ServiceUtils';
 
 const moduleName = 'OCPPResponseService';
 
@@ -45,7 +45,7 @@ export default abstract class OCPPResponseService {
       validate.errors
     );
     throw new OCPPError(
-      ErrorType.FORMATION_VIOLATION,
+      OCPP16ServiceUtils.AjvErrorsToErrorType(validate.errors),
       'Response PDU is invalid',
       commandName,
       JSON.stringify(validate.errors, null, 2)
index c9bfdd564cfa33cfe275cb386fe863ee0a1e4c12..25d6b1e72d451ed64acdd9d93280c77bd4917036 100644 (file)
@@ -1,8 +1,28 @@
+import { DefinedError, ErrorObject } from 'ajv';
+
+import { ErrorType } from '../../types/ocpp/ErrorType';
+
 export class OCPPServiceUtils {
   protected constructor() {
     // This is intentional
   }
 
+  public static AjvErrorsToErrorType(errors: ErrorObject[]): ErrorType {
+    for (const error of errors as DefinedError[]) {
+      switch (error.keyword) {
+        case 'type':
+          return ErrorType.TYPE_CONSTRAINT_VIOLATION;
+        case 'dependencies':
+        case 'required':
+          return ErrorType.OCCURRENCE_CONSTRAINT_VIOLATION;
+        case 'pattern':
+        case 'format':
+          return ErrorType.PROPERTY_CONSTRAINT_VIOLATION;
+      }
+    }
+    return ErrorType.FORMAT_VIOLATION;
+  }
+
   protected static getLimitFromSampledValueTemplateCustomValue(
     value: string,
     limit: number,