mirror of
https://github.com/xbgmsharp/postgsail.git
synced 2025-09-17 11:17:46 +00:00
Compare commits
73 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b7efb9636f | ||
![]() |
14d19a5394 | ||
![]() |
66b61f9d65 | ||
![]() |
b50c8f5007 | ||
![]() |
a9e1990184 | ||
![]() |
59b52515e3 | ||
![]() |
f528456c08 | ||
![]() |
a76c25b19f | ||
![]() |
00d2247549 | ||
![]() |
b84ac31da1 | ||
![]() |
63cf5d24a5 | ||
![]() |
fe7c1dc1e5 | ||
![]() |
10a26942c7 | ||
![]() |
a5fb08fa42 | ||
![]() |
25c74fd75a | ||
![]() |
fa45782553 | ||
![]() |
e237391e8a | ||
![]() |
dcf4eaca9b | ||
![]() |
ade15f538d | ||
![]() |
f2cf604dab | ||
![]() |
ad2e95bfa8 | ||
![]() |
02130a9e4f | ||
![]() |
29fa3863eb | ||
![]() |
7cd06fced4 | ||
![]() |
564b85f58c | ||
![]() |
da317dce87 | ||
![]() |
08ee757fa5 | ||
![]() |
76ade18d6b | ||
![]() |
e6852a43f1 | ||
![]() |
13f8240838 | ||
![]() |
b7fe6a27b2 | ||
![]() |
29cc40f6de | ||
![]() |
861e61d378 | ||
![]() |
684f34644f | ||
![]() |
6ad9980cd2 | ||
![]() |
7f5974efe2 | ||
![]() |
f4b65d3156 | ||
![]() |
d8ef8b8958 | ||
![]() |
686ac7498b | ||
![]() |
d4c4347a4c | ||
![]() |
4aacae3913 | ||
![]() |
06fd834441 | ||
![]() |
86bd4b5843 | ||
![]() |
111d7d36db | ||
![]() |
b6fef6358a | ||
![]() |
4aecea7532 | ||
![]() |
c8908748f7 | ||
![]() |
0e812c0939 | ||
![]() |
395b7cfad7 | ||
![]() |
14e8c8363c | ||
![]() |
448124f01b | ||
![]() |
3b466e3d93 | ||
![]() |
f0ddca7d58 | ||
![]() |
7744ad4af9 | ||
![]() |
5c70a9a453 | ||
![]() |
6635015dbf | ||
![]() |
f285fcddb0 | ||
![]() |
cabf405648 | ||
![]() |
b2f3372b26 | ||
![]() |
754c9bb6e7 | ||
![]() |
f9238c62dd | ||
![]() |
4a294674e8 | ||
![]() |
83e92cfd6c | ||
![]() |
718ca6d6ea | ||
![]() |
a07f4f181c | ||
![]() |
72b06f9eb9 | ||
![]() |
598a789d36 | ||
![]() |
37e948cb20 | ||
![]() |
f26ece878b | ||
![]() |
9f8b43577e | ||
![]() |
0c76edf793 | ||
![]() |
0cac828347 | ||
![]() |
9e9189ac36 |
11
README.md
11
README.md
@@ -55,7 +55,7 @@ postgsail-telegram-bot:
|
|||||||
- [About The Project](#about-the-project)
|
- [About The Project](#about-the-project)
|
||||||
- [Features](#features)
|
- [Features](#features)
|
||||||
- [Cloud-hosted PostgSail](#cloud-hosted-postgsail)
|
- [Cloud-hosted PostgSail](#cloud-hosted-postgsail)
|
||||||
- [On-Premise (for free)](#on-premise-for-free)
|
- [On-Premise](#on-premise)
|
||||||
- [Roadmap](#roadmap)
|
- [Roadmap](#roadmap)
|
||||||
- [Contributing](#contributing)
|
- [Contributing](#contributing)
|
||||||
- [Creating A Pull Request](#creating-a-pull-request)
|
- [Creating A Pull Request](#creating-a-pull-request)
|
||||||
@@ -104,10 +104,16 @@ To understand the why and how, you might want to read [Why.md](https://github.co
|
|||||||
|
|
||||||
Remove the hassle of running PostgSail yourself. Here you can skip the technical setup, the maintenance work and server costs by getting PostgSail on our reliable and secure PostgSail Cloud. Register and try for free at [iot.openplotter.cloud](https://iot.openplotter.cloud/).
|
Remove the hassle of running PostgSail yourself. Here you can skip the technical setup, the maintenance work and server costs by getting PostgSail on our reliable and secure PostgSail Cloud. Register and try for free at [iot.openplotter.cloud](https://iot.openplotter.cloud/).
|
||||||
|
|
||||||
## On-Premise (for free)
|
PostgSail Cloud is Open Source and free for personal use with a single vessel. If wish to manage multiple boats contact us.
|
||||||
|
|
||||||
|
PostgSail is free to use, but is not free to make or host. The stability and accuracy of PostgSail depends on its volunteers and donations from its users. Please consider making an annual recurring gift to PostgSail.
|
||||||
|
|
||||||
|
## On-Premise
|
||||||
|
|
||||||
Self host postgSail where you want and how you want. There are no restrictions, you’re in full control. [Install Guide](https://github.com/xbgmsharp/postgsail/blob/main/docs/README.md)
|
Self host postgSail where you want and how you want. There are no restrictions, you’re in full control. [Install Guide](https://github.com/xbgmsharp/postgsail/blob/main/docs/README.md)
|
||||||
|
|
||||||
|
PostgSail is free to use, but is not free to make or host. The stability and accuracy of PostgSail depends on its volunteers and donations from its users. Please consider making an annual recurring gift to PostgSail.
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
See the [open issues](https://github.com/xbgmsharp/postgsail/issues) for a list of proposed features (and known issues).
|
See the [open issues](https://github.com/xbgmsharp/postgsail/issues) for a list of proposed features (and known issues).
|
||||||
@@ -142,5 +148,6 @@ An out of the box IoT platform using Docker (could be extend to K3 or K8) with t
|
|||||||
- [PostgreSQL, open source object-relational database system](https://postgresql.org)
|
- [PostgreSQL, open source object-relational database system](https://postgresql.org)
|
||||||
- [TimescaleDB, Time-series data extends PostgreSQL](https://www.timescale.com)
|
- [TimescaleDB, Time-series data extends PostgreSQL](https://www.timescale.com)
|
||||||
- [PostGIS, a spatial database extender for PostgreSQL object-relational database.](https://postgis.net/)
|
- [PostGIS, a spatial database extender for PostgreSQL object-relational database.](https://postgis.net/)
|
||||||
|
- [MobilityDB, An open source geospatial trajectory data management & analysis platform.](https://mobilitydb.com/)
|
||||||
- [Grafana, open observability platform | Grafana Labs](https://grafana.com)
|
- [Grafana, open observability platform | Grafana Labs](https://grafana.com)
|
||||||
- And many more
|
- And many more
|
||||||
|
@@ -1,5 +1,3 @@
|
|||||||
version: "3.9"
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: xbgmsharp/timescaledb-postgis
|
image: xbgmsharp/timescaledb-postgis
|
||||||
|
@@ -26,11 +26,15 @@ erDiagram
|
|||||||
tfloat trip_batt_voltage "Battery Voltage"
|
tfloat trip_batt_voltage "Battery Voltage"
|
||||||
tfloat trip_cog "courseovergroundtrue"
|
tfloat trip_cog "courseovergroundtrue"
|
||||||
tfloat trip_depth "Depth"
|
tfloat trip_depth "Depth"
|
||||||
|
tfloat trip_heading "heading True"
|
||||||
tfloat trip_hum_out "Humidity outside"
|
tfloat trip_hum_out "Humidity outside"
|
||||||
ttext trip_notes
|
ttext trip_notes
|
||||||
tfloat trip_pres_out "Pressure outside"
|
tfloat trip_pres_out "Pressure outside"
|
||||||
tfloat trip_sog "speedoverground"
|
tfloat trip_sog "speedoverground"
|
||||||
|
tfloat trip_solar_power "solar powerPanel"
|
||||||
|
tfloat trip_solar_voltage "solar voltage"
|
||||||
ttext trip_status
|
ttext trip_status
|
||||||
|
tfloat trip_tank_level "Tank currentLevel"
|
||||||
tfloat trip_temp_out "Temperature outside"
|
tfloat trip_temp_out "Temperature outside"
|
||||||
tfloat trip_temp_water "Temperature water"
|
tfloat trip_temp_water "Temperature water"
|
||||||
tfloat trip_twa "windspeedapparent"
|
tfloat trip_twa "windspeedapparent"
|
||||||
@@ -42,14 +46,17 @@ erDiagram
|
|||||||
api_metadata {
|
api_metadata {
|
||||||
boolean active "trigger monitor online/offline"
|
boolean active "trigger monitor online/offline"
|
||||||
boolean active
|
boolean active
|
||||||
|
jsonb available_keys "Signalk paths with unit for custom mapping"
|
||||||
|
jsonb available_keys
|
||||||
double_precision beam
|
double_precision beam
|
||||||
text client_id
|
jsonb configuration "Signalk path mapping for metrics"
|
||||||
text configuration
|
jsonb configuration
|
||||||
timestamp_with_time_zone created_at "{NOT_NULL}"
|
timestamp_with_time_zone created_at "{NOT_NULL}"
|
||||||
double_precision height
|
double_precision height
|
||||||
integer id "{NOT_NULL}"
|
text ip "Store vessel ip address"
|
||||||
|
text ip
|
||||||
double_precision length
|
double_precision length
|
||||||
numeric mmsi
|
text mmsi
|
||||||
text name
|
text name
|
||||||
text platform
|
text platform
|
||||||
text plugin_version "{NOT_NULL}"
|
text plugin_version "{NOT_NULL}"
|
||||||
@@ -61,9 +68,22 @@ erDiagram
|
|||||||
text vessel_id "{NOT_NULL}"
|
text vessel_id "{NOT_NULL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api_metadata_ext {
|
||||||
|
timestamp_with_time_zone created_at "{NOT_NULL}"
|
||||||
|
bytea image "Store user boat image in bytea format"
|
||||||
|
text image_b64
|
||||||
|
text image_type "Store user boat image type in text format"
|
||||||
|
timestamp_with_time_zone image_updated_at
|
||||||
|
text image_url
|
||||||
|
text make_model "Store user make & model in text format"
|
||||||
|
text polar "Store polar data in CSV notation as used on ORC sailboat data"
|
||||||
|
timestamp_with_time_zone polar_updated_at
|
||||||
|
text vessel_id "{NOT_NULL}"
|
||||||
|
}
|
||||||
|
|
||||||
api_metrics {
|
api_metrics {
|
||||||
double_precision anglespeedapparent
|
double_precision anglespeedapparent
|
||||||
text client_id
|
text client_id "Deprecated client_id to be removed"
|
||||||
double_precision courseovergroundtrue
|
double_precision courseovergroundtrue
|
||||||
double_precision latitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger"
|
double_precision latitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger"
|
||||||
double_precision longitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger"
|
double_precision longitude "With CONSTRAINT but allow NULL value to be ignored silently by trigger"
|
||||||
@@ -111,6 +131,17 @@ erDiagram
|
|||||||
integer stay_code "{NOT_NULL}"
|
integer stay_code "{NOT_NULL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api_stays_ext {
|
||||||
|
timestamp_with_time_zone created_at "{NOT_NULL}"
|
||||||
|
bytea image "Store stays image in bytea format"
|
||||||
|
text image_b64
|
||||||
|
text image_type "Store stays image type in text format"
|
||||||
|
timestamp_with_time_zone image_updated_at
|
||||||
|
text image_url
|
||||||
|
integer stay_id "{NOT_NULL}"
|
||||||
|
text vessel_id "{NOT_NULL}"
|
||||||
|
}
|
||||||
|
|
||||||
auth_accounts {
|
auth_accounts {
|
||||||
timestamp_with_time_zone connected_at "{NOT_NULL}"
|
timestamp_with_time_zone connected_at "{NOT_NULL}"
|
||||||
timestamp_with_time_zone created_at "{NOT_NULL}"
|
timestamp_with_time_zone created_at "{NOT_NULL}"
|
||||||
@@ -269,12 +300,15 @@ erDiagram
|
|||||||
api_logbook }o--|| api_moorages : ""
|
api_logbook }o--|| api_moorages : ""
|
||||||
api_logbook }o--|| api_moorages : ""
|
api_logbook }o--|| api_moorages : ""
|
||||||
api_metadata }o--|| auth_vessels : ""
|
api_metadata }o--|| auth_vessels : ""
|
||||||
|
api_metadata_ext |o--|| api_metadata : ""
|
||||||
api_metrics }o--|| api_metadata : ""
|
api_metrics }o--|| api_metadata : ""
|
||||||
api_moorages }o--|| api_metadata : ""
|
api_moorages }o--|| api_metadata : ""
|
||||||
api_stays }o--|| api_metadata : ""
|
api_stays }o--|| api_metadata : ""
|
||||||
|
api_stays_ext }o--|| api_metadata : ""
|
||||||
api_moorages }o--|| api_stays_at : ""
|
api_moorages }o--|| api_stays_at : ""
|
||||||
api_stays }o--|| api_moorages : ""
|
api_stays }o--|| api_moorages : ""
|
||||||
api_stays }o--|| api_stays_at : ""
|
api_stays }o--|| api_stays_at : ""
|
||||||
|
api_stays_ext |o--|| api_stays : ""
|
||||||
auth_otp |o--|| auth_accounts : ""
|
auth_otp |o--|| auth_accounts : ""
|
||||||
auth_vessels }o--|| auth_accounts : ""
|
auth_vessels }o--|| auth_accounts : ""
|
||||||
```
|
```
|
2
frontend
2
frontend
Submodule frontend updated: 2fb525adad...41e5f0d1b1
@@ -248,7 +248,7 @@ RETURNS TABLE (
|
|||||||
) AS $$
|
) AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Aggregate all metrics as trip ios short.
|
-- Aggregate all metrics as trip is short.
|
||||||
RETURN QUERY
|
RETURN QUERY
|
||||||
WITH metrics AS (
|
WITH metrics AS (
|
||||||
-- Extract metrics
|
-- Extract metrics
|
||||||
@@ -267,7 +267,16 @@ BEGIN
|
|||||||
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC, NULL) as stateofcharge,
|
COALESCE(
|
||||||
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
@@ -362,7 +371,16 @@ BEGIN
|
|||||||
COALESCE((t.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
COALESCE((t.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE((t.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
COALESCE((t.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE((t.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
COALESCE((t.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE((t.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC, NULL) as stateofcharge,
|
COALESCE(
|
||||||
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (t.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(t.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
COALESCE((t.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
COALESCE((t.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(t.longitude, t.latitude) AS geo_point
|
ST_MakePoint(t.longitude, t.latitude) AS geo_point
|
||||||
FROM (
|
FROM (
|
||||||
@@ -395,7 +413,16 @@ BEGIN
|
|||||||
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC, NULL) as stateofcharge,
|
COALESCE(
|
||||||
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
@@ -424,7 +451,16 @@ BEGIN
|
|||||||
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC, NULL) as stateofcharge,
|
COALESCE(
|
||||||
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
@@ -513,7 +549,7 @@ BEGIN
|
|||||||
RETURN QUERY
|
RETURN QUERY
|
||||||
WITH metrics AS (
|
WITH metrics AS (
|
||||||
-- Extract metrics base the total of entry ignoring first and last 10 minutes metrics
|
-- Extract metrics base the total of entry ignoring first and last 10 minutes metrics
|
||||||
SELECT time_bucket(bucket_interval::INTERVAL, m.time) AS time_bucket, -- Time-bucketed period
|
SELECT time_bucket(bucket_interval::INTERVAL, m.time) AS time_bucket, -- Time-bucketed period
|
||||||
avg(m.courseovergroundtrue) as courseovergroundtrue,
|
avg(m.courseovergroundtrue) as courseovergroundtrue,
|
||||||
avg(m.speedoverground) as speedoverground,
|
avg(m.speedoverground) as speedoverground,
|
||||||
avg(m.windspeedapparent) as windspeedapparent,
|
avg(m.windspeedapparent) as windspeedapparent,
|
||||||
@@ -527,7 +563,16 @@ BEGIN
|
|||||||
COALESCE(avg((m.metrics->'environment.outside.relativeHumidity')::NUMERIC), NULL) as outsidehumidity,
|
COALESCE(avg((m.metrics->'environment.outside.relativeHumidity')::NUMERIC), NULL) as outsidehumidity,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.pressure')::NUMERIC), NULL) as outsidepressure,
|
COALESCE(avg((m.metrics->'environment.outside.pressure')::NUMERIC), NULL) as outsidepressure,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.temperature')::NUMERIC), NULL) as outsidetemperature,
|
COALESCE(avg((m.metrics->'environment.outside.temperature')::NUMERIC), NULL) as outsidetemperature,
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC), NULL) as stateofcharge,
|
COALESCE(
|
||||||
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.voltage')::NUMERIC), NULL) as voltage,
|
COALESCE(avg((m.metrics->'electrical.batteries.House.voltage')::NUMERIC), NULL) as voltage,
|
||||||
ST_MakePoint(last(m.longitude, m.time),last(m.latitude, m.time)) AS geo_point
|
ST_MakePoint(last(m.longitude, m.time),last(m.latitude, m.time)) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
@@ -552,13 +597,22 @@ BEGIN
|
|||||||
m.status,
|
m.status,
|
||||||
COALESCE(metersToKnots((m.metrics->'environment.wind.speedTrue')::NUMERIC), NULL) AS truewindspeed,
|
COALESCE(metersToKnots((m.metrics->'environment.wind.speedTrue')::NUMERIC), NULL) AS truewindspeed,
|
||||||
COALESCE(radiantToDegrees((m.metrics->'environment.wind.directionTrue')::NUMERIC), NULL) AS truewinddirection,
|
COALESCE(radiantToDegrees((m.metrics->'environment.wind.directionTrue')::NUMERIC), NULL) AS truewinddirection,
|
||||||
COALESCE(avg((m.metrics->'environment.water.temperature')::NUMERIC), NULL) as watertemperature,
|
COALESCE((m.metrics->'environment.water.temperature')::NUMERIC, NULL) as watertemperature,
|
||||||
COALESCE(avg((m.metrics->'environment.depth.belowTransducer')::NUMERIC), NULL) as depth,
|
COALESCE((m.metrics->'environment.depth.belowTransducer')::NUMERIC, NULL) as depth,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.relativeHumidity')::NUMERIC), NULL) as outsidehumidity,
|
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.pressure')::NUMERIC), NULL) as outsidepressure,
|
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.temperature')::NUMERIC), NULL) as outsidetemperature,
|
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC), NULL) as stateofcharge,
|
COALESCE(
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.voltage')::NUMERIC), NULL) as voltage,
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
|
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
WHERE m.latitude IS NOT NULL
|
WHERE m.latitude IS NOT NULL
|
||||||
@@ -581,13 +635,22 @@ BEGIN
|
|||||||
m.status,
|
m.status,
|
||||||
COALESCE(metersToKnots((m.metrics->'environment.wind.speedTrue')::NUMERIC), NULL) AS truewindspeed,
|
COALESCE(metersToKnots((m.metrics->'environment.wind.speedTrue')::NUMERIC), NULL) AS truewindspeed,
|
||||||
COALESCE(radiantToDegrees((m.metrics->'environment.wind.directionTrue')::NUMERIC), NULL) AS truewinddirection,
|
COALESCE(radiantToDegrees((m.metrics->'environment.wind.directionTrue')::NUMERIC), NULL) AS truewinddirection,
|
||||||
COALESCE(avg((m.metrics->'environment.water.temperature')::NUMERIC), NULL) as watertemperature,
|
COALESCE((m.metrics->'environment.water.temperature')::NUMERIC, NULL) as watertemperature,
|
||||||
COALESCE(avg((m.metrics->'environment.depth.belowTransducer')::NUMERIC), NULL) as depth,
|
COALESCE((m.metrics->'environment.depth.belowTransducer')::NUMERIC, NULL) as depth,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.relativeHumidity')::NUMERIC), NULL) as outsidehumidity,
|
COALESCE((m.metrics->'environment.outside.relativeHumidity')::NUMERIC, NULL) as outsidehumidity,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.pressure')::NUMERIC), NULL) as outsidepressure,
|
COALESCE((m.metrics->'environment.outside.pressure')::NUMERIC, NULL) as outsidepressure,
|
||||||
COALESCE(avg((m.metrics->'environment.outside.temperature')::NUMERIC), NULL) as outsidetemperature,
|
COALESCE((m.metrics->'environment.outside.temperature')::NUMERIC, NULL) as outsidetemperature,
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC), NULL) as stateofcharge,
|
COALESCE(
|
||||||
COALESCE(avg((m.metrics->'electrical.batteries.House.voltage')::NUMERIC), NULL) as voltage,
|
NULLIF(
|
||||||
|
CASE
|
||||||
|
WHEN (m.metrics->>'electrical.batteries.House.capacity.stateOfCharge') ~ '^-?[0-9]+(\.[0-9]+)?$' THEN
|
||||||
|
(m.metrics->>'electrical.batteries.House.capacity.stateOfCharge')::NUMERIC
|
||||||
|
END,
|
||||||
|
NULL
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
) as stateofcharge,
|
||||||
|
COALESCE((m.metrics->'electrical.batteries.House.voltage')::NUMERIC, NULL) as voltage,
|
||||||
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
ST_MakePoint(m.longitude, m.latitude) AS geo_point
|
||||||
FROM api.metrics m
|
FROM api.metrics m
|
||||||
WHERE m.latitude IS NOT NULL
|
WHERE m.latitude IS NOT NULL
|
||||||
@@ -2170,6 +2233,7 @@ AS SELECT id,
|
|||||||
_to_moorage_id AS to_moorage_id
|
_to_moorage_id AS to_moorage_id
|
||||||
FROM api.logbook l
|
FROM api.logbook l
|
||||||
WHERE _to_time IS NOT NULL
|
WHERE _to_time IS NOT NULL
|
||||||
|
AND trip IS NOT NULL
|
||||||
ORDER BY _from_time DESC;
|
ORDER BY _from_time DESC;
|
||||||
-- Description
|
-- Description
|
||||||
COMMENT ON VIEW api.log_view IS 'Log web view';
|
COMMENT ON VIEW api.log_view IS 'Log web view';
|
||||||
@@ -2201,6 +2265,7 @@ BEGIN
|
|||||||
WHERE id = _id;
|
WHERE id = _id;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
-- Description
|
||||||
COMMENT ON FUNCTION api.delete_trip_entry_fn IS 'Delete at a specific time a temporal sequence for all trip_* column from a logbook';
|
COMMENT ON FUNCTION api.delete_trip_entry_fn IS 'Delete at a specific time a temporal sequence for all trip_* column from a logbook';
|
||||||
|
|
||||||
-- Update export_logbooks_geojson_point_trips_fn, replace timelapse2_fn, Generate the GeoJSON from the time sequence value
|
-- Update export_logbooks_geojson_point_trips_fn, replace timelapse2_fn, Generate the GeoJSON from the time sequence value
|
||||||
@@ -2239,6 +2304,7 @@ BEGIN
|
|||||||
LATERAL jsonb_array_elements(l.log_geojson) AS feature_element; -- Flatten the arrays and create a GeoJSON FeatureCollection
|
LATERAL jsonb_array_elements(l.log_geojson) AS feature_element; -- Flatten the arrays and create a GeoJSON FeatureCollection
|
||||||
END;
|
END;
|
||||||
$function$;
|
$function$;
|
||||||
|
-- Description
|
||||||
COMMENT ON FUNCTION api.export_logbooks_geojson_point_trips_fn IS 'Export all selected logs into a geojson `trip` to a geojson as points including properties';
|
COMMENT ON FUNCTION api.export_logbooks_geojson_point_trips_fn IS 'Export all selected logs into a geojson `trip` to a geojson as points including properties';
|
||||||
|
|
||||||
-- Update api role SQL connection to 40
|
-- Update api role SQL connection to 40
|
||||||
@@ -2268,7 +2334,3 @@ UPDATE public.app_settings
|
|||||||
SET value='0.8.1'
|
SET value='0.8.1'
|
||||||
WHERE "name"='app.version';
|
WHERE "name"='app.version';
|
||||||
|
|
||||||
\c postgres
|
|
||||||
UPDATE cron.job SET username = 'scheduler'; -- Update to scheduler, pending process_queue update
|
|
||||||
UPDATE cron.job SET username = 'username' WHERE jobname = 'cron_vacuum'; -- Update to superuser for vacuum permissions
|
|
||||||
UPDATE cron.job SET username = 'username' WHERE jobname = 'job_run_details_cleanup';
|
|
||||||
|
219
initdb/99_migrations_202501.sql
Normal file
219
initdb/99_migrations_202501.sql
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
---------------------------------------------------------------------------
|
||||||
|
-- Copyright 2021-2025 Francois Lacroix <xbgmsharp@gmail.com>
|
||||||
|
-- This file is part of PostgSail which is released under Apache License, Version 2.0 (the "License").
|
||||||
|
-- See file LICENSE or go to http://www.apache.org/licenses/LICENSE-2.0 for full license details.
|
||||||
|
--
|
||||||
|
-- Migration January-March 2025
|
||||||
|
--
|
||||||
|
-- List current database
|
||||||
|
select current_database();
|
||||||
|
|
||||||
|
-- connect to the DB
|
||||||
|
\c signalk
|
||||||
|
|
||||||
|
\echo 'Timing mode is enabled'
|
||||||
|
\timing
|
||||||
|
|
||||||
|
\echo 'Force timezone, just in case'
|
||||||
|
set timezone to 'UTC';
|
||||||
|
|
||||||
|
-- Update metadata table, mark client_id as deprecated
|
||||||
|
COMMENT ON COLUMN api.metadata.client_id IS 'Deprecated client_id to be removed';
|
||||||
|
-- Update metrics table, mark client_id as deprecated
|
||||||
|
COMMENT ON COLUMN api.metrics.client_id IS 'Deprecated client_id to be removed';
|
||||||
|
|
||||||
|
-- Update metadata table update configuration column type to jsonb and comment
|
||||||
|
ALTER TABLE api.metadata ALTER COLUMN "configuration" TYPE jsonb USING "configuration"::jsonb;
|
||||||
|
COMMENT ON COLUMN api.metadata.configuration IS 'Signalk path mapping for metrics';
|
||||||
|
|
||||||
|
-- Update metadata table add new column available_keys and comment
|
||||||
|
ALTER TABLE api.metadata ADD available_keys jsonb NULL;
|
||||||
|
COMMENT ON COLUMN api.metadata.available_keys IS 'Signalk paths with unit for custom mapping';
|
||||||
|
|
||||||
|
--DROP FUNCTION public.metadata_upsert_trigger_fn();
|
||||||
|
-- Update metadata_upsert_trigger_fn to metadata table to support configuration and available_keys and deprecated client_id
|
||||||
|
CREATE OR REPLACE FUNCTION public.metadata_upsert_trigger_fn()
|
||||||
|
RETURNS trigger
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $function$
|
||||||
|
DECLARE
|
||||||
|
metadata_id integer;
|
||||||
|
metadata_active boolean;
|
||||||
|
BEGIN
|
||||||
|
-- Require Signalk plugin version 0.4.0
|
||||||
|
-- Set client_id to new value to allow RLS
|
||||||
|
--PERFORM set_config('vessel.client_id', NEW.client_id, false);
|
||||||
|
-- UPSERT - Insert vs Update for Metadata
|
||||||
|
--RAISE NOTICE 'metadata_upsert_trigger_fn';
|
||||||
|
--PERFORM set_config('vessel.id', NEW.vessel_id, true);
|
||||||
|
--RAISE WARNING 'metadata_upsert_trigger_fn [%] [%]', current_setting('vessel.id', true), NEW;
|
||||||
|
SELECT m.id,m.active INTO metadata_id, metadata_active
|
||||||
|
FROM api.metadata m
|
||||||
|
WHERE m.vessel_id IS NOT NULL AND m.vessel_id = current_setting('vessel.id', true);
|
||||||
|
--RAISE NOTICE 'metadata_id is [%]', metadata_id;
|
||||||
|
IF metadata_id IS NOT NULL THEN
|
||||||
|
-- send notification if boat is back online
|
||||||
|
IF metadata_active is False THEN
|
||||||
|
-- Add monitor online entry to process queue for later notification
|
||||||
|
INSERT INTO process_queue (channel, payload, stored, ref_id)
|
||||||
|
VALUES ('monitoring_online', metadata_id, now(), current_setting('vessel.id', true));
|
||||||
|
END IF;
|
||||||
|
-- Update vessel metadata
|
||||||
|
UPDATE api.metadata
|
||||||
|
SET
|
||||||
|
name = NEW.name,
|
||||||
|
mmsi = NEW.mmsi,
|
||||||
|
--client_id = NEW.client_id,
|
||||||
|
length = NEW.length,
|
||||||
|
beam = NEW.beam,
|
||||||
|
height = NEW.height,
|
||||||
|
ship_type = NEW.ship_type,
|
||||||
|
plugin_version = NEW.plugin_version,
|
||||||
|
signalk_version = NEW.signalk_version,
|
||||||
|
platform = REGEXP_REPLACE(NEW.platform, '[^a-zA-Z0-9\(\) ]', '', 'g'),
|
||||||
|
-- configuration = NEW.configuration, -- ignore configuration from vessel, it is manage by user
|
||||||
|
-- time = NEW.time, ignore the time sent by the vessel as it is out of sync sometimes.
|
||||||
|
time = NOW(), -- overwrite the time sent by the vessel
|
||||||
|
available_keys = NEW.available_keys,
|
||||||
|
active = true
|
||||||
|
WHERE id = metadata_id;
|
||||||
|
RETURN NULL; -- Ignore insert
|
||||||
|
ELSE
|
||||||
|
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;
|
||||||
|
-- Ignore and overwrite the time sent by the vessel
|
||||||
|
NEW.time := NOW();
|
||||||
|
-- Insert new vessel metadata
|
||||||
|
RETURN NEW; -- Insert new vessel metadata
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$function$
|
||||||
|
;
|
||||||
|
COMMENT ON FUNCTION public.metadata_upsert_trigger_fn() IS 'process metadata from vessel, upsert';
|
||||||
|
|
||||||
|
-- Create or replace the function that will be executed by the trigger
|
||||||
|
-- Add metadata table trigger for update_metadata_configuration
|
||||||
|
CREATE OR REPLACE FUNCTION api.update_metadata_configuration()
|
||||||
|
RETURNS TRIGGER AS $$
|
||||||
|
BEGIN
|
||||||
|
-- Require Signalk plugin version 0.4.0
|
||||||
|
-- Update the configuration field with current date in ISO format
|
||||||
|
-- Using jsonb_set if configuration is already a JSONB field
|
||||||
|
IF NEW.configuration IS NOT NULL AND
|
||||||
|
jsonb_typeof(NEW.configuration) = 'object' THEN
|
||||||
|
NEW.configuration = jsonb_set(
|
||||||
|
NEW.configuration,
|
||||||
|
'{update_at}',
|
||||||
|
to_jsonb(to_char(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS"Z"'))
|
||||||
|
);
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
COMMENT ON FUNCTION api.update_metadata_configuration() IS 'Update the configuration field with current date in ISO format';
|
||||||
|
|
||||||
|
-- Create the trigger
|
||||||
|
CREATE TRIGGER metadata_update_configuration_trigger
|
||||||
|
BEFORE UPDATE ON api.metadata
|
||||||
|
FOR EACH ROW
|
||||||
|
EXECUTE FUNCTION api.update_metadata_configuration();
|
||||||
|
|
||||||
|
-- Update api.export_logbook_geojson_linestring_trip_fn, add metadata properties
|
||||||
|
CREATE OR REPLACE FUNCTION api.export_logbooks_geojson_linestring_trips_fn(
|
||||||
|
start_log integer DEFAULT NULL::integer,
|
||||||
|
end_log integer DEFAULT NULL::integer,
|
||||||
|
start_date text DEFAULT NULL::text,
|
||||||
|
end_date text DEFAULT NULL::text,
|
||||||
|
OUT geojson jsonb
|
||||||
|
) RETURNS jsonb
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $function$
|
||||||
|
DECLARE
|
||||||
|
logs_geojson jsonb;
|
||||||
|
BEGIN
|
||||||
|
-- Normalize start and end values
|
||||||
|
IF start_log IS NOT NULL AND end_log IS NULL THEN end_log := start_log; END IF;
|
||||||
|
IF start_date IS NOT NULL AND end_date IS NULL THEN end_date := start_date; END IF;
|
||||||
|
|
||||||
|
WITH logbook_data AS (
|
||||||
|
-- get the logbook geometry and metadata, an array for each log
|
||||||
|
SELECT id, name,
|
||||||
|
starttimestamp(trip),
|
||||||
|
endtimestamp(trip),
|
||||||
|
--speed(trip_sog),
|
||||||
|
duration(trip),
|
||||||
|
--length(trip) as length, -- Meters
|
||||||
|
(length(trip) * 0.0005399568)::numeric as distance, -- NM
|
||||||
|
twavg(trip_sog) as avg_sog,
|
||||||
|
maxValue(trip_sog) as max_sog,
|
||||||
|
maxValue(trip_depth) as max_depth, -- Depth
|
||||||
|
maxValue(trip_batt_charge) as max_batt_charge, -- Battery Charge
|
||||||
|
maxValue(trip_batt_voltage) as max_batt_voltage, -- Battery Voltage
|
||||||
|
maxValue(trip_temp_water) as max_temp_water, -- Temperature water
|
||||||
|
maxValue(trip_temp_out) as max_temp_out, -- Temperature outside
|
||||||
|
maxValue(trip_pres_out) as max_pres_out, -- Pressure outside
|
||||||
|
maxValue(trip_hum_out) as max_hum_out, -- Humidity outside
|
||||||
|
twavg(trip_depth) as avg_depth, -- Depth
|
||||||
|
twavg(trip_batt_charge) as avg_batt_charge, -- Battery Charge
|
||||||
|
twavg(trip_batt_voltage) as avg_batt_voltage, -- Battery Voltage
|
||||||
|
twavg(trip_temp_water) as avg_temp_water, -- Temperature water
|
||||||
|
twavg(trip_temp_out) as avg_temp_out, -- Temperature outside
|
||||||
|
twavg(trip_pres_out) as avg_pres_out, -- Pressure outside
|
||||||
|
twavg(trip_hum_out) as avg_hum_out, -- Humidity outside
|
||||||
|
trajectory(l.trip)::geometry as track_geog -- extract trip to geography
|
||||||
|
FROM api.logbook l
|
||||||
|
WHERE (start_log IS NULL OR l.id >= start_log) AND
|
||||||
|
(end_log IS NULL OR l.id <= end_log) AND
|
||||||
|
(start_date IS NULL OR l._from_time >= start_date::TIMESTAMPTZ) AND
|
||||||
|
(end_date IS NULL OR l._to_time <= end_date::TIMESTAMPTZ + interval '23 hours 59 minutes') AND
|
||||||
|
l.trip IS NOT NULL
|
||||||
|
ORDER BY l._from_time ASC
|
||||||
|
),
|
||||||
|
collect as (
|
||||||
|
SELECT ST_Collect(
|
||||||
|
ARRAY(
|
||||||
|
SELECT track_geog FROM logbook_data))
|
||||||
|
)
|
||||||
|
-- Create the GeoJSON response
|
||||||
|
SELECT jsonb_build_object(
|
||||||
|
'type', 'FeatureCollection',
|
||||||
|
'features', json_agg(ST_AsGeoJSON(logs.*)::json)) INTO geojson FROM logbook_data logs;
|
||||||
|
END;
|
||||||
|
$function$;
|
||||||
|
-- Description
|
||||||
|
COMMENT ON FUNCTION api.export_logbooks_geojson_linestring_trips_fn IS 'Generate geojson geometry LineString from trip with the corresponding properties';
|
||||||
|
|
||||||
|
-- Add public.get_season, return the season based on the input date for logbook tag
|
||||||
|
CREATE OR REPLACE FUNCTION public.get_season(input_date TIMESTAMPTZ)
|
||||||
|
RETURNS TEXT AS $$
|
||||||
|
BEGIN
|
||||||
|
CASE
|
||||||
|
WHEN (EXTRACT(MONTH FROM input_date) = 3 AND EXTRACT(DAY FROM input_date) >= 1) OR
|
||||||
|
(EXTRACT(MONTH FROM input_date) BETWEEN 4 AND 5) THEN
|
||||||
|
RETURN 'Spring';
|
||||||
|
WHEN (EXTRACT(MONTH FROM input_date) = 6 AND EXTRACT(DAY FROM input_date) >= 1) OR
|
||||||
|
(EXTRACT(MONTH FROM input_date) BETWEEN 7 AND 8) THEN
|
||||||
|
RETURN 'Summer';
|
||||||
|
WHEN (EXTRACT(MONTH FROM input_date) = 9 AND EXTRACT(DAY FROM input_date) >= 1) OR
|
||||||
|
(EXTRACT(MONTH FROM input_date) BETWEEN 10 AND 11) THEN
|
||||||
|
RETURN 'Fall';
|
||||||
|
ELSE
|
||||||
|
RETURN 'Winter';
|
||||||
|
END CASE;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
||||||
|
|
||||||
|
-- Refresh permissions
|
||||||
|
GRANT SELECT ON TABLE api.metrics,api.metadata TO scheduler;
|
||||||
|
GRANT INSERT, UPDATE, SELECT ON TABLE api.logbook,api.moorages,api.stays TO scheduler;
|
||||||
|
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO scheduler;
|
||||||
|
GRANT SELECT ON ALL TABLES IN SCHEMA public TO scheduler;
|
||||||
|
GRANT SELECT, UPDATE ON TABLE public.process_queue TO scheduler;
|
||||||
|
|
||||||
|
-- Update version
|
||||||
|
UPDATE public.app_settings
|
||||||
|
SET value='0.9.0'
|
||||||
|
WHERE "name"='app.version';
|
1149
initdb/99_migrations_202504.sql
Normal file
1149
initdb/99_migrations_202504.sql
Normal file
File diff suppressed because it is too large
Load Diff
3454
initdb/99_migrations_202505.sql
Normal file
3454
initdb/99_migrations_202505.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
|||||||
0.8.1
|
0.9.2
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -27,6 +27,7 @@ const metrics_aava = require('./metrics_sample_aava.json');
|
|||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
|
let configtime = new Date().toISOString();
|
||||||
|
|
||||||
// CNAMEs Array
|
// CNAMEs Array
|
||||||
[
|
[
|
||||||
@@ -39,7 +40,7 @@ const fs = require('fs');
|
|||||||
vessel_metadata: {
|
vessel_metadata: {
|
||||||
name: "kapla",
|
name: "kapla",
|
||||||
mmsi: "123456789",
|
mmsi: "123456789",
|
||||||
client_id: "vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd",
|
//client_id: "vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd",
|
||||||
length: "12",
|
length: "12",
|
||||||
beam: "10",
|
beam: "10",
|
||||||
height: "24",
|
height: "24",
|
||||||
@@ -59,8 +60,8 @@ const fs = require('fs');
|
|||||||
user_views: [
|
user_views: [
|
||||||
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
||||||
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
||||||
{ url: '/logs_view', res_body_length: 0},
|
{ url: '/logs_view', res_body_length: 0}, // not processed yet so empty
|
||||||
{ url: '/log_view', res_body_length: 2},
|
{ url: '/log_view', res_body_length: 0}, // not processed yet so empty
|
||||||
//{ url: '/stats_view', res_body_length: 1},
|
//{ url: '/stats_view', res_body_length: 1},
|
||||||
{ url: '/vessels_view', res_body_length: 1},
|
{ url: '/vessels_view', res_body_length: 1},
|
||||||
],
|
],
|
||||||
@@ -177,6 +178,18 @@ const fs = require('fs');
|
|||||||
obj_name: 'settings'
|
obj_name: 'settings'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
config_fn: [
|
||||||
|
{ url: '/metadata?select=configuration',
|
||||||
|
res: {
|
||||||
|
obj_name: 'configuration'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ url: `/metadata?select=configuration&configuration->>update_at=gt.${configtime}`,
|
||||||
|
res: {
|
||||||
|
obj_name: 'settings'
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ cname: process.env.PGSAIL_API_URI, name: "PostgSail unit test, aava",
|
{ cname: process.env.PGSAIL_API_URI, name: "PostgSail unit test, aava",
|
||||||
@@ -186,8 +199,8 @@ const fs = require('fs');
|
|||||||
preferences: { key: '{email_notifications}', value: false }, /* Disable email_notifications */
|
preferences: { key: '{email_notifications}', value: false }, /* Disable email_notifications */
|
||||||
vessel_metadata: {
|
vessel_metadata: {
|
||||||
name: "aava",
|
name: "aava",
|
||||||
mmsi: "787654321",
|
mmsi: "n/a",
|
||||||
client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
//client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
||||||
length: "12",
|
length: "12",
|
||||||
beam: "10",
|
beam: "10",
|
||||||
height: "24",
|
height: "24",
|
||||||
@@ -206,8 +219,8 @@ const fs = require('fs');
|
|||||||
user_views: [
|
user_views: [
|
||||||
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
||||||
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
||||||
{ url: '/logs_view', res_body_length: 0},
|
{ url: '/logs_view', res_body_length: 0}, // not processed yet so empty
|
||||||
{ url: '/log_view', res_body_length: 1},
|
{ url: '/log_view', res_body_length: 0}, // not processed yet so empty
|
||||||
//{ url: '/stats_view', res_body_length: 1},
|
//{ url: '/stats_view', res_body_length: 1},
|
||||||
{ url: '/vessels_view', res_body_length: 1},
|
{ url: '/vessels_view', res_body_length: 1},
|
||||||
],
|
],
|
||||||
@@ -318,6 +331,30 @@ const fs = require('fs');
|
|||||||
obj_name: 'settings'
|
obj_name: 'settings'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
],
|
||||||
|
config_fn: [
|
||||||
|
{ url: '/metadata?select=configuration',
|
||||||
|
res: {
|
||||||
|
obj_name: 'configuration'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ url: `/metadata?select=configuration&configuration->>update_at=gt.${configtime}`,
|
||||||
|
res: {
|
||||||
|
obj_name: 'settings'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
meta_ext_fn: [
|
||||||
|
{ url: '/metadata_ext?',
|
||||||
|
res: {
|
||||||
|
obj_name: 'configuration'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ url: `/metadata_ext?`,
|
||||||
|
res: {
|
||||||
|
obj_name: 'image'
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
].forEach( function(test){
|
].forEach( function(test){
|
||||||
@@ -596,7 +633,7 @@ request.set('User-Agent', 'PostgSail unit tests');
|
|||||||
.set('Authorization', `Bearer ${vessel_jwt}`)
|
.set('Authorization', `Bearer ${vessel_jwt}`)
|
||||||
.set('Accept', 'application/json')
|
.set('Accept', 'application/json')
|
||||||
.set('Content-Type', 'application/json')
|
.set('Content-Type', 'application/json')
|
||||||
.set('Prefer', 'return=headers-only,resolution=merge-duplicates')
|
.set('Prefer', 'missing=default,return=headers-only,resolution=merge-duplicates')
|
||||||
.end(function(err,res){
|
.end(function(err,res){
|
||||||
res.status.should.equal(201);
|
res.status.should.equal(201);
|
||||||
//console.log(res.header);
|
//console.log(res.header);
|
||||||
@@ -611,14 +648,15 @@ request.set('User-Agent', 'PostgSail unit tests');
|
|||||||
describe("Vessel POST metrics, JWT vessel_role", function(){
|
describe("Vessel POST metrics, JWT vessel_role", function(){
|
||||||
|
|
||||||
let data = [];
|
let data = [];
|
||||||
//console.log(vessel_metrics['metrics'][0]);
|
//console.log(test.vessel_metrics['metrics'][0]);
|
||||||
let i;
|
let i;
|
||||||
for (i = 0; i < test.vessel_metrics['metrics'].length; i++) {
|
for (i = 0; i < test.vessel_metrics['metrics'].length; i++) {
|
||||||
data[i] = test.vessel_metrics['metrics'][i];
|
data[i] = test.vessel_metrics['metrics'][i];
|
||||||
// Override time, -2h to allow to new data later without delay.
|
// Override time, -2h to allow to new data later without delay.
|
||||||
data[i]['time'] = moment.utc().subtract(1, 'day').add(i, 'minutes').format();
|
data[i]['time'] = moment.utc().subtract(1, 'day').add(i, 'minutes').format();
|
||||||
// Override client_id
|
// Override client_id
|
||||||
data[i]['client_id'] = test.vessel_metadata.client_id;
|
//data[i]['client_id'] = test.vessel_metadata.client_id;
|
||||||
|
data[i]['client_id'] = null;
|
||||||
}
|
}
|
||||||
// The last entry are invalid and should be ignore.
|
// The last entry are invalid and should be ignore.
|
||||||
// - Invalid status
|
// - Invalid status
|
||||||
@@ -843,6 +881,37 @@ request.set('User-Agent', 'PostgSail unit tests');
|
|||||||
}); // Function OTP endpoint
|
}); // Function OTP endpoint
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
describe("Function Metadata configuration endpoint, JWT vessel_role", function(){
|
||||||
|
|
||||||
|
let otp = null;
|
||||||
|
test.config_fn.forEach(function (subtest) {
|
||||||
|
it(`${subtest.url}`, function(done) {
|
||||||
|
try {
|
||||||
|
//console.log(`${subtest.url} ${subtest.res}`);
|
||||||
|
// Reset agent so we do not save cookies
|
||||||
|
request = supertest.agent(test.cname);
|
||||||
|
request
|
||||||
|
.get(subtest.url)
|
||||||
|
.set('Authorization', `Bearer ${vessel_jwt}`)
|
||||||
|
.set('Accept', 'application/json')
|
||||||
|
.end(function(err,res){
|
||||||
|
res.status.should.equal(200);
|
||||||
|
should.exist(res.header['content-type']);
|
||||||
|
should.exist(res.header['server']);
|
||||||
|
res.header['content-type'].should.match(new RegExp('json','g'));
|
||||||
|
res.header['server'].should.match(new RegExp('postgrest','g'));
|
||||||
|
console.log(res.body);
|
||||||
|
should.exist(res.body);
|
||||||
|
done(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}); // Function metadata configuration endpoint
|
||||||
|
|
||||||
}); // OpenAPI description
|
}); // OpenAPI description
|
||||||
|
|
||||||
}); // CNAMEs Array
|
}); // CNAMEs Array
|
||||||
|
@@ -28,14 +28,15 @@ const metrics_simulator = require('./metrics_sample_simulator.json');
|
|||||||
vessel_metadata: {
|
vessel_metadata: {
|
||||||
name: "aava",
|
name: "aava",
|
||||||
mmsi: "787654321",
|
mmsi: "787654321",
|
||||||
client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
//client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
||||||
length: "12",
|
length: "12",
|
||||||
beam: "10",
|
beam: "10",
|
||||||
height: "24",
|
height: "24",
|
||||||
ship_type: "37",
|
ship_type: "37",
|
||||||
plugin_version: "1.0.2",
|
plugin_version: "1.0.2",
|
||||||
signalk_version: "1.20.0",
|
signalk_version: "1.20.0",
|
||||||
time: moment().subtract(69, 'minutes').format()
|
time: moment().subtract(69, 'minutes').format(),
|
||||||
|
available_keys: [],
|
||||||
},
|
},
|
||||||
vessel_metrics: metrics_simulator,
|
vessel_metrics: metrics_simulator,
|
||||||
user_tables: [
|
user_tables: [
|
||||||
@@ -48,7 +49,7 @@ const metrics_simulator = require('./metrics_sample_simulator.json');
|
|||||||
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
// not processed yet, { url: '/stays_view', res_body_length: 1},
|
||||||
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
// not processed yet, { url: '/moorages_view', res_body_length: 1},
|
||||||
{ url: '/logs_view', res_body_length: 1},
|
{ url: '/logs_view', res_body_length: 1},
|
||||||
{ url: '/log_view', res_body_length: 2},
|
{ url: '/log_view', res_body_length: 0}, // not processed yet so empty
|
||||||
//{ url: '/stats_view', res_body_length: 1},
|
//{ url: '/stats_view', res_body_length: 1},
|
||||||
{ url: '/vessels_view', res_body_length: 1},
|
{ url: '/vessels_view', res_body_length: 1},
|
||||||
],
|
],
|
||||||
@@ -412,18 +413,19 @@ request.set('User-Agent', 'PostgSail unit tests');
|
|||||||
|
|
||||||
describe("Vessel POST metadata, JWT vessel_role", function(){
|
describe("Vessel POST metadata, JWT vessel_role", function(){
|
||||||
|
|
||||||
it('/metadata', function(done) {
|
it('/metadata?on_conflict=vessel_id', function(done) {
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
.post('/metadata')
|
.post('/metadata?on_conflict=vessel_id')
|
||||||
.send(test.vessel_metadata)
|
.send(test.vessel_metadata)
|
||||||
.set('Authorization', `Bearer ${vessel_jwt}`)
|
.set('Authorization', `Bearer ${vessel_jwt}`)
|
||||||
.set('Accept', 'application/json')
|
.set('Accept', 'application/json')
|
||||||
.set('Content-Type', 'application/json')
|
.set('Content-Type', 'application/json')
|
||||||
.set('Prefer', 'return=headers-only')
|
.set('Prefer', 'missing=default,return=headers-only,resolution=merge-duplicates')
|
||||||
.end(function(err,res){
|
.end(function(err,res){
|
||||||
res.status.should.equal(201);
|
//console.log(res.body);
|
||||||
//console.log(res.header);
|
//console.log(res.header);
|
||||||
|
res.status.should.equal(200);
|
||||||
should.exist(res.header['server']);
|
should.exist(res.header['server']);
|
||||||
res.header['server'].should.match(new RegExp('postgrest','g'));
|
res.header['server'].should.match(new RegExp('postgrest','g'));
|
||||||
done(err);
|
done(err);
|
||||||
@@ -442,7 +444,8 @@ request.set('User-Agent', 'PostgSail unit tests');
|
|||||||
// Override time, +1h because previous sample include 47 entry.
|
// Override time, +1h because previous sample include 47 entry.
|
||||||
data[i]['time'] = moment.utc().subtract(2, 'hours').add(i, 'minutes').format();
|
data[i]['time'] = moment.utc().subtract(2, 'hours').add(i, 'minutes').format();
|
||||||
// Override client_id
|
// Override client_id
|
||||||
data[i]['client_id'] = test.vessel_metadata.client_id;
|
//data[i]['client_id'] = test.vessel_metadata.client_id;
|
||||||
|
data[i]['client_id'] = null;
|
||||||
}
|
}
|
||||||
//console.log(data[0]);
|
//console.log(data[0]);
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@ var moment = require('moment');
|
|||||||
vessel_metadata: {
|
vessel_metadata: {
|
||||||
name: "kapla",
|
name: "kapla",
|
||||||
mmsi: "123456789",
|
mmsi: "123456789",
|
||||||
client_id: "vessels.urn:mrn:imo:mmsi:123456789",
|
//client_id: "vessels.urn:mrn:imo:mmsi:123456789",
|
||||||
length: "12",
|
length: "12",
|
||||||
beam: "10",
|
beam: "10",
|
||||||
height: "24",
|
height: "24",
|
||||||
@@ -249,7 +249,7 @@ var moment = require('moment');
|
|||||||
vessel_metadata: {
|
vessel_metadata: {
|
||||||
name: "aava",
|
name: "aava",
|
||||||
mmsi: "787654321",
|
mmsi: "787654321",
|
||||||
client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
//client_id: "vessels.urn:mrn:imo:mmsi:787654321",
|
||||||
length: "12",
|
length: "12",
|
||||||
beam: "10",
|
beam: "10",
|
||||||
height: "24",
|
height: "24",
|
||||||
|
@@ -163,6 +163,10 @@ var moment = require("moment");
|
|||||||
url: "/rpc/update_user_preferences_fn",
|
url: "/rpc/update_user_preferences_fn",
|
||||||
payload: { key: "{public_monitoring}", value: true },
|
payload: { key: "{public_monitoring}", value: true },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
url: "/rpc/update_user_preferences_fn",
|
||||||
|
payload: { key: "{public_timelapse}", value: true },
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -685,7 +689,7 @@ var moment = require("moment");
|
|||||||
let event = res.body;
|
let event = res.body;
|
||||||
//console.log(event);
|
//console.log(event);
|
||||||
// minimum events log for kapla & aava 13 + 4 email_otp = 17
|
// minimum events log for kapla & aava 13 + 4 email_otp = 17
|
||||||
event.length.should.be.aboveOrEqual(13);
|
event.length.should.be.aboveOrEqual(11);
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -151,7 +151,7 @@ var moment = require("moment");
|
|||||||
request.set("User-Agent", "PostgSail unit tests");
|
request.set("User-Agent", "PostgSail unit tests");
|
||||||
|
|
||||||
describe("With no JWT as api_anonymous", function () {
|
describe("With no JWT as api_anonymous", function () {
|
||||||
it("/logs_view, api_anonymous no jwt token", function (done) {
|
it("/logs_view, api_anonymous no jwt token, x-is-public header", function (done) {
|
||||||
// Reset agent so we do not save cookies
|
// Reset agent so we do not save cookies
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
@@ -167,7 +167,7 @@ var moment = require("moment");
|
|||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("/log_view, api_anonymous no jwt token", function (done) {
|
it("/log_view, api_anonymous no jwt token, x-is-public header", function (done) {
|
||||||
// Reset agent so we do not save cookies
|
// Reset agent so we do not save cookies
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
@@ -183,7 +183,7 @@ var moment = require("moment");
|
|||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("/monitoring_view, api_anonymous no jwt token", function (done) {
|
it("/monitoring_view, api_anonymous no jwt token, x-is-public header", function (done) {
|
||||||
// Reset agent so we do not save cookies
|
// Reset agent so we do not save cookies
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
@@ -200,7 +200,7 @@ var moment = require("moment");
|
|||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("/rpc/export_logbooks_geojson_linestring_trips_fn, api_anonymous no jwt token", function (done) {
|
it("/rpc/export_logbooks_geojson_linestring_trips_fn, api_anonymous no jwt token, x-is-public header", function (done) {
|
||||||
// Reset agent so we do not save cookies
|
// Reset agent so we do not save cookies
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
@@ -214,10 +214,18 @@ var moment = require("moment");
|
|||||||
should.exist(res.header["server"]);
|
should.exist(res.header["server"]);
|
||||||
res.header["content-type"].should.match(new RegExp("json", "g"));
|
res.header["content-type"].should.match(new RegExp("json", "g"));
|
||||||
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
||||||
|
should.exist(res.body.geojson);
|
||||||
|
/*
|
||||||
|
if (res.body.geojson.features == null) { // aava
|
||||||
|
//res.body.geojson.features.should.not.be.ok();
|
||||||
|
done(err);
|
||||||
|
}
|
||||||
|
res.body.geojson.features.length.should.be.equal(4);
|
||||||
|
*/
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("/rpc/export_logbooks_geojson_point_trips_fn, api_anonymous no jwt token", function (done) {
|
it("/rpc/export_logbooks_geojson_point_trips_fn, api_anonymous no jwt token, x-is-public header", function (done) {
|
||||||
// Reset agent so we do not save cookies
|
// Reset agent so we do not save cookies
|
||||||
request = supertest.agent(test.cname);
|
request = supertest.agent(test.cname);
|
||||||
request
|
request
|
||||||
@@ -231,6 +239,14 @@ var moment = require("moment");
|
|||||||
should.exist(res.header["server"]);
|
should.exist(res.header["server"]);
|
||||||
res.header["content-type"].should.match(new RegExp("json", "g"));
|
res.header["content-type"].should.match(new RegExp("json", "g"));
|
||||||
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
||||||
|
should.exist(res.body.geojson);
|
||||||
|
/*
|
||||||
|
if (res.body.geojson.features == null) { // aava
|
||||||
|
//res.body.geojson.features.should.not.be.ok();
|
||||||
|
done(err);
|
||||||
|
}
|
||||||
|
res.body.geojson.features.length.should.be.equal(53);
|
||||||
|
*/
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -183,6 +183,7 @@ var moment = require("moment");
|
|||||||
should.exist(res.header["server"]);
|
should.exist(res.header["server"]);
|
||||||
res.header["content-type"].should.match(new RegExp("json", "g"));
|
res.header["content-type"].should.match(new RegExp("json", "g"));
|
||||||
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
||||||
|
should.exist(res.body.geojson);
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -193,12 +194,13 @@ var moment = require("moment");
|
|||||||
.post(test.replay_full.url)
|
.post(test.replay_full.url)
|
||||||
.set("Accept", "application/json")
|
.set("Accept", "application/json")
|
||||||
.end(function (err, res) {
|
.end(function (err, res) {
|
||||||
console.log(res.text);
|
console.log(res.body);
|
||||||
res.status.should.equal(200);
|
res.status.should.equal(200);
|
||||||
should.exist(res.header["content-type"]);
|
should.exist(res.header["content-type"]);
|
||||||
should.exist(res.header["server"]);
|
should.exist(res.header["server"]);
|
||||||
res.header["content-type"].should.match(new RegExp("json", "g"));
|
res.header["content-type"].should.match(new RegExp("json", "g"));
|
||||||
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
res.header["server"].should.match(new RegExp("postgrest", "g"));
|
||||||
|
should.exist(res.body.geojson);
|
||||||
done(err);
|
done(err);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -18,3 +18,10 @@ SELECT api.ispublic_fn('kapla', 'public_logs', 1);
|
|||||||
SELECT api.ispublic_fn('kapla', 'public_logs', 3);
|
SELECT api.ispublic_fn('kapla', 'public_logs', 3);
|
||||||
SELECT api.ispublic_fn('kapla', 'public_monitoring');
|
SELECT api.ispublic_fn('kapla', 'public_monitoring');
|
||||||
SELECT api.ispublic_fn('kapla', 'public_timelapse');
|
SELECT api.ispublic_fn('kapla', 'public_timelapse');
|
||||||
|
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_test');
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_logs_list');
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_logs', 1);
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_logs', 3);
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_monitoring');
|
||||||
|
SELECT api.ispublic_fn('aava', 'public_timelapse');
|
@@ -21,6 +21,24 @@ ispublic_fn | f
|
|||||||
-[ RECORD 1 ]--
|
-[ RECORD 1 ]--
|
||||||
ispublic_fn | t
|
ispublic_fn | t
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | t
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | f
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | f
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | f
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | t
|
||||||
|
|
||||||
|
-[ RECORD 1 ]--
|
||||||
|
ispublic_fn | t
|
||||||
|
|
||||||
-[ RECORD 1 ]--
|
-[ RECORD 1 ]--
|
||||||
ispublic_fn | f
|
ispublic_fn | f
|
||||||
|
|
||||||
|
@@ -21,6 +21,9 @@ SELECT v.vessel_id as "vessel_id" FROM auth.vessels v WHERE v.owner_email = 'dem
|
|||||||
--\echo :"vessel_id"
|
--\echo :"vessel_id"
|
||||||
SELECT set_config('vessel.id', :'vessel_id', false) IS NOT NULL as vessel_id;
|
SELECT set_config('vessel.id', :'vessel_id', false) IS NOT NULL as vessel_id;
|
||||||
|
|
||||||
|
-- user_role
|
||||||
|
SET ROLE user_role;
|
||||||
|
|
||||||
-- Test logbook for user
|
-- Test logbook for user
|
||||||
\echo 'logbook'
|
\echo 'logbook'
|
||||||
SELECT count(*) FROM api.logbook WHERE vessel_id = current_setting('vessel.id', false);
|
SELECT count(*) FROM api.logbook WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
@@ -38,7 +41,7 @@ SELECT active,name IS NOT NULL AS name,geog,stay_code FROM api.stays WHERE vesse
|
|||||||
\echo 'eventlogs_view'
|
\echo 'eventlogs_view'
|
||||||
SELECT count(*) from api.eventlogs_view;
|
SELECT count(*) from api.eventlogs_view;
|
||||||
|
|
||||||
-- Test event logs view for user
|
-- Test stats logs view for user
|
||||||
\echo 'stats_logs_fn'
|
\echo 'stats_logs_fn'
|
||||||
SELECT api.stats_logs_fn(null, null) INTO stats_jsonb;
|
SELECT api.stats_logs_fn(null, null) INTO stats_jsonb;
|
||||||
SELECT stats_logs_fn->'name' AS name,
|
SELECT stats_logs_fn->'name' AS name,
|
||||||
|
@@ -11,6 +11,7 @@ user_id | t
|
|||||||
-[ RECORD 1 ]
|
-[ RECORD 1 ]
|
||||||
vessel_id | t
|
vessel_id | t
|
||||||
|
|
||||||
|
SET
|
||||||
logbook
|
logbook
|
||||||
-[ RECORD 1 ]
|
-[ RECORD 1 ]
|
||||||
count | 2
|
count | 2
|
||||||
@@ -66,23 +67,23 @@ stay_code | 4
|
|||||||
|
|
||||||
eventlogs_view
|
eventlogs_view
|
||||||
-[ RECORD 1 ]
|
-[ RECORD 1 ]
|
||||||
count | 11
|
count | 12
|
||||||
|
|
||||||
stats_logs_fn
|
stats_logs_fn
|
||||||
SELECT 1
|
SELECT 1
|
||||||
-[ RECORD 1 ]+----------
|
-[ RECORD 1 ]+--------
|
||||||
name | "kapla"
|
name | "kapla"
|
||||||
count | 4
|
count | 2
|
||||||
max_speed | 9.5
|
max_speed | 6.5
|
||||||
max_distance | 68.8677
|
max_distance | 8.8968
|
||||||
max_duration | "PT1H11M"
|
max_duration | "PT27M"
|
||||||
?column? | 3
|
?column? | 2
|
||||||
?column? | 90.6030
|
?column? | 16.5415
|
||||||
?column? | "PT2H44M"
|
?column? | "PT47M"
|
||||||
?column? | 44.2
|
?column? | 37.2
|
||||||
?column? | 3
|
?column? | 2
|
||||||
?column? | 4
|
?column? | 1
|
||||||
?column? | 4
|
?column? | 2
|
||||||
first_date | t
|
first_date | t
|
||||||
last_date | t
|
last_date | t
|
||||||
|
|
||||||
|
@@ -15,7 +15,12 @@ select current_database();
|
|||||||
\echo 'Check the number of process pending'
|
\echo 'Check the number of process pending'
|
||||||
-- Should be 24
|
-- Should be 24
|
||||||
SELECT count(*) as jobs from public.process_queue pq where pq.processed is null;
|
SELECT count(*) as jobs from public.process_queue pq where pq.processed is null;
|
||||||
--set role scheduler
|
-- Switch to the scheduler role
|
||||||
|
--\echo 'Switch to the scheduler role'
|
||||||
|
--SET ROLE scheduler;
|
||||||
|
-- Should be 24
|
||||||
|
SELECT count(*) as jobs from public.process_queue pq where pq.processed is null;
|
||||||
|
-- Run the cron jobs
|
||||||
SELECT public.run_cron_jobs();
|
SELECT public.run_cron_jobs();
|
||||||
-- Check any pending job
|
-- Check any pending job
|
||||||
SELECT count(*) as any_pending_jobs from public.process_queue pq where pq.processed is null;
|
SELECT count(*) as any_pending_jobs from public.process_queue pq where pq.processed is null;
|
||||||
|
@@ -7,7 +7,10 @@ You are now connected to database "signalk" as user "username".
|
|||||||
Expanded display is on.
|
Expanded display is on.
|
||||||
Check the number of process pending
|
Check the number of process pending
|
||||||
-[ RECORD 1 ]
|
-[ RECORD 1 ]
|
||||||
jobs | 24
|
jobs | 26
|
||||||
|
|
||||||
|
-[ RECORD 1 ]
|
||||||
|
jobs | 26
|
||||||
|
|
||||||
-[ RECORD 1 ]-+-
|
-[ RECORD 1 ]-+-
|
||||||
run_cron_jobs |
|
run_cron_jobs |
|
||||||
|
@@ -20,7 +20,7 @@ SELECT current_user, current_setting('user.email', true), current_setting('vesse
|
|||||||
--SELECT a.pass,v.name,m.client_id FROM auth.accounts a JOIN auth.vessels v ON a.email = 'demo+kapla@openplotter.cloud' AND a.role = 'user_role' AND cast(a.preferences->>'email_valid' as Boolean) = True AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id;
|
--SELECT a.pass,v.name,m.client_id FROM auth.accounts a JOIN auth.vessels v ON a.email = 'demo+kapla@openplotter.cloud' AND a.role = 'user_role' AND cast(a.preferences->>'email_valid' as Boolean) = True AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id;
|
||||||
--SELECT a.pass,v.name,m.client_id FROM auth.accounts a JOIN auth.vessels v ON a.email = 'demo+kapla@openplotter.cloud' AND a.role = 'user_role' AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id;
|
--SELECT a.pass,v.name,m.client_id FROM auth.accounts a JOIN auth.vessels v ON a.email = 'demo+kapla@openplotter.cloud' AND a.role = 'user_role' AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id;
|
||||||
\echo 'link vessel and user based on current_setting'
|
\echo 'link vessel and user based on current_setting'
|
||||||
SELECT v.name,m.client_id FROM auth.accounts a JOIN auth.vessels v ON a.role = 'user_role' AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id ORDER BY a.id DESC;
|
SELECT v.name, m.vessel_id IS NOT NULL AS vessel_id FROM auth.accounts a JOIN auth.vessels v ON a.role = 'user_role' AND v.owner_email = a.email JOIN api.metadata m ON m.vessel_id = v.vessel_id ORDER BY a.id DESC;
|
||||||
|
|
||||||
\echo 'auth.accounts details'
|
\echo 'auth.accounts details'
|
||||||
SELECT a.user_id IS NOT NULL AS user_id, a.email, a.first, a.last, a.pass IS NOT NULL AS pass, a.role, a.preferences->'telegram'->'chat' AS telegram, a.preferences->'pushover_user_key' AS pushover_user_key FROM auth.accounts AS a ORDER BY a.id DESC;
|
SELECT a.user_id IS NOT NULL AS user_id, a.email, a.first, a.last, a.pass IS NOT NULL AS pass, a.role, a.preferences->'telegram'->'chat' AS telegram, a.preferences->'pushover_user_key' AS pushover_user_key FROM auth.accounts AS a ORDER BY a.id DESC;
|
||||||
@@ -29,7 +29,7 @@ SELECT a.user_id IS NOT NULL AS user_id, a.email, a.first, a.last, a.pass IS NOT
|
|||||||
SELECT v.vessel_id IS NOT NULL AS vessel_id, v.owner_email, v.mmsi, v.name, v.role FROM auth.vessels AS v;
|
SELECT v.vessel_id IS NOT NULL AS vessel_id, v.owner_email, v.mmsi, v.name, v.role FROM auth.vessels AS v;
|
||||||
\echo 'api.metadata details'
|
\echo 'api.metadata details'
|
||||||
--
|
--
|
||||||
SELECT m.id, m.name, m.mmsi, m.client_id, m.length, m.beam, m.height, m.ship_type, m.plugin_version, m.signalk_version, m.time IS NOT NULL AS time, m.active FROM api.metadata AS m;
|
SELECT vessel_id IS NOT NULL AS vessel_id_not_null, m.name, m.mmsi, m.length, m.beam, m.height, m.ship_type, m.plugin_version, m.signalk_version, m.time IS NOT NULL AS time, m.active, configuration IS NOT NULL AS configuration_not_null, available_keys FROM api.metadata AS m ORDER BY m.name DESC;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- grafana
|
-- grafana
|
||||||
@@ -48,14 +48,14 @@ SELECT set_config('vessel.id', :'vessel_id', false) IS NOT NULL as vessel_id;
|
|||||||
--SELECT current_user, current_setting('user.email', true), current_setting('vessel.client_id', true), current_setting('vessel.id', true);
|
--SELECT current_user, current_setting('user.email', true), current_setting('vessel.client_id', true), current_setting('vessel.id', true);
|
||||||
SELECT current_user, current_setting('user.email', true);
|
SELECT current_user, current_setting('user.email', true);
|
||||||
|
|
||||||
SELECT v.name AS __text, m.client_id AS __value FROM auth.vessels v JOIN api.metadata m ON v.owner_email = 'demo+kapla@openplotter.cloud' and m.vessel_id = v.vessel_id;
|
SELECT v.name AS __text, m.vessel_id IS NOT NULL AS __value FROM auth.vessels v JOIN api.metadata m ON v.owner_email = 'demo+kapla@openplotter.cloud' and m.vessel_id = v.vessel_id;
|
||||||
|
|
||||||
\echo 'auth.vessels details'
|
\echo 'auth.vessels details'
|
||||||
--SELECT * FROM auth.vessels v;
|
--SELECT * FROM auth.vessels v;
|
||||||
SELECT v.vessel_id IS NOT NULL AS vessel_id, v.owner_email, v.mmsi, v.name, v.role FROM auth.vessels AS v;
|
SELECT v.vessel_id IS NOT NULL AS vessel_id, v.owner_email, v.mmsi, v.name, v.role FROM auth.vessels AS v;
|
||||||
--SELECT * FROM api.metadata m;
|
--SELECT * FROM api.metadata m;
|
||||||
\echo 'api.metadata details'
|
\echo 'api.metadata details'
|
||||||
SELECT m.id, m.name, m.mmsi, m.client_id, m.length, m.beam, m.height, m.ship_type, m.plugin_version, m.signalk_version, m.time IS NOT NULL AS time, m.active FROM api.metadata AS m;
|
SELECT vessel_id IS NOT NULL AS vessel_id_not_null, m.name, m.mmsi, m.length, m.beam, m.height, m.ship_type, m.plugin_version, m.signalk_version, m.time IS NOT NULL AS time, m.active, configuration IS NOT NULL AS configuration_not_null, available_keys FROM api.metadata AS m;
|
||||||
|
|
||||||
\echo 'api.logs_view'
|
\echo 'api.logs_view'
|
||||||
--SELECT * FROM api.logbook l;
|
--SELECT * FROM api.logbook l;
|
||||||
|
@@ -13,12 +13,12 @@ current_setting |
|
|||||||
current_setting |
|
current_setting |
|
||||||
|
|
||||||
link vessel and user based on current_setting
|
link vessel and user based on current_setting
|
||||||
-[ RECORD 1 ]----------------------------------------------------------------
|
-[ RECORD 1 ]----
|
||||||
name | aava
|
name | aava
|
||||||
client_id | vessels.urn:mrn:imo:mmsi:787654321
|
vessel_id | t
|
||||||
-[ RECORD 2 ]----------------------------------------------------------------
|
-[ RECORD 2 ]----
|
||||||
name | kapla
|
name | kapla
|
||||||
client_id | vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd
|
vessel_id | t
|
||||||
|
|
||||||
auth.accounts details
|
auth.accounts details
|
||||||
-[ RECORD 1 ]-----+-----------------------------
|
-[ RECORD 1 ]-----+-----------------------------
|
||||||
@@ -55,32 +55,34 @@ name | aava
|
|||||||
role | vessel_role
|
role | vessel_role
|
||||||
|
|
||||||
api.metadata details
|
api.metadata details
|
||||||
-[ RECORD 1 ]---+------------------------------------------------------------------
|
-[ RECORD 1 ]----------+----------------
|
||||||
id | 1
|
vessel_id_not_null | t
|
||||||
name | kapla
|
name | kapla
|
||||||
mmsi | 123456789
|
mmsi | 123456789
|
||||||
client_id | vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd
|
length | 12
|
||||||
length | 12
|
beam | 10
|
||||||
beam | 10
|
height | 24
|
||||||
height | 24
|
ship_type | 36
|
||||||
ship_type | 36
|
plugin_version | 0.0.1
|
||||||
plugin_version | 0.0.1
|
signalk_version | signalk_version
|
||||||
signalk_version | signalk_version
|
time | t
|
||||||
time | t
|
active | t
|
||||||
active | t
|
configuration_not_null | t
|
||||||
-[ RECORD 2 ]---+------------------------------------------------------------------
|
available_keys |
|
||||||
id | 2
|
-[ RECORD 2 ]----------+----------------
|
||||||
name | aava
|
vessel_id_not_null | t
|
||||||
mmsi | 787654321
|
name | aava
|
||||||
client_id | vessels.urn:mrn:imo:mmsi:787654321
|
mmsi | 787654321
|
||||||
length | 12
|
length | 12
|
||||||
beam | 10
|
beam | 10
|
||||||
height | 24
|
height | 24
|
||||||
ship_type | 37
|
ship_type | 37
|
||||||
plugin_version | 1.0.2
|
plugin_version | 1.0.2
|
||||||
signalk_version | 1.20.0
|
signalk_version | 1.20.0
|
||||||
time | t
|
time | t
|
||||||
active | t
|
active | t
|
||||||
|
configuration_not_null | t
|
||||||
|
available_keys | []
|
||||||
|
|
||||||
SET
|
SET
|
||||||
ROLE grafana current_setting
|
ROLE grafana current_setting
|
||||||
@@ -93,9 +95,9 @@ vessel_id | t
|
|||||||
current_user | grafana
|
current_user | grafana
|
||||||
current_setting | demo+kapla@openplotter.cloud
|
current_setting | demo+kapla@openplotter.cloud
|
||||||
|
|
||||||
-[ RECORD 1 ]--------------------------------------------------------------
|
-[ RECORD 1 ]--
|
||||||
__text | kapla
|
__text | kapla
|
||||||
__value | vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd
|
__value | t
|
||||||
|
|
||||||
auth.vessels details
|
auth.vessels details
|
||||||
-[ RECORD 1 ]-----------------------------
|
-[ RECORD 1 ]-----------------------------
|
||||||
@@ -106,19 +108,20 @@ name | kapla
|
|||||||
role | vessel_role
|
role | vessel_role
|
||||||
|
|
||||||
api.metadata details
|
api.metadata details
|
||||||
-[ RECORD 1 ]---+------------------------------------------------------------------
|
-[ RECORD 1 ]----------+----------------
|
||||||
id | 1
|
vessel_id_not_null | t
|
||||||
name | kapla
|
name | kapla
|
||||||
mmsi | 123456789
|
mmsi | 123456789
|
||||||
client_id | vessels.urn:mrn:signalk:uuid:5b4f7543-7153-4840-b139-761310b242fd
|
length | 12
|
||||||
length | 12
|
beam | 10
|
||||||
beam | 10
|
height | 24
|
||||||
height | 24
|
ship_type | 36
|
||||||
ship_type | 36
|
plugin_version | 0.0.1
|
||||||
plugin_version | 0.0.1
|
signalk_version | signalk_version
|
||||||
signalk_version | signalk_version
|
time | t
|
||||||
time | t
|
active | t
|
||||||
active | t
|
configuration_not_null | t
|
||||||
|
available_keys |
|
||||||
|
|
||||||
api.logs_view
|
api.logs_view
|
||||||
-[ RECORD 1 ]----+-----------------------
|
-[ RECORD 1 ]----+-----------------------
|
||||||
|
84
tests/sql/metadata.sql
Normal file
84
tests/sql/metadata.sql
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
---------------------------------------------------------------------------
|
||||||
|
-- Listing
|
||||||
|
--
|
||||||
|
|
||||||
|
-- List current database
|
||||||
|
select current_database();
|
||||||
|
|
||||||
|
-- connect to the DB
|
||||||
|
\c signalk
|
||||||
|
|
||||||
|
-- output display format
|
||||||
|
\x on
|
||||||
|
|
||||||
|
SELECT count(*) as count_eq_2 FROM api.metadata m;
|
||||||
|
|
||||||
|
SELECT v.vessel_id as "vessel_id" FROM auth.vessels v WHERE v.owner_email = 'demo+kapla@openplotter.cloud' \gset
|
||||||
|
--\echo :"vessel_id"
|
||||||
|
SELECT set_config('vessel.id', :'vessel_id', false) IS NOT NULL as vessel_id;
|
||||||
|
|
||||||
|
-- user_role
|
||||||
|
SET ROLE user_role;
|
||||||
|
|
||||||
|
\echo 'api.metadata details'
|
||||||
|
SELECT vessel_id IS NOT NULL AS vessel_id_not_null, m.name, m.mmsi, m.length, m.beam, m.height, m.ship_type, m.plugin_version, m.signalk_version, m.time IS NOT NULL AS time, m.active, configuration, available_keys FROM api.metadata AS m ORDER BY m.name ASC;
|
||||||
|
|
||||||
|
\echo 'api.metadata get configuration'
|
||||||
|
select configuration from api.metadata; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
\echo 'api.metadata update configuration'
|
||||||
|
UPDATE api.metadata SET configuration = '{ "depthKey": "environment.depth.belowTransducer" }'; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
\echo 'api.metadata get configuration with new value'
|
||||||
|
select configuration->'depthKey' AS depthKey, configuration->'update_at' IS NOT NULL AS update_at_not_null from api.metadata; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
\echo 'api.metadata get configuration base on update_at value'
|
||||||
|
select configuration->'depthKey' AS depthKey, configuration->'update_at' IS NOT NULL AS update_at_not_null from api.metadata WHERE vessel_id = current_setting('vessel.id', false) AND configuration->>'update_at' <= to_char(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS"Z"');
|
||||||
|
|
||||||
|
-- Upsert make_model on metadata_ext table
|
||||||
|
\echo 'api.metadata_ext set make_model'
|
||||||
|
INSERT INTO api.metadata_ext (vessel_id, make_model)
|
||||||
|
VALUES (current_setting('vessel.id', false), 'my super yacht')
|
||||||
|
ON CONFLICT (vessel_id) DO UPDATE
|
||||||
|
SET make_model = EXCLUDED.make_model;
|
||||||
|
|
||||||
|
-- Upsert polar on metadata_ext table
|
||||||
|
\echo 'api.metadata_ext set polar'
|
||||||
|
INSERT INTO api.metadata_ext (vessel_id, polar)
|
||||||
|
VALUES (current_setting('vessel.id', false), 'twa/tws;4;6;8;10;12;14;16;20;24\n0;0;0;0;0;0;0;0;0;0')
|
||||||
|
ON CONFLICT (vessel_id) DO UPDATE
|
||||||
|
SET polar = EXCLUDED.polar;
|
||||||
|
|
||||||
|
-- Upsert image on metadata_ext table
|
||||||
|
\echo 'api.metadata_ext set image/image_b64'
|
||||||
|
INSERT INTO api.metadata_ext (vessel_id, image_b64)
|
||||||
|
VALUES (current_setting('vessel.id', false), 'iVBORw0KGgoAAAANSUhEUgAAAMgAAAAyCAIAAACWMwO2AAABNklEQVR4nO3bwY6CMBiF0XYy7//KzIKk6VBjiMMNk59zVljRIH6WsrBv29bgal93HwA1CYsIYREhLCKERYSwiBAWEcIiQlhECIsIYREhLCKERYSwiBAWEcIiQlhECIsIYREhLCK+7z6A/6j33lq75G8m')
|
||||||
|
ON CONFLICT (vessel_id) DO UPDATE
|
||||||
|
SET image_b64 = EXCLUDED.image_b64;
|
||||||
|
|
||||||
|
-- Ensure make_model on metadata_ext table is updated
|
||||||
|
\echo 'api.metadata_ext get make_model'
|
||||||
|
SELECT make_model FROM api.metadata_ext; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
-- Ensure polar_updated_at on metadata_ext table is updated by trigger
|
||||||
|
\echo 'api.metadata_ext get polar_updated_at'
|
||||||
|
SELECT polar,polar_updated_at IS NOT NULL AS polar_updated_at_not_null FROM api.metadata_ext; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
-- Ensure image_updated_at on metadata_ext table is updated by trigger
|
||||||
|
\echo 'api.metadata_ext get image_updated_at'
|
||||||
|
SELECT image_b64 IS NULL AS image_b64_is_null,image IS NOT NULL AS image_not_null,image_updated_at IS NOT NULL AS image_updated_at_not_null FROM api.metadata_ext; --WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
-- vessel_role
|
||||||
|
SET ROLE vessel_role;
|
||||||
|
|
||||||
|
\echo 'api.metadata get configuration with new value as vessel'
|
||||||
|
select configuration->'depthKey' AS depthKey, configuration->'update_at' IS NOT NULL AS update_at_not_null from api.metadata; -- WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
|
||||||
|
\echo 'api.metadata get configuration base on update_at value as vessel'
|
||||||
|
select configuration->'depthKey' AS depthKey, configuration->'update_at' IS NOT NULL AS update_at_not_null from api.metadata WHERE vessel_id = current_setting('vessel.id', false) AND configuration->>'update_at' <= to_char(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS"Z"');
|
||||||
|
|
||||||
|
-- api_anonymous
|
||||||
|
SET ROLE api_anonymous;
|
||||||
|
|
||||||
|
\echo 'api_anonymous get vessel image'
|
||||||
|
SELECT api.vessel_image(current_setting('vessel.id', false)) IS NOT NULL AS vessel_image_not_null;
|
83
tests/sql/metadata.sql.output
Normal file
83
tests/sql/metadata.sql.output
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
current_database
|
||||||
|
------------------
|
||||||
|
signalk
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
You are now connected to database "signalk" as user "username".
|
||||||
|
Expanded display is on.
|
||||||
|
-[ RECORD 1 ]-
|
||||||
|
count_eq_2 | 2
|
||||||
|
|
||||||
|
-[ RECORD 1 ]
|
||||||
|
vessel_id | t
|
||||||
|
|
||||||
|
SET
|
||||||
|
api.metadata details
|
||||||
|
-[ RECORD 1 ]------+----------------
|
||||||
|
vessel_id_not_null | t
|
||||||
|
name | kapla
|
||||||
|
mmsi | 123456789
|
||||||
|
length | 12
|
||||||
|
beam | 10
|
||||||
|
height | 24
|
||||||
|
ship_type | 36
|
||||||
|
plugin_version | 0.0.1
|
||||||
|
signalk_version | signalk_version
|
||||||
|
time | t
|
||||||
|
active | t
|
||||||
|
configuration |
|
||||||
|
available_keys |
|
||||||
|
|
||||||
|
api.metadata get configuration
|
||||||
|
-[ RECORD 1 ]-+-
|
||||||
|
configuration |
|
||||||
|
|
||||||
|
api.metadata update configuration
|
||||||
|
UPDATE 1
|
||||||
|
api.metadata get configuration with new value
|
||||||
|
-[ RECORD 1 ]------+------------------------------------
|
||||||
|
depthkey | "environment.depth.belowTransducer"
|
||||||
|
update_at_not_null | t
|
||||||
|
|
||||||
|
api.metadata get configuration base on update_at value
|
||||||
|
-[ RECORD 1 ]------+------------------------------------
|
||||||
|
depthkey | "environment.depth.belowTransducer"
|
||||||
|
update_at_not_null | t
|
||||||
|
|
||||||
|
api.metadata_ext set make_model
|
||||||
|
INSERT 0 1
|
||||||
|
api.metadata_ext set polar
|
||||||
|
INSERT 0 1
|
||||||
|
api.metadata_ext set image/image_b64
|
||||||
|
INSERT 0 1
|
||||||
|
api.metadata_ext get make_model
|
||||||
|
-[ RECORD 1 ]--------------
|
||||||
|
make_model | my super yacht
|
||||||
|
|
||||||
|
api.metadata_ext get polar_updated_at
|
||||||
|
-[ RECORD 1 ]-------------+-----------------------------------------------------
|
||||||
|
polar | twa/tws;4;6;8;10;12;14;16;20;24\n0;0;0;0;0;0;0;0;0;0
|
||||||
|
polar_updated_at_not_null | t
|
||||||
|
|
||||||
|
api.metadata_ext get image_updated_at
|
||||||
|
-[ RECORD 1 ]-------------+--
|
||||||
|
image_b64_is_null | f
|
||||||
|
image_not_null | t
|
||||||
|
image_updated_at_not_null | t
|
||||||
|
|
||||||
|
SET
|
||||||
|
api.metadata get configuration with new value as vessel
|
||||||
|
-[ RECORD 1 ]------+------------------------------------
|
||||||
|
depthkey | "environment.depth.belowTransducer"
|
||||||
|
update_at_not_null | t
|
||||||
|
|
||||||
|
api.metadata get configuration base on update_at value as vessel
|
||||||
|
-[ RECORD 1 ]------+------------------------------------
|
||||||
|
depthkey | "environment.depth.belowTransducer"
|
||||||
|
update_at_not_null | t
|
||||||
|
|
||||||
|
SET
|
||||||
|
api_anonymous get vessel image
|
||||||
|
-[ RECORD 1 ]---------+--
|
||||||
|
vessel_image_not_null | t
|
||||||
|
|
@@ -67,7 +67,21 @@ SELECT set_config('vessel.id', :'vessel_id_kapla', false) IS NOT NULL as vessel_
|
|||||||
|
|
||||||
-- Export timelapse as Geometry LineString from a trip
|
-- Export timelapse as Geometry LineString from a trip
|
||||||
\echo 'Export timelapse as Geometry LineString from a trip'
|
\echo 'Export timelapse as Geometry LineString from a trip'
|
||||||
SELECT api.export_logbooks_geojson_linestring_trips_fn(1,2) FROM api.logbook WHERE vessel_id = current_setting('vessel.id', false);
|
--SELECT api.export_logbooks_geojson_linestring_trips_fn(1,2) FROM api.logbook WHERE vessel_id = current_setting('vessel.id', false);
|
||||||
|
-- Test geometry_type and num_properties
|
||||||
|
-- propoerties include endtimestamp and starttimestamp
|
||||||
|
WITH geojson_output AS (
|
||||||
|
SELECT api.export_logbooks_geojson_linestring_trips_fn(1, 2) AS geojson
|
||||||
|
FROM api.logbook
|
||||||
|
WHERE vessel_id = current_setting('vessel.id', false)
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
--geojson
|
||||||
|
geojson->'features'->0->'geometry'->>'type' AS geometry_type,
|
||||||
|
--jsonb_array_length(jsonb_object_keys(geojson->'features'->0->'properties')::JSONB),
|
||||||
|
--jsonb_array_length(jsonb_object_keys(geojson->'features')) AS num_geometry,
|
||||||
|
(SELECT COUNT(*) FROM jsonb_object_keys(geojson->'features'->0->'properties')) AS num_properties
|
||||||
|
FROM geojson_output;
|
||||||
|
|
||||||
-- Export timelapse as Geometry Point from a trip
|
-- Export timelapse as Geometry Point from a trip
|
||||||
\echo 'Export timelapse as Geometry Point from a trip'
|
\echo 'Export timelapse as Geometry Point from a trip'
|
||||||
|
@@ -52,8 +52,9 @@ Export KML from a trip
|
|||||||
vessel_id | t
|
vessel_id | t
|
||||||
|
|
||||||
Export timelapse as Geometry LineString from a trip
|
Export timelapse as Geometry LineString from a trip
|
||||||
-[ RECORD 1 ]-------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 1 ]--+-----------
|
||||||
export_logbooks_geojson_linestring_trips_fn | {"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "LineString", "coordinates": [[23.530866667, 60.077666667], [23.52355, 60.07065], [23.515866667, 60.0637], [23.507866667, 60.056716667], [23.500533333, 60.04915], [23.493, 60.041633333], [23.485466667, 60.033983333], [23.479033333, 60.026216667], [23.47295, 60.01835], [23.461033333, 60.003516667], [23.45415, 59.99755], [23.445683333, 59.99235], [23.438766667, 59.989266667], [23.435116667, 59.987866667], [23.43165, 59.986333333], [23.4292, 59.984833333], [23.432566667, 59.9862], [23.43375, 59.987266667], [23.431566667, 59.98615], [23.4307, 59.98565], [23.429383333, 59.984683333], [23.421066667, 59.978233333], [23.431, 59.977716667], [23.432133333, 59.976883333], [23.4321, 59.976883333], [23.425533333, 59.9781], [23.41165, 59.9738], [23.401383333, 59.967], [23.395816667, 59.958866667], [23.390166667, 59.9508], [23.38365, 59.94275], [23.37245, 59.935783333], [23.3572, 59.930766667], [23.33415, 59.918933333], [23.327433333, 59.9114], [23.329966667, 59.90315], [23.3428, 59.89735], [23.3492, 59.889533333], [23.345833333, 59.881266667], [23.344066667, 59.872783333], [23.355716667, 59.866616667], [23.365766667, 59.86]]}, "properties": {}}]}
|
geometry_type | LineString
|
||||||
|
num_properties | 35
|
||||||
|
|
||||||
Export timelapse as Geometry Point from a trip
|
Export timelapse as Geometry Point from a trip
|
||||||
-[ RECORD 1 ]
|
-[ RECORD 1 ]
|
||||||
|
@@ -6,10 +6,10 @@
|
|||||||
You are now connected to database "signalk" as user "username".
|
You are now connected to database "signalk" as user "username".
|
||||||
Expanded display is on.
|
Expanded display is on.
|
||||||
-[ RECORD 1 ]--+-------------------------------
|
-[ RECORD 1 ]--+-------------------------------
|
||||||
server_version | 16.6 (Debian 16.6-1.pgdg120+1)
|
server_version | 16.9 (Debian 16.9-1.pgdg120+1)
|
||||||
|
|
||||||
-[ RECORD 1 ]--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 1 ]--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
postgis_full_version | POSTGIS="3.5.1 48ab069" [EXTENSION] PGSQL="160" GEOS="3.11.1-CAPI-1.17.1" PROJ="9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/var/lib/postgresql/.local/share/proj DATABASE_PATH=/usr/share/proj/proj.db" (compiled against PROJ 9.1.1) LIBXML="2.9.14" LIBJSON="0.16" LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)"
|
postgis_full_version | POSTGIS="3.5.3 aab5f55" [EXTENSION] PGSQL="160" GEOS="3.11.1-CAPI-1.17.1" PROJ="9.1.1 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/var/lib/postgresql/.local/share/proj DATABASE_PATH=/usr/share/proj/proj.db" (compiled against PROJ 9.1.1) LIBXML="2.9.14" LIBJSON="0.16" LIBPROTOBUF="1.4.1" WAGYU="0.5.0 (Internal)"
|
||||||
|
|
||||||
-[ RECORD 1 ]--------------------------------------------------------------------------------------
|
-[ RECORD 1 ]--------------------------------------------------------------------------------------
|
||||||
Name | citext
|
Name | citext
|
||||||
@@ -53,15 +53,20 @@ Schema | pg_catalog
|
|||||||
Description | PL/Python3U untrusted procedural language
|
Description | PL/Python3U untrusted procedural language
|
||||||
-[ RECORD 9 ]--------------------------------------------------------------------------------------
|
-[ RECORD 9 ]--------------------------------------------------------------------------------------
|
||||||
Name | postgis
|
Name | postgis
|
||||||
Version | 3.5.1
|
Version | 3.5.3
|
||||||
Schema | public
|
Schema | public
|
||||||
Description | PostGIS geometry and geography spatial types and functions
|
Description | PostGIS geometry and geography spatial types and functions
|
||||||
-[ RECORD 10 ]-------------------------------------------------------------------------------------
|
-[ RECORD 10 ]-------------------------------------------------------------------------------------
|
||||||
Name | timescaledb
|
Name | timescaledb
|
||||||
Version | 2.17.2
|
Version | 2.20.3
|
||||||
Schema | public
|
Schema | public
|
||||||
Description | Enables scalable inserts and complex queries for time-series data (Community Edition)
|
Description | Enables scalable inserts and complex queries for time-series data (Community Edition)
|
||||||
-[ RECORD 11 ]-------------------------------------------------------------------------------------
|
-[ RECORD 11 ]-------------------------------------------------------------------------------------
|
||||||
|
Name | timescaledb_toolkit
|
||||||
|
Version | 1.21.0
|
||||||
|
Schema | public
|
||||||
|
Description | Library of analytical hyperfunctions, time-series pipelining, and other SQL utilities
|
||||||
|
-[ RECORD 12 ]-------------------------------------------------------------------------------------
|
||||||
Name | uuid-ossp
|
Name | uuid-ossp
|
||||||
Version | 1.1
|
Version | 1.1
|
||||||
Schema | public
|
Schema | public
|
||||||
@@ -111,14 +116,14 @@ laninline | 13566
|
|||||||
lanvalidator | 13567
|
lanvalidator | 13567
|
||||||
lanacl |
|
lanacl |
|
||||||
-[ RECORD 5 ]-+-----------
|
-[ RECORD 5 ]-+-----------
|
||||||
oid | 18190
|
oid | 18245
|
||||||
lanname | plpython3u
|
lanname | plpython3u
|
||||||
lanowner | 10
|
lanowner | 10
|
||||||
lanispl | t
|
lanispl | t
|
||||||
lanpltrusted | t
|
lanpltrusted | t
|
||||||
lanplcallfoid | 18187
|
lanplcallfoid | 18242
|
||||||
laninline | 18188
|
laninline | 18243
|
||||||
lanvalidator | 18189
|
lanvalidator | 18244
|
||||||
lanacl |
|
lanacl |
|
||||||
|
|
||||||
-[ RECORD 1 ]+-----------
|
-[ RECORD 1 ]+-----------
|
||||||
@@ -214,18 +219,22 @@ Name | spatial_ref_sys
|
|||||||
Type | table
|
Type | table
|
||||||
Owner | username
|
Owner | username
|
||||||
|
|
||||||
-[ RECORD 1 ]--------
|
-[ RECORD 1 ]------------
|
||||||
schema_api | logbook
|
schema_api | logbook
|
||||||
-[ RECORD 2 ]--------
|
-[ RECORD 2 ]------------
|
||||||
schema_api | metadata
|
schema_api | metadata
|
||||||
-[ RECORD 3 ]--------
|
-[ RECORD 3 ]------------
|
||||||
|
schema_api | metadata_ext
|
||||||
|
-[ RECORD 4 ]------------
|
||||||
schema_api | metrics
|
schema_api | metrics
|
||||||
-[ RECORD 4 ]--------
|
-[ RECORD 5 ]------------
|
||||||
schema_api | moorages
|
schema_api | moorages
|
||||||
-[ RECORD 5 ]--------
|
-[ RECORD 6 ]------------
|
||||||
schema_api | stays
|
schema_api | stays
|
||||||
-[ RECORD 6 ]--------
|
-[ RECORD 7 ]------------
|
||||||
schema_api | stays_at
|
schema_api | stays_at
|
||||||
|
-[ RECORD 8 ]------------
|
||||||
|
schema_api | stays_ext
|
||||||
|
|
||||||
-[ RECORD 1 ]-+------------------------------
|
-[ RECORD 1 ]-+------------------------------
|
||||||
schema_public | aistypes
|
schema_public | aistypes
|
||||||
@@ -274,31 +283,13 @@ with_check | true
|
|||||||
-[ RECORD 2 ]------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 2 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metadata
|
tablename | metadata
|
||||||
policyname | api_vessel_role
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {vessel_role}
|
|
||||||
cmd | ALL
|
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
|
||||||
with_check | true
|
|
||||||
-[ RECORD 3 ]------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | api
|
|
||||||
tablename | metadata
|
|
||||||
policyname | api_user_role
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {user_role}
|
|
||||||
cmd | ALL
|
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
|
||||||
-[ RECORD 4 ]------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | api
|
|
||||||
tablename | metadata
|
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
permissive | PERMISSIVE
|
permissive | PERMISSIVE
|
||||||
roles | {scheduler}
|
roles | {scheduler}
|
||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 5 ]------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 3 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metadata
|
tablename | metadata
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -307,7 +298,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 6 ]------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 4 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metadata
|
tablename | metadata
|
||||||
policyname | grafana_proxy_role
|
policyname | grafana_proxy_role
|
||||||
@@ -316,52 +307,34 @@ roles | {grafana_auth}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | false
|
with_check | false
|
||||||
|
-[ RECORD 5 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metrics
|
||||||
|
policyname | admin_all
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {username}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | true
|
||||||
|
-[ RECORD 6 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | auth
|
||||||
|
tablename | vessels
|
||||||
|
policyname | grafana_proxy_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {grafana_auth}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | false
|
||||||
-[ RECORD 7 ]------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 7 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metrics
|
tablename | metrics
|
||||||
policyname | admin_all
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {username}
|
|
||||||
cmd | ALL
|
|
||||||
qual | true
|
|
||||||
with_check | true
|
|
||||||
-[ RECORD 8 ]------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | api
|
|
||||||
tablename | metrics
|
|
||||||
policyname | api_vessel_role
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {vessel_role}
|
|
||||||
cmd | ALL
|
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
|
||||||
with_check | true
|
|
||||||
-[ RECORD 9 ]------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | auth
|
|
||||||
tablename | vessels
|
|
||||||
policyname | grafana_proxy_role
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {grafana_auth}
|
|
||||||
cmd | ALL
|
|
||||||
qual | true
|
|
||||||
with_check | false
|
|
||||||
-[ RECORD 10 ]-----------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | api
|
|
||||||
tablename | metrics
|
|
||||||
policyname | api_user_role
|
|
||||||
permissive | PERMISSIVE
|
|
||||||
roles | {user_role}
|
|
||||||
cmd | ALL
|
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
|
||||||
-[ RECORD 11 ]-----------------------------------------------------------------------------------------------------------------------------
|
|
||||||
schemaname | api
|
|
||||||
tablename | metrics
|
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
permissive | PERMISSIVE
|
permissive | PERMISSIVE
|
||||||
roles | {scheduler}
|
roles | {scheduler}
|
||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 12 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 8 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metrics
|
tablename | metrics
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -370,7 +343,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 13 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 9 ]------------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | metrics
|
tablename | metrics
|
||||||
policyname | api_anonymous_role
|
policyname | api_anonymous_role
|
||||||
@@ -379,7 +352,7 @@ roles | {api_anonymous}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 14 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 10 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -388,7 +361,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 15 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 11 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | api_vessel_role
|
policyname | api_vessel_role
|
||||||
@@ -397,7 +370,7 @@ roles | {vessel_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 16 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 12 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | accounts
|
tablename | accounts
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -406,7 +379,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 17 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 13 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -415,7 +388,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 18 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 14 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
@@ -424,7 +397,7 @@ roles | {scheduler}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 19 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 15 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -433,7 +406,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 20 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 16 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | api_anonymous_role
|
policyname | api_anonymous_role
|
||||||
@@ -442,7 +415,7 @@ roles | {api_anonymous}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 21 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 17 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -451,7 +424,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 22 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 18 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | api_vessel_role
|
policyname | api_vessel_role
|
||||||
@@ -460,7 +433,7 @@ roles | {vessel_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 23 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 19 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | logbook
|
tablename | logbook
|
||||||
policyname | logbook_qgis_role
|
policyname | logbook_qgis_role
|
||||||
@@ -469,7 +442,7 @@ roles | {qgis_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 24 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 20 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | public
|
schemaname | public
|
||||||
tablename | process_queue
|
tablename | process_queue
|
||||||
policyname | public_maplapse_role
|
policyname | public_maplapse_role
|
||||||
@@ -478,7 +451,7 @@ roles | {maplapse_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 25 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 21 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -487,7 +460,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 26 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 22 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
@@ -496,7 +469,7 @@ roles | {scheduler}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 27 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 23 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -505,7 +478,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 28 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 24 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | stays
|
tablename | stays
|
||||||
policyname | api_anonymous_role
|
policyname | api_anonymous_role
|
||||||
@@ -514,7 +487,7 @@ roles | {api_anonymous}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 29 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 25 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -523,7 +496,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 30 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 26 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | api_vessel_role
|
policyname | api_vessel_role
|
||||||
@@ -532,7 +505,16 @@ roles | {vessel_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 31 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 27 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | stays_ext
|
||||||
|
policyname | admin_all
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {username}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | true
|
||||||
|
-[ RECORD 28 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -541,7 +523,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
qual | (vessel_id = current_setting('vessel.id'::text, true))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 32 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 29 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
@@ -550,7 +532,7 @@ roles | {scheduler}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
-[ RECORD 33 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 30 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -559,7 +541,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 34 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 31 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | api
|
schemaname | api
|
||||||
tablename | moorages
|
tablename | moorages
|
||||||
policyname | api_anonymous_role
|
policyname | api_anonymous_role
|
||||||
@@ -568,7 +550,7 @@ roles | {api_anonymous}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 35 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 32 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | vessels
|
tablename | vessels
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -577,7 +559,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 36 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 33 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | vessels
|
tablename | vessels
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -586,7 +568,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((vessel_id = current_setting('vessel.id'::text, true)) AND ((owner_email)::text = current_setting('user.email'::text, true)))
|
qual | ((vessel_id = current_setting('vessel.id'::text, true)) AND ((owner_email)::text = current_setting('user.email'::text, true)))
|
||||||
with_check | ((vessel_id = current_setting('vessel.id'::text, true)) AND ((owner_email)::text = current_setting('user.email'::text, true)))
|
with_check | ((vessel_id = current_setting('vessel.id'::text, true)) AND ((owner_email)::text = current_setting('user.email'::text, true)))
|
||||||
-[ RECORD 37 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 34 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | vessels
|
tablename | vessels
|
||||||
policyname | grafana_role
|
policyname | grafana_role
|
||||||
@@ -595,7 +577,7 @@ roles | {grafana}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((owner_email)::text = current_setting('user.email'::text, true))
|
qual | ((owner_email)::text = current_setting('user.email'::text, true))
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 38 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 35 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | accounts
|
tablename | accounts
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -604,7 +586,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((email)::text = current_setting('user.email'::text, true))
|
qual | ((email)::text = current_setting('user.email'::text, true))
|
||||||
with_check | ((email)::text = current_setting('user.email'::text, true))
|
with_check | ((email)::text = current_setting('user.email'::text, true))
|
||||||
-[ RECORD 39 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 36 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | accounts
|
tablename | accounts
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
@@ -613,7 +595,7 @@ roles | {scheduler}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((email)::text = current_setting('user.email'::text, true))
|
qual | ((email)::text = current_setting('user.email'::text, true))
|
||||||
with_check | ((email)::text = current_setting('user.email'::text, true))
|
with_check | ((email)::text = current_setting('user.email'::text, true))
|
||||||
-[ RECORD 40 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 37 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | auth
|
schemaname | auth
|
||||||
tablename | accounts
|
tablename | accounts
|
||||||
policyname | grafana_proxy_role
|
policyname | grafana_proxy_role
|
||||||
@@ -622,7 +604,7 @@ roles | {grafana_auth}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | false
|
with_check | false
|
||||||
-[ RECORD 41 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 38 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | public
|
schemaname | public
|
||||||
tablename | process_queue
|
tablename | process_queue
|
||||||
policyname | admin_all
|
policyname | admin_all
|
||||||
@@ -631,7 +613,7 @@ roles | {username}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 42 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 39 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | public
|
schemaname | public
|
||||||
tablename | process_queue
|
tablename | process_queue
|
||||||
policyname | api_vessel_role
|
policyname | api_vessel_role
|
||||||
@@ -640,7 +622,7 @@ roles | {vessel_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
qual | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
||||||
with_check | true
|
with_check | true
|
||||||
-[ RECORD 43 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 40 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | public
|
schemaname | public
|
||||||
tablename | process_queue
|
tablename | process_queue
|
||||||
policyname | api_user_role
|
policyname | api_user_role
|
||||||
@@ -649,7 +631,7 @@ roles | {user_role}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
qual | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
||||||
with_check | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
with_check | ((ref_id = current_setting('user.id'::text, true)) OR (ref_id = current_setting('vessel.id'::text, true)))
|
||||||
-[ RECORD 44 ]-----------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 41 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
schemaname | public
|
schemaname | public
|
||||||
tablename | process_queue
|
tablename | process_queue
|
||||||
policyname | api_scheduler_role
|
policyname | api_scheduler_role
|
||||||
@@ -658,6 +640,105 @@ roles | {scheduler}
|
|||||||
cmd | ALL
|
cmd | ALL
|
||||||
qual | true
|
qual | true
|
||||||
with_check | false
|
with_check | false
|
||||||
|
-[ RECORD 42 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | stays_ext
|
||||||
|
policyname | api_user_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {user_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
-[ RECORD 43 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | stays_ext
|
||||||
|
policyname | api_anonymous_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {api_anonymous}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | false
|
||||||
|
-[ RECORD 44 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | stays_ext
|
||||||
|
policyname | api_vessel_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {vessel_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | false
|
||||||
|
with_check | false
|
||||||
|
-[ RECORD 45 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata_ext
|
||||||
|
policyname | admin_all
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {username}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | true
|
||||||
|
-[ RECORD 46 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata_ext
|
||||||
|
policyname | api_user_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {user_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
-[ RECORD 47 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata_ext
|
||||||
|
policyname | api_anonymous_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {api_anonymous}
|
||||||
|
cmd | ALL
|
||||||
|
qual | true
|
||||||
|
with_check | false
|
||||||
|
-[ RECORD 48 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata_ext
|
||||||
|
policyname | api_vessel_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {vessel_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | false
|
||||||
|
with_check | false
|
||||||
|
-[ RECORD 49 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metrics
|
||||||
|
policyname | api_user_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {user_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | false
|
||||||
|
-[ RECORD 50 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metrics
|
||||||
|
policyname | api_vessel_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {vessel_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
-[ RECORD 51 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata
|
||||||
|
policyname | api_vessel_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {vessel_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
-[ RECORD 52 ]-----------------------------------------------------------------------------------------------------------------------------
|
||||||
|
schemaname | api
|
||||||
|
tablename | metadata
|
||||||
|
policyname | api_user_role
|
||||||
|
permissive | PERMISSIVE
|
||||||
|
roles | {user_role}
|
||||||
|
cmd | ALL
|
||||||
|
qual | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
with_check | (vessel_id = current_setting('vessel.id'::text, false))
|
||||||
|
|
||||||
Test nominatim reverse_geocode_py_fn
|
Test nominatim reverse_geocode_py_fn
|
||||||
-[ RECORD 1 ]---------+----------------------------------------
|
-[ RECORD 1 ]---------+----------------------------------------
|
||||||
@@ -671,16 +752,16 @@ overpass_py_fn | {"fee": "yes", "vhf": "09", "name": "Port Olímpic", "phone": "
|
|||||||
-[ RECORD 1 ]--+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 1 ]--+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
overpass_py_fn | {"name": "Port de la Ginesta", "type": "multipolygon", "leisure": "marina", "name:ca": "Port de la Ginesta", "wikidata": "Q16621038", "wikipedia": "ca:Port Ginesta", "check_date": "2024-08-23"}
|
overpass_py_fn | {"name": "Port de la Ginesta", "type": "multipolygon", "leisure": "marina", "name:ca": "Port de la Ginesta", "wikidata": "Q16621038", "wikipedia": "ca:Port Ginesta", "check_date": "2024-08-23"}
|
||||||
|
|
||||||
-[ RECORD 1 ]--+----------------------------------------------
|
-[ RECORD 1 ]--+---------------------------------------------------------------------------------------------------------------
|
||||||
overpass_py_fn | {"name": "Norra hamnen", "leisure": "marina"}
|
overpass_py_fn | {"name": "Norra hamnen", "leisure": "marina", "seamark:type": "harbour", "seamark:harbour:category": "marina"}
|
||||||
|
|
||||||
-[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
versions_fn | {"api_version" : "0.8.1", "sys_version" : "PostgreSQL 16.6", "mobilitydb" : "1.2.0", "timescaledb" : "2.17.2", "postgis" : "3.5.1", "postgrest" : "PostgREST 12.2.3"}
|
versions_fn | {"api_version" : "0.9.2", "sys_version" : "PostgreSQL 16.9", "mobilitydb" : "1.2.0", "timescaledb" : "2.20.3", "postgis" : "3.5.3", "postgrest" : "PostgREST 13.0.2"}
|
||||||
|
|
||||||
-[ RECORD 1 ]-----------------
|
-[ RECORD 1 ]-----------------
|
||||||
api_version | 0.8.1
|
api_version | 0.9.2
|
||||||
sys_version | PostgreSQL 16.6
|
sys_version | PostgreSQL 16.9
|
||||||
timescaledb | 2.17.2
|
timescaledb | 2.20.3
|
||||||
postgis | 3.5.1
|
postgis | 3.5.3
|
||||||
postgrest | PostgREST 12.2.3
|
postgrest | PostgREST 13.0.2
|
||||||
|
|
||||||
|
@@ -49,6 +49,19 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# metadata and vessel configuration unit tests
|
||||||
|
psql ${PGSAIL_DB_URI} < sql/metadata.sql > output/metadata.sql.output
|
||||||
|
diff sql/metadata.sql.output output/metadata.sql.output > /dev/null
|
||||||
|
#diff -u sql/metadata.sql.output output/metadata.sql.output | wc -l
|
||||||
|
#echo 0
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo OK
|
||||||
|
else
|
||||||
|
echo SQL metadata.sql FAILED
|
||||||
|
diff -u sql/metadata.sql.output output/metadata.sql.output
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# https://www.postgresql.org/docs/current/app-psql.html
|
# https://www.postgresql.org/docs/current/app-psql.html
|
||||||
# run cron jobs
|
# run cron jobs
|
||||||
#psql -U ${POSTGRES_USER} -h 172.30.0.1 signalk < sql/cron_run_jobs.sql > output/cron_run_jobs.sql.output
|
#psql -U ${POSTGRES_USER} -h 172.30.0.1 signalk < sql/cron_run_jobs.sql > output/cron_run_jobs.sql.output
|
||||||
|
Reference in New Issue
Block a user