Update api tables, add api.metrics primary key. Update metrics_trigger_fn to enforce a vessel_id.

This commit is contained in:
xbgmsharp
2023-07-18 18:29:31 +02:00
parent 577da72451
commit 94960ad391

View File

@@ -33,6 +33,7 @@ COMMENT ON COLUMN api.metadata.active IS 'trigger monitor online/offline';
-- Index -- Index
CREATE INDEX metadata_vessel_id_idx ON api.metadata (vessel_id); CREATE INDEX metadata_vessel_id_idx ON api.metadata (vessel_id);
--CREATE INDEX metadata_mmsi_idx ON api.metadata (mmsi); --CREATE INDEX metadata_mmsi_idx ON api.metadata (mmsi);
-- is unused index ?
CREATE INDEX metadata_name_idx ON api.metadata (name); CREATE INDEX metadata_name_idx ON api.metadata (name);
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
@@ -55,7 +56,8 @@ CREATE TABLE IF NOT EXISTS api.metrics (
metrics jsonb NULL, metrics jsonb NULL,
--CONSTRAINT valid_client_id CHECK (length(client_id) > 10), --CONSTRAINT valid_client_id CHECK (length(client_id) > 10),
CONSTRAINT valid_latitude CHECK (latitude >= -90 and latitude <= 90), CONSTRAINT valid_latitude CHECK (latitude >= -90 and latitude <= 90),
CONSTRAINT valid_longitude CHECK (longitude >= -180 and longitude <= 180) CONSTRAINT valid_longitude CHECK (longitude >= -180 and longitude <= 180),
PRIMARY KEY (time, vessel_id)
); );
-- Description -- Description
COMMENT ON TABLE COMMENT ON TABLE
@@ -81,7 +83,7 @@ SELECT create_hypertable('api.metrics', 'time', chunk_time_interval => INTERVAL
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
-- Logbook -- Logbook
-- todo add cosumption fuel? -- todo add consumption fuel?
-- todo add engine hour? -- todo add engine hour?
-- todo add geom object http://epsg.io/4326 EPSG:4326 Unit: degres -- todo add geom object http://epsg.io/4326 EPSG:4326 Unit: degres
-- todo add geog object http://epsg.io/3857 EPSG:3857 Unit: meters -- todo add geog object http://epsg.io/3857 EPSG:3857 Unit: meters
@@ -91,6 +93,8 @@ SELECT create_hypertable('api.metrics', 'time', chunk_time_interval => INTERVAL
-- https://www.postgresql.org/docs/current/ddl-partitioning.html -- https://www.postgresql.org/docs/current/ddl-partitioning.html
-- Issue: -- Issue:
-- https://www.reddit.com/r/PostgreSQL/comments/di5mbr/postgresql_12_foreign_keys_and_partitioned_tables/f3tsoop/ -- https://www.reddit.com/r/PostgreSQL/comments/di5mbr/postgresql_12_foreign_keys_and_partitioned_tables/f3tsoop/
-- Check unused index
CREATE TABLE IF NOT EXISTS api.logbook( CREATE TABLE IF NOT EXISTS api.logbook(
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
--client_id VARCHAR(255) NOT NULL REFERENCES api.metadata(client_id) ON DELETE RESTRICT, --client_id VARCHAR(255) NOT NULL REFERENCES api.metadata(client_id) ON DELETE RESTRICT,
@@ -256,7 +260,7 @@ CREATE FUNCTION metadata_upsert_trigger_fn() RETURNS trigger AS $metadata_upsert
ELSE ELSE
IF NEW.vessel_id IS NULL THEN IF NEW.vessel_id IS NULL THEN
-- set vessel_id from jwt if not present in INSERT query -- set vessel_id from jwt if not present in INSERT query
NEW.vessel_id = current_setting('vessel.id'); NEW.vessel_id := current_setting('vessel.id');
END IF; END IF;
-- Insert new vessel metadata and -- Insert new vessel metadata and
RETURN NEW; -- Insert new vessel metadata RETURN NEW; -- Insert new vessel metadata
@@ -329,10 +333,13 @@ CREATE FUNCTION metrics_trigger_fn() RETURNS trigger AS $metrics$
valid_status BOOLEAN; valid_status BOOLEAN;
_vessel_id TEXT; _vessel_id TEXT;
BEGIN BEGIN
-- Set client_id to new value to allow RLS --RAISE NOTICE 'metrics_trigger_fn';
--PERFORM set_config('vessel.client_id', NEW.client_id, false); --RAISE WARNING 'metrics_trigger_fn [%] [%]', current_setting('vessel.id', true), NEW;
NEW.vessel_id = current_setting('vessel.id', true); -- Ensure vessel.id to new value to allow RLS
--RAISE NOTICE 'metrics_trigger_fn client_id [%]', NEW.client_id; IF NEW.vessel_id IS NULL THEN
-- set vessel_id from jwt if not present in INSERT query
NEW.vessel_id := current_setting('vessel.id');
END IF;
-- Boat metadata are check using api.metrics REFERENCES to api.metadata -- Boat metadata are check using api.metrics REFERENCES to api.metadata
-- Fetch the latest entry to compare status against the new status to be insert -- Fetch the latest entry to compare status against the new status to be insert
SELECT coalesce(m.status, 'moored'), m.time INTO previous_status, previous_time SELECT coalesce(m.status, 'moored'), m.time INTO previous_status, previous_time