UI server: logging and code refinements
[e-mobility-charging-stations-simulator.git] / src / charging-station / ui-server / UIHttpServer.ts
index 01c0f1b63bba1dec403f7251fc1845cc421f9c93..a9b620635d03df20db1898e6894fb94be00c8993 100644 (file)
@@ -1,12 +1,13 @@
 import { IncomingMessage, RequestListener, Server, ServerResponse } from 'http';
 
-import StatusCodes from 'http-status-codes';
+import { StatusCodes } from 'http-status-codes';
 
 import BaseError from '../../exception/BaseError';
 import { ServerOptions } from '../../types/ConfigurationData';
 import {
   ProcedureName,
   Protocol,
+  ProtocolRequest,
   ProtocolResponse,
   ProtocolVersion,
   RequestPayload,
@@ -48,25 +49,16 @@ export default class UIHttpServer extends AbstractUIServer {
 
   public sendResponse(response: string): void {
     const [uuid, payload] = JSON.parse(response) as ProtocolResponse;
-    let statusCode: number;
-    switch (payload.status) {
-      case ResponseStatus.SUCCESS:
-        statusCode = StatusCodes.OK;
-        break;
-      case ResponseStatus.FAILURE:
-      default:
-        statusCode = StatusCodes.BAD_REQUEST;
-        break;
-    }
+    const statusCode = this.responseStatusToStatusCode(payload.status);
     if (this.responseHandlers.has(uuid)) {
-      const { procedureName, res } = this.responseHandlers.get(uuid);
+      const { res } = this.responseHandlers.get(uuid);
       res.writeHead(statusCode, { 'Content-Type': 'application/json' });
       res.write(JSON.stringify(payload));
       res.end();
       this.responseHandlers.delete(uuid);
     } else {
       logger.error(
-        `${this.logPrefix()} ${moduleName}.sendResponse: Response received for unknown request: ${response}`
+        `${this.logPrefix()} ${moduleName}.sendResponse: Response for unknown request: ${response}`
       );
     }
   }
@@ -92,10 +84,7 @@ export default class UIHttpServer extends AbstractUIServer {
       }
       req.on('error', (error) => {
         logger.error(
-          `${this.logPrefix(
-            moduleName,
-            'requestListener.req.onerror'
-          )} Error at incoming request handling:`,
+          `${this.logPrefix(moduleName, 'requestListener.req.onerror')} Error on HTTP request:`,
           error
         );
       });
@@ -104,13 +93,12 @@ export default class UIHttpServer extends AbstractUIServer {
       }
       if (req.method === 'POST') {
         const bodyBuffer = [];
-        let body: RequestPayload;
         req
           .on('data', (chunk) => {
             bodyBuffer.push(chunk);
           })
           .on('end', () => {
-            body = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload;
+            const body = JSON.parse(Buffer.concat(bodyBuffer).toString()) as RequestPayload;
             this.uiServices
               .get(version)
               .requestHandler(this.buildRequest(uuid, procedureName, body ?? {}))
@@ -122,6 +110,10 @@ export default class UIHttpServer extends AbstractUIServer {
         throw new BaseError(`Unsupported HTTP method: '${req.method}'`);
       }
     } catch (error) {
+      logger.error(
+        `${this.logPrefix(moduleName, 'requestListener')} Handle HTTP request error:`,
+        error
+      );
       this.sendResponse(this.buildResponse(uuid, { status: ResponseStatus.FAILURE }));
     }
   }
@@ -131,10 +123,21 @@ export default class UIHttpServer extends AbstractUIServer {
     procedureName: ProcedureName,
     requestPayload: RequestPayload
   ): string {
-    return JSON.stringify([id, procedureName, requestPayload]);
+    return JSON.stringify([id, procedureName, requestPayload] as ProtocolRequest);
   }
 
   private buildResponse(id: string, responsePayload: ResponsePayload): string {
-    return JSON.stringify([id, responsePayload]);
+    return JSON.stringify([id, responsePayload] as ProtocolResponse);
+  }
+
+  private responseStatusToStatusCode(status: ResponseStatus): StatusCodes {
+    switch (status) {
+      case ResponseStatus.SUCCESS:
+        return StatusCodes.OK;
+      case ResponseStatus.FAILURE:
+        return StatusCodes.BAD_REQUEST;
+      default:
+        return StatusCodes.INTERNAL_SERVER_ERROR;
+    }
   }
 }