diff --git a/initdb/02_1_1_signalk_api_tables.sql b/initdb/02_1_1_signalk_api_tables.sql index 8c1e7e6..472e405 100644 --- a/initdb/02_1_1_signalk_api_tables.sql +++ b/initdb/02_1_1_signalk_api_tables.sql @@ -20,10 +20,10 @@ CREATE TABLE IF NOT EXISTS api.metadata( ship_type NUMERIC NULL, plugin_version TEXT NOT NULL, signalk_version TEXT NOT NULL, - time TIMESTAMP WITHOUT TIME ZONE NOT NULL, -- should be rename to last_update !? + time TIMESTAMPTZ NOT NULL, -- should be rename to last_update !? active BOOLEAN DEFAULT True, -- trigger monitor online/offline - created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(), - updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW() + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Description COMMENT ON TABLE @@ -42,7 +42,7 @@ CREATE INDEX metadata_name_idx ON api.metadata (name); CREATE TYPE status AS ENUM ('sailing', 'motoring', 'moored', 'anchored'); -- Table api.metrics CREATE TABLE IF NOT EXISTS api.metrics ( - time TIMESTAMP WITHOUT TIME ZONE NOT NULL, + time TIMESTAMPTZ NOT NULL, client_id TEXT NULL, vessel_id TEXT NOT NULL REFERENCES api.metadata(vessel_id) ON DELETE RESTRICT, latitude DOUBLE PRECISION NULL, @@ -111,8 +111,8 @@ CREATE TABLE IF NOT EXISTS api.logbook( track_geom geometry(LINESTRING,4326) NULL, track_geog geography(LINESTRING) NULL, track_geojson JSONB NULL, - _from_time TIMESTAMP WITHOUT TIME ZONE NOT NULL, - _to_time TIMESTAMP WITHOUT TIME ZONE NULL, + _from_time TIMESTAMPTZ NOT NULL, + _to_time TIMESTAMPTZ NULL, distance NUMERIC, -- meters? duration INTERVAL, -- duration in days and hours? avg_speed DOUBLE PRECISION NULL, @@ -151,8 +151,8 @@ CREATE TABLE IF NOT EXISTS api.stays( latitude DOUBLE PRECISION NULL, longitude DOUBLE PRECISION NULL, geog GEOGRAPHY(POINT) NULL, - arrived TIMESTAMP WITHOUT TIME ZONE NOT NULL, - departed TIMESTAMP WITHOUT TIME ZONE, + arrived TIMESTAMPTZ NOT NULL, + departed TIMESTAMPTZ, duration INTERVAL, -- duration in days and hours? stay_code INT DEFAULT 1, -- REFERENCES api.stays_at(stay_code), notes TEXT NULL diff --git a/initdb/02_1_2_signalk_api_functions.sql b/initdb/02_1_2_signalk_api_functions.sql index a0e2f05..f6f9e27 100644 --- a/initdb/02_1_2_signalk_api_functions.sql +++ b/initdb/02_1_2_signalk_api_functions.sql @@ -41,8 +41,8 @@ CREATE OR REPLACE FUNCTION api.timelapse_fn( WITH logbook as ( SELECT track_geom FROM api.logbook - WHERE _from_time >= start_log::TIMESTAMP WITHOUT TIME ZONE - AND _to_time <= end_date::TIMESTAMP WITHOUT TIME ZONE + interval '23 hours 59 minutes' + WHERE _from_time >= start_log::TIMESTAMPTZ + AND _to_time <= end_date::TIMESTAMPTZ + interval '23 hours 59 minutes' AND track_geom IS NOT NULL ORDER BY _from_time ASC ) @@ -554,6 +554,7 @@ COMMENT ON FUNCTION DROP FUNCTION IF EXISTS api.export_moorages_gpx_fn; CREATE FUNCTION api.export_moorages_gpx_fn() RETURNS pg_catalog.xml AS $export_moorages_gpx$ DECLARE + app_settings jsonb; BEGIN -- Gather url from app settings app_settings := get_app_url_fn(); @@ -605,13 +606,13 @@ CREATE OR REPLACE FUNCTION api.stats_logs_fn( IN end_date TEXT DEFAULT NULL, OUT stats JSON) RETURNS JSON AS $stats_logs$ DECLARE - _start_date TIMESTAMP WITHOUT TIME ZONE DEFAULT '1970-01-01'; - _end_date TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(); + _start_date TIMESTAMPTZ DEFAULT '1970-01-01'; + _end_date TIMESTAMPTZ DEFAULT NOW(); BEGIN IF start_date IS NOT NULL AND public.isdate(start_date::text) AND public.isdate(end_date::text) THEN RAISE WARNING '--> stats_fn, filter result stats by date [%]', start_date; - _start_date := start_date::TIMESTAMP WITHOUT TIME ZONE; - _end_date := end_date::TIMESTAMP WITHOUT TIME ZONE; + _start_date := start_date::TIMESTAMPTZ; + _end_date := end_date::TIMESTAMPTZ; END IF; RAISE NOTICE '--> stats_fn, _start_date [%], _end_date [%]', _start_date, _end_date; WITH @@ -620,8 +621,8 @@ CREATE OR REPLACE FUNCTION api.stats_logs_fn( logs_view AS ( SELECT * FROM api.logbook l - WHERE _from_time >= _start_date::TIMESTAMP WITHOUT TIME ZONE - AND _to_time <= _end_date::TIMESTAMP WITHOUT TIME ZONE + interval '23 hours 59 minutes' + WHERE _from_time >= _start_date::TIMESTAMPTZ + AND _to_time <= _end_date::TIMESTAMPTZ + interval '23 hours 59 minutes' ), first_date AS ( SELECT _from_time as first_date from logs_view ORDER BY first_date ASC LIMIT 1 @@ -673,21 +674,21 @@ CREATE OR REPLACE FUNCTION api.stats_stays_fn( IN end_date TEXT DEFAULT NULL, OUT stats JSON) RETURNS JSON AS $stats_stays$ DECLARE - _start_date TIMESTAMP WITHOUT TIME ZONE DEFAULT '1970-01-01'; - _end_date TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(); + _start_date TIMESTAMPTZ DEFAULT '1970-01-01'; + _end_date TIMESTAMPTZ DEFAULT NOW(); BEGIN IF start_date IS NOT NULL AND public.isdate(start_date::text) AND public.isdate(end_date::text) THEN RAISE NOTICE '--> stats_stays_fn, custom filter result stats by date [%]', start_date; - _start_date := start_date::TIMESTAMP WITHOUT TIME ZONE; - _end_date := end_date::TIMESTAMP WITHOUT TIME ZONE; + _start_date := start_date::TIMESTAMPTZ; + _end_date := end_date::TIMESTAMPTZ; END IF; RAISE NOTICE '--> stats_stays_fn, _start_date [%], _end_date [%]', _start_date, _end_date; WITH moorages_log AS ( SELECT s.id as stays_id, m.id as moorages_id, * FROM api.stays s, api.moorages m - WHERE arrived >= _start_date::TIMESTAMP WITHOUT TIME ZONE - AND departed <= _end_date::TIMESTAMP WITHOUT TIME ZONE + interval '23 hours 59 minutes' + WHERE arrived >= _start_date::TIMESTAMPTZ + AND departed <= _end_date::TIMESTAMPTZ + interval '23 hours 59 minutes' AND s.id = m.stay_id ), home_ports AS ( @@ -766,7 +767,7 @@ CREATE OR REPLACE FUNCTION api.delete_logbook_fn(IN _id integer) RETURNS BOOLEAN -- Update previous stays with the departed time from current stays -- and set the active state from current stays UPDATE api.stays - SET departed = current_stays_departed::timestamp without time zone, + SET departed = current_stays_departed::TIMESTAMPTZ, active = current_stays_active WHERE vessel_id = current_setting('vessel.id', false) AND id = previous_stays_id; diff --git a/initdb/02_3_1_signalk_public_tables.sql b/initdb/02_3_1_signalk_public_tables.sql index 00ff5dc..c34641c 100644 --- a/initdb/02_3_1_signalk_public_tables.sql +++ b/initdb/02_3_1_signalk_public_tables.sql @@ -90,7 +90,7 @@ INSERT INTO public.email_templates VALUES E'Congratulations!\nYou have just connect your account to Pushover.\n'), ('email_otp', 'Email verification', - E'Hello,\nPlease active your account using the following code: __OTP_CODE__.\nThe code is valid 15 minutes.\nSee more details at __APP_URL__/activate\nThe PostgSail Team', + E'Hello,\nPlease active your account using the following code: __OTP_CODE__.\nThe code is valid 15 minutes.\nThe PostgSail Team', 'Email verification', E'Congratulations!\nPlease validate your account. Check your email!'), ('email_valid', @@ -154,8 +154,8 @@ CREATE TABLE IF NOT EXISTS public.process_queue ( channel TEXT NOT NULL, payload TEXT NOT NULL, ref_id TEXT NOT NULL, - stored TIMESTAMP WITHOUT TIME ZONE NOT NULL, - processed TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL + stored TIMESTAMPTZ NOT NULL, + processed TIMESTAMPTZ DEFAULT NULL ); -- Description COMMENT ON TABLE diff --git a/initdb/02_3_2_signalk_public_functions.sql b/initdb/02_3_2_signalk_public_functions.sql index 3941440..2ec1760 100644 --- a/initdb/02_3_2_signalk_public_functions.sql +++ b/initdb/02_3_2_signalk_public_functions.sql @@ -27,8 +27,8 @@ CREATE OR REPLACE FUNCTION public.logbook_metrics_dwithin_fn( WHERE m.latitude IS NOT NULL AND m.longitude IS NOT NULL - AND m.time >= _start::TIMESTAMP WITHOUT TIME ZONE - AND m.time <= _end::TIMESTAMP WITHOUT TIME ZONE + AND m.time >= _start::TIMESTAMPTZ + AND m.time <= _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) AND ST_DWithin( Geography(ST_MakePoint(m.longitude, m.latitude)), @@ -60,8 +60,8 @@ CREATE OR REPLACE FUNCTION public.logbook_update_avg_fn( FROM api.metrics m WHERE m.latitude IS NOT NULL AND m.longitude IS NOT NULL - AND m.time >= _start::TIMESTAMP WITHOUT TIME ZONE - AND m.time <= _end::TIMESTAMP WITHOUT TIME ZONE + AND m.time >= _start::TIMESTAMPTZ + AND m.time <= _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false); RAISE NOTICE '-> logbook_update_avg_fn avg for logbook id=%, avg_speed:%, max_speed:%, max_wind_speed:%, count:%', _id, avg_speed, max_speed, max_wind_speed, count_metric; END; @@ -87,8 +87,8 @@ CREATE FUNCTION public.logbook_update_geom_distance_fn(IN _id integer, IN _start FROM api.metrics m WHERE m.latitude IS NOT NULL AND m.longitude IS NOT NULL - AND m.time >= _start::TIMESTAMP WITHOUT TIME ZONE - AND m.time <= _end::TIMESTAMP WITHOUT TIME ZONE + AND m.time >= _start::TIMESTAMPTZ + AND m.time <= _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ORDER BY m.time ASC ) @@ -151,8 +151,8 @@ CREATE FUNCTION public.logbook_update_geojson_fn(IN _id integer, IN _start text, FROM api.metrics m WHERE m.latitude IS NOT NULL AND m.longitude IS NOT NULL - AND time >= _start::TIMESTAMP WITHOUT TIME ZONE - AND time <= _end::TIMESTAMP WITHOUT TIME ZONE + AND time >= _start::TIMESTAMPTZ + AND time <= _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ORDER BY m.time ASC ) @@ -231,8 +231,8 @@ AS $logbook_update_gpx$ FROM api.metrics m WHERE m.latitude IS NOT NULL AND m.longitude IS NOT NULL - AND m.time >= log_rec._from_time::TIMESTAMP WITHOUT TIME ZONE - AND m.time <= log_rec._to_time::TIMESTAMP WITHOUT TIME ZONE + AND m.time >= log_rec._from_time::TIMESTAMPTZ + AND m.time <= log_rec._to_time::TIMESTAMPTZ AND vessel_id = log_rec.vessel_id GROUP BY m.time ORDER BY m.time ASC; @@ -256,7 +256,7 @@ AS $logbook_get_extra_json$ FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE search - AND time = _start::timestamp without time zone + AND time = _start::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) LOOP -- Engine Hours in seconds @@ -268,7 +268,7 @@ AS $logbook_get_extra_json$ FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE metric_rec.key - AND time = _end::timestamp without time zone + AND time = _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ), metric AS ( @@ -304,7 +304,7 @@ CREATE FUNCTION logbook_update_extra_json_fn(IN _id integer, IN _start text, IN FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE 'navigation.log' - AND time = _start::timestamp without time zone + AND time = _start::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ), end_trip as ( @@ -313,7 +313,7 @@ CREATE FUNCTION logbook_update_extra_json_fn(IN _id integer, IN _start text, IN FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE 'navigation.log' - AND time = _end::timestamp without time zone + AND time = _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ), nm as ( @@ -330,7 +330,7 @@ CREATE FUNCTION logbook_update_extra_json_fn(IN _id integer, IN _start text, IN FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE 'propulsion.%.runTime' - AND time = _start::timestamp without time zone + AND time = _start::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) LOOP -- Engine Hours in seconds @@ -342,7 +342,7 @@ CREATE FUNCTION logbook_update_extra_json_fn(IN _id integer, IN _start text, IN FROM api.metrics m, jsonb_each_text(m.metrics) WHERE key ILIKE metric_rec.key - AND time = _end::timestamp without time zone + AND time = _end::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false) ), runtime AS ( @@ -425,11 +425,11 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void -- Avoid/ignore/delete logbook stationary movement or time sync issue -- Check time start vs end - SELECT logbook_rec._to_time::timestamp without time zone < logbook_rec._from_time::timestamp without time zone INTO _invalid_time; + SELECT logbook_rec._to_time::TIMESTAMPTZ < logbook_rec._from_time::TIMESTAMPTZ INTO _invalid_time; -- Is distance is less than 0.010 SELECT geo_rec._track_distance < 0.010 INTO _invalid_distance; -- Is duration is less than 100sec - SELECT (logbook_rec._to_time::timestamp without time zone - logbook_rec._from_time::timestamp without time zone) < (100::text||' secs')::interval INTO _invalid_interval; + SELECT (logbook_rec._to_time::TIMESTAMPTZ - logbook_rec._from_time::TIMESTAMPTZ) < (100::text||' secs')::interval INTO _invalid_interval; -- if stationary fix data metrics,logbook,stays,moorage IF _invalid_time IS True OR _invalid_distance IS True OR _invalid_interval IS True OR count_metric = avg_rec.count_metric THEN @@ -438,8 +438,8 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void -- Update metrics status to moored UPDATE api.metrics SET status = 'moored' - WHERE time >= logbook_rec._from_time::TIMESTAMP WITHOUT TIME ZONE - AND time <= logbook_rec._to_time::TIMESTAMP WITHOUT TIME ZONE + WHERE time >= logbook_rec._from_time::TIMESTAMPTZ + AND time <= logbook_rec._to_time::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false); -- Update logbook UPDATE api.logbook @@ -464,7 +464,7 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void -- Update previous stays with the departed time from current stays -- and set the active state from current stays UPDATE api.stays - SET departed = current_stays_departed::timestamp without time zone, + SET departed = current_stays_departed::TIMESTAMPTZ, active = current_stays_active WHERE vessel_id = current_setting('vessel.id', false) AND id = previous_stays_id; @@ -498,7 +498,7 @@ CREATE OR REPLACE FUNCTION process_logbook_queue_fn(IN _id integer) RETURNS void RAISE NOTICE 'Updating valid logbook entry [%] [%] [%]', logbook_rec.id, logbook_rec._from_time, logbook_rec._to_time; UPDATE api.logbook SET - duration = (logbook_rec._to_time::timestamp without time zone - logbook_rec._from_time::timestamp without time zone), + duration = (logbook_rec._to_time::TIMESTAMPTZ - logbook_rec._from_time::TIMESTAMPTZ), avg_speed = avg_rec.avg_speed, max_speed = avg_rec.max_speed, max_wind_speed = avg_rec.max_wind_speed, @@ -576,7 +576,7 @@ CREATE OR REPLACE FUNCTION process_stay_queue_fn(IN _id integer) RETURNS void AS UPDATE api.stays SET name = concat( - ROUND( EXTRACT(epoch from (stay_rec.departed::timestamp without time zone - stay_rec.arrived::timestamp without time zone)::INTERVAL / 86400) ), + ROUND( EXTRACT(epoch from (stay_rec.departed::TIMESTAMPTZ - stay_rec.arrived::TIMESTAMPTZ)::INTERVAL / 86400) ), ' days stay at ', moorage.moorage_name, ' in ', @@ -585,7 +585,7 @@ CREATE OR REPLACE FUNCTION process_stay_queue_fn(IN _id integer) RETURNS void AS TO_CHAR(stay_rec.departed, 'YYYY') ), moorage_id = moorage.moorage_id, - duration = (stay_rec.departed::timestamp without time zone - stay_rec.arrived::timestamp without time zone)::INTERVAL, + duration = (stay_rec.departed::TIMESTAMPTZ - stay_rec.arrived::TIMESTAMPTZ)::INTERVAL, stay_code = moorage.moorage_type, geog = Geography(ST_MakePoint(stay_rec.longitude, stay_rec.latitude)) WHERE id = stay_rec.id; @@ -677,7 +677,7 @@ CREATE OR REPLACE FUNCTION process_moorage_queue_fn(IN _id integer) RETURNS void reference_count = moorage_rec.reference_count + 1, stay_duration = moorage_rec.stay_duration + - (stay_rec.departed::timestamp without time zone - stay_rec.arrived::timestamp without time zone) + (stay_rec.departed::TIMESTAMPTZ - stay_rec.arrived::TIMESTAMPTZ) WHERE id = moorage_rec.id; ELSE RAISE NOTICE 'Insert new moorage entry from stay %', stay_rec; @@ -696,7 +696,7 @@ CREATE OR REPLACE FUNCTION process_moorage_queue_fn(IN _id integer) RETURNS void coalesce(moorage_rec.country, null), stay_rec.id, stay_rec.stay_code, - (stay_rec.departed::timestamp without time zone - stay_rec.arrived::timestamp without time zone), + (stay_rec.departed::TIMESTAMPTZ - stay_rec.arrived::TIMESTAMPTZ), 1, -- default reference_count stay_rec.latitude, stay_rec.longitude, @@ -1381,11 +1381,11 @@ CREATE OR REPLACE FUNCTION public.process_logbook_valid_fn(IN _id integer) RETUR -- Avoid/ignore/delete logbook stationary movement or time sync issue -- Check time start vs end - SELECT logbook_rec._to_time::timestamp without time zone < logbook_rec._from_time::timestamp without time zone INTO _invalid_time; + SELECT logbook_rec._to_time::TIMESTAMPTZ < logbook_rec._from_time::TIMESTAMPTZ INTO _invalid_time; -- Is distance is less than 0.010 SELECT geo_rec._track_distance < 0.010 INTO _invalid_distance; -- Is duration is less than 100sec - SELECT (logbook_rec._to_time::timestamp without time zone - logbook_rec._from_time::timestamp without time zone) < (100::text||' secs')::interval INTO _invalid_interval; + SELECT (logbook_rec._to_time::TIMESTAMPTZ - logbook_rec._from_time::TIMESTAMPTZ) < (100::text||' secs')::interval INTO _invalid_interval; -- if stationary fix data metrics,logbook,stays,moorage IF _invalid_time IS True OR _invalid_distance IS True OR _invalid_interval IS True OR count_metric = avg_rec.count_metric THEN @@ -1394,8 +1394,8 @@ CREATE OR REPLACE FUNCTION public.process_logbook_valid_fn(IN _id integer) RETUR -- Update metrics status to moored UPDATE api.metrics SET status = 'moored' - WHERE time >= logbook_rec._from_time::TIMESTAMP WITHOUT TIME ZONE - AND time <= logbook_rec._to_time::TIMESTAMP WITHOUT TIME ZONE + WHERE time >= logbook_rec._from_time::TIMESTAMPTZ + AND time <= logbook_rec._to_time::TIMESTAMPTZ AND vessel_id = current_setting('vessel.id', false); -- Update logbook UPDATE api.logbook @@ -1421,7 +1421,7 @@ CREATE OR REPLACE FUNCTION public.process_logbook_valid_fn(IN _id integer) RETUR -- Update previous stays with the departed time from current stays -- and set the active state from current stays UPDATE api.stays - SET departed = current_stays_departed::timestamp without time zone, + SET departed = current_stays_departed::TIMESTAMPTZ, active = current_stays_active WHERE vessel_id = current_setting('vessel.id', false) AND id = previous_stays_id; diff --git a/initdb/02_3_3_signalk_public_functions_helpers.sql b/initdb/02_3_3_signalk_public_functions_helpers.sql index e66f61e..8e8623c 100644 --- a/initdb/02_3_3_signalk_public_functions_helpers.sql +++ b/initdb/02_3_3_signalk_public_functions_helpers.sql @@ -79,9 +79,9 @@ COMMENT ON FUNCTION CREATE OR REPLACE FUNCTION public.istimestamptz(text) RETURNS BOOLEAN AS $isdate$ -DECLARE x TIMESTAMP WITHOUT TIME ZONE; +DECLARE x TIMESTAMPTZ; BEGIN - x = $1::TIMESTAMP WITHOUT TIME ZONE; + x = $1::TIMESTAMPTZ; RETURN TRUE; EXCEPTION WHEN others THEN RETURN FALSE; @@ -92,7 +92,7 @@ LANGUAGE plpgsql IMMUTABLE; -- Description COMMENT ON FUNCTION public.istimestamptz - IS 'Check typeof value is TIMESTAMP WITHOUT TIME ZONE'; + IS 'Check typeof value is TIMESTAMPTZ'; --------------------------------------------------------------------------- -- JSON helpers diff --git a/initdb/02_4_signalk_auth.sql b/initdb/02_4_signalk_auth.sql index 4c98b53..a1a6303 100644 --- a/initdb/02_4_signalk_auth.sql +++ b/initdb/02_4_signalk_auth.sql @@ -28,9 +28,9 @@ CREATE TABLE IF NOT EXISTS auth.accounts ( pass TEXT NOT NULL CHECK (length(pass) < 512), role name NOT NULL CHECK (length(role) < 512), preferences JSONB NULL DEFAULT '{"email_notifications":true}', - created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(), - updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(), - connected_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + connected_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT valid_email CHECK (length(email) > 5), -- Enforce at least 5 char, eg: a@b.io CONSTRAINT valid_first CHECK (length(first) > 1), CONSTRAINT valid_last CHECK (length(last) > 1), @@ -64,8 +64,8 @@ CREATE TABLE IF NOT EXISTS auth.vessels ( name TEXT NOT NULL CHECK (length(name) >= 3 AND length(name) < 512), -- pass text not null check (length(pass) < 512), -- unused role name not null check (length(role) < 512), - created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW(), - updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT NOW() + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -- CONSTRAINT valid_length_mmsi CHECK (length(mmsi) < 10 OR length(mmsi) = 0) CONSTRAINT valid_range_mmsi CHECK (mmsi > 100000000 AND mmsi < 800000000) ); diff --git a/initdb/02_5_signalk_api_deps.sql b/initdb/02_5_signalk_api_deps.sql index 8009190..5fb84f8 100644 --- a/initdb/02_5_signalk_api_deps.sql +++ b/initdb/02_5_signalk_api_deps.sql @@ -48,8 +48,8 @@ CREATE OR REPLACE VIEW api.vessels_view WITH (security_invoker=true,security_bar v.mmsi as mmsi, v.created_at::timestamp(0) as created_at, m.last_contact as last_contact, - ((NOW() AT TIME ZONE 'UTC' - m.last_contact::timestamp without time zone) > INTERVAL '70 MINUTES') as offline, - (NOW() AT TIME ZONE 'UTC' - m.last_contact::timestamp without time zone) as duration + ((NOW() AT TIME ZONE 'UTC' - m.last_contact::TIMESTAMPTZ) > INTERVAL '70 MINUTES') as offline, + (NOW() AT TIME ZONE 'UTC' - m.last_contact::TIMESTAMPTZ) as duration FROM auth.vessels v, metadata m WHERE v.owner_email = current_setting('user.email'); -- Description diff --git a/initdb/02_5_signalk_auth_otp.sql b/initdb/02_5_signalk_auth_otp.sql index 0826bd5..504017c 100644 --- a/initdb/02_5_signalk_auth_otp.sql +++ b/initdb/02_5_signalk_auth_otp.sql @@ -12,8 +12,8 @@ DROP TABLE IF EXISTS auth.otp; CREATE TABLE IF NOT EXISTS auth.otp ( -- update email type to CITEXT, https://www.postgresql.org/docs/current/citext.html user_email CITEXT NOT NULL PRIMARY KEY REFERENCES auth.accounts(email) ON DELETE RESTRICT, - otp_pass VARCHAR(10) NOT NULL, - otp_timestamp TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(), + otp_pass TEXT NOT NULL, + otp_timestamp TIMESTAMPTZ DEFAULT NOW(), otp_tries SMALLINT NOT NULL DEFAULT '0' ); -- Description