Ver Fonte

Added OAuth2 authorization by JWT Bearer token

Lukas Cerny há 1 ano atrás
pai
commit
c117af8429

+ 2 - 0
Dockerfile

@@ -1,6 +1,7 @@
 FROM openjdk:17 AS builder
 
 COPY src /app/src
+COPY keystore.jceks /app/keystore.jceks
 COPY gradle /app/gradle
 COPY build.gradle settings.gradle gradle.properties gradlew /app/
 WORKDIR /app
@@ -32,6 +33,7 @@ FROM openjdk:17-jdk-slim-buster AS dev-debug
 
 COPY --from=builder /app/build/libs/ /app/
 COPY --from=builder /app/gradle.properties /app/
+COPY --from=builder /app/keystore.jceks /app/
 
 WORKDIR /app
 

+ 4 - 1
README.md

@@ -15,4 +15,7 @@ docker run --name senslog_telemetry \
 docker run --name senslog_telemetry --env-file ./production.env -v /home/lcerny/logs:/volume/logs -p 8081:8080 -p 8083:9999/tcp -d senslog/telemetry
 
 
-docker compose up --no-deps --build telemetry-dev  
+docker compose up --no-deps --build telemetry-dev  
+
+
+keytool -importcert -alias RS256 -file <certificate.pem> -keystore <keystore_name.jks> -storepass <keystore_pass> -noprompt

+ 6 - 5
build.gradle

