From 5dddde3973e4a93158bdf90520dbac8e0e39bbfa Mon Sep 17 00:00:00 2001
From: csba1652 <Bilal.Hassan@student.uibk.ac.at>
Date: Fri, 14 Apr 2023 11:16:53 +0100
Subject: [PATCH] working on last meetings ecology suggestions

---
 api-doc.json                                  | 2724 +----------------
 projects/generated-api/src/.gitignore         |    4 +
 projects/generated-api/src/.npmignore         |    5 +
 .../generated-api/src/.swagger-codegen-ignore |   23 +
 .../src/.swagger-codegen/VERSION              |    1 +
 projects/generated-api/src/api.module.ts      |   45 +
 projects/generated-api/src/api/api.ts         |   15 +
 .../src/api/clientController.service.ts       |  352 +++
 .../src/api/hostController.service.ts         |  352 +++
 .../src/api/sensorController.service.ts       |  311 ++
 .../src/api/sensorGroupController.service.ts  |  352 +++
 .../src/api/serverController.service.ts       |  329 ++
 .../src/api/stationController.service.ts      |  352 +++
 .../src/api/userController.service.ts         |  330 ++
 projects/generated-api/src/configuration.ts   |   79 +
 projects/generated-api/src/encoder.ts         |   20 +
 projects/generated-api/src/git_push.sh        |   52 +
 projects/generated-api/src/index.ts           |    5 +
 projects/generated-api/src/model/avgMinMax.ts |   40 +
 projects/generated-api/src/model/client.ts    |   20 +
 .../src/model/dendrometerDailyValue.ts        |   21 +
 .../src/model/dendrometerDeltaR.ts            |   16 +
 .../generated-api/src/model/dendrometerMDS.ts |   16 +
 .../src/model/dendrometerValue.ts             |   26 +
 projects/generated-api/src/model/document.ts  |   19 +
 projects/generated-api/src/model/host.ts      |   18 +
 .../src/model/levelOneResponse.ts             |   20 +
 projects/generated-api/src/model/location.ts  |   18 +
 .../generated-api/src/model/measurement.ts    |   53 +
 projects/generated-api/src/model/models.ts    |   20 +
 .../generated-api/src/model/readingPayload.ts |   55 +
 .../generated-api/src/model/readingValue.ts   |   35 +
 projects/generated-api/src/model/role.ts      |   24 +
 projects/generated-api/src/model/sensor.ts    |   23 +
 .../generated-api/src/model/sensorGroup.ts    |   38 +
 projects/generated-api/src/model/station.ts   |   23 +
 projects/generated-api/src/model/sumOrAvg.ts  |   43 +
 .../src/model/threePhaseDendrometer.ts        |   18 +
 .../src/model/userLoginRequest.ts             |   16 +
 .../src/model/userSignUpRequest.ts            |   18 +
 .../src/model/valueWithTimestamp.ts           |   16 +
 projects/generated-api/src/ng-package.json    |    6 +
 projects/generated-api/src/variables.ts       |    9 +
 .../src/api/serverController.service.ts       |   32 +-
 src/app/app.component.html                    |   10 +-
 src/app/app.module.ts                         |    4 +-
 .../components/lev0Ver2/lev0.component.html   |   38 +-
 .../components/lev0Ver2/lev0.component.ts     |   41 +-
 .../pro-view/pro-view.component.html          |   10 +-
 .../components/pro-view/pro-view.component.ts |   34 +-
 src/app/shared/auth/interceptor.service.ts    |   12 +-
 51 files changed, 3372 insertions(+), 2771 deletions(-)
 create mode 100644 projects/generated-api/src/.gitignore
 create mode 100644 projects/generated-api/src/.npmignore
 create mode 100644 projects/generated-api/src/.swagger-codegen-ignore
 create mode 100644 projects/generated-api/src/.swagger-codegen/VERSION
 create mode 100644 projects/generated-api/src/api.module.ts
 create mode 100644 projects/generated-api/src/api/api.ts
 create mode 100644 projects/generated-api/src/api/clientController.service.ts
 create mode 100644 projects/generated-api/src/api/hostController.service.ts
 create mode 100644 projects/generated-api/src/api/sensorController.service.ts
 create mode 100644 projects/generated-api/src/api/sensorGroupController.service.ts
 create mode 100644 projects/generated-api/src/api/serverController.service.ts
 create mode 100644 projects/generated-api/src/api/stationController.service.ts
 create mode 100644 projects/generated-api/src/api/userController.service.ts
 create mode 100644 projects/generated-api/src/configuration.ts
 create mode 100644 projects/generated-api/src/encoder.ts
 create mode 100644 projects/generated-api/src/git_push.sh
 create mode 100644 projects/generated-api/src/index.ts
 create mode 100644 projects/generated-api/src/model/avgMinMax.ts
 create mode 100644 projects/generated-api/src/model/client.ts
 create mode 100644 projects/generated-api/src/model/dendrometerDailyValue.ts
 create mode 100644 projects/generated-api/src/model/dendrometerDeltaR.ts
 create mode 100644 projects/generated-api/src/model/dendrometerMDS.ts
 create mode 100644 projects/generated-api/src/model/dendrometerValue.ts
 create mode 100644 projects/generated-api/src/model/document.ts
 create mode 100644 projects/generated-api/src/model/host.ts
 create mode 100644 projects/generated-api/src/model/levelOneResponse.ts
 create mode 100644 projects/generated-api/src/model/location.ts
 create mode 100644 projects/generated-api/src/model/measurement.ts
 create mode 100644 projects/generated-api/src/model/models.ts
 create mode 100644 projects/generated-api/src/model/readingPayload.ts
 create mode 100644 projects/generated-api/src/model/readingValue.ts
 create mode 100644 projects/generated-api/src/model/role.ts
 create mode 100644 projects/generated-api/src/model/sensor.ts
 create mode 100644 projects/generated-api/src/model/sensorGroup.ts
 create mode 100644 projects/generated-api/src/model/station.ts
 create mode 100644 projects/generated-api/src/model/sumOrAvg.ts
 create mode 100644 projects/generated-api/src/model/threePhaseDendrometer.ts
 create mode 100644 projects/generated-api/src/model/userLoginRequest.ts
 create mode 100644 projects/generated-api/src/model/userSignUpRequest.ts
 create mode 100644 projects/generated-api/src/model/valueWithTimestamp.ts
 create mode 100644 projects/generated-api/src/ng-package.json
 create mode 100644 projects/generated-api/src/variables.ts

diff --git a/api-doc.json b/api-doc.json
index e473a2c..c126a16 100644
--- a/api-doc.json
+++ b/api-doc.json
@@ -1,2724 +1,2 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "OpenAPI definition",
-    "version": "v0"
-  },
-  "servers": [
-    {
-      "url": "http://localhost:8080",
-      "description": "Generated server url"
-    }
-  ],
-  "paths": {
-    "/api/v1/station/update/{id}": {
-      "put": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "update",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Station"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Station"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/update/{id}": {
-      "put": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "updateSensor",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Sensor"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/update/{id}": {
-      "put": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "updateSensorGroup",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/SensorGroup"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/update/{id}": {
-      "put": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "update_1",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Host"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Host"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/update/{id}": {
-      "put": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "updateClient",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Client"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Client"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/user/update/{id}": {
-      "put": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "updateUser",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/UserSignUpRequest"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/add": {
-      "post": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "save",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Station"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Station"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/server/add": {
-      "post": {
-        "tags": [
-          "server-controller"
-        ],
-        "summary": "Add a reading to the database",
-        "operationId": "addReading",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/ReadingPayload"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "400": {
-            "description": "Reading not added",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          },
-          "200": {
-            "description": "Reading added successfully",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/add": {
-      "post": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "addSensorGroup",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/SensorGroup"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/add": {
-      "post": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "addSensor",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Sensor"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/add": {
-      "post": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "save_1",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Host"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Host"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/add": {
-      "post": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "saveClient",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Client"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Client"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/signup": {
-      "post": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "registerUser",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/UserSignUpRequest"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/login": {
-      "post": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "authenticateUser",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/UserLoginRequest"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/add/role": {
-      "post": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "addRole",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/Role"
-              }
-            }
-          },
-          "required": true
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/{id}": {
-      "get": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "getById",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Station"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/name/{name}": {
-      "get": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "getByName",
-        "parameters": [
-          {
-            "name": "name",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Station"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/all": {
-      "get": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "getAll",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Station"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/server/get/sensor/range": {
-      "get": {
-        "tags": [
-          "server-controller"
-        ],
-        "summary": "Get readings by sensor name and time range",
-        "operationId": "getReadingsBySensorIdAndTimeRange",
-        "parameters": [
-          {
-            "name": "sensorId",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "name": "from",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
 
-            }
-          },
-          {
-            "name": "to",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "403": {
-            "description": "Accessing the resource you were trying to reach is forbidden",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "401": {
-            "description": "You are not authorized to view the resource",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "404": {
-            "description": "The resource you were trying to reach is not found",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "200": {
-            "description": "Successfully retrieved readings by sensor name and time range",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/server/get/sensor/error/range": {
-      "get": {
-        "tags": [
-          "server-controller"
-        ],
-        "summary": "Get readings by sensor name and error type and time range",
-        "operationId": "getReadingsBySensorIdAndErrorTypeAndTimeRange",
-        "parameters": [
-          {
-            "name": "sensorId",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "name": "errorType",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "name": "from",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string",
-              "format": "date-time"
-            }
-          },
-          {
-            "name": "to",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string",
-              "format": "date-time"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "Successfully retrieved readings by sensor name and error type and time range",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "403": {
-            "description": "Accessing the resource you were trying to reach is forbidden",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "401": {
-            "description": "You are not authorized to view the resource",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          },
-          "404": {
-            "description": "The resource you were trying to reach is not found",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Document"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/server/get/lvl1/{station}": {
-      "get": {
-        "tags": [
-          "server-controller"
-        ],
-        "summary": "Get level one response for a group id and a time range",
-        "operationId": "getLevelOneResponseForGroupAndTimeRange",
-        "parameters": [
-          {
-            "name": "station",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "name": "date",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string",
-              "format": "date-time"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "Successfully retrieved level one response for a group id and a time range",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/LevelOneResponse"
-                }
-              }
-            }
-          },
-          "403": {
-            "description": "Accessing the resource you were trying to reach is forbidden",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/LevelOneResponse"
-                }
-              }
-            }
-          },
-          "401": {
-            "description": "You are not authorized to view the resource",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/LevelOneResponse"
-                }
-              }
-            }
-          },
-          "404": {
-            "description": "The resource you were trying to reach is not found",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/LevelOneResponse"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/{id}": {
-      "get": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "getSensorById",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Sensor"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/{id}": {
-      "get": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "getSensorGroupById",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/SensorGroup"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/name/{name}": {
-      "get": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "getSensorGroupByName",
-        "parameters": [
-          {
-            "name": "name",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/SensorGroup"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/all": {
-      "get": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "getAllSensorGroups",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/SensorGroup"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/all": {
-      "get": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "getAllSensors",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Sensor"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/{id}": {
-      "get": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "getById_1",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Host"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/name/{name}": {
-      "get": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "getByName_1",
-        "parameters": [
-          {
-            "name": "name",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Host"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/all": {
-      "get": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "getAll_1",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Host"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/{id}": {
-      "get": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "getClientById",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Client"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/name/{name}": {
-      "get": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "getClientByName",
-        "parameters": [
-          {
-            "name": "name",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/Client"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/all": {
-      "get": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "getAllClients",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Client"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/users": {
-      "get": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "getAllUsers",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/delete/{id}": {
-      "delete": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "delete",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/station/delete/all": {
-      "delete": {
-        "tags": [
-          "station-controller"
-        ],
-        "operationId": "deleteAll",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/server/delete/all": {
-      "delete": {
-        "tags": [
-          "server-controller"
-        ],
-        "summary": "Delete all readings from database",
-        "operationId": "deleteAllReadings",
-        "responses": {
-          "200": {
-            "description": "Successfully deleted all readings from database",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          },
-          "403": {
-            "description": "Accessing the resource you were trying to reach is forbidden",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          },
-          "401": {
-            "description": "You are not authorized to view the resource",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          },
-          "404": {
-            "description": "The resource you were trying to reach is not found",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/delete/{id}": {
-      "delete": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "deleteSensorGroup",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/group/delete/all": {
-      "delete": {
-        "tags": [
-          "sensor-group-controller"
-        ],
-        "operationId": "deleteAllSensorGroups",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/delete/{id}": {
-      "delete": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "deleteSensor",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/sensor/delete/all": {
-      "delete": {
-        "tags": [
-          "sensor-controller"
-        ],
-        "operationId": "deleteAllSensors",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/delete/{id}": {
-      "delete": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "delete_1",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/host/delete/all": {
-      "delete": {
-        "tags": [
-          "host-controller"
-        ],
-        "operationId": "deleteAll_1",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string",
-                  "enum": [
-                    "100 CONTINUE",
-                    "101 SWITCHING_PROTOCOLS",
-                    "102 PROCESSING",
-                    "103 CHECKPOINT",
-                    "200 OK",
-                    "201 CREATED",
-                    "202 ACCEPTED",
-                    "203 NON_AUTHORITATIVE_INFORMATION",
-                    "204 NO_CONTENT",
-                    "205 RESET_CONTENT",
-                    "206 PARTIAL_CONTENT",
-                    "207 MULTI_STATUS",
-                    "208 ALREADY_REPORTED",
-                    "226 IM_USED",
-                    "300 MULTIPLE_CHOICES",
-                    "301 MOVED_PERMANENTLY",
-                    "302 FOUND",
-                    "302 MOVED_TEMPORARILY",
-                    "303 SEE_OTHER",
-                    "304 NOT_MODIFIED",
-                    "305 USE_PROXY",
-                    "307 TEMPORARY_REDIRECT",
-                    "308 PERMANENT_REDIRECT",
-                    "400 BAD_REQUEST",
-                    "401 UNAUTHORIZED",
-                    "402 PAYMENT_REQUIRED",
-                    "403 FORBIDDEN",
-                    "404 NOT_FOUND",
-                    "405 METHOD_NOT_ALLOWED",
-                    "406 NOT_ACCEPTABLE",
-                    "407 PROXY_AUTHENTICATION_REQUIRED",
-                    "408 REQUEST_TIMEOUT",
-                    "409 CONFLICT",
-                    "410 GONE",
-                    "411 LENGTH_REQUIRED",
-                    "412 PRECONDITION_FAILED",
-                    "413 PAYLOAD_TOO_LARGE",
-                    "413 REQUEST_ENTITY_TOO_LARGE",
-                    "414 URI_TOO_LONG",
-                    "414 REQUEST_URI_TOO_LONG",
-                    "415 UNSUPPORTED_MEDIA_TYPE",
-                    "416 REQUESTED_RANGE_NOT_SATISFIABLE",
-                    "417 EXPECTATION_FAILED",
-                    "418 I_AM_A_TEAPOT",
-                    "419 INSUFFICIENT_SPACE_ON_RESOURCE",
-                    "420 METHOD_FAILURE",
-                    "421 DESTINATION_LOCKED",
-                    "422 UNPROCESSABLE_ENTITY",
-                    "423 LOCKED",
-                    "424 FAILED_DEPENDENCY",
-                    "425 TOO_EARLY",
-                    "426 UPGRADE_REQUIRED",
-                    "428 PRECONDITION_REQUIRED",
-                    "429 TOO_MANY_REQUESTS",
-                    "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
-                    "451 UNAVAILABLE_FOR_LEGAL_REASONS",
-                    "500 INTERNAL_SERVER_ERROR",
-                    "501 NOT_IMPLEMENTED",
-                    "502 BAD_GATEWAY",
-                    "503 SERVICE_UNAVAILABLE",
-                    "504 GATEWAY_TIMEOUT",
-                    "505 HTTP_VERSION_NOT_SUPPORTED",
-                    "506 VARIANT_ALSO_NEGOTIATES",
-                    "507 INSUFFICIENT_STORAGE",
-                    "508 LOOP_DETECTED",
-                    "509 BANDWIDTH_LIMIT_EXCEEDED",
-                    "510 NOT_EXTENDED",
-                    "511 NETWORK_AUTHENTICATION_REQUIRED"
-                  ]
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/delete/{id}": {
-      "delete": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "deleteClient",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/client/delete/all": {
-      "delete": {
-        "tags": [
-          "client-controller"
-        ],
-        "operationId": "deleteAllClients",
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/api/v1/auth/user/delete/{id}": {
-      "delete": {
-        "tags": [
-          "user-controller"
-        ],
-        "operationId": "deleteUser",
-        "parameters": [
-          {
-            "name": "id",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object"
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "Location": {
-        "type": "object",
-        "properties": {
-          "latitude": {
-            "type": "number",
-            "format": "double"
-          },
-          "longitude": {
-            "type": "number",
-            "format": "double"
-          },
-          "altitude": {
-            "type": "number",
-            "format": "double"
-          },
-          "comment": {
-            "type": "string"
-          }
-        }
-      },
-      "Station": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string"
-          },
-          "location": {
-            "$ref": "#/components/schemas/Location"
-          },
-          "createdDate": {
-            "type": "string",
-            "format": "date-time"
-          },
-          "updatedDate": {
-            "type": "string",
-            "format": "date-time"
-          },
-          "host": {
-            "type": "string"
-          },
-          "clients": {
-            "type": "array",
-            "items": {
-              "type": "string"
-            }
-          },
-          "diary": {
-            "type": "string"
-          }
-        }
-      },
-      "Measurement": {
-        "type": "object",
-        "properties": {
-          "name": {
-            "type": "string"
-          },
-          "type": {
-            "type": "string"
-          },
-          "maxValue": {
-            "type": "number",
-            "format": "double"
-          },
-          "minValue": {
-            "type": "number",
-            "format": "double"
-          },
-          "unit": {
-            "type": "string"
-          },
-          "comment": {
-            "type": "string"
-          },
-          "precision": {
-            "type": "integer",
-            "format": "int32"
-          },
-          "maxReadoutDifference": {
-            "type": "number",
-            "format": "double"
-          },
-          "maxFrozenTimeInSeconds": {
-            "type": "integer",
-            "format": "int32"
-          },
-          "maxRateOfChange": {
-            "type": "number",
-            "format": "double"
-          },
-          "minVariationCoefficient": {
-            "type": "number",
-            "format": "double"
-          },
-          "latitude": {
-            "type": "number",
-            "format": "double"
-          },
-          "longitude": {
-            "type": "number",
-            "format": "double"
-          },
-          "standardMeridianLongitude": {
-            "type": "number",
-            "format": "double"
-          }
-        }
-      },
-      "Sensor": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string"
-          },
-          "protocol": {
-            "type": "string"
-          },
-          "protocolAddress": {
-            "type": "string"
-          },
-          "hardwareName": {
-            "type": "string"
-          },
-          "uniqueHardwareName": {
-            "type": "string"
-          },
-          "description": {
-            "type": "string"
-          },
-          "measurements": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Measurement"
-            }
-          }
-        }
-      },
-      "SensorGroup": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string"
-          },
-          "sensors": {
-            "type": "array",
-            "items": {
-              "type": "string"
-            }
-          },
-          "station": {
-            "type": "string"
-          },
-          "sensorType": {
-            "type": "string",
-            "enum": [
-              "PRECIPITATION",
-              "SOLAR_RADIATION",
-              "SOIL_MOISTURE",
-              "SOIL_TEMPERATURE",
-              "AIR_HUMIDITY",
-              "AIR_TEMPERATURE",
-              "DENDROMETER"
-            ]
-          }
-        }
-      },
-      "Host": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string"
-          },
-          "simId": {
-            "type": "string"
-          },
-          "mac": {
-            "type": "string"
-          }
-        }
-      },
-      "Client": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string"
-          },
-          "mac": {
-            "type": "string"
-          },
-          "description": {
-            "type": "string"
-          },
-          "connectionType": {
-            "type": "string"
-          },
-          "sensors": {
-            "type": "array",
-            "items": {
-              "type": "string"
-            }
-          }
-        }
-      },
-      "UserSignUpRequest": {
-        "required": [
-          "email",
-          "password",
-          "username"
-        ],
-        "type": "object",
-        "properties": {
-          "username": {
-            "maxLength": 20,
-            "minLength": 3,
-            "type": "string"
-          },
-          "email": {
-            "maxLength": 50,
-            "minLength": 0,
-            "type": "string"
-          },
-          "password": {
-            "maxLength": 40,
-            "minLength": 6,
-            "type": "string"
-          },
-          "roles": {
-            "uniqueItems": true,
-            "type": "array",
-            "items": {
-              "type": "string"
-            }
-          }
-        }
-      },
-      "ReadingPayload": {
-        "type": "object",
-        "properties": {
-          "host": {
-            "type": "string"
-          },
-          "client": {
-            "type": "string"
-          },
-          "sensorProtocol": {
-            "type": "string"
-          },
-          "protocolAddress": {
-            "type": "string"
-          },
-          "hardwareName": {
-            "type": "string"
-          },
-          "readings": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/ReadingValue"
-            }
-          },
-          "timestamp": {
-            "type": "integer",
-            "format": "int64"
-          }
-        }
-      },
-      "ReadingValue": {
-        "type": "object",
-        "properties": {
-          "name": {
-            "type": "string",
-            "enum": [
-              "PRECIPITATION",
-              "SOLAR_RADIATION",
-              "SOIL_MOISTURE",
-              "SOIL_TEMPERATURE",
-              "AIR_HUMIDITY",
-              "AIR_TEMPERATURE",
-              "DENDROMETER"
-            ]
-          },
-          "value": {
-            "type": "number",
-            "format": "double"
-          }
-        }
-      },
-      "UserLoginRequest": {
-        "required": [
-          "password",
-          "username"
-        ],
-        "type": "object",
-        "properties": {
-          "username": {
-            "maxLength": 20,
-            "minLength": 3,
-            "type": "string"
-          },
-          "password": {
-            "maxLength": 40,
-            "minLength": 6,
-            "type": "string"
-          }
-        }
-      },
-      "Role": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "string"
-          },
-          "name": {
-            "type": "string",
-            "enum": [
-              "ROLE_USER",
-              "ROLE_MANAGER",
-              "ROLE_ADMIN"
-            ]
-          }
-        }
-      },
-      "Document": {
-        "type": "object",
-        "properties": {
-          "empty": {
-            "type": "boolean"
-          }
-        },
-        "additionalProperties": {
-          "type": "object"
-        }
-      },
-      "AvgMinMax": {
-        "type": "object",
-        "properties": {
-          "name": {
-            "type": "string"
-          },
-          "min": {
-            "$ref": "#/components/schemas/ValueWithTimestamp"
-          },
-          "max": {
-            "$ref": "#/components/schemas/ValueWithTimestamp"
-          },
-          "avg": {
-            "type": "number",
-            "format": "double"
-          },
-          "sensorType": {
-            "type": "string",
-            "enum": [
-              "PRECIPITATION",
-              "SOLAR_RADIATION",
-              "SOIL_MOISTURE",
-              "SOIL_TEMPERATURE",
-              "AIR_HUMIDITY",
-              "AIR_TEMPERATURE",
-              "DENDROMETER"
-            ]
-          },
-          "isSensorGroup": {
-            "type": "boolean"
-          }
-        }
-      },
-      "DendrometerValue": {
-        "type": "object",
-        "properties": {
-          "timestamp": {
-            "type": "string",
-            "format": "date-time"
-          },
-          "value": {
-            "type": "number",
-            "format": "double"
-          },
-          "fluctuationType": {
-            "type": "string",
-            "enum": [
-              "CONTRACTION",
-              "EXPANSION",
-              "STEM_RADIUS_INCREASE",
-              "STEM_RADIUS_STABLE"
-            ]
-          }
-        }
-      },
-      "LevelOneResponse": {
-        "type": "object",
-        "properties": {
-          "sumOrAvg": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/SumOrAvg"
-            }
-          },
-          "avgMinMax": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/AvgMinMax"
-            }
-          },
-          "threePhaseDendrometer": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/ThreePhaseDendrometer"
-            }
-          }
-        }
-      },
-      "SumOrAvg": {
-        "type": "object",
-        "properties": {
-          "type": {
-            "type": "string",
-            "enum": [
-              "SUM",
-              "AVG"
-            ]
-          },
-          "name": {
-            "type": "string"
-          },
-          "value": {
-            "type": "number",
-            "format": "double"
-          },
-          "sensorType": {
-            "type": "string",
-            "enum": [
-              "PRECIPITATION",
-              "SOLAR_RADIATION",
-              "SOIL_MOISTURE",
-              "SOIL_TEMPERATURE",
-              "AIR_HUMIDITY",
-              "AIR_TEMPERATURE",
-              "DENDROMETER"
-            ]
-          },
-          "isSensorGroup": {
-            "type": "boolean"
-          }
-        }
-      },
-      "ThreePhaseDendrometer": {
-        "type": "object",
-        "properties": {
-          "name": {
-            "type": "string"
-          },
-          "readings": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/DendrometerValue"
-            }
-          },
-          "isSensorGroup": {
-            "type": "boolean"
-          }
-        }
-      },
-      "ValueWithTimestamp": {
-        "type": "object",
-        "properties": {
-          "value": {
-            "type": "number",
-            "format": "double"
-          },
-          "timestamp": {
-            "type": "string",
-            "format": "date-time"
-          }
-        }
-      }
-    }
-  }
-}
+{"openapi":"3.0.1","info":{"title":"OpenAPI definition","version":"v0"},"servers":[{"url":"http://localhost:8080","description":"Generated server url"}],"paths":{"/api/v1/station/update/{id}":{"put":{"tags":["station-controller"],"operationId":"update","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Station"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Station"}}}}}}},"/api/v1/sensor/update/{id}":{"put":{"tags":["sensor-controller"],"operationId":"updateSensor","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sensor"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/sensor/group/update/{id}":{"put":{"tags":["sensor-group-controller"],"operationId":"updateSensorGroup","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorGroup"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/host/update/{id}":{"put":{"tags":["host-controller"],"operationId":"update_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Host"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Host"}}}}}}},"/api/v1/client/update/{id}":{"put":{"tags":["client-controller"],"operationId":"updateClient","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Client"}}}}}}},"/api/v1/auth/user/update/{id}":{"put":{"tags":["user-controller"],"operationId":"updateUser","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSignUpRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/station/add":{"post":{"tags":["station-controller"],"operationId":"save","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Station"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Station"}}}}}}},"/api/v1/server/add":{"post":{"tags":["server-controller"],"summary":"Add a reading to the database","operationId":"addReading","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadingPayload"}}},"required":true},"responses":{"400":{"description":"Reading not added","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}},"200":{"description":"Reading added successfully","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/sensor/group/add":{"post":{"tags":["sensor-group-controller"],"operationId":"addSensorGroup","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SensorGroup"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/sensor/add":{"post":{"tags":["sensor-controller"],"operationId":"addSensor","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sensor"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/host/add":{"post":{"tags":["host-controller"],"operationId":"save_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Host"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Host"}}}}}}},"/api/v1/client/add":{"post":{"tags":["client-controller"],"operationId":"saveClient","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Client"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Client"}}}}}}},"/api/v1/auth/signup":{"post":{"tags":["user-controller"],"operationId":"registerUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSignUpRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["user-controller"],"operationId":"authenticateUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLoginRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/auth/add/role":{"post":{"tags":["user-controller"],"operationId":"addRole","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/station/{id}":{"get":{"tags":["station-controller"],"operationId":"getById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Station"}}}}}}},"/api/v1/station/name/{name}":{"get":{"tags":["station-controller"],"operationId":"getByName","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Station"}}}}}}},"/api/v1/station/all":{"get":{"tags":["station-controller"],"operationId":"getAll","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Station"}}}}}}}},"/api/v1/server/get/sensor/range":{"get":{"tags":["server-controller"],"summary":"Get readings by sensor name and time range","operationId":"getReadingsBySensorIdAndTimeRange","parameters":[{"name":"sensorId","in":"query","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"403":{"description":"Accessing the resource you were trying to reach is forbidden","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"401":{"description":"You are not authorized to view the resource","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"404":{"description":"The resource you were trying to reach is not found","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"200":{"description":"Successfully retrieved readings by sensor name and time range","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}}}}},"/api/v1/server/get/sensor/error/range":{"get":{"tags":["server-controller"],"summary":"Get readings by sensor name and error type and time range","operationId":"getReadingsBySensorIdAndErrorTypeAndTimeRange","parameters":[{"name":"sensorId","in":"query","required":true,"schema":{"type":"string"}},{"name":"errorType","in":"query","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Successfully retrieved readings by sensor name and error type and time range","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"403":{"description":"Accessing the resource you were trying to reach is forbidden","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"401":{"description":"You are not authorized to view the resource","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}},"404":{"description":"The resource you were trying to reach is not found","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}}}}},"/api/v1/server/get/lvl1/{station}":{"get":{"tags":["server-controller"],"summary":"Get level one response for a group id and a time range","operationId":"getLevelOneResponseForGroupAndTimeRange","parameters":[{"name":"station","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Successfully retrieved level one response for a group id and a time range","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LevelOneResponse"}}}},"403":{"description":"Accessing the resource you were trying to reach is forbidden","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LevelOneResponse"}}}},"401":{"description":"You are not authorized to view the resource","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LevelOneResponse"}}}},"404":{"description":"The resource you were trying to reach is not found","content":{"*/*":{"schema":{"$ref":"#/components/schemas/LevelOneResponse"}}}}}}},"/api/v1/sensor/{id}":{"get":{"tags":["sensor-controller"],"operationId":"getSensorById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Sensor"}}}}}}},"/api/v1/sensor/group/{id}":{"get":{"tags":["sensor-group-controller"],"operationId":"getSensorGroupById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SensorGroup"}}}}}}},"/api/v1/sensor/group/name/{name}":{"get":{"tags":["sensor-group-controller"],"operationId":"getSensorGroupByName","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SensorGroup"}}}}}}},"/api/v1/sensor/group/all":{"get":{"tags":["sensor-group-controller"],"operationId":"getAllSensorGroups","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SensorGroup"}}}}}}}},"/api/v1/sensor/all":{"get":{"tags":["sensor-controller"],"operationId":"getAllSensors","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Sensor"}}}}}}}},"/api/v1/host/{id}":{"get":{"tags":["host-controller"],"operationId":"getById_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Host"}}}}}}},"/api/v1/host/name/{name}":{"get":{"tags":["host-controller"],"operationId":"getByName_1","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Host"}}}}}}},"/api/v1/host/all":{"get":{"tags":["host-controller"],"operationId":"getAll_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Host"}}}}}}}},"/api/v1/client/{id}":{"get":{"tags":["client-controller"],"operationId":"getClientById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Client"}}}}}}},"/api/v1/client/name/{name}":{"get":{"tags":["client-controller"],"operationId":"getClientByName","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Client"}}}}}}},"/api/v1/client/all":{"get":{"tags":["client-controller"],"operationId":"getAllClients","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Client"}}}}}}}},"/api/v1/auth/users":{"get":{"tags":["user-controller"],"operationId":"getAllUsers","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/station/delete/{id}":{"delete":{"tags":["station-controller"],"operationId":"delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/station/delete/all":{"delete":{"tags":["station-controller"],"operationId":"deleteAll","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/server/delete/all":{"delete":{"tags":["server-controller"],"summary":"Delete all readings from database","operationId":"deleteAllReadings","responses":{"200":{"description":"Successfully deleted all readings from database","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}},"403":{"description":"Accessing the resource you were trying to reach is forbidden","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}},"401":{"description":"You are not authorized to view the resource","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}},"404":{"description":"The resource you were trying to reach is not found","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/sensor/group/delete/{id}":{"delete":{"tags":["sensor-group-controller"],"operationId":"deleteSensorGroup","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/sensor/group/delete/all":{"delete":{"tags":["sensor-group-controller"],"operationId":"deleteAllSensorGroups","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/sensor/delete/{id}":{"delete":{"tags":["sensor-controller"],"operationId":"deleteSensor","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/sensor/delete/all":{"delete":{"tags":["sensor-controller"],"operationId":"deleteAllSensors","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/host/delete/{id}":{"delete":{"tags":["host-controller"],"operationId":"delete_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/host/delete/all":{"delete":{"tags":["host-controller"],"operationId":"deleteAll_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","enum":["100 CONTINUE","101 SWITCHING_PROTOCOLS","102 PROCESSING","103 CHECKPOINT","200 OK","201 CREATED","202 ACCEPTED","203 NON_AUTHORITATIVE_INFORMATION","204 NO_CONTENT","205 RESET_CONTENT","206 PARTIAL_CONTENT","207 MULTI_STATUS","208 ALREADY_REPORTED","226 IM_USED","300 MULTIPLE_CHOICES","301 MOVED_PERMANENTLY","302 FOUND","302 MOVED_TEMPORARILY","303 SEE_OTHER","304 NOT_MODIFIED","305 USE_PROXY","307 TEMPORARY_REDIRECT","308 PERMANENT_REDIRECT","400 BAD_REQUEST","401 UNAUTHORIZED","402 PAYMENT_REQUIRED","403 FORBIDDEN","404 NOT_FOUND","405 METHOD_NOT_ALLOWED","406 NOT_ACCEPTABLE","407 PROXY_AUTHENTICATION_REQUIRED","408 REQUEST_TIMEOUT","409 CONFLICT","410 GONE","411 LENGTH_REQUIRED","412 PRECONDITION_FAILED","413 PAYLOAD_TOO_LARGE","413 REQUEST_ENTITY_TOO_LARGE","414 URI_TOO_LONG","414 REQUEST_URI_TOO_LONG","415 UNSUPPORTED_MEDIA_TYPE","416 REQUESTED_RANGE_NOT_SATISFIABLE","417 EXPECTATION_FAILED","418 I_AM_A_TEAPOT","419 INSUFFICIENT_SPACE_ON_RESOURCE","420 METHOD_FAILURE","421 DESTINATION_LOCKED","422 UNPROCESSABLE_ENTITY","423 LOCKED","424 FAILED_DEPENDENCY","425 TOO_EARLY","426 UPGRADE_REQUIRED","428 PRECONDITION_REQUIRED","429 TOO_MANY_REQUESTS","431 REQUEST_HEADER_FIELDS_TOO_LARGE","451 UNAVAILABLE_FOR_LEGAL_REASONS","500 INTERNAL_SERVER_ERROR","501 NOT_IMPLEMENTED","502 BAD_GATEWAY","503 SERVICE_UNAVAILABLE","504 GATEWAY_TIMEOUT","505 HTTP_VERSION_NOT_SUPPORTED","506 VARIANT_ALSO_NEGOTIATES","507 INSUFFICIENT_STORAGE","508 LOOP_DETECTED","509 BANDWIDTH_LIMIT_EXCEEDED","510 NOT_EXTENDED","511 NETWORK_AUTHENTICATION_REQUIRED"]}}}}}}},"/api/v1/client/delete/{id}":{"delete":{"tags":["client-controller"],"operationId":"deleteClient","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/client/delete/all":{"delete":{"tags":["client-controller"],"operationId":"deleteAllClients","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/auth/user/delete/{id}":{"delete":{"tags":["user-controller"],"operationId":"deleteUser","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}}},"components":{"schemas":{"Location":{"type":"object","properties":{"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"altitude":{"type":"number","format":"double"},"comment":{"type":"string"}}},"Station":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"location":{"$ref":"#/components/schemas/Location"},"createdDate":{"type":"string","format":"date-time"},"updatedDate":{"type":"string","format":"date-time"},"host":{"type":"string"},"clients":{"type":"array","items":{"type":"string"}},"diary":{"type":"string"}}},"Measurement":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string","enum":["PRECIPITATION","SOLAR_RADIATION","SOIL_MOISTURE","SOIL_TEMPERATURE","HUMIDITY","TEMPERATURE","CIRCUMFERENCE_INCREMENT","SHUNT_VOLTAGE","BUS_VOLTAGE","CURRENT_mA","POWER_mW","LOAD_VOLTAGE_V","INA219_OVERFLOW","BATTERY_VOLTAGE"]},"maxValue":{"type":"number","format":"double"},"minValue":{"type":"number","format":"double"},"unit":{"type":"string"},"comment":{"type":"string"},"precision":{"type":"integer","format":"int32"},"maxReadoutDifference":{"type":"number","format":"double"},"maxFrozenTimeInSeconds":{"type":"integer","format":"int32"},"maxRateOfChange":{"type":"number","format":"double"},"minVariationCoefficient":{"type":"number","format":"double"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"initialCircumference":{"type":"number","format":"double"},"treeType":{"type":"string","enum":["LARCH","SPRUCE"]}}},"Sensor":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"protocol":{"type":"string"},"protocolAddress":{"type":"string"},"hardwareName":{"type":"string"},"uniqueHardwareName":{"type":"string"},"description":{"type":"string"},"measurements":{"type":"array","items":{"$ref":"#/components/schemas/Measurement"}}}},"SensorGroup":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"sensors":{"type":"array","items":{"type":"string"}},"station":{"type":"string"},"measurementType":{"type":"string","enum":["PRECIPITATION","SOLAR_RADIATION","SOIL_MOISTURE","SOIL_TEMPERATURE","HUMIDITY","TEMPERATURE","CIRCUMFERENCE_INCREMENT","SHUNT_VOLTAGE","BUS_VOLTAGE","CURRENT_mA","POWER_mW","LOAD_VOLTAGE_V","INA219_OVERFLOW","BATTERY_VOLTAGE"]}}},"Host":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"simId":{"type":"string"},"mac":{"type":"string"}}},"Client":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"mac":{"type":"string"},"description":{"type":"string"},"connectionType":{"type":"string"},"sensors":{"type":"array","items":{"type":"string"}}}},"UserSignUpRequest":{"required":["email","password","username"],"type":"object","properties":{"username":{"maxLength":20,"minLength":3,"type":"string"},"email":{"maxLength":50,"minLength":0,"type":"string"},"password":{"maxLength":40,"minLength":6,"type":"string"},"roles":{"uniqueItems":true,"type":"array","items":{"type":"string"}}}},"ReadingPayload":{"type":"object","properties":{"host":{"type":"string"},"client":{"type":"string"},"sensorProtocol":{"type":"string"},"protocolAddress":{"type":"string"},"hardwareName":{"type":"string"},"readings":{"type":"array","items":{"$ref":"#/components/schemas/ReadingValue"}},"timestamp":{"type":"integer","format":"int64"},"sensorError":{"type":"string","enum":["NO_ERROR","INVALID_TIMESTAMP","INVALID_SENSOR_ID","INVALID_SENSOR_TYPE","INVALID_READING_VALUE_RANGE","INVALID_READING_VALUE_TOO_LOW","INVALID_READING_VALUE_TOO_HIGH","INVALID_READING_VALUE_NAN","INVALID_READING_VALUE_DUPLICATE","INVALID_READING_VALUE_BELOW_VAR_COFF","INVALID_READING_VALUE_ABOVE_RATE_OF_CHANGE","INVALID_READING_VALUE_LOWER_FOR_SOLAR_ELEVATION","INVALID_READING_VALUE_NOT_ZERO_FOR_SOLAR_ELEVATION","INVALID_READING_VALUE_FROZEN","INVALID_READING_VALUE_SPIKE","DATA_OK","SENSOR_NOT_FOUND","SENSOR_NOT_CONNECTED","NO_DATA","SENSOR_DOES_NOT_RETURN_DATA","BATTERY_VOLTAGE_TOO_LOW","INVALID_VALUE","SENSOR_INIT_FAILED","INA219_OVERFLOW","CONNECTION_ENDED_PREMATURELY","WRONG_CRC","UNKNOWN_ERROR_TYPE"]}}},"ReadingValue":{"type":"object","properties":{"name":{"type":"string","enum":["PRECIPITATION","SOLAR_RADIATION","SOIL_MOISTURE","SOIL_TEMPERATURE","HUMIDITY","TEMPERATURE","CIRCUMFERENCE_INCREMENT","SHUNT_VOLTAGE","BUS_VOLTAGE","CURRENT_mA","POWER_mW","LOAD_VOLTAGE_V","INA219_OVERFLOW","BATTERY_VOLTAGE"]},"value":{"type":"number","format":"double"}}},"UserLoginRequest":{"required":["password","username"],"type":"object","properties":{"username":{"maxLength":20,"minLength":3,"type":"string"},"password":{"maxLength":40,"minLength":6,"type":"string"}}},"Role":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","enum":["ROLE_USER","ROLE_MANAGER","ROLE_ADMIN"]}}},"Document":{"type":"object","properties":{"empty":{"type":"boolean"}},"additionalProperties":{"type":"object"}},"AvgMinMax":{"type":"object","properties":{"name":{"type":"string"},"min":{"$ref":"#/components/schemas/ValueWithTimestamp"},"max":{"$ref":"#/components/schemas/ValueWithTimestamp"},"avg":{"type":"number","format":"double"},"measurementType":{"type":"string","enum":["PRECIPITATION","SOLAR_RADIATION","SOIL_MOISTURE","SOIL_TEMPERATURE","HUMIDITY","TEMPERATURE","CIRCUMFERENCE_INCREMENT","SHUNT_VOLTAGE","BUS_VOLTAGE","CURRENT_mA","POWER_mW","LOAD_VOLTAGE_V","INA219_OVERFLOW","BATTERY_VOLTAGE"]},"isSensorGroup":{"type":"boolean"}}},"DendrometerDailyValue":{"type":"object","properties":{"name":{"type":"string"},"mds":{"$ref":"#/components/schemas/DendrometerMDS"},"deltaR":{"$ref":"#/components/schemas/DendrometerDeltaR"},"std":{"type":"number","format":"double"},"isSensorGroup":{"type":"boolean"}}},"DendrometerDeltaR":{"type":"object","properties":{"value":{"type":"number","format":"double"},"duration":{"type":"number","format":"double"}}},"DendrometerMDS":{"type":"object","properties":{"value":{"type":"number","format":"double"},"duration":{"type":"number","format":"double"}}},"LevelOneResponse":{"type":"object","properties":{"sumOrAvg":{"type":"array","items":{"$ref":"#/components/schemas/SumOrAvg"}},"avgMinMax":{"type":"array","items":{"$ref":"#/components/schemas/AvgMinMax"}},"dendrometerDailyValues":{"type":"array","items":{"$ref":"#/components/schemas/DendrometerDailyValue"}}}},"SumOrAvg":{"type":"object","properties":{"type":{"type":"string","enum":["SUM","AVG"]},"name":{"type":"string"},"value":{"type":"number","format":"double"},"measurementType":{"type":"string","enum":["PRECIPITATION","SOLAR_RADIATION","SOIL_MOISTURE","SOIL_TEMPERATURE","HUMIDITY","TEMPERATURE","CIRCUMFERENCE_INCREMENT","SHUNT_VOLTAGE","BUS_VOLTAGE","CURRENT_mA","POWER_mW","LOAD_VOLTAGE_V","INA219_OVERFLOW","BATTERY_VOLTAGE"]},"isSensorGroup":{"type":"boolean"}}},"ValueWithTimestamp":{"type":"object","properties":{"value":{"type":"number","format":"double"},"timestamp":{"type":"string","format":"date-time"}}}}}}
diff --git a/projects/generated-api/src/.gitignore b/projects/generated-api/src/.gitignore
new file mode 100644
index 0000000..149b576
--- /dev/null
+++ b/projects/generated-api/src/.gitignore
@@ -0,0 +1,4 @@
+wwwroot/*.js
+node_modules
+typings
+dist
diff --git a/projects/generated-api/src/.npmignore b/projects/generated-api/src/.npmignore
new file mode 100644
index 0000000..7e981c4
--- /dev/null
+++ b/projects/generated-api/src/.npmignore
@@ -0,0 +1,5 @@
+wwwroot/*.js
+node
+node_modules
+typings
+dist
diff --git a/projects/generated-api/src/.swagger-codegen-ignore b/projects/generated-api/src/.swagger-codegen-ignore
new file mode 100644
index 0000000..c5fa491
--- /dev/null
+++ b/projects/generated-api/src/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/projects/generated-api/src/.swagger-codegen/VERSION b/projects/generated-api/src/.swagger-codegen/VERSION
new file mode 100644
index 0000000..3a460e6
--- /dev/null
+++ b/projects/generated-api/src/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.40
\ No newline at end of file
diff --git a/projects/generated-api/src/api.module.ts b/projects/generated-api/src/api.module.ts
new file mode 100644
index 0000000..0e58c02
--- /dev/null
+++ b/projects/generated-api/src/api.module.ts
@@ -0,0 +1,45 @@
+import { NgModule, ModuleWithProviders, SkipSelf, Optional } from '@angular/core';
+import { Configuration } from './configuration';
+import { HttpClient } from '@angular/common/http';
+
+
+import { ClientControllerService } from './api/clientController.service';
+import { HostControllerService } from './api/hostController.service';
+import { SensorControllerService } from './api/sensorController.service';
+import { SensorGroupControllerService } from './api/sensorGroupController.service';
+import { ServerControllerService } from './api/serverController.service';
+import { StationControllerService } from './api/stationController.service';
+import { UserControllerService } from './api/userController.service';
+
+@NgModule({
+  imports:      [],
+  declarations: [],
+  exports:      [],
+  providers: [
+    ClientControllerService,
+    HostControllerService,
+    SensorControllerService,
+    SensorGroupControllerService,
+    ServerControllerService,
+    StationControllerService,
+    UserControllerService ]
+})
+export class ApiModule {
+    public static forRoot(configurationFactory: () => Configuration): ModuleWithProviders<ApiModule> {
+        return {
+            ngModule: ApiModule,
+            providers: [ { provide: Configuration, useFactory: configurationFactory } ]
+        };
+    }
+
+    constructor( @Optional() @SkipSelf() parentModule: ApiModule,
+                 @Optional() http: HttpClient) {
+        if (parentModule) {
+            throw new Error('ApiModule is already loaded. Import in your base AppModule only.');
+        }
+        if (!http) {
+            throw new Error('You need to import the HttpClientModule in your AppModule! \n' +
+            'See also https://github.com/angular/angular/issues/20575');
+        }
+    }
+}
diff --git a/projects/generated-api/src/api/api.ts b/projects/generated-api/src/api/api.ts
new file mode 100644
index 0000000..81af0e2
--- /dev/null
+++ b/projects/generated-api/src/api/api.ts
@@ -0,0 +1,15 @@
+export * from './clientController.service';
+import { ClientControllerService } from './clientController.service';
+export * from './hostController.service';
+import { HostControllerService } from './hostController.service';
+export * from './sensorController.service';
+import { SensorControllerService } from './sensorController.service';
+export * from './sensorGroupController.service';
+import { SensorGroupControllerService } from './sensorGroupController.service';
+export * from './serverController.service';
+import { ServerControllerService } from './serverController.service';
+export * from './stationController.service';
+import { StationControllerService } from './stationController.service';
+export * from './userController.service';
+import { UserControllerService } from './userController.service';
+export const APIS = [ClientControllerService, HostControllerService, SensorControllerService, SensorGroupControllerService, ServerControllerService, StationControllerService, UserControllerService];
diff --git a/projects/generated-api/src/api/clientController.service.ts b/projects/generated-api/src/api/clientController.service.ts
new file mode 100644
index 0000000..2cb64be
--- /dev/null
+++ b/projects/generated-api/src/api/clientController.service.ts
@@ -0,0 +1,352 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Client } from '../model/client';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class ClientControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAllClients(observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteAllClients(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteAllClients(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteAllClients(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/client/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteClient(id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteClient(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteClient(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteClient(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling deleteClient.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/client/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAllClients(observe?: 'body', reportProgress?: boolean): Observable<Array<Client>>;
+    public getAllClients(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Client>>>;
+    public getAllClients(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Client>>>;
+    public getAllClients(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Client>>('get',`${this.basePath}/api/v1/client/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getClientById(id: string, observe?: 'body', reportProgress?: boolean): Observable<Client>;
+    public getClientById(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Client>>;
+    public getClientById(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Client>>;
+    public getClientById(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling getClientById.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Client>('get',`${this.basePath}/api/v1/client/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param name 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getClientByName(name: string, observe?: 'body', reportProgress?: boolean): Observable<Client>;
+    public getClientByName(name: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Client>>;
+    public getClientByName(name: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Client>>;
+    public getClientByName(name: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (name === null || name === undefined) {
+            throw new Error('Required parameter name was null or undefined when calling getClientByName.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Client>('get',`${this.basePath}/api/v1/client/name/${encodeURIComponent(String(name))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public saveClient(body: Client, observe?: 'body', reportProgress?: boolean): Observable<Client>;
+    public saveClient(body: Client, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Client>>;
+    public saveClient(body: Client, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Client>>;
+    public saveClient(body: Client, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling saveClient.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Client>('post',`${this.basePath}/api/v1/client/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public updateClient(body: Client, id: string, observe?: 'body', reportProgress?: boolean): Observable<Client>;
+    public updateClient(body: Client, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Client>>;
+    public updateClient(body: Client, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Client>>;
+    public updateClient(body: Client, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling updateClient.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling updateClient.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Client>('put',`${this.basePath}/api/v1/client/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/hostController.service.ts b/projects/generated-api/src/api/hostController.service.ts
new file mode 100644
index 0000000..9cc3886
--- /dev/null
+++ b/projects/generated-api/src/api/hostController.service.ts
@@ -0,0 +1,352 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Host } from '../model/host';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class HostControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public delete1(id: string, observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public delete1(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public delete1(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public delete1(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling delete1.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<string>('delete',`${this.basePath}/api/v1/host/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAll1(observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public deleteAll1(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public deleteAll1(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public deleteAll1(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<string>('delete',`${this.basePath}/api/v1/host/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAll1(observe?: 'body', reportProgress?: boolean): Observable<Array<Host>>;
+    public getAll1(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Host>>>;
+    public getAll1(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Host>>>;
+    public getAll1(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Host>>('get',`${this.basePath}/api/v1/host/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getById1(id: string, observe?: 'body', reportProgress?: boolean): Observable<Host>;
+    public getById1(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Host>>;
+    public getById1(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Host>>;
+    public getById1(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling getById1.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Host>('get',`${this.basePath}/api/v1/host/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param name 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getByName1(name: string, observe?: 'body', reportProgress?: boolean): Observable<Host>;
+    public getByName1(name: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Host>>;
+    public getByName1(name: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Host>>;
+    public getByName1(name: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (name === null || name === undefined) {
+            throw new Error('Required parameter name was null or undefined when calling getByName1.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Host>('get',`${this.basePath}/api/v1/host/name/${encodeURIComponent(String(name))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public save1(body: Host, observe?: 'body', reportProgress?: boolean): Observable<Host>;
+    public save1(body: Host, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Host>>;
+    public save1(body: Host, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Host>>;
+    public save1(body: Host, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling save1.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Host>('post',`${this.basePath}/api/v1/host/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public update1(body: Host, id: string, observe?: 'body', reportProgress?: boolean): Observable<Host>;
+    public update1(body: Host, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Host>>;
+    public update1(body: Host, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Host>>;
+    public update1(body: Host, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling update1.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling update1.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Host>('put',`${this.basePath}/api/v1/host/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/sensorController.service.ts b/projects/generated-api/src/api/sensorController.service.ts
new file mode 100644
index 0000000..12c0eb7
--- /dev/null
+++ b/projects/generated-api/src/api/sensorController.service.ts
@@ -0,0 +1,311 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Sensor } from '../model/sensor';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class SensorControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public addSensor(body: Sensor, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public addSensor(body: Sensor, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public addSensor(body: Sensor, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public addSensor(body: Sensor, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling addSensor.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('post',`${this.basePath}/api/v1/sensor/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAllSensors(observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteAllSensors(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteAllSensors(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteAllSensors(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/sensor/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteSensor(id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteSensor(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteSensor(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteSensor(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling deleteSensor.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/sensor/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAllSensors(observe?: 'body', reportProgress?: boolean): Observable<Array<Sensor>>;
+    public getAllSensors(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Sensor>>>;
+    public getAllSensors(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Sensor>>>;
+    public getAllSensors(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Sensor>>('get',`${this.basePath}/api/v1/sensor/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getSensorById(id: string, observe?: 'body', reportProgress?: boolean): Observable<Sensor>;
+    public getSensorById(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Sensor>>;
+    public getSensorById(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Sensor>>;
+    public getSensorById(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling getSensorById.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Sensor>('get',`${this.basePath}/api/v1/sensor/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public updateSensor(body: Sensor, id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public updateSensor(body: Sensor, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public updateSensor(body: Sensor, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public updateSensor(body: Sensor, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling updateSensor.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling updateSensor.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('put',`${this.basePath}/api/v1/sensor/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/sensorGroupController.service.ts b/projects/generated-api/src/api/sensorGroupController.service.ts
new file mode 100644
index 0000000..0332c12
--- /dev/null
+++ b/projects/generated-api/src/api/sensorGroupController.service.ts
@@ -0,0 +1,352 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { SensorGroup } from '../model/sensorGroup';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class SensorGroupControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public addSensorGroup(body: SensorGroup, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public addSensorGroup(body: SensorGroup, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public addSensorGroup(body: SensorGroup, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public addSensorGroup(body: SensorGroup, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling addSensorGroup.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('post',`${this.basePath}/api/v1/sensor/group/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAllSensorGroups(observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteAllSensorGroups(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteAllSensorGroups(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteAllSensorGroups(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/sensor/group/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteSensorGroup(id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteSensorGroup(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteSensorGroup(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteSensorGroup(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling deleteSensorGroup.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/sensor/group/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAllSensorGroups(observe?: 'body', reportProgress?: boolean): Observable<Array<SensorGroup>>;
+    public getAllSensorGroups(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<SensorGroup>>>;
+    public getAllSensorGroups(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<SensorGroup>>>;
+    public getAllSensorGroups(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<SensorGroup>>('get',`${this.basePath}/api/v1/sensor/group/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getSensorGroupById(id: string, observe?: 'body', reportProgress?: boolean): Observable<SensorGroup>;
+    public getSensorGroupById(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<SensorGroup>>;
+    public getSensorGroupById(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<SensorGroup>>;
+    public getSensorGroupById(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling getSensorGroupById.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<SensorGroup>('get',`${this.basePath}/api/v1/sensor/group/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param name 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getSensorGroupByName(name: string, observe?: 'body', reportProgress?: boolean): Observable<SensorGroup>;
+    public getSensorGroupByName(name: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<SensorGroup>>;
+    public getSensorGroupByName(name: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<SensorGroup>>;
+    public getSensorGroupByName(name: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (name === null || name === undefined) {
+            throw new Error('Required parameter name was null or undefined when calling getSensorGroupByName.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<SensorGroup>('get',`${this.basePath}/api/v1/sensor/group/name/${encodeURIComponent(String(name))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public updateSensorGroup(body: SensorGroup, id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public updateSensorGroup(body: SensorGroup, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public updateSensorGroup(body: SensorGroup, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public updateSensorGroup(body: SensorGroup, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling updateSensorGroup.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling updateSensorGroup.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('put',`${this.basePath}/api/v1/sensor/group/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/serverController.service.ts b/projects/generated-api/src/api/serverController.service.ts
new file mode 100644
index 0000000..f89f6f9
--- /dev/null
+++ b/projects/generated-api/src/api/serverController.service.ts
@@ -0,0 +1,329 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Document } from '../model/document';
+import { LevelOneResponse } from '../model/levelOneResponse';
+import { ReadingPayload } from '../model/readingPayload';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class ServerControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * Add a reading to the database
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public addReading(body: ReadingPayload, observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public addReading(body: ReadingPayload, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public addReading(body: ReadingPayload, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public addReading(body: ReadingPayload, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling addReading.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<string>('post',`${this.basePath}/api/v1/server/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * Delete all readings from database
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAllReadings(observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public deleteAllReadings(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public deleteAllReadings(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public deleteAllReadings(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<string>('delete',`${this.basePath}/api/v1/server/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * Get level one response for a group id and a time range
+     * 
+     * @param station 
+     * @param date 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getLevelOneResponseForGroupAndTimeRange(station: string, date: Date, observe?: 'body', reportProgress?: boolean): Observable<LevelOneResponse>;
+    public getLevelOneResponseForGroupAndTimeRange(station: string, date: Date, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<LevelOneResponse>>;
+    public getLevelOneResponseForGroupAndTimeRange(station: string, date: Date, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<LevelOneResponse>>;
+    public getLevelOneResponseForGroupAndTimeRange(station: string, date: Date, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (station === null || station === undefined) {
+            throw new Error('Required parameter station was null or undefined when calling getLevelOneResponseForGroupAndTimeRange.');
+        }
+
+        if (date === null || date === undefined) {
+            throw new Error('Required parameter date was null or undefined when calling getLevelOneResponseForGroupAndTimeRange.');
+        }
+
+        let queryParameters = new HttpParams({encoder: new CustomHttpUrlEncodingCodec()});
+        if (date !== undefined && date !== null) {
+            queryParameters = queryParameters.set('date', <any>date.toISOString());
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<LevelOneResponse>('get',`${this.basePath}/api/v1/server/get/lvl1/${encodeURIComponent(String(station))}`,
+            {
+                params: queryParameters,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * Get readings by sensor name and error type and time range
+     * 
+     * @param sensorId 
+     * @param errorType 
+     * @param from 
+     * @param to 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getReadingsBySensorIdAndErrorTypeAndTimeRange(sensorId: string, errorType: string, from: Date, to: Date, observe?: 'body', reportProgress?: boolean): Observable<Array<Document>>;
+    public getReadingsBySensorIdAndErrorTypeAndTimeRange(sensorId: string, errorType: string, from: Date, to: Date, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Document>>>;
+    public getReadingsBySensorIdAndErrorTypeAndTimeRange(sensorId: string, errorType: string, from: Date, to: Date, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Document>>>;
+    public getReadingsBySensorIdAndErrorTypeAndTimeRange(sensorId: string, errorType: string, from: Date, to: Date, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (sensorId === null || sensorId === undefined) {
+            throw new Error('Required parameter sensorId was null or undefined when calling getReadingsBySensorIdAndErrorTypeAndTimeRange.');
+        }
+
+        if (errorType === null || errorType === undefined) {
+            throw new Error('Required parameter errorType was null or undefined when calling getReadingsBySensorIdAndErrorTypeAndTimeRange.');
+        }
+
+        if (from === null || from === undefined) {
+            throw new Error('Required parameter from was null or undefined when calling getReadingsBySensorIdAndErrorTypeAndTimeRange.');
+        }
+
+        if (to === null || to === undefined) {
+            throw new Error('Required parameter to was null or undefined when calling getReadingsBySensorIdAndErrorTypeAndTimeRange.');
+        }
+
+        let queryParameters = new HttpParams({encoder: new CustomHttpUrlEncodingCodec()});
+        if (sensorId !== undefined && sensorId !== null) {
+            queryParameters = queryParameters.set('sensorId', <any>sensorId);
+        }
+        if (errorType !== undefined && errorType !== null) {
+            queryParameters = queryParameters.set('errorType', <any>errorType);
+        }
+        if (from !== undefined && from !== null) {
+            queryParameters = queryParameters.set('from', <any>from.toISOString());
+        }
+        if (to !== undefined && to !== null) {
+            queryParameters = queryParameters.set('to', <any>to.toISOString());
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Document>>('get',`${this.basePath}/api/v1/server/get/sensor/error/range`,
+            {
+                params: queryParameters,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * Get readings by sensor name and time range
+     * 
+     * @param sensorId 
+     * @param from 
+     * @param to 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getReadingsBySensorIdAndTimeRange(sensorId: string, from: Date, to: Date, observe?: 'body', reportProgress?: boolean): Observable<Array<Document>>;
+    public getReadingsBySensorIdAndTimeRange(sensorId: string, from: Date, to: Date, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Document>>>;
+    public getReadingsBySensorIdAndTimeRange(sensorId: string, from: Date, to: Date, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Document>>>;
+    public getReadingsBySensorIdAndTimeRange(sensorId: string, from: Date, to: Date, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (sensorId === null || sensorId === undefined) {
+            throw new Error('Required parameter sensorId was null or undefined when calling getReadingsBySensorIdAndTimeRange.');
+        }
+
+        if (from === null || from === undefined) {
+            throw new Error('Required parameter from was null or undefined when calling getReadingsBySensorIdAndTimeRange.');
+        }
+
+        if (to === null || to === undefined) {
+            throw new Error('Required parameter to was null or undefined when calling getReadingsBySensorIdAndTimeRange.');
+        }
+
+        let queryParameters = new HttpParams({encoder: new CustomHttpUrlEncodingCodec()});
+        if (sensorId !== undefined && sensorId !== null) {
+            queryParameters = queryParameters.set('sensorId', <any>sensorId);
+        }
+        if (from !== undefined && from !== null) {
+            queryParameters = queryParameters.set('from', <any>from.toISOString());
+        }
+        if (to !== undefined && to !== null) {
+            queryParameters = queryParameters.set('to', <any>to.toISOString());
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Document>>('get',`${this.basePath}/api/v1/server/get/sensor/range`,
+            {
+                params: queryParameters,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/stationController.service.ts b/projects/generated-api/src/api/stationController.service.ts
new file mode 100644
index 0000000..6377251
--- /dev/null
+++ b/projects/generated-api/src/api/stationController.service.ts
@@ -0,0 +1,352 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Station } from '../model/station';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class StationControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public _delete(id: string, observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public _delete(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public _delete(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public _delete(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling _delete.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<string>('delete',`${this.basePath}/api/v1/station/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteAll(observe?: 'body', reportProgress?: boolean): Observable<string>;
+    public deleteAll(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<string>>;
+    public deleteAll(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<string>>;
+    public deleteAll(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<string>('delete',`${this.basePath}/api/v1/station/delete/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAll(observe?: 'body', reportProgress?: boolean): Observable<Array<Station>>;
+    public getAll(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Array<Station>>>;
+    public getAll(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Array<Station>>>;
+    public getAll(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Array<Station>>('get',`${this.basePath}/api/v1/station/all`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getById(id: string, observe?: 'body', reportProgress?: boolean): Observable<Station>;
+    public getById(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Station>>;
+    public getById(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Station>>;
+    public getById(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling getById.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Station>('get',`${this.basePath}/api/v1/station/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param name 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getByName(name: string, observe?: 'body', reportProgress?: boolean): Observable<Station>;
+    public getByName(name: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Station>>;
+    public getByName(name: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Station>>;
+    public getByName(name: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (name === null || name === undefined) {
+            throw new Error('Required parameter name was null or undefined when calling getByName.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<Station>('get',`${this.basePath}/api/v1/station/name/${encodeURIComponent(String(name))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public save(body: Station, observe?: 'body', reportProgress?: boolean): Observable<Station>;
+    public save(body: Station, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Station>>;
+    public save(body: Station, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Station>>;
+    public save(body: Station, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling save.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Station>('post',`${this.basePath}/api/v1/station/add`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public update(body: Station, id: string, observe?: 'body', reportProgress?: boolean): Observable<Station>;
+    public update(body: Station, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<Station>>;
+    public update(body: Station, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<Station>>;
+    public update(body: Station, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling update.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling update.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<Station>('put',`${this.basePath}/api/v1/station/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/api/userController.service.ts b/projects/generated-api/src/api/userController.service.ts
new file mode 100644
index 0000000..21455a2
--- /dev/null
+++ b/projects/generated-api/src/api/userController.service.ts
@@ -0,0 +1,330 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ *//* tslint:disable:no-unused-variable member-ordering */
+
+import { Inject, Injectable, Optional }                      from '@angular/core';
+import { HttpClient, HttpHeaders, HttpParams,
+         HttpResponse, HttpEvent }                           from '@angular/common/http';
+import { CustomHttpUrlEncodingCodec }                        from '../encoder';
+
+import { Observable }                                        from 'rxjs';
+
+import { Role } from '../model/role';
+import { UserLoginRequest } from '../model/userLoginRequest';
+import { UserSignUpRequest } from '../model/userSignUpRequest';
+
+import { BASE_PATH, COLLECTION_FORMATS }                     from '../variables';
+import { Configuration }                                     from '../configuration';
+
+
+@Injectable()
+export class UserControllerService {
+
+    protected basePath = 'http://localhost:8080';
+    public defaultHeaders = new HttpHeaders();
+    public configuration = new Configuration();
+
+    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) {
+        if (basePath) {
+            this.basePath = basePath;
+        }
+        if (configuration) {
+            this.configuration = configuration;
+            this.basePath = basePath || configuration.basePath || this.basePath;
+        }
+    }
+
+    /**
+     * @param consumes string[] mime-types
+     * @return true: consumes contains 'multipart/form-data', false: otherwise
+     */
+    private canConsumeForm(consumes: string[]): boolean {
+        const form = 'multipart/form-data';
+        for (const consume of consumes) {
+            if (form === consume) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public addRole(body: Role, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public addRole(body: Role, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public addRole(body: Role, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public addRole(body: Role, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling addRole.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('post',`${this.basePath}/api/v1/auth/add/role`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public authenticateUser(body: UserLoginRequest, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public authenticateUser(body: UserLoginRequest, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public authenticateUser(body: UserLoginRequest, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public authenticateUser(body: UserLoginRequest, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling authenticateUser.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('post',`${this.basePath}/api/v1/auth/login`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public deleteUser(id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public deleteUser(id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public deleteUser(id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public deleteUser(id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling deleteUser.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('delete',`${this.basePath}/api/v1/auth/user/delete/${encodeURIComponent(String(id))}`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public getAllUsers(observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public getAllUsers(observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public getAllUsers(observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public getAllUsers(observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+        ];
+
+        return this.httpClient.request<any>('get',`${this.basePath}/api/v1/auth/users`,
+            {
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public registerUser(body: UserSignUpRequest, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public registerUser(body: UserSignUpRequest, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public registerUser(body: UserSignUpRequest, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public registerUser(body: UserSignUpRequest, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling registerUser.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('post',`${this.basePath}/api/v1/auth/signup`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+    /**
+     * 
+     * 
+     * @param body 
+     * @param id 
+     * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+     * @param reportProgress flag to report request and response progress.
+     */
+    public updateUser(body: UserSignUpRequest, id: string, observe?: 'body', reportProgress?: boolean): Observable<any>;
+    public updateUser(body: UserSignUpRequest, id: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<any>>;
+    public updateUser(body: UserSignUpRequest, id: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<any>>;
+    public updateUser(body: UserSignUpRequest, id: string, observe: any = 'body', reportProgress: boolean = false ): Observable<any> {
+
+        if (body === null || body === undefined) {
+            throw new Error('Required parameter body was null or undefined when calling updateUser.');
+        }
+
+        if (id === null || id === undefined) {
+            throw new Error('Required parameter id was null or undefined when calling updateUser.');
+        }
+
+        let headers = this.defaultHeaders;
+
+        // to determine the Accept header
+        let httpHeaderAccepts: string[] = [
+            '*/*'
+        ];
+        const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts);
+        if (httpHeaderAcceptSelected != undefined) {
+            headers = headers.set('Accept', httpHeaderAcceptSelected);
+        }
+
+        // to determine the Content-Type header
+        const consumes: string[] = [
+            'application/json'
+        ];
+        const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
+        if (httpContentTypeSelected != undefined) {
+            headers = headers.set('Content-Type', httpContentTypeSelected);
+        }
+
+        return this.httpClient.request<any>('put',`${this.basePath}/api/v1/auth/user/update/${encodeURIComponent(String(id))}`,
+            {
+                body: body,
+                withCredentials: this.configuration.withCredentials,
+                headers: headers,
+                observe: observe,
+                reportProgress: reportProgress
+            }
+        );
+    }
+
+}
diff --git a/projects/generated-api/src/configuration.ts b/projects/generated-api/src/configuration.ts
new file mode 100644
index 0000000..82e8458
--- /dev/null
+++ b/projects/generated-api/src/configuration.ts
@@ -0,0 +1,79 @@
+export interface ConfigurationParameters {
+    apiKeys?: {[ key: string ]: string};
+    username?: string;
+    password?: string;
+    accessToken?: string | (() => string);
+    basePath?: string;
+    withCredentials?: boolean;
+}
+
+export class Configuration {
+    apiKeys?: {[ key: string ]: string};
+    username?: string;
+    password?: string;
+    accessToken?: string | (() => string);
+    basePath?: string;
+    withCredentials?: boolean;
+
+    constructor(configurationParameters: ConfigurationParameters = {}) {
+        this.apiKeys = configurationParameters.apiKeys;
+        this.username = configurationParameters.username;
+        this.password = configurationParameters.password;
+        this.accessToken = configurationParameters.accessToken;
+        this.basePath = configurationParameters.basePath;
+        this.withCredentials = configurationParameters.withCredentials;
+    }
+
+    /**
+     * Select the correct content-type to use for a request.
+     * Uses {@link Configuration#isJsonMime} to determine the correct content-type.
+     * If no content type is found return the first found type if the contentTypes is not empty
+     * @param contentTypes - the array of content types that are available for selection
+     * @returns the selected content-type or <code>undefined</code> if no selection could be made.
+     */
+    public selectHeaderContentType (contentTypes: string[]): string | undefined {
+        if (contentTypes.length == 0) {
+            return undefined;
+        }
+
+        let type = contentTypes.find(x => this.isJsonMime(x));
+        if (type === undefined) {
+            return contentTypes[0];
+        }
+        return type;
+    }
+
+    /**
+     * Select the correct accept content-type to use for a request.
+     * Uses {@link Configuration#isJsonMime} to determine the correct accept content-type.
+     * If no content type is found return the first found type if the contentTypes is not empty
+     * @param accepts - the array of content types that are available for selection.
+     * @returns the selected content-type or <code>undefined</code> if no selection could be made.
+     */
+    public selectHeaderAccept(accepts: string[]): string | undefined {
+        if (accepts.length == 0) {
+            return undefined;
+        }
+
+        let type = accepts.find(x => this.isJsonMime(x));
+        if (type === undefined) {
+            return accepts[0];
+        }
+        return type;
+    }
+
+    /**
+     * Check if the given MIME is a JSON MIME.
+     * JSON MIME examples:
+     *   application/json
+     *   application/json; charset=UTF8
+     *   APPLICATION/JSON
+     *   application/vnd.company+json
+     * @param mime - MIME (Multipurpose Internet Mail Extensions)
+     * @return True if the given MIME is JSON, false otherwise.
+     */
+    public isJsonMime(mime: string): boolean {
+        const jsonMime: RegExp = new RegExp('^(application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(;.*)?$', 'i');
+        return mime != null && (jsonMime.test(mime) || mime.toLowerCase() === 'application/json-patch+json');
+    }
+}
diff --git a/projects/generated-api/src/encoder.ts b/projects/generated-api/src/encoder.ts
new file mode 100644
index 0000000..d34eab7
--- /dev/null
+++ b/projects/generated-api/src/encoder.ts
@@ -0,0 +1,20 @@
+    import { HttpUrlEncodingCodec } from '@angular/common/http';
+
+/**
+* CustomHttpUrlEncodingCodec
+* Fix plus sign (+) not encoding, so sent as blank space
+* See: https://github.com/angular/angular/issues/11058#issuecomment-247367318
+*/
+export class CustomHttpUrlEncodingCodec extends HttpUrlEncodingCodec {
+
+  override encodeKey(k: string): string {
+        k = super.encodeKey(k);
+        return k.replace(/\+/gi, '%2B');
+    }
+
+  override encodeValue(v: string): string {
+        v = super.encodeValue(v);
+        return v.replace(/\+/gi, '%2B');
+    }
+}
+
diff --git a/projects/generated-api/src/git_push.sh b/projects/generated-api/src/git_push.sh
new file mode 100644
index 0000000..ae01b18
--- /dev/null
+++ b/projects/generated-api/src/git_push.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+    git_user_id="GIT_USER_ID"
+    echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+    git_repo_id="GIT_REPO_ID"
+    echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+    release_note="Minor update"
+    echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository. 
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+    if [ "$GIT_TOKEN" = "" ]; then
+        echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+        git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+    else
+        git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+    fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/projects/generated-api/src/index.ts b/projects/generated-api/src/index.ts
new file mode 100644
index 0000000..c312b70
--- /dev/null
+++ b/projects/generated-api/src/index.ts
@@ -0,0 +1,5 @@
+export * from './api/api';
+export * from './model/models';
+export * from './variables';
+export * from './configuration';
+export * from './api.module';
\ No newline at end of file
diff --git a/projects/generated-api/src/model/avgMinMax.ts b/projects/generated-api/src/model/avgMinMax.ts
new file mode 100644
index 0000000..c39b97c
--- /dev/null
+++ b/projects/generated-api/src/model/avgMinMax.ts
@@ -0,0 +1,40 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { ValueWithTimestamp } from './valueWithTimestamp';
+
+export interface AvgMinMax { 
+    name?: string;
+    min?: ValueWithTimestamp;
+    max?: ValueWithTimestamp;
+    avg?: number;
+    measurementType?: AvgMinMax.MeasurementTypeEnum;
+    isSensorGroup?: boolean;
+}
+export namespace AvgMinMax {
+    export type MeasurementTypeEnum = 'PRECIPITATION' | 'SOLAR_RADIATION' | 'SOIL_MOISTURE' | 'SOIL_TEMPERATURE' | 'HUMIDITY' | 'TEMPERATURE' | 'CIRCUMFERENCE_INCREMENT' | 'SHUNT_VOLTAGE' | 'BUS_VOLTAGE' | 'CURRENT_mA' | 'POWER_mW' | 'LOAD_VOLTAGE_V' | 'INA219_OVERFLOW' | 'BATTERY_VOLTAGE';
+    export const MeasurementTypeEnum = {
+        PRECIPITATION: 'PRECIPITATION' as MeasurementTypeEnum,
+        SOLARRADIATION: 'SOLAR_RADIATION' as MeasurementTypeEnum,
+        SOILMOISTURE: 'SOIL_MOISTURE' as MeasurementTypeEnum,
+        SOILTEMPERATURE: 'SOIL_TEMPERATURE' as MeasurementTypeEnum,
+        HUMIDITY: 'HUMIDITY' as MeasurementTypeEnum,
+        TEMPERATURE: 'TEMPERATURE' as MeasurementTypeEnum,
+        CIRCUMFERENCEINCREMENT: 'CIRCUMFERENCE_INCREMENT' as MeasurementTypeEnum,
+        SHUNTVOLTAGE: 'SHUNT_VOLTAGE' as MeasurementTypeEnum,
+        BUSVOLTAGE: 'BUS_VOLTAGE' as MeasurementTypeEnum,
+        CURRENTMA: 'CURRENT_mA' as MeasurementTypeEnum,
+        POWERMW: 'POWER_mW' as MeasurementTypeEnum,
+        LOADVOLTAGEV: 'LOAD_VOLTAGE_V' as MeasurementTypeEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as MeasurementTypeEnum,
+        BATTERYVOLTAGE: 'BATTERY_VOLTAGE' as MeasurementTypeEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/client.ts b/projects/generated-api/src/model/client.ts
new file mode 100644
index 0000000..ddbedf2
--- /dev/null
+++ b/projects/generated-api/src/model/client.ts
@@ -0,0 +1,20 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface Client { 
+    id?: string;
+    name?: string;
+    mac?: string;
+    description?: string;
+    connectionType?: string;
+    sensors?: Array<string>;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/dendrometerDailyValue.ts b/projects/generated-api/src/model/dendrometerDailyValue.ts
new file mode 100644
index 0000000..ed4aede
--- /dev/null
+++ b/projects/generated-api/src/model/dendrometerDailyValue.ts
@@ -0,0 +1,21 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { DendrometerDeltaR } from './dendrometerDeltaR';
+import { DendrometerMDS } from './dendrometerMDS';
+
+export interface DendrometerDailyValue { 
+    name?: string;
+    mds?: DendrometerMDS;
+    deltaR?: DendrometerDeltaR;
+    std?: number;
+    isSensorGroup?: boolean;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/dendrometerDeltaR.ts b/projects/generated-api/src/model/dendrometerDeltaR.ts
new file mode 100644
index 0000000..2f011c6
--- /dev/null
+++ b/projects/generated-api/src/model/dendrometerDeltaR.ts
@@ -0,0 +1,16 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface DendrometerDeltaR { 
+    value?: number;
+    duration?: number;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/dendrometerMDS.ts b/projects/generated-api/src/model/dendrometerMDS.ts
new file mode 100644
index 0000000..37d465e
--- /dev/null
+++ b/projects/generated-api/src/model/dendrometerMDS.ts
@@ -0,0 +1,16 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface DendrometerMDS { 
+    value?: number;
+    duration?: number;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/dendrometerValue.ts b/projects/generated-api/src/model/dendrometerValue.ts
new file mode 100644
index 0000000..10191f2
--- /dev/null
+++ b/projects/generated-api/src/model/dendrometerValue.ts
@@ -0,0 +1,26 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface DendrometerValue { 
+    timestamp?: Date;
+    value?: number;
+    fluctuationType?: DendrometerValue.FluctuationTypeEnum;
+}
+export namespace DendrometerValue {
+    export type FluctuationTypeEnum = 'CONTRACTION' | 'EXPANSION' | 'STEM_RADIUS_INCREASE' | 'STEM_RADIUS_STABLE';
+    export const FluctuationTypeEnum = {
+        CONTRACTION: 'CONTRACTION' as FluctuationTypeEnum,
+        EXPANSION: 'EXPANSION' as FluctuationTypeEnum,
+        STEMRADIUSINCREASE: 'STEM_RADIUS_INCREASE' as FluctuationTypeEnum,
+        STEMRADIUSSTABLE: 'STEM_RADIUS_STABLE' as FluctuationTypeEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/document.ts b/projects/generated-api/src/model/document.ts
new file mode 100644
index 0000000..722a36f
--- /dev/null
+++ b/projects/generated-api/src/model/document.ts
@@ -0,0 +1,19 @@
+// @ts-ignore
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ *
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+// @ts-ignore
+export interface Document extends null<String, any> {
+  [key: string]: any;
+
+
+}
diff --git a/projects/generated-api/src/model/host.ts b/projects/generated-api/src/model/host.ts
new file mode 100644
index 0000000..90a9dfb
--- /dev/null
+++ b/projects/generated-api/src/model/host.ts
@@ -0,0 +1,18 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface Host { 
+    id?: string;
+    name?: string;
+    simId?: string;
+    mac?: string;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/levelOneResponse.ts b/projects/generated-api/src/model/levelOneResponse.ts
new file mode 100644
index 0000000..51d4257
--- /dev/null
+++ b/projects/generated-api/src/model/levelOneResponse.ts
@@ -0,0 +1,20 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { AvgMinMax } from './avgMinMax';
+import { DendrometerDailyValue } from './dendrometerDailyValue';
+import { SumOrAvg } from './sumOrAvg';
+
+export interface LevelOneResponse { 
+    sumOrAvg?: Array<SumOrAvg>;
+    avgMinMax?: Array<AvgMinMax>;
+    dendrometerDailyValues?: Array<DendrometerDailyValue>;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/location.ts b/projects/generated-api/src/model/location.ts
new file mode 100644
index 0000000..5646ae6
--- /dev/null
+++ b/projects/generated-api/src/model/location.ts
@@ -0,0 +1,18 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface Location { 
+    latitude?: number;
+    longitude?: number;
+    altitude?: number;
+    comment?: string;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/measurement.ts b/projects/generated-api/src/model/measurement.ts
new file mode 100644
index 0000000..c818157
--- /dev/null
+++ b/projects/generated-api/src/model/measurement.ts
@@ -0,0 +1,53 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface Measurement { 
+    name?: string;
+    type?: Measurement.TypeEnum;
+    maxValue?: number;
+    minValue?: number;
+    unit?: string;
+    comment?: string;
+    precision?: number;
+    maxReadoutDifference?: number;
+    maxFrozenTimeInSeconds?: number;
+    maxRateOfChange?: number;
+    minVariationCoefficient?: number;
+    latitude?: number;
+    longitude?: number;
+    initialCircumference?: number;
+    treeType?: Measurement.TreeTypeEnum;
+}
+export namespace Measurement {
+    export type TypeEnum = 'PRECIPITATION' | 'SOLAR_RADIATION' | 'SOIL_MOISTURE' | 'SOIL_TEMPERATURE' | 'HUMIDITY' | 'TEMPERATURE' | 'CIRCUMFERENCE_INCREMENT' | 'SHUNT_VOLTAGE' | 'BUS_VOLTAGE' | 'CURRENT_mA' | 'POWER_mW' | 'LOAD_VOLTAGE_V' | 'INA219_OVERFLOW' | 'BATTERY_VOLTAGE';
+    export const TypeEnum = {
+        PRECIPITATION: 'PRECIPITATION' as TypeEnum,
+        SOLARRADIATION: 'SOLAR_RADIATION' as TypeEnum,
+        SOILMOISTURE: 'SOIL_MOISTURE' as TypeEnum,
+        SOILTEMPERATURE: 'SOIL_TEMPERATURE' as TypeEnum,
+        HUMIDITY: 'HUMIDITY' as TypeEnum,
+        TEMPERATURE: 'TEMPERATURE' as TypeEnum,
+        CIRCUMFERENCEINCREMENT: 'CIRCUMFERENCE_INCREMENT' as TypeEnum,
+        SHUNTVOLTAGE: 'SHUNT_VOLTAGE' as TypeEnum,
+        BUSVOLTAGE: 'BUS_VOLTAGE' as TypeEnum,
+        CURRENTMA: 'CURRENT_mA' as TypeEnum,
+        POWERMW: 'POWER_mW' as TypeEnum,
+        LOADVOLTAGEV: 'LOAD_VOLTAGE_V' as TypeEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as TypeEnum,
+        BATTERYVOLTAGE: 'BATTERY_VOLTAGE' as TypeEnum
+    };
+    export type TreeTypeEnum = 'LARCH' | 'SPRUCE';
+    export const TreeTypeEnum = {
+        LARCH: 'LARCH' as TreeTypeEnum,
+        SPRUCE: 'SPRUCE' as TreeTypeEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/models.ts b/projects/generated-api/src/model/models.ts
new file mode 100644
index 0000000..2e2d97a
--- /dev/null
+++ b/projects/generated-api/src/model/models.ts
@@ -0,0 +1,20 @@
+export * from './avgMinMax';
+export * from './client';
+export * from './dendrometerDailyValue';
+export * from './dendrometerDeltaR';
+export * from './dendrometerMDS';
+export * from './document';
+export * from './host';
+export * from './levelOneResponse';
+export * from './location';
+export * from './measurement';
+export * from './readingPayload';
+export * from './readingValue';
+export * from './role';
+export * from './sensor';
+export * from './sensorGroup';
+export * from './station';
+export * from './sumOrAvg';
+export * from './userLoginRequest';
+export * from './userSignUpRequest';
+export * from './valueWithTimestamp';
diff --git a/projects/generated-api/src/model/readingPayload.ts b/projects/generated-api/src/model/readingPayload.ts
new file mode 100644
index 0000000..7366f5d
--- /dev/null
+++ b/projects/generated-api/src/model/readingPayload.ts
@@ -0,0 +1,55 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { ReadingValue } from './readingValue';
+
+export interface ReadingPayload { 
+    host?: string;
+    client?: string;
+    sensorProtocol?: string;
+    protocolAddress?: string;
+    hardwareName?: string;
+    readings?: Array<ReadingValue>;
+    timestamp?: number;
+    sensorError?: ReadingPayload.SensorErrorEnum;
+}
+export namespace ReadingPayload {
+    export type SensorErrorEnum = 'NO_ERROR' | 'INVALID_TIMESTAMP' | 'INVALID_SENSOR_ID' | 'INVALID_SENSOR_TYPE' | 'INVALID_READING_VALUE_RANGE' | 'INVALID_READING_VALUE_TOO_LOW' | 'INVALID_READING_VALUE_TOO_HIGH' | 'INVALID_READING_VALUE_NAN' | 'INVALID_READING_VALUE_DUPLICATE' | 'INVALID_READING_VALUE_BELOW_VAR_COFF' | 'INVALID_READING_VALUE_ABOVE_RATE_OF_CHANGE' | 'INVALID_READING_VALUE_LOWER_FOR_SOLAR_ELEVATION' | 'INVALID_READING_VALUE_NOT_ZERO_FOR_SOLAR_ELEVATION' | 'INVALID_READING_VALUE_FROZEN' | 'INVALID_READING_VALUE_SPIKE' | 'DATA_OK' | 'SENSOR_NOT_FOUND' | 'SENSOR_NOT_CONNECTED' | 'NO_DATA' | 'SENSOR_DOES_NOT_RETURN_DATA' | 'BATTERY_VOLTAGE_TOO_LOW' | 'INVALID_VALUE' | 'SENSOR_INIT_FAILED' | 'INA219_OVERFLOW' | 'CONNECTION_ENDED_PREMATURELY' | 'WRONG_CRC' | 'UNKNOWN_ERROR_TYPE';
+    export const SensorErrorEnum = {
+        NOERROR: 'NO_ERROR' as SensorErrorEnum,
+        INVALIDTIMESTAMP: 'INVALID_TIMESTAMP' as SensorErrorEnum,
+        INVALIDSENSORID: 'INVALID_SENSOR_ID' as SensorErrorEnum,
+        INVALIDSENSORTYPE: 'INVALID_SENSOR_TYPE' as SensorErrorEnum,
+        INVALIDREADINGVALUERANGE: 'INVALID_READING_VALUE_RANGE' as SensorErrorEnum,
+        INVALIDREADINGVALUETOOLOW: 'INVALID_READING_VALUE_TOO_LOW' as SensorErrorEnum,
+        INVALIDREADINGVALUETOOHIGH: 'INVALID_READING_VALUE_TOO_HIGH' as SensorErrorEnum,
+        INVALIDREADINGVALUENAN: 'INVALID_READING_VALUE_NAN' as SensorErrorEnum,
+        INVALIDREADINGVALUEDUPLICATE: 'INVALID_READING_VALUE_DUPLICATE' as SensorErrorEnum,
+        INVALIDREADINGVALUEBELOWVARCOFF: 'INVALID_READING_VALUE_BELOW_VAR_COFF' as SensorErrorEnum,
+        INVALIDREADINGVALUEABOVERATEOFCHANGE: 'INVALID_READING_VALUE_ABOVE_RATE_OF_CHANGE' as SensorErrorEnum,
+        INVALIDREADINGVALUELOWERFORSOLARELEVATION: 'INVALID_READING_VALUE_LOWER_FOR_SOLAR_ELEVATION' as SensorErrorEnum,
+        INVALIDREADINGVALUENOTZEROFORSOLARELEVATION: 'INVALID_READING_VALUE_NOT_ZERO_FOR_SOLAR_ELEVATION' as SensorErrorEnum,
+        INVALIDREADINGVALUEFROZEN: 'INVALID_READING_VALUE_FROZEN' as SensorErrorEnum,
+        INVALIDREADINGVALUESPIKE: 'INVALID_READING_VALUE_SPIKE' as SensorErrorEnum,
+        DATAOK: 'DATA_OK' as SensorErrorEnum,
+        SENSORNOTFOUND: 'SENSOR_NOT_FOUND' as SensorErrorEnum,
+        SENSORNOTCONNECTED: 'SENSOR_NOT_CONNECTED' as SensorErrorEnum,
+        NODATA: 'NO_DATA' as SensorErrorEnum,
+        SENSORDOESNOTRETURNDATA: 'SENSOR_DOES_NOT_RETURN_DATA' as SensorErrorEnum,
+        BATTERYVOLTAGETOOLOW: 'BATTERY_VOLTAGE_TOO_LOW' as SensorErrorEnum,
+        INVALIDVALUE: 'INVALID_VALUE' as SensorErrorEnum,
+        SENSORINITFAILED: 'SENSOR_INIT_FAILED' as SensorErrorEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as SensorErrorEnum,
+        CONNECTIONENDEDPREMATURELY: 'CONNECTION_ENDED_PREMATURELY' as SensorErrorEnum,
+        WRONGCRC: 'WRONG_CRC' as SensorErrorEnum,
+        UNKNOWNERRORTYPE: 'UNKNOWN_ERROR_TYPE' as SensorErrorEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/readingValue.ts b/projects/generated-api/src/model/readingValue.ts
new file mode 100644
index 0000000..1386949
--- /dev/null
+++ b/projects/generated-api/src/model/readingValue.ts
@@ -0,0 +1,35 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface ReadingValue { 
+    name?: ReadingValue.NameEnum;
+    value?: number;
+}
+export namespace ReadingValue {
+    export type NameEnum = 'PRECIPITATION' | 'SOLAR_RADIATION' | 'SOIL_MOISTURE' | 'SOIL_TEMPERATURE' | 'HUMIDITY' | 'TEMPERATURE' | 'CIRCUMFERENCE_INCREMENT' | 'SHUNT_VOLTAGE' | 'BUS_VOLTAGE' | 'CURRENT_mA' | 'POWER_mW' | 'LOAD_VOLTAGE_V' | 'INA219_OVERFLOW' | 'BATTERY_VOLTAGE';
+    export const NameEnum = {
+        PRECIPITATION: 'PRECIPITATION' as NameEnum,
+        SOLARRADIATION: 'SOLAR_RADIATION' as NameEnum,
+        SOILMOISTURE: 'SOIL_MOISTURE' as NameEnum,
+        SOILTEMPERATURE: 'SOIL_TEMPERATURE' as NameEnum,
+        HUMIDITY: 'HUMIDITY' as NameEnum,
+        TEMPERATURE: 'TEMPERATURE' as NameEnum,
+        CIRCUMFERENCEINCREMENT: 'CIRCUMFERENCE_INCREMENT' as NameEnum,
+        SHUNTVOLTAGE: 'SHUNT_VOLTAGE' as NameEnum,
+        BUSVOLTAGE: 'BUS_VOLTAGE' as NameEnum,
+        CURRENTMA: 'CURRENT_mA' as NameEnum,
+        POWERMW: 'POWER_mW' as NameEnum,
+        LOADVOLTAGEV: 'LOAD_VOLTAGE_V' as NameEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as NameEnum,
+        BATTERYVOLTAGE: 'BATTERY_VOLTAGE' as NameEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/role.ts b/projects/generated-api/src/model/role.ts
new file mode 100644
index 0000000..4386c65
--- /dev/null
+++ b/projects/generated-api/src/model/role.ts
@@ -0,0 +1,24 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface Role { 
+    id?: string;
+    name?: Role.NameEnum;
+}
+export namespace Role {
+    export type NameEnum = 'ROLE_USER' | 'ROLE_MANAGER' | 'ROLE_ADMIN';
+    export const NameEnum = {
+        USER: 'ROLE_USER' as NameEnum,
+        MANAGER: 'ROLE_MANAGER' as NameEnum,
+        ADMIN: 'ROLE_ADMIN' as NameEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/sensor.ts b/projects/generated-api/src/model/sensor.ts
new file mode 100644
index 0000000..a3a2146
--- /dev/null
+++ b/projects/generated-api/src/model/sensor.ts
@@ -0,0 +1,23 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { Measurement } from './measurement';
+
+export interface Sensor { 
+    id?: string;
+    name?: string;
+    protocol?: string;
+    protocolAddress?: string;
+    hardwareName?: string;
+    uniqueHardwareName?: string;
+    description?: string;
+    measurements?: Array<Measurement>;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/sensorGroup.ts b/projects/generated-api/src/model/sensorGroup.ts
new file mode 100644
index 0000000..ab98ec6
--- /dev/null
+++ b/projects/generated-api/src/model/sensorGroup.ts
@@ -0,0 +1,38 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface SensorGroup { 
+    id?: string;
+    name?: string;
+    sensors?: Array<string>;
+    station?: string;
+    measurementType?: SensorGroup.MeasurementTypeEnum;
+}
+export namespace SensorGroup {
+    export type MeasurementTypeEnum = 'PRECIPITATION' | 'SOLAR_RADIATION' | 'SOIL_MOISTURE' | 'SOIL_TEMPERATURE' | 'HUMIDITY' | 'TEMPERATURE' | 'CIRCUMFERENCE_INCREMENT' | 'SHUNT_VOLTAGE' | 'BUS_VOLTAGE' | 'CURRENT_mA' | 'POWER_mW' | 'LOAD_VOLTAGE_V' | 'INA219_OVERFLOW' | 'BATTERY_VOLTAGE';
+    export const MeasurementTypeEnum = {
+        PRECIPITATION: 'PRECIPITATION' as MeasurementTypeEnum,
+        SOLARRADIATION: 'SOLAR_RADIATION' as MeasurementTypeEnum,
+        SOILMOISTURE: 'SOIL_MOISTURE' as MeasurementTypeEnum,
+        SOILTEMPERATURE: 'SOIL_TEMPERATURE' as MeasurementTypeEnum,
+        HUMIDITY: 'HUMIDITY' as MeasurementTypeEnum,
+        TEMPERATURE: 'TEMPERATURE' as MeasurementTypeEnum,
+        CIRCUMFERENCEINCREMENT: 'CIRCUMFERENCE_INCREMENT' as MeasurementTypeEnum,
+        SHUNTVOLTAGE: 'SHUNT_VOLTAGE' as MeasurementTypeEnum,
+        BUSVOLTAGE: 'BUS_VOLTAGE' as MeasurementTypeEnum,
+        CURRENTMA: 'CURRENT_mA' as MeasurementTypeEnum,
+        POWERMW: 'POWER_mW' as MeasurementTypeEnum,
+        LOADVOLTAGEV: 'LOAD_VOLTAGE_V' as MeasurementTypeEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as MeasurementTypeEnum,
+        BATTERYVOLTAGE: 'BATTERY_VOLTAGE' as MeasurementTypeEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/station.ts b/projects/generated-api/src/model/station.ts
new file mode 100644
index 0000000..5889acb
--- /dev/null
+++ b/projects/generated-api/src/model/station.ts
@@ -0,0 +1,23 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { Location } from './location';
+
+export interface Station { 
+    id?: string;
+    name?: string;
+    location?: Location;
+    createdDate?: Date;
+    updatedDate?: Date;
+    host?: string;
+    clients?: Array<string>;
+    diary?: string;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/sumOrAvg.ts b/projects/generated-api/src/model/sumOrAvg.ts
new file mode 100644
index 0000000..e76af1b
--- /dev/null
+++ b/projects/generated-api/src/model/sumOrAvg.ts
@@ -0,0 +1,43 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface SumOrAvg { 
+    type?: SumOrAvg.TypeEnum;
+    name?: string;
+    value?: number;
+    measurementType?: SumOrAvg.MeasurementTypeEnum;
+    isSensorGroup?: boolean;
+}
+export namespace SumOrAvg {
+    export type TypeEnum = 'SUM' | 'AVG';
+    export const TypeEnum = {
+        SUM: 'SUM' as TypeEnum,
+        AVG: 'AVG' as TypeEnum
+    };
+    export type MeasurementTypeEnum = 'PRECIPITATION' | 'SOLAR_RADIATION' | 'SOIL_MOISTURE' | 'SOIL_TEMPERATURE' | 'HUMIDITY' | 'TEMPERATURE' | 'CIRCUMFERENCE_INCREMENT' | 'SHUNT_VOLTAGE' | 'BUS_VOLTAGE' | 'CURRENT_mA' | 'POWER_mW' | 'LOAD_VOLTAGE_V' | 'INA219_OVERFLOW' | 'BATTERY_VOLTAGE';
+    export const MeasurementTypeEnum = {
+        PRECIPITATION: 'PRECIPITATION' as MeasurementTypeEnum,
+        SOLARRADIATION: 'SOLAR_RADIATION' as MeasurementTypeEnum,
+        SOILMOISTURE: 'SOIL_MOISTURE' as MeasurementTypeEnum,
+        SOILTEMPERATURE: 'SOIL_TEMPERATURE' as MeasurementTypeEnum,
+        HUMIDITY: 'HUMIDITY' as MeasurementTypeEnum,
+        TEMPERATURE: 'TEMPERATURE' as MeasurementTypeEnum,
+        CIRCUMFERENCEINCREMENT: 'CIRCUMFERENCE_INCREMENT' as MeasurementTypeEnum,
+        SHUNTVOLTAGE: 'SHUNT_VOLTAGE' as MeasurementTypeEnum,
+        BUSVOLTAGE: 'BUS_VOLTAGE' as MeasurementTypeEnum,
+        CURRENTMA: 'CURRENT_mA' as MeasurementTypeEnum,
+        POWERMW: 'POWER_mW' as MeasurementTypeEnum,
+        LOADVOLTAGEV: 'LOAD_VOLTAGE_V' as MeasurementTypeEnum,
+        INA219OVERFLOW: 'INA219_OVERFLOW' as MeasurementTypeEnum,
+        BATTERYVOLTAGE: 'BATTERY_VOLTAGE' as MeasurementTypeEnum
+    };
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/threePhaseDendrometer.ts b/projects/generated-api/src/model/threePhaseDendrometer.ts
new file mode 100644
index 0000000..c38d745
--- /dev/null
+++ b/projects/generated-api/src/model/threePhaseDendrometer.ts
@@ -0,0 +1,18 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+import { DendrometerValue } from './dendrometerValue';
+
+export interface ThreePhaseDendrometer { 
+    name?: string;
+    readings?: Array<DendrometerValue>;
+    isSensorGroup?: boolean;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/userLoginRequest.ts b/projects/generated-api/src/model/userLoginRequest.ts
new file mode 100644
index 0000000..3a5f441
--- /dev/null
+++ b/projects/generated-api/src/model/userLoginRequest.ts
@@ -0,0 +1,16 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface UserLoginRequest { 
+    username: string;
+    password: string;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/userSignUpRequest.ts b/projects/generated-api/src/model/userSignUpRequest.ts
new file mode 100644
index 0000000..15c8ee7
--- /dev/null
+++ b/projects/generated-api/src/model/userSignUpRequest.ts
@@ -0,0 +1,18 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface UserSignUpRequest { 
+    username: string;
+    email: string;
+    password: string;
+    roles?: Array<string>;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/model/valueWithTimestamp.ts b/projects/generated-api/src/model/valueWithTimestamp.ts
new file mode 100644
index 0000000..52e03b3
--- /dev/null
+++ b/projects/generated-api/src/model/valueWithTimestamp.ts
@@ -0,0 +1,16 @@
+/**
+ * OpenAPI definition
+ * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
+ *
+ * OpenAPI spec version: v0
+ * 
+ *
+ * NOTE: This class is auto generated by the swagger code generator program.
+ * https://github.com/swagger-api/swagger-codegen.git
+ * Do not edit the class manually.
+ */
+
+export interface ValueWithTimestamp { 
+    value?: number;
+    timestamp?: Date;
+}
\ No newline at end of file
diff --git a/projects/generated-api/src/ng-package.json b/projects/generated-api/src/ng-package.json
new file mode 100644
index 0000000..3b17900
--- /dev/null
+++ b/projects/generated-api/src/ng-package.json
@@ -0,0 +1,6 @@
+{
+  "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
+  "lib": {
+    "entryFile": "index.ts"
+  }
+}
diff --git a/projects/generated-api/src/variables.ts b/projects/generated-api/src/variables.ts
new file mode 100644
index 0000000..6fe5854
--- /dev/null
+++ b/projects/generated-api/src/variables.ts
@@ -0,0 +1,9 @@
+import { InjectionToken } from '@angular/core';
+
+export const BASE_PATH = new InjectionToken<string>('basePath');
+export const COLLECTION_FORMATS = {
+    'csv': ',',
+    'tsv': '   ',
+    'ssv': ' ',
+    'pipes': '|'
+}
diff --git a/projects/swagger-client/src/api/serverController.service.ts b/projects/swagger-client/src/api/serverController.service.ts
index 5f3e53f..197714b 100644
--- a/projects/swagger-client/src/api/serverController.service.ts
+++ b/projects/swagger-client/src/api/serverController.service.ts
@@ -3,7 +3,7 @@
  * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
  *
  * OpenAPI spec version: v0
- * 
+ *
  *
  * NOTE: This class is auto generated by the swagger code generator program.
  * https://github.com/swagger-api/swagger-codegen.git
@@ -59,8 +59,8 @@ export class ServerControllerService {
 
     /**
      * Add a reading to the database
-     * 
-     * @param body 
+     *
+     * @param body
      * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
      * @param reportProgress flag to report request and response progress.
      */
@@ -106,7 +106,7 @@ export class ServerControllerService {
 
     /**
      * Delete all readings from database
-     * 
+     *
      * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
      * @param reportProgress flag to report request and response progress.
      */
@@ -142,9 +142,9 @@ export class ServerControllerService {
 
     /**
      * Get level one response for a group id and a time range
-     * 
-     * @param station 
-     * @param date 
+     *
+     * @param station
+     * @param date
      * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
      * @param reportProgress flag to report request and response progress.
      */
@@ -194,11 +194,11 @@ export class ServerControllerService {
 
     /**
      * Get readings by sensor name and error type and time range
-     * 
-     * @param sensorId 
-     * @param errorType 
-     * @param from 
-     * @param to 
+     *
+     * @param sensorId
+     * @param errorType
+     * @param from
+     * @param to
      * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
      * @param reportProgress flag to report request and response progress.
      */
@@ -265,10 +265,10 @@ export class ServerControllerService {
 
     /**
      * Get readings by sensor name and time range
-     * 
-     * @param sensorId 
-     * @param from 
-     * @param to 
+     *
+     * @param sensorId
+     * @param from
+     * @param to
      * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
      * @param reportProgress flag to report request and response progress.
      */
diff --git a/src/app/app.component.html b/src/app/app.component.html
index eea828c..a70525f 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -35,15 +35,7 @@
 
 
 
-
-
-
-
-
-
-<app-thermometer></app-thermometer>
-
-
+<app-home-tailwindcss></app-home-tailwindcss>
 
 
 
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 9ec6a42..ac504c1 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -41,6 +41,7 @@ import { InterceptorService } from './shared/auth/interceptor.service';
 import {CjsTimelineMultiple} from "./module/components/charts/Cjs-timeline-multiple/light-chart.component";
 import {MatButtonModule} from "@angular/material/button";
 import { ThermometerComponent } from './module/components/thermometer/thermometer.component';
+import { HomeTailwindcssComponent } from './module/pages/home-tailwindcss/home-tailwindcss.component';
 
 @NgModule({
   declarations: [
@@ -67,7 +68,8 @@ import { ThermometerComponent } from './module/components/thermometer/thermomete
     LightChartComponent,
     ProViewComponent,
     CjsTimelineMultiple,
-    ThermometerComponent
+    ThermometerComponent,
+    HomeTailwindcssComponent
 
   ],
   imports: [
diff --git a/src/app/module/components/lev0Ver2/lev0.component.html b/src/app/module/components/lev0Ver2/lev0.component.html
index 656a1ce..294eb37 100644
--- a/src/app/module/components/lev0Ver2/lev0.component.html
+++ b/src/app/module/components/lev0Ver2/lev0.component.html
@@ -65,10 +65,46 @@
   </div>
 
 
+    <div class="w-full flex flex-row  justify-start flex-wrap ">
 
 
+      <div class="flex-col p-2 m-4 bg-white justify-center items-center rounded"
+           *ngFor="let dent of dentrometerDailyValue"
+           [ngStyle]="{'box-shadow':dent.isSensorGroup  ? '15px 15px rgb(173,216,230,0.4) ,30px 30px rgb(173,216,230,0.2)':''}">
 
-  <div class="w-full flex flex-row items-end justify-center flex-wrap">
+        <h1 class="flex font-bold text-4sm mb-6 justify-center">{{dent.name}}</h1>
+        <div class="mx-8 flex justify-between">
+
+          <div class="flex-col content-center items-center justify-center">
+            <div class="flex mx-2  flex items-center border-b-2 border-black  ">
+              <i class="material-icons text-blue-500 text-2xl mr-2">unfold_less</i>
+              <h5 class="text-gray-500 text-xs">Maximum daily shrinkage</h5>
+            </div>
+            <div class="flex items-end justify-center">
+              <h1 class=" flex justify-center text-3xl font-bold">{{dent.mds?.value}}</h1>
+              <h3 class="mb-1 ml-1 text-slate-400">mm </h3>
+            </div>
+          </div>
+
+          <div class="flex-col">
+            <div class="flex mx-2  flex items-center border-b-2 border-black ">
+              <i class="material-icons text-yellow-500 text-2xl mr-2">vertical_align_top</i>
+              <h5 class="text-gray-500 text-xs">Radius increment</h5>
+            </div>
+            <div class="flex items-end justify-center">
+              <h1 class=" flex justify-center text-3xl font-bold">{{dent.deltaR?.value}}</h1>
+              <h3 class="mb-1 ml-1 text-slate-400">mm </h3>
+            </div>
+          </div>
+
+        </div>
+      </div>
+
+    </div>
+
+
+
+    <div class="w-full flex flex-row items-end justify-center flex-wrap">
 
       <div class="card-dendrometer">
         <h1>Dendrometer</h1>
diff --git a/src/app/module/components/lev0Ver2/lev0.component.ts b/src/app/module/components/lev0Ver2/lev0.component.ts
index cb9d3f8..fe8ea6b 100644
--- a/src/app/module/components/lev0Ver2/lev0.component.ts
+++ b/src/app/module/components/lev0Ver2/lev0.component.ts
@@ -6,6 +6,7 @@ import {SumOrAvg} from "../../../core/service/level1/SumOrAvg";
 import {FormControl, FormGroup} from "@angular/forms";
 import {DatePipe} from "@angular/common";
 import {ThreePhaseDendrometer} from "../../../core/service/level1/ThreePhaseDendrometer";
+import {DendrometerDailyValue} from "../../../../../projects/generated-api/src";
 
 @Component({
   selector: 'app-lev0Ver2',
@@ -13,17 +14,35 @@ import {ThreePhaseDendrometer} from "../../../core/service/level1/ThreePhaseDend
   styleUrls: ['./lev0.component.scss']
 })
 export class Lev0Ver2Component {
-  heros: Hero[] = [
-    { id: 12, name: 'Dr. Nice' },
-    { id: 13, name: 'Bombasto' },
-    { id: 14, name: 'Celeritas' },
-    { id: 15, name: 'Magneta' },
-    { id: 16, name: 'RubberMan' },
-    { id: 17, name: 'Dynama' },
-    { id: 18, name: 'Dr. IQ' },
-    { id: 19, name: 'Magma' },
-    { id: 20, name: 'Tornado' }
-  ];
+  dentrometerDailyValue:DendrometerDailyValue[]=[
+    {
+      name: "name",
+      mds: {
+        value: 1.23,
+        duration: 456
+      },
+      deltaR: {
+        value: 7.89,
+        duration: 2
+      },
+      std: 0.123,
+      isSensorGroup: true
+    },
+    {
+      name: "name2",
+      mds: {
+        value: 1.23,
+        duration: 456
+      },
+      deltaR: {
+        value: 7.89,
+        duration: 2
+      },
+      std: 0.123,
+      isSensorGroup: true
+    }
+  ]
+
   constructor(private api:ApiService) {
     this.dateControl.valueChanges.subscribe(date => {
       this.reload()
diff --git a/src/app/module/components/pro-view/pro-view.component.html b/src/app/module/components/pro-view/pro-view.component.html
index fd3b2f9..55de3dc 100644
--- a/src/app/module/components/pro-view/pro-view.component.html
+++ b/src/app/module/components/pro-view/pro-view.component.html
@@ -1,4 +1,4 @@
-
+{{isDendrometer}}
 <form class="mt-10 flex flex-wrap justify-center sm:justify-between w-full
             [&>*]:w-full [&>*]:sm:w-1/4  [&>*]:p-2">
 
@@ -47,7 +47,7 @@
   </mat-form-field>
 </form>
 
-
+<!--
 <mat-form-field class=" " appearance="fill" *ngIf="t_bool">
   <mat-label>Select a Station</mat-label>
   <input type="text"
@@ -58,6 +58,7 @@
          [matAutocomplete]="auto2">
   <mat-error *ngIf="stationControl.hasError('invalid')">This Station does not exists</mat-error>
 
+
   <mat-autocomplete #auto2="matAutocomplete">
     <div *ngIf="t_bool">
       <mat-select>
@@ -71,6 +72,7 @@
 
 </mat-form-field>
 
+
 <mat-form-field class="" appearance="fill">
   <mat-label>Favorite food</mat-label>
   <input matInput placeholder="Ex. Pizza" value="Sushi" [formControl]="t_control2" (focus)="onFocus()"
@@ -92,6 +94,8 @@
   </div>
 </div>
 {{isFocused}}{{menuOpen}}
+
+-->
 <div class="flex flex-wrap w-full justify-center sm:justify-end
              [&>*]:w-full [&>*]:sm:w-1/4  [&>*]:h-16  [&>*]:p-2 ">
 
@@ -115,5 +119,5 @@
 
 <app-Cjs-timeline-multiple [sensorData]="this.sensorData" [sensorDataArray]="this.sensorDataArray" ></app-Cjs-timeline-multiple>
 
-
+<app-Cjs-timline></app-Cjs-timline>
 
diff --git a/src/app/module/components/pro-view/pro-view.component.ts b/src/app/module/components/pro-view/pro-view.component.ts
index b7f971a..75a5b5e 100644
--- a/src/app/module/components/pro-view/pro-view.component.ts
+++ b/src/app/module/components/pro-view/pro-view.component.ts
@@ -4,7 +4,7 @@ import {Observable} from 'rxjs';
 import {map, startWith} from 'rxjs/operators';
 import {
   ClientControllerService,
-  HostControllerService,
+  HostControllerService, SensorControllerService,
   ServerControllerService,
   Station,
   StationControllerService
@@ -12,13 +12,15 @@ import {
 
 import {DatePipe} from "@angular/common";
 import {LogLevel, MyLoggerServiceService} from "../../../shared/service/my-logger-service.service";
+import {ThreePhaseDendrometer} from "../../../core/service/level1/ThreePhaseDendrometer";
 
 //TODOS after from this.serverControllerService.getReadingsBySensorIdAndTimeRange return type is changed i can uncomment the @ts-ignore
 //
 @Component({
   selector: 'app-pro-view',
   templateUrl: './pro-view.component.html',
-  styleUrls: ['./pro-view.component.css']
+  styleUrls: ['./pro-view.component.css'],
+  providers: [DatePipe]
 })
 export class ProViewComponent {
   stationControl = new FormControl('');
@@ -29,10 +31,14 @@ export class ProViewComponent {
   hostClientControl = new FormControl();
   availableHostClients: string[] = ['host','station'];
   availableHostClientsO:checkHostsStation[]=[]
+
+  isDendrometer:boolean=false;
+  threePhaseDendromete!:ThreePhaseDendrometer
   selected: string[] = []
 
   selectedHostClient:string[]=[]
 
+
   t_string:string[]=['Apple','Banana','Ribisel']
   t_control= new FormControl();
   t_filterdString!: Observable<string[]>;
@@ -66,12 +72,22 @@ t_bool:boolean=true
   station!: Observable<Array<Station>>;
   constructor(private stationControllerService: StationControllerService,private hostControllerService:HostControllerService,
               private clientControllerService:ClientControllerService,private serverControllerService:ServerControllerService,
+              private sensorControllerService:SensorControllerService,
+              private datePipe: DatePipe,
               private logger:MyLoggerServiceService) {
     this.logger.setLevel(LogLevel.LOG)
     this.logger.setTopic("ProViewInputParent")
   }
 
   ngOnInit() {
+    //test for dendrometer
+    const date = new Date('2022-04-15T00:00:00');
+    const formattedDate = this.datePipe.transform(date, 'dd-MM-yyyy');
+    this.serverControllerService.getLevelOneResponseForGroupAndTimeRange("as",date).subscribe(
+      x=>this.logger.info("dendrometer",x)
+    )
+
+
     //If Date Input changes than call Selected Method
     this.range.valueChanges.subscribe((value) => {
       this.onSelectionChange2([])
@@ -206,10 +222,20 @@ t_bool:boolean=true
     let dateStart = datePipe.transform(this.range.value.start, 'dd-MM-yyyyTHH:mm:ss');
     let dateEnd = datePipe.transform(this.range.value.end, 'dd-MM-yyyyTHH:mm:ss');
     this.logger.info("DatenInptut",dateStart,"to",dateEnd)
-
+    this.isDendrometer=false;
     //just call the api if at least 1 client is selected
       if (this.sensorControl.value && this.sensorControl.value.length >= 1) {
-
+        console.log("sensors",this.sensorControl.value)
+        let s_id:String=this.sensorControl.value[0]
+        this.sensorControllerService.getSensorById(s_id+"").subscribe(
+          s=>{
+            this.logger.info("GET sensor",s)
+            this.logger.info("GET sensor type",s.measurements?.at(0)?.type)
+            if (s.measurements?.at(0)?.type=="SOLAR_RADIATION"){
+              this.isDendrometer=true
+            }
+          })
+        console.log("s_id",s_id)
         //save the data from the API in sensorDataArry=>passed to child element + used for visualisation
         this.sensorControl.value.forEach((sensor:string)=>
           this.serverControllerService.getReadingsBySensorIdAndTimeRange(sensor, dateStart + "", dateEnd + "").subscribe(
diff --git a/src/app/shared/auth/interceptor.service.ts b/src/app/shared/auth/interceptor.service.ts
index 83d0f5f..1fdb0d3 100644
--- a/src/app/shared/auth/interceptor.service.ts
+++ b/src/app/shared/auth/interceptor.service.ts
@@ -5,9 +5,9 @@ import {
   HttpEvent,
   HttpHandler,
   HttpInterceptor,
-  HttpRequest
+  HttpRequest, HttpResponse
 } from "@angular/common/http";
-import {Observable} from "rxjs";
+import {Observable, tap} from "rxjs";
 @Injectable({
   providedIn: 'root'
 })
@@ -19,7 +19,13 @@ export class InterceptorService implements HttpInterceptor{
     const authHeader = {'Authorization': 'Bearer ' + localStorage.getItem('token')};
     const authReq = req.clone({ setHeaders: authHeader });
     console.log("Intercptor:",req)
-    return next.handle(authReq);
+    return next.handle(authReq).pipe(
+      tap((event: HttpEvent<any>) => {
+        if (event instanceof HttpResponse) {
+          console.log('Server response:', event);
+        }
+      })
+    );
   }
 }
 export const httpInterceptorProviders = [
-- 
GitLab