@@ -54,11 +54,12 @@ dependencies {
     implementation 'org.apache.logging.log4j:log4j-api:2.22.0'
     implementation 'org.apache.logging.log4j:log4j-core:2.22.0'
 
-    implementation 'io.vertx:vertx-core:4.4.0'
-    implementation 'io.vertx:vertx-web:4.4.0'
-    implementation 'io.vertx:vertx-web-openapi:4.4.0'
-    implementation 'io.vertx:vertx-pg-client:4.4.0'
-    implementation 'org.postgresql:postgresql:42.6.0'
+    implementation 'io.vertx:vertx-core:4.5.1'
+    implementation 'io.vertx:vertx-web:4.5.1'
+    implementation 'io.vertx:vertx-web-openapi:4.5.1'
+    implementation 'io.vertx:vertx-auth-jwt:4.5.1'
+    implementation 'io.vertx:vertx-pg-client:4.5.1'
+    implementation 'org.postgresql:postgresql:42.7.1'
     implementation 'com.ongres.scram:client:2.1'
 
 

+ 1 - 1
docker-compose.yaml

@@ -42,4 +42,4 @@ services:
     ports:
       - '5432:5432'
     volumes:
-      - ./sql/init.sql:/docker-entrypoint-initdb.d/create_tables.sql
+      - ./init.sql:/docker-entrypoint-initdb.d/create_tables.sql

+ 5 - 0
docker.dev.env

@@ -9,3 +9,8 @@ DATABASE_NAME=maplog
 DATABASE_USER=maplog_app
 DATABASE_PASSWORD=MAPlog
 DATABASE_POOL_SIZE=5
+
+# Auth
+AUTH_KEYSTORE_PATH=/app/keystore.jceks
+AUTH_KEYSTORE_TYPE=PKCS12
+AUTH_KEYSTORE_PASSWORD=SENSlog

+ 0 - 0
sql/init.sql → init.sql


BIN
keystore.jceks


+ 6 - 1
local.dev.env

@@ -8,4 +8,9 @@ DATABASE_PORT=5432
 DATABASE_NAME=maplog
 DATABASE_USER=maplog_app
 DATABASE_PASSWORD=MAPlog
-DATABASE_POOL_SIZE=5
+DATABASE_POOL_SIZE=5
+
+# Auth
+AUTH_KEYSTORE_PATH=keystore.jceks
+AUTH_KEYSTORE_TYPE=PKCS12
+AUTH_KEYSTORE_PASSWORD=SENSlog

+ 0 - 18
sql/mock-data.sql

@@ -1,18 +0,0 @@
-INSERT INTO maplog.campaign(name, description, from_time, to_time) VALUES ('Test Campaign', 'Description of the Test Campaign', '2023-01-01 12:00:00.400922 +00:00', '2024-01-01 12:00:00.400922 +00:00');
-
-INSERT INTO maplog.unit_type(unit_type_id, type_name, description) VALUES ('X', 'Telemetry', 'Mobile Telemetry Unit');
-
-INSERT INTO maplog.unit(unit_id, imei, unit_type_id, description) VALUES (1000, '867648041484898', 'X',  'Testing Telemetry unit');
-
-INSERT INTO maplog.unit_to_campaign(camp_id, unit_id, from_time, to_time) SELECT campaign_id, 1000, from_time, to_time FROM maplog.campaign;
-
-INSERT INTO maplog.phenomenon(phenomenon_id, phenomenon_name, uom) VALUES (1, 'DEFAULT', 'NONE');
-
-INSERT INTO maplog.sensor(sensor_id, sensor_name, sensor_type_id, phenomenon_id) VALUES (360200000, 'IO Property 66', 66, 1);
-INSERT INTO maplog.sensor(sensor_id, sensor_name, sensor_type_id, phenomenon_id) VALUES (360300000, 'IO Property 239', 239, 1);
-INSERT INTO maplog.sensor(sensor_id, sensor_name, sensor_type_id, phenomenon_id) VALUES (360400000, 'IO Property 67', 67, 1);
-INSERT INTO maplog.sensor(sensor_id, sensor_name, sensor_type_id, phenomenon_id) VALUES (360500000, 'IO Property 24', 24, 1);
-INSERT INTO maplog.sensor(sensor_id, sensor_name, sensor_type_id, phenomenon_id) VALUES (360700000, 'IO Property 78', 78, 1);
-
-
-

+ 0 - 849
sql/telemetry-model-v2.sql

@@ -1,849 +0,0 @@
---
--- PostgreSQL database dump
---
-
--- Dumped from database version 11.12
--- Dumped by pg_dump version 15.2
-
--- Started on 2023-05-05 01:10:04
-
-SET statement_timeout = 0;
-SET lock_timeout = 0;
-SET idle_in_transaction_session_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = on;
-SELECT pg_catalog.set_config('search_path', '', false);
-SET check_function_bodies = false;
-SET xmloption = content;
-SET client_min_messages = warning;
-SET row_security = off;
-
-
-CREATE ROLE senslog NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT;
-CREATE ROLE maplog_app NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN PASSWORD 'MAPlog';
-GRANT senslog TO maplog_app;
-
---
--- TOC entry 3861 (class 1262 OID 54507)
--- Name: maplog; Type: DATABASE; Schema: -; Owner: postgres
---
-
-
-
-CREATE DATABASE maplog WITH TEMPLATE = template0 ENCODING = 'UTF8' LOCALE_PROVIDER = libc LOCALE = 'en_US.UTF-8';
-
-
-ALTER DATABASE maplog OWNER TO senslog;
-
-\connect maplog
-
-SET statement_timeout = 0;
-SET lock_timeout = 0;
-SET idle_in_transaction_session_timeout = 0;
-SET client_encoding = 'UTF8';
-SET standard_conforming_strings = on;
-SELECT pg_catalog.set_config('search_path', '', false);
-SET check_function_bodies = false;
-SET xmloption = content;
-SET client_min_messages = warning;
-SET row_security = off;
-
---
--- TOC entry 9 (class 2615 OID 55528)
--- Name: maplog; Type: SCHEMA; Schema: -; Owner: postgres
---
-
-CREATE SCHEMA maplog;
-
-
-ALTER SCHEMA maplog OWNER TO senslog;
-
---
--- TOC entry 7 (class 2615 OID 2200)
--- Name: public; Type: SCHEMA; Schema: -; Owner: postgres
---
-
--- *not* creating schema, since initdb creates it
-
-
-ALTER SCHEMA public OWNER TO senslog;
-
---
--- TOC entry 2 (class 3079 OID 54508)
--- Name: postgis; Type: EXTENSION; Schema: -; Owner: -
---
-
-CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA public;
-
-
---
--- TOC entry 3863 (class 0 OID 0)
--- Dependencies: 2
--- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner: 
---
-
-COMMENT ON EXTENSION postgis IS 'PostGIS geometry and geography spatial types and functions';
-
-
-SET default_tablespace = '';
-
---
--- TOC entry 216 (class 1259 OID 62701)
--- Name: campaign; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.campaign (
-    campaign_id integer NOT NULL,
-    description text NOT NULL,
-    from_time timestamp with time zone NOT NULL,
-    to_time timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE maplog.campaign OWNER TO senslog;
-
---
--- TOC entry 215 (class 1259 OID 62699)
--- Name: campaign_campaign_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.campaign_campaign_id_seq
-    AS integer
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.campaign_campaign_id_seq OWNER TO senslog;
-
---
--- TOC entry 3864 (class 0 OID 0)
--- Dependencies: 215
--- Name: campaign_campaign_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.campaign_campaign_id_seq OWNED BY maplog.campaign.campaign_id;
-
-
---
--- TOC entry 224 (class 1259 OID 62784)
--- Name: groups; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.groups (
-    group_id integer NOT NULL,
-    group_name text,
-    parent_group_id integer,
-    has_children boolean DEFAULT false
-);
-
-
-ALTER TABLE maplog.groups OWNER TO senslog;
-
---
--- TOC entry 223 (class 1259 OID 62782)
--- Name: group_group_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.group_group_id_seq
-    AS integer
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.group_group_id_seq OWNER TO senslog;
-
---
--- TOC entry 3865 (class 0 OID 0)
--- Dependencies: 223
--- Name: group_group_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.group_group_id_seq OWNED BY maplog.groups.group_id;
-
-
---
--- TOC entry 212 (class 1259 OID 55614)
--- Name: obs_telemetry; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.obs_telemetry (
-    obs_id bigint NOT NULL,
-    time_stamp timestamp with time zone NOT NULL,
-    unit_id bigint NOT NULL,
-    observed_values jsonb NOT NULL,
-    the_geom public.geometry(Point,4326),
-    time_received timestamp with time zone DEFAULT now() NOT NULL
-);
-
-
-ALTER TABLE maplog.obs_telemetry OWNER TO senslog;
-
---
--- TOC entry 211 (class 1259 OID 55612)
--- Name: obs_telemetry_obs_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.obs_telemetry_obs_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.obs_telemetry_obs_id_seq OWNER TO senslog;
-
---
--- TOC entry 3866 (class 0 OID 0)
--- Dependencies: 211
--- Name: obs_telemetry_obs_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.obs_telemetry_obs_id_seq OWNED BY maplog.obs_telemetry.obs_id;
-
-
---
--- TOC entry 209 (class 1259 OID 55579)
--- Name: phenomenon; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.phenomenon (
-    phenomenon_id integer NOT NULL,
-    phenomenon_name text NOT NULL,
-    uom character varying(30) NOT NULL,
-    uom_link text
-);
-
-
-ALTER TABLE maplog.phenomenon OWNER TO senslog;
-
---
--- TOC entry 208 (class 1259 OID 55577)
--- Name: phenomenon_phenomenon_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.phenomenon_phenomenon_id_seq
-    AS integer
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.phenomenon_phenomenon_id_seq OWNER TO senslog;
-
---
--- TOC entry 3867 (class 0 OID 0)
--- Dependencies: 208
--- Name: phenomenon_phenomenon_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.phenomenon_phenomenon_id_seq OWNED BY maplog.phenomenon.phenomenon_id;
-
-
---
--- TOC entry 207 (class 1259 OID 55566)
--- Name: sensor; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.sensor (
-    sensor_id bigint NOT NULL,
-    sensor_name character varying(100),
-    sensor_type text,
-    sensor_type_id integer,
-    min_range text,
-    max_range text,
-    phenomenon_id integer NOT NULL
-);
-
-
-ALTER TABLE maplog.sensor OWNER TO senslog;
-
---
--- TOC entry 206 (class 1259 OID 55564)
--- Name: sensor_sensor_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.sensor_sensor_id_seq
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.sensor_sensor_id_seq OWNER TO senslog;
-
---
--- TOC entry 3868 (class 0 OID 0)
--- Dependencies: 206
--- Name: sensor_sensor_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.sensor_sensor_id_seq OWNED BY maplog.sensor.sensor_id;
-
-
---
--- TOC entry 213 (class 1259 OID 55644)
--- Name: system_user; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.system_user (
-    user_id integer NOT NULL,
-    user_name text NOT NULL,
-    user_real_name text,
-    user_password text,
-    group_id integer,
-    rights_id integer DEFAULT 0
-);
-
-
-ALTER TABLE maplog.system_user OWNER TO senslog;
-
---
--- TOC entry 204 (class 1259 OID 55540)
--- Name: unit; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.unit (
-    unit_id bigint NOT NULL,
-    description text,
-    is_mobile boolean DEFAULT true NOT NULL,
-    unit_type_id character varying(2) DEFAULT 'X'::character varying NOT NULL
-);
-
-
-ALTER TABLE maplog.unit OWNER TO senslog;
-
---
--- TOC entry 218 (class 1259 OID 62712)
--- Name: unit_to_campaign; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.unit_to_campaign (
-    id integer NOT NULL,
-    camp_id integer NOT NULL,
-    unit_id bigint NOT NULL,
-    from_time timestamp with time zone NOT NULL,
-    to_time timestamp with time zone NOT NULL
-);
-
-
-ALTER TABLE maplog.unit_to_campaign OWNER TO senslog;
-
---
--- TOC entry 217 (class 1259 OID 62710)
--- Name: unit_to_campaign_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.unit_to_campaign_id_seq
-    AS integer
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.unit_to_campaign_id_seq OWNER TO senslog;
-
---
--- TOC entry 3869 (class 0 OID 0)
--- Dependencies: 217
--- Name: unit_to_campaign_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.unit_to_campaign_id_seq OWNED BY maplog.unit_to_campaign.id;
-
-
---
--- TOC entry 226 (class 1259 OID 62796)
--- Name: unit_to_group; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.unit_to_group (
-    id integer NOT NULL,
-    group_id integer,
-    unit_id bigint
-);
-
-
-ALTER TABLE maplog.unit_to_group OWNER TO senslog;
-
---
--- TOC entry 225 (class 1259 OID 62794)
--- Name: unit_to_group_id_seq; Type: SEQUENCE; Schema: maplog; Owner: postgres
---
-
-CREATE SEQUENCE maplog.unit_to_group_id_seq
-    AS integer
-    START WITH 1
-    INCREMENT BY 1
-    NO MINVALUE
-    NO MAXVALUE
-    CACHE 1;
-
-
-ALTER TABLE maplog.unit_to_group_id_seq OWNER TO senslog;
-
---
--- TOC entry 3870 (class 0 OID 0)
--- Dependencies: 225
--- Name: unit_to_group_id_seq; Type: SEQUENCE OWNED BY; Schema: maplog; Owner: postgres
---
-
-ALTER SEQUENCE maplog.unit_to_group_id_seq OWNED BY maplog.unit_to_group.id;
-
-
---
--- TOC entry 210 (class 1259 OID 55594)
--- Name: unit_to_sensor; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.unit_to_sensor (
-    sensor_id bigint NOT NULL,
-    unit_id bigint NOT NULL,
-    first_obs_ts timestamp with time zone,
-    last_obs_ts timestamp with time zone,
-    last_obs_value double precision DEFAULT 'NaN'::double precision
-);
-
-
-ALTER TABLE maplog.unit_to_sensor OWNER TO senslog;
-
---
--- TOC entry 205 (class 1259 OID 55548)
--- Name: unit_type; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.unit_type (
-    unit_type_id character varying(2) NOT NULL,
-    type_name character varying(20) NOT NULL,
-    description text
-);
-
-
-ALTER TABLE maplog.unit_type OWNER TO senslog;
-
---
--- TOC entry 214 (class 1259 OID 55654)
--- Name: user_to_campaign; Type: TABLE; Schema: maplog; Owner: postgres
---
-
-CREATE TABLE maplog.user_to_campaign (
-    user_id integer NOT NULL,
-    campaign_id integer NOT NULL
-);
-
-
-ALTER TABLE maplog.user_to_campaign OWNER TO senslog;
-
-
---
--- TOC entry 3638 (class 2604 OID 62704)
--- Name: campaign campaign_id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.campaign ALTER COLUMN campaign_id SET DEFAULT nextval('maplog.campaign_campaign_id_seq'::regclass);
-
-
---
--- TOC entry 3643 (class 2604 OID 62787)
--- Name: groups group_id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.groups ALTER COLUMN group_id SET DEFAULT nextval('maplog.group_group_id_seq'::regclass);
-
-
---
--- TOC entry 3635 (class 2604 OID 55617)
--- Name: obs_telemetry obs_id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.obs_telemetry ALTER COLUMN obs_id SET DEFAULT nextval('maplog.obs_telemetry_obs_id_seq'::regclass);
-
-
---
--- TOC entry 3633 (class 2604 OID 55582)
--- Name: phenomenon phenomenon_id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.phenomenon ALTER COLUMN phenomenon_id SET DEFAULT nextval('maplog.phenomenon_phenomenon_id_seq'::regclass);
-
-
---
--- TOC entry 3632 (class 2604 OID 55569)
--- Name: sensor sensor_id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.sensor ALTER COLUMN sensor_id SET DEFAULT nextval('maplog.sensor_sensor_id_seq'::regclass);
-
-
---
--- TOC entry 3639 (class 2604 OID 62715)
--- Name: unit_to_campaign id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_campaign ALTER COLUMN id SET DEFAULT nextval('maplog.unit_to_campaign_id_seq'::regclass);
-
-
---
--- TOC entry 3645 (class 2604 OID 62799)
--- Name: unit_to_group id; Type: DEFAULT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_group ALTER COLUMN id SET DEFAULT nextval('maplog.unit_to_group_id_seq'::regclass);
-
-
---
--- TOC entry 3677 (class 2606 OID 62709)
--- Name: campaign campaign_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.campaign
-    ADD CONSTRAINT campaign_pkey PRIMARY KEY (campaign_id);
-
-
---
--- TOC entry 3689 (class 2606 OID 62793)
--- Name: groups group_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.groups
-    ADD CONSTRAINT group_pkey PRIMARY KEY (group_id);
-
-
---
--- TOC entry 3667 (class 2606 OID 55623)
--- Name: obs_telemetry obs_telemetry_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.obs_telemetry
-    ADD CONSTRAINT obs_telemetry_pkey PRIMARY KEY (obs_id);
-
-
---
--- TOC entry 3660 (class 2606 OID 55587)
--- Name: phenomenon phenomenon_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.phenomenon
-    ADD CONSTRAINT phenomenon_pkey PRIMARY KEY (phenomenon_id);
-
-
---
--- TOC entry 3656 (class 2606 OID 55574)
--- Name: sensor sensor_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.sensor
-    ADD CONSTRAINT sensor_pkey PRIMARY KEY (sensor_id);
-
-
---
--- TOC entry 3658 (class 2606 OID 55576)
--- Name: sensor sensor_sensor_name_key; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.sensor
-    ADD CONSTRAINT sensor_sensor_name_key UNIQUE (sensor_name);
-
-
---
--- TOC entry 3670 (class 2606 OID 55653)
--- Name: system_user systemuser_pk; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.system_user
-    ADD CONSTRAINT systemuser_pk PRIMARY KEY (user_id);
-
-
---
--- TOC entry 3651 (class 2606 OID 55557)
--- Name: unit unit_pk; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit
-    ADD CONSTRAINT unit_pk PRIMARY KEY (unit_id);
-
-
---
--- TOC entry 3681 (class 2606 OID 62717)
--- Name: unit_to_campaign unit_to_campaign_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_campaign
-    ADD CONSTRAINT unit_to_campaign_pkey PRIMARY KEY (id);
-
-
---
--- TOC entry 3693 (class 2606 OID 62801)
--- Name: unit_to_group unit_to_group_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_group
-    ADD CONSTRAINT unit_to_group_pkey PRIMARY KEY (id);
-
-
---
--- TOC entry 3653 (class 2606 OID 55555)
--- Name: unit_type unittype_pk; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_type
-    ADD CONSTRAINT unittype_pk PRIMARY KEY (unit_type_id);
-
-
---
--- TOC entry 3675 (class 2606 OID 55658)
--- Name: user_to_campaign user_to_campaign_pkey; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.user_to_campaign
-    ADD CONSTRAINT user_to_campaign_pkey PRIMARY KEY (user_id, campaign_id);
-
-
---
--- TOC entry 3664 (class 2606 OID 55599)
--- Name: unit_to_sensor uts_pk; Type: CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_sensor
-    ADD CONSTRAINT uts_pk PRIMARY KEY (unit_id, sensor_id);
-
-
---
--- TOC entry 3665 (class 1259 OID 55629)
--- Name: fki_obss_unitid_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_obss_unitid_fk ON maplog.obs_telemetry USING btree (unit_id);
-
-
---
--- TOC entry 3654 (class 1259 OID 55593)
--- Name: fki_sens_phenom_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_sens_phenom_fk ON maplog.sensor USING btree (phenomenon_id);
-
-
---
--- TOC entry 3671 (class 1259 OID 62723)
--- Name: fki_u2c_campid; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_u2c_campid ON maplog.user_to_campaign USING btree (campaign_id);
-
-
---
--- TOC entry 3672 (class 1259 OID 55670)
--- Name: fki_u2c_campid_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_u2c_campid_fk ON maplog.user_to_campaign USING btree (campaign_id);
-
-
---
--- TOC entry 3673 (class 1259 OID 55664)
--- Name: fki_u2c_userid_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_u2c_userid_fk ON maplog.user_to_campaign USING btree (user_id);
-
-
---
--- TOC entry 3678 (class 1259 OID 62735)
--- Name: fki_un2c_campid; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_un2c_campid ON maplog.unit_to_campaign USING btree (camp_id);
-
-
---
--- TOC entry 3679 (class 1259 OID 62729)
--- Name: fki_un2c_unitid; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_un2c_unitid ON maplog.unit_to_campaign USING btree (unit_id);
-
-
---
--- TOC entry 3690 (class 1259 OID 62813)
--- Name: fki_unit2group_group_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_unit2group_group_fk ON maplog.unit_to_group USING btree (group_id);
-
-
---
--- TOC entry 3691 (class 1259 OID 62819)
--- Name: fki_unit2group_unit_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_unit2group_unit_fk ON maplog.unit_to_group USING btree (unit_id);
-
-
---
--- TOC entry 3649 (class 1259 OID 55563)
--- Name: fki_unit_unittype_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_unit_unittype_fk ON maplog.unit USING btree (unit_type_id);
-
-
---
--- TOC entry 3668 (class 1259 OID 62807)
--- Name: fki_user2group_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_user2group_fk ON maplog.system_user USING btree (group_id);
-
-
---
--- TOC entry 3661 (class 1259 OID 55611)
--- Name: fki_uts_sensorid_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_uts_sensorid_fk ON maplog.unit_to_sensor USING btree (sensor_id);
-
-
---
--- TOC entry 3662 (class 1259 OID 55605)
--- Name: fki_uts_unitid_fk; Type: INDEX; Schema: maplog; Owner: postgres
---
-
-CREATE INDEX fki_uts_unitid_fk ON maplog.unit_to_sensor USING btree (unit_id);
-
-
---
--- TOC entry 3700 (class 2606 OID 55624)
--- Name: obs_telemetry obss_unitid_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.obs_telemetry
-    ADD CONSTRAINT obss_unitid_fk FOREIGN KEY (unit_id) REFERENCES maplog.unit(unit_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3697 (class 2606 OID 55588)
--- Name: sensor sens_phenom_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.sensor
-    ADD CONSTRAINT sens_phenom_fk FOREIGN KEY (phenomenon_id) REFERENCES maplog.phenomenon(phenomenon_id);
-
-
---
--- TOC entry 3702 (class 2606 OID 62718)
--- Name: user_to_campaign u2c_campid; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.user_to_campaign
-    ADD CONSTRAINT u2c_campid FOREIGN KEY (campaign_id) REFERENCES maplog.campaign(campaign_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3703 (class 2606 OID 55659)
--- Name: user_to_campaign u2c_userid_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.user_to_campaign
-    ADD CONSTRAINT u2c_userid_fk FOREIGN KEY (user_id) REFERENCES maplog.system_user(user_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3704 (class 2606 OID 62730)
--- Name: unit_to_campaign un2c_campid; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_campaign
-    ADD CONSTRAINT un2c_campid FOREIGN KEY (camp_id) REFERENCES maplog.campaign(campaign_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3705 (class 2606 OID 62724)
--- Name: unit_to_campaign un2c_unitid; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_campaign
-    ADD CONSTRAINT un2c_unitid FOREIGN KEY (unit_id) REFERENCES maplog.unit(unit_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3706 (class 2606 OID 62808)
--- Name: unit_to_group unit2group_group_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_group
-    ADD CONSTRAINT unit2group_group_fk FOREIGN KEY (group_id) REFERENCES maplog.groups(group_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3707 (class 2606 OID 62814)
--- Name: unit_to_group unit2group_unit_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_group
-    ADD CONSTRAINT unit2group_unit_fk FOREIGN KEY (unit_id) REFERENCES maplog.unit(unit_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3696 (class 2606 OID 55558)
--- Name: unit unit_unittype_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit
-    ADD CONSTRAINT unit_unittype_fk FOREIGN KEY (unit_type_id) REFERENCES maplog.unit_type(unit_type_id);
-
-
---
--- TOC entry 3701 (class 2606 OID 62802)
--- Name: system_user user2group_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.system_user
-    ADD CONSTRAINT user2group_fk FOREIGN KEY (group_id) REFERENCES maplog.groups(group_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3698 (class 2606 OID 55606)
--- Name: unit_to_sensor uts_sensorid_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_sensor
-    ADD CONSTRAINT uts_sensorid_fk FOREIGN KEY (sensor_id) REFERENCES maplog.sensor(sensor_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3699 (class 2606 OID 55600)
--- Name: unit_to_sensor uts_unitid_fk; Type: FK CONSTRAINT; Schema: maplog; Owner: postgres
---
-
-ALTER TABLE ONLY maplog.unit_to_sensor
-    ADD CONSTRAINT uts_unitid_fk FOREIGN KEY (unit_id) REFERENCES maplog.unit(unit_id) ON UPDATE CASCADE ON DELETE CASCADE;
-
-
---
--- TOC entry 3862 (class 0 OID 0)
--- Dependencies: 7
--- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres
---
-
-REVOKE USAGE ON SCHEMA public FROM PUBLIC;
-GRANT ALL ON SCHEMA public TO PUBLIC;
-
-
--- Completed on 2023-05-05 01:10:04
-
---
--- PostgreSQL database dump complete
---
-

+ 2 - 1
src/main/java/cz/senslog/telemetry/app/Application.java

@@ -56,7 +56,8 @@ public final class Application {
         PropertyConfig config = PropertyConfig.getInstance();
         DeploymentOptions options = new DeploymentOptions().setConfig(JsonObject.of(
                 "server", config.server(),
-                "db", config.db()
+                "db", config.db(),
+                "auth", config.auth()
         ));
 
         Vertx.vertx().deployVerticle(VertxDeployer.deploy(

+ 30 - 2
src/main/java/cz/senslog/telemetry/app/PropertyConfig.java

@@ -11,19 +11,22 @@ public final class PropertyConfig {
     private final TCPServer tcpServerConfig;
     private final Database dbConfig;
 
+    private final Auth authConfig;
+
     public static PropertyConfig getInstance() {
         if (INSTANCE == null) {
             INSTANCE = new PropertyConfig(
-                    new HttpServer(), new TCPServer(), new Database()
+                    new HttpServer(), new TCPServer(), new Database(), new Auth()
             );
         }
         return INSTANCE;
     }
 
-    private PropertyConfig(HttpServer httpServer, TCPServer tcpServer, Database dbConfig) {
+    private PropertyConfig(HttpServer httpServer, TCPServer tcpServer, Database dbConfig, Auth authConfig) {
         this.httpServerConfig = httpServer;
         this.tcpServerConfig = tcpServer;
         this.dbConfig = dbConfig;
+        this.authConfig = authConfig;
     }
 
     private static class HttpServer {
@@ -75,6 +78,23 @@ public final class PropertyConfig {
         }
     }
 
+    private static class Auth {
+
+        public String getKeyStorePath() {
+            String user = System.getenv("AUTH_KEYSTORE_PATH");
+            return Objects.requireNonNull(user, "System environmental variable 'AUTH_KEYSTORE_PATH' is not set.");
+        }
+
+        public String getKeyStoreType() {
+            String user = System.getenv("AUTH_KEYSTORE_TYPE");
+            return Objects.requireNonNull(user, "System environmental variable 'AUTH_KEYSTORE_TYPE' is not set.");
+        }
+
+        public String getKeyStorePassword() {
+            String user = System.getenv("AUTH_KEYSTORE_PASSWORD");
+            return Objects.requireNonNull(user, "System environmental variable 'AUTH_KEYSTORE_PASSWORD' is not set.");
+        }
+    }
 
     public JsonObject server() {
         return JsonObject.of(
@@ -83,6 +103,14 @@ public final class PropertyConfig {
         );
     }
 
+    public JsonObject auth() {
+        return JsonObject.of(
+                "keystore.path", authConfig.getKeyStorePath(),
+                "keystore.type", authConfig.getKeyStoreType(),
+                "keystore.password", authConfig.getKeyStorePassword()
+        );
+    }
+
     public JsonObject db() {
         return JsonObject.of(
             "port", dbConfig.getPort(),

+ 101 - 55
src/main/java/cz/senslog/telemetry/server/HttpVertxServer.java

@@ -9,12 +9,15 @@ import cz.senslog.telemetry.utils.ResourcesUtils;
 import io.vertx.core.AbstractVerticle;
 import io.vertx.core.Promise;
 import io.vertx.core.http.HttpMethod;
+import io.vertx.core.json.JsonArray;
 import io.vertx.core.json.JsonObject;
+import io.vertx.ext.auth.JWTOptions;
+import io.vertx.ext.auth.KeyStoreOptions;
+import io.vertx.ext.auth.PubSecKeyOptions;
+import io.vertx.ext.auth.jwt.JWTAuth;
+import io.vertx.ext.auth.jwt.JWTAuthOptions;
 import io.vertx.ext.web.Router;
-import io.vertx.ext.web.handler.BodyHandler;
-import io.vertx.ext.web.handler.CorsHandler;
-import io.vertx.ext.web.handler.LoggerFormat;
-import io.vertx.ext.web.handler.LoggerHandler;
+import io.vertx.ext.web.handler.*;
 import io.vertx.ext.web.openapi.RouterBuilder;
 import io.vertx.pgclient.PgPool;
 import io.vertx.sqlclient.RowSet;
@@ -32,6 +35,14 @@ public final class HttpVertxServer extends AbstractVerticle {
     public void start(Promise<Void> startPromise) {
         Path openApiUrl = ResourcesUtils.getPath("openAPISpec.yaml");
         logger.info("Loading the OpenAPI spec from '{}'", openApiUrl);
+
+        PgPool pgPool = ConnectionPool.createWithVertx(vertx, config());
+        pgPool.query("SELECT version()").execute().map(RowSet::iterator)
+                .map(it -> it.hasNext() ? it.next().getString(0) : null)
+                .onSuccess(version -> logger.info("Successful database connection to {}.", version))
+                .onFailure(startPromise::fail);
+        SensLogRepository repo = MapLogRepository.create(pgPool);
+
         RouterBuilder.create(vertx, requireNonNull(openApiUrl, "Open API Specification was not found as a resource.").toString())
                 .onSuccess(openAPIRouterBuilder -> {
                     logger.info("The OpenAPI specification was loaded successfully.");
@@ -49,66 +60,101 @@ public final class HttpVertxServer extends AbstractVerticle {
                             .allowedHeader("Accept")
                     );
 
-                    // The order matters, so adding the body handler should happen after any PLATFORM or SECURITY_POLICY handler(s).
-                    openAPIRouterBuilder.rootHandler(BodyHandler.create());
-
-//                    openAPIRouterBuilder.securityHandler("ApiKeyAuth")
-//                            .bind(config -> APIKeyHandler.create(authProvider).header(config.getString("name")));
+                    final String securitySchemaKey = "hubJwtAuth";
 
-                    PgPool pgPool = ConnectionPool.createWithVertx(vertx, config());
+                    JsonObject authConfig = config().getJsonObject("auth");
+                    JWTAuthHandler authHandler = JWTAuthHandler.create(JWTAuth.create(vertx, new JWTAuthOptions()
+                            .setKeyStore(new KeyStoreOptions()
+                                    .setPath(authConfig.getString("keystore.path"))
+                                    .setType(authConfig.getString("keystore.type"))
+                                    .setPassword(authConfig.getString("keystore.password")))));
 
-                    pgPool.query("SELECT version()").execute().map(RowSet::iterator)
-                            .map(it -> it.hasNext() ? it.next().getString(0) : null)
-                            .onSuccess(version -> logger.info("Successful database connection to {}.", version))
-                            .onFailure(startPromise::fail);
+                    // The order matters, so adding the body handler should happen after any PLATFORM or SECURITY_POLICY handler(s).
+                    openAPIRouterBuilder.rootHandler(BodyHandler.create());
 
-                    SensLogRepository repo = MapLogRepository.create(pgPool);
                     OpenAPIHandler apiHandler = OpenAPIHandler.create(repo);
 
                     openAPIRouterBuilder.operation("infoGET").handler(apiHandler::info);
 
-                    openAPIRouterBuilder.operation("campaignsGET").handler(apiHandler::campaignsGET);
-                    openAPIRouterBuilder.operation("campaignIdGET").handler(apiHandler::campaignIdGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitsGET").handler(apiHandler::campaignIdUnitsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitsObservationsGET").handler(apiHandler::campaignIdUnitsObservationsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitsObservationsPOST").handler(apiHandler::campaignIdUnitsObservationsPOST);
-                    openAPIRouterBuilder.operation("campaignIdUnitsObservationsLocationsGET").handler(apiHandler::campaignIdUnitsObservationsLocationsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdObservationsGET").handler(apiHandler::campaignIdUnitIdObservationsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdLocationsGET").handler(apiHandler::campaignIdUnitIdLocationsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdGET").handler(apiHandler::campaignIdUnitIdGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdSensorsGET").handler(apiHandler::campaignIdUnitIdSensorsGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdSensorIdGET").handler(apiHandler::campaignIdUnitIdSensorIdGET);
-                    openAPIRouterBuilder.operation("campaignIdUnitIdSensorIdObservationsGET").handler(apiHandler::campaignIdUnitIdSensorIdObservationsGET);
-
-                    openAPIRouterBuilder.operation("unitsGET").handler(apiHandler::unitsGET);
-                    openAPIRouterBuilder.operation("unitIdGET").handler(apiHandler::unitIdGET);
-                    openAPIRouterBuilder.operation("unitIdSensorsGET").handler(apiHandler::unitIdSensorsGET);
-                    openAPIRouterBuilder.operation("unitIdCampaignsGET").handler(apiHandler::unitIdCampaignsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignsGET").handler(apiHandler::campaignsGET);
+
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdGET").handler(apiHandler::campaignIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitsGET").handler(apiHandler::campaignIdUnitsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitsObservationsGET").handler(apiHandler::campaignIdUnitsObservationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitsObservationsPOST").handler(apiHandler::campaignIdUnitsObservationsPOST);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitsObservationsLocationsGET").handler(apiHandler::campaignIdUnitsObservationsLocationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdObservationsGET").handler(apiHandler::campaignIdUnitIdObservationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdLocationsGET").handler(apiHandler::campaignIdUnitIdLocationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdGET").handler(apiHandler::campaignIdUnitIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdSensorsGET").handler(apiHandler::campaignIdUnitIdSensorsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdSensorIdGET").handler(apiHandler::campaignIdUnitIdSensorIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("campaignIdUnitIdSensorIdObservationsGET").handler(apiHandler::campaignIdUnitIdSensorIdObservationsGET);
+
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("unitsGET").handler(apiHandler::unitsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("unitIdGET").handler(apiHandler::unitIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("unitIdSensorsGET").handler(apiHandler::unitIdSensorsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("unitIdCampaignsGET").handler(apiHandler::unitIdCampaignsGET);
                     openAPIRouterBuilder.operation("unitIdDriversGET").handler(apiHandler::unitIdDriversGET);
 
-                    openAPIRouterBuilder.operation("sensorsGET").handler(apiHandler::sensorsGET);
-                    openAPIRouterBuilder.operation("sensorIdGET").handler(apiHandler::sensorIdGET);
-                    openAPIRouterBuilder.operation("sensorIdUnitsGET").handler(apiHandler::sensorIdUnitsGET);
-
-                    openAPIRouterBuilder.operation("phenomenonsGET").handler(apiHandler::phenomenonsGET);
-                    openAPIRouterBuilder.operation("phenomenonIdGET").handler(apiHandler::phenomenonIdGET);
-                    openAPIRouterBuilder.operation("phenomenonIdSensorsGET").handler(apiHandler::phenomenonIdSensorsGET);
-
-                    openAPIRouterBuilder.operation("driversGET").handler(apiHandler::driversGET);
-                    openAPIRouterBuilder.operation("driverIdGET").handler(apiHandler::driverIdGET);
-                    openAPIRouterBuilder.operation("driverIdUnitsGET").handler(apiHandler::driverIdUnitsGET);
-                    openAPIRouterBuilder.operation("driverIdUnitIdGET").handler(apiHandler::driverIdUnitIdGET);
-                    openAPIRouterBuilder.operation("driverIdUnitIdActionsGET").handler(apiHandler::driverIdUnitIdActionsGET);
-                    openAPIRouterBuilder.operation("driverIdActionsGET").handler(apiHandler::driverIdActionsGET);
-                    openAPIRouterBuilder.operation("driverIdActionIdGET").handler(apiHandler::driverIdActionIdGET);
-                    openAPIRouterBuilder.operation("driverIdActionIdUnitsGET").handler(apiHandler::driverIdActionIdUnitsGET);
-                    openAPIRouterBuilder.operation("driverIdActionIdUnitIdGET").handler(apiHandler::driverIdActionIdUnitIdGET);
-                    openAPIRouterBuilder.operation("driverIdUnitIdActionIdGET").handler(apiHandler::driverIdUnitIdActionIdGET);
-                    openAPIRouterBuilder.operation("driverIdUnitIdActionIdEventsGET").handler(apiHandler::driverIdUnitIdActionIdEventsGET);
-
-                    openAPIRouterBuilder.operation("eventIdGET").handler(apiHandler::eventIdGET);
-                    openAPIRouterBuilder.operation("eventIdObservationsGET").handler(apiHandler::eventIdObservationsGET);
-                    openAPIRouterBuilder.operation("eventIdLocationsGET").handler(apiHandler::eventIdLocationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("sensorsGET").handler(apiHandler::sensorsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("sensorIdGET").handler(apiHandler::sensorIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("sensorIdUnitsGET").handler(apiHandler::sensorIdUnitsGET);
+
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("phenomenonsGET").handler(apiHandler::phenomenonsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("phenomenonIdGET").handler(apiHandler::phenomenonIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("phenomenonIdSensorsGET").handler(apiHandler::phenomenonIdSensorsGET);
+
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driversGET").handler(apiHandler::driversGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdGET").handler(apiHandler::driverIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdUnitsGET").handler(apiHandler::driverIdUnitsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdUnitIdGET").handler(apiHandler::driverIdUnitIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdUnitIdActionsGET").handler(apiHandler::driverIdUnitIdActionsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdActionsGET").handler(apiHandler::driverIdActionsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdActionIdGET").handler(apiHandler::driverIdActionIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdActionIdUnitsGET").handler(apiHandler::driverIdActionIdUnitsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdActionIdUnitIdGET").handler(apiHandler::driverIdActionIdUnitIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdUnitIdActionIdGET").handler(apiHandler::driverIdUnitIdActionIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("driverIdUnitIdActionIdEventsGET").handler(apiHandler::driverIdUnitIdActionIdEventsGET);
+
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("eventIdGET").handler(apiHandler::eventIdGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("eventIdObservationsGET").handler(apiHandler::eventIdObservationsGET);
+                    openAPIRouterBuilder.securityHandler(securitySchemaKey, authHandler)
+                            .operation("eventIdLocationsGET").handler(apiHandler::eventIdLocationsGET);
 
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 

+ 6 - 6
src/main/java/cz/senslog/telemetry/server/LoopInvoker.java

@@ -39,20 +39,20 @@ public class LoopInvoker<I, O, C> {
         if (functions.isEmpty()) { return null; }
         Tuple<AtomicInteger, BiFunction<I, C, Future<O>>> f = functions.get(currentStart.get());
         Future<O> res = Future.failedFuture(new ServiceConfigurationError("No method found."));
-        if (f.getItem1().get() < 0) {
+        if (f.item1().get() < 0) {
             try {
-                res = functions.get(currentStart.get()).getItem2().apply(param, telemetryContext);
+                res = functions.get(currentStart.get()).item2().apply(param, telemetryContext);
             } catch (Exception e) {
                 res = Future.failedFuture(e);
             }
             currentStart.set(currentStart.incrementAndGet() % functions.size());
-        } else if (f.getItem1().get() > 0) {
+        } else if (f.item1().get() > 0) {
             try {
-                res = functions.get(currentStart.get()).getItem2().apply(param, telemetryContext);
+                res = functions.get(currentStart.get()).item2().apply(param, telemetryContext);
             } catch (Exception e) {
                 res = Future.failedFuture(e);
             }
-            if (f.getItem1().decrementAndGet() == 0) {
+            if (f.item1().decrementAndGet() == 0) {
                 functions.remove(currentStart.get());
             } else {
                 currentStart.set(currentStart.incrementAndGet() % functions.size());
@@ -71,7 +71,7 @@ public class LoopInvoker<I, O, C> {
 
         public LoopInvoker<I, O, C> init(C ctx) {
             return new LoopInvoker<>(0, ctx, functions.stream()
-                    .map(f -> Tuple.of(new AtomicInteger(f.getItem1()), f.getItem2())).collect(Collectors.toList())
+                    .map(f -> Tuple.of(new AtomicInteger(f.item1()), f.item2())).collect(Collectors.toList())
             );
         }
 

+ 79 - 6
src/main/resources/openAPISpec.yaml

@@ -28,6 +28,8 @@ paths:
     get:
       operationId: campaignsGET
       summary: Publish info about all campaigns
+      security:
+        - hubJwtAuth: [telemetry:read]
       parameters:
         - $ref: '#/components/parameters/zoneParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -51,6 +53,8 @@ paths:
     get:
       operationId: campaignIdGET
       summary: Publish info about a campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/zoneParam'
@@ -73,6 +77,8 @@ paths:
     get:
       operationId: campaignIdUnitsGET
       summary: Publish info about the campaign's units
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/zoneParam'
@@ -97,6 +103,8 @@ paths:
     get:
       operationId: campaignIdUnitsObservationsGET
       summary: Publish info about all data of units merged together within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/fromParam'
@@ -125,6 +133,8 @@ paths:
                 $ref: '#/components/schemas/Error'
     post:
       operationId: campaignIdUnitsObservationsPOST
+      security:
+        - hubJwtAuth: [ telemetry:write ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
       requestBody:
@@ -156,6 +166,8 @@ paths:
     get:
       operationId: campaignIdUnitsObservationsLocationsGET
       summary: Publish info about all data of units merged together within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/limitPerUnitParam'
@@ -187,6 +199,8 @@ paths:
     get:
       operationId: campaignIdUnitIdGET
       summary: Publish info about the unit within its campaign's scope
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -210,6 +224,8 @@ paths:
     get:
       operationId: campaignIdUnitIdObservationsGET
       summary: Publish info about all data of the unit within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -242,6 +258,8 @@ paths:
     get:
       operationId: campaignIdUnitIdLocationsGET
       summary: Publish locations of the unit within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -274,6 +292,8 @@ paths:
     get:
       operationId: campaignIdUnitIdSensorsGET
       summary: Publish info about all sensors of the unit within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -298,6 +318,8 @@ paths:
     get:
       operationId: campaignIdUnitIdSensorIdGET
       summary: Publish info about all sensors associated with the unit and the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -321,6 +343,8 @@ paths:
     get:
       operationId: campaignIdUnitIdSensorIdObservationsGET
       summary: Publish info about all data of the unit within the campaign
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/campaignIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -354,6 +378,8 @@ paths:
     get:
       operationId: unitsGET
       summary: Publish info about all units
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/navigationLinksParam'
       responses:
@@ -376,6 +402,8 @@ paths:
     get:
       operationId: unitIdGET
       summary: Publish info about the unit
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/unitIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -397,6 +425,8 @@ paths:
     get:
       operationId: unitIdSensorsGET
       summary: Publish info about sensors assigned to the unit
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/unitIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -420,6 +450,8 @@ paths:
     get:
       operationId: unitIdCampaignsGET
       summary: Publish info about campaigns where the unit was/is assigned
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/unitIdParam'
         - $ref: '#/components/parameters/zoneParam'
@@ -444,6 +476,8 @@ paths:
     get:
       operationId: unitIdDriversGET
       summary: Publish basic info about drivers who performed actions upon the unit
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/unitIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -467,6 +501,8 @@ paths:
     get:
       operationId: sensorsGET
       summary: Publish info about all sensors
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/navigationLinksParam'
       responses:
@@ -489,6 +525,8 @@ paths:
     get:
       operationId: sensorIdGET
       summary: Publish info about the sensor
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/sensorIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -510,6 +548,8 @@ paths:
     get:
       operationId: sensorIdUnitsGET
       summary: Publish info about units to whom the sensor is assigned
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/sensorIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -534,6 +574,8 @@ paths:
     get:
       operationId: phenomenonsGET
       summary: Publish info about all phenomenons
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/navigationLinksParam'
       responses:
@@ -556,6 +598,8 @@ paths:
     get:
       operationId: phenomenonIdGET
       summary: Publish info about the phenomenon
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/phenomenonIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -577,6 +621,8 @@ paths:
     get:
       operationId: phenomenonIdSensorsGET
       summary: Publish info about sensors of the phenomenon
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/phenomenonIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -600,6 +646,8 @@ paths:
     get:
       operationId: driversGET
       summary: Publish basic info about all drivers
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/navigationLinksParam'
       responses:
@@ -622,6 +670,8 @@ paths:
     get:
       operationId: driverIdGET
       summary: Publish detailed info about the driver
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/navigationLinksParam'
@@ -643,6 +693,8 @@ paths:
     get:
       operationId: driverIdUnitsGET
       summary: Publish basic info about driver's units
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/fromParam'
@@ -668,6 +720,8 @@ paths:
     get:
       operationId: driverIdUnitIdGET
       summary: Publish detailed info about driver's unit
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -690,6 +744,8 @@ paths:
     get:
       operationId: driverIdUnitIdActionsGET
       summary: Publish basic info actions performed on the unit by the driver
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -714,6 +770,8 @@ paths:
     get:
       operationId: driverIdActionsGET
       summary: Publish basic info about driver's actions
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/fromParam'
@@ -739,6 +797,8 @@ paths:
     get:
       operationId: driverIdActionIdGET
       summary: Publish detailed info about the driver's action
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/actionIdParam'
@@ -761,6 +821,8 @@ paths:
     get:
       operationId: driverIdActionIdUnitsGET
       summary: Publish basic info about units on which the driver performed its action
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/actionIdParam'
@@ -785,6 +847,8 @@ paths:
     get:
       operationId: driverIdActionIdUnitIdGET
       summary: Publish detail info about the unit on which the driver performed the action
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/actionIdParam'
@@ -808,6 +872,8 @@ paths:
     get:
       operationId: driverIdUnitIdActionIdGET
       summary: Publish detailed info about the action performed on the unit by the driver
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -831,6 +897,8 @@ paths:
     get:
       operationId: driverIdUnitIdActionIdEventsGET
       summary: Publish basic info about events that where performed on the unit byt the driver with the specific action
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/driverIdParam'
         - $ref: '#/components/parameters/unitIdParam'
@@ -858,6 +926,8 @@ paths:
     get:
       operationId: eventIdGET
       summary: Publish basic info about events that where performed on the unit byt the driver with the specific action
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/eventIdParam'
         - $ref: '#/components/parameters/zoneParam'
@@ -880,6 +950,8 @@ paths:
     get:
       operationId: eventIdObservationsGET
       summary: Publish telemetry observations created by the driver while performing specific action on the unit at the time/event
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/eventIdParam'
         - $ref: '#/components/parameters/zoneParam'
@@ -909,6 +981,8 @@ paths:
     get:
       operationId: eventIdLocationsGET
       summary: Publish locations created by the driver while performing specific action on the unit at the time/event
+      security:
+        - hubJwtAuth: [ telemetry:read ]
       parameters:
         - $ref: '#/components/parameters/eventIdParam'
         - $ref: '#/components/parameters/fromParam'
@@ -937,12 +1011,11 @@ paths:
                 $ref: '#/components/schemas/Error'
 
 components:
-
-#  securitySchemes:
-#    ApiKeyAuth:
-#      type: apiKey
-#      in: header
-#      name: Authorization
+  securitySchemes:
+    hubJwtAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
 
   parameters:
     campaignIdParam:

+ 20 - 0
src/test/java/cz/senslog/telemetry/database/validation/UnitTelemetryValidationTest.java

@@ -0,0 +1,20 @@
+package cz.senslog.telemetry.database.validation;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class UnitTelemetryValidationTest {
+
+    @Test
+    void isTelemetryWithinCampaign() {
+    }
+
+    @Test
+    void telemetriesWithinCampaign() {
+    }
+
+    @Test
+    void telemetriesAccToSensors() {
+    }
+}

+ 1 - 0
testing/access_token.json

@@ -0,0 +1 @@
+{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ii0xbW13UG9vM25ZeEF1akt2LVRieCJ9.eyJpc3MiOiJodHRwczovL2Rldi0wdXF2eHJyemJseWlyeXIyLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJmQW4xNlgzbkFhWFVkTnZYVTZmSjhtaEdzOTY1MHpCOEBjbGllbnRzIiwiYXVkIjoiaHR0cDovLzEyNy4wLjAuMTo4MDgwIiwiaWF0IjoxNzA2NTM3NDEwLCJleHAiOjE3MDkxMjk0MTAsImF6cCI6ImZBbjE2WDNuQWFYVWROdlhVNmZKOG1oR3M5NjUwekI4Iiwic2NvcGUiOiJ0ZWxlbWV0cnk6cmVhZCIsImd0eSI6ImNsaWVudC1jcmVkZW50aWFscyIsInBlcm1pc3Npb25zIjpbInRlbGVtZXRyeTpyZWFkIl19.g-XGG0qUFyOj2lVdDlL58FgyASfneIc1RQHS6AtRyrl-CwdrFqge1ClSARd7tAuSFlMe_sFy3IJZVgrTXnlxiNoyCu_y85wM6tsQ_ZqgpnpM-q2fokb3k7Tsi4kKxe3maRoZXzOAWofCCYkWzpsl3IXiu4SL1kniyCWea9D3T5vXytnzzpjhplqFgbUH2q367pGV5_IgJ_GN7WokB6z8cJL9gWWCquCZdNXO85v3SGW-OLYd7dCJUYlVAsp69TNaZwZRiZ3K5J2U7sSqwWhvyBHYlHQVFUP1MyRYhFyoK0Z-2z2XEf1zHGLe8qmbJm7V6xHtnUhUvEX6Kakj-Fjpow","scope":"telemetry:read","expires_in":2592000,"token_type":"Bearer"}

+ 7 - 0
testing/api-test.http

@@ -0,0 +1,7 @@
+### without Scopes
+GET http://127.0.0.1:8080/campaigns
+Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ii0xbW13UG9vM25ZeEF1akt2LVRieCJ9.eyJpc3MiOiJodHRwczovL2Rldi0wdXF2eHJyemJseWlyeXIyLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJmQW4xNlgzbkFhWFVkTnZYVTZmSjhtaEdzOTY1MHpCOEBjbGllbnRzIiwiYXVkIjoiaHR0cDovLzEyNy4wLjAuMTo4MDgwIiwiaWF0IjoxNzA2NDc3NzEyLCJleHAiOjE3MDkwNjk3MTIsImF6cCI6ImZBbjE2WDNuQWFYVWROdlhVNmZKOG1oR3M5NjUwekI4IiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIiwicGVybWlzc2lvbnMiOltdfQ.ncyVBqYvRExD1v3PKGzmxGC8IbvHupWYzoMY5pY-iIGge-QFQx4ruzA5jVBmQgPWLcEff2pgXGAly5eGAqXUZFFq10OXR_7lYzl-RZu1xzn50CdIXv7MTNw9OdBYzut-rqc_2N_bq32sLoP5SW1_q0C0JMBfyHDL0D3ifkxwzP6exRSlOPddEK73B7DR1-igfq3vDq17qS8Tqsp_yg6AnMmUlJX0FwCghoQoCgxEXyLo_1YUFnmSrc95USYm1pRTf8aS8jPaFwo8B7mqHL2gUjlLC2FC_QaYF7DdfepfRiB1gTuN44hMHsiXydMvOg7NB-TQBPxQqE4oCrDYX0U9Ew
+
+### with Scopes
+GET http://127.0.0.1:8080/campaigns
+Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ii0xbW13UG9vM25ZeEF1akt2LVRieCJ9.eyJpc3MiOiJodHRwczovL2Rldi0wdXF2eHJyemJseWlyeXIyLnVzLmF1dGgwLmNvbS8iLCJzdWIiOiJmQW4xNlgzbkFhWFVkTnZYVTZmSjhtaEdzOTY1MHpCOEBjbGllbnRzIiwiYXVkIjoiaHR0cDovLzEyNy4wLjAuMTo4MDgwIiwiaWF0IjoxNzA2NTM1NDczLCJleHAiOjE3MDkxMjc0NzMsImF6cCI6ImZBbjE2WDNuQWFYVWROdlhVNmZKOG1oR3M5NjUwekI4Iiwic2NvcGUiOiJ0ZWxlbWV0cnk6cmVhZCIsImd0eSI6ImNsaWVudC1jcmVkZW50aWFscyIsInBlcm1pc3Npb25zIjpbInRlbGVtZXRyeTpyZWFkIl19.caqI9_P22jU4-UQNh6RGB16OGt9BNdiPnJzlxWio8lf_StjXvcxOffTB6Yzticp-WvcfJSz1yZxB9VbBC2UrURWVAfYcICjoxSk3-ES9vySZ4Po4kwGL5NsAYxAJ5gQ6VO-LVBxZwz6A76GdgRR-RBVxLtnB4OCU8OFC0LWz3FD9WLroqce1txcfwdNsFIhqIEp7ozLy1ex2yKqV_p7yewhKAKmmcnEsREbJsiDflO3MJs5ZuHgygeODQabqZsz4ygRo0512jSNqr7PDXzcSitbAbkqvT0qWD96kbDVOrUI8B0hIpR-TxHCgFjg8S8KVYd5qntoZQ3YGbHvYV6jESw

+ 18 - 0
testing/mock-data.sql

@@ -0,0 +1,18 @@
+INSERT INTO maplog.campaign(name, description, from_time, to_time) VALUES ('Test Campaign', 'Description of the Test Campaign', '2023-01-01 12:00:00.400922 +00:00', '2024-01-01 12:00:00.400922 +00:00');
+
+INSERT INTO maplog.unit_type(unit_type_id, name, description) VALUES ('X', 'Telemetry', 'Mobile Telemetry Unit');
+
+INSERT INTO maplog.unit(unit_id, imei, unit_type_id, description) VALUES (1000, '867648041484898', 'X',  'Testing Telemetry unit');
+
+INSERT INTO maplog.unit_to_campaign(campaign_id, unit_id, from_time, to_time) SELECT id, 1000, from_time, to_time FROM maplog.campaign;
+
+INSERT INTO maplog.phenomenon(id, name, uom) VALUES (1, 'DEFAULT', 'NONE');
+
+INSERT INTO maplog.sensor(sensor_id, name, type, phenomenon_id) VALUES (360200000, 'IO Property 66', 66, 1);
+INSERT INTO maplog.sensor(sensor_id, name, type, phenomenon_id) VALUES (360300000, 'IO Property 239', 239, 1);
+INSERT INTO maplog.sensor(sensor_id, name, type, phenomenon_id) VALUES (360400000, 'IO Property 67', 67, 1);
+INSERT INTO maplog.sensor(sensor_id, name, type, phenomenon_id) VALUES (360500000, 'IO Property 24', 24, 1);
+INSERT INTO maplog.sensor(sensor_id, name, type, phenomenon_id) VALUES (360700000, 'IO Property 78', 78, 1);
+
+
+