diff --git a/openadr-vtn/src/data_source/postgres/event.rs b/openadr-vtn/src/data_source/postgres/event.rs index c2daf46..18cdae2 100644 --- a/openadr-vtn/src/data_source/postgres/event.rs +++ b/openadr-vtn/src/data_source/postgres/event.rs @@ -9,6 +9,7 @@ use openadr_wire::Event; use sqlx::PgPool; use std::str::FromStr; use tracing::error; +use crate::data_source::postgres::to_json_value; #[async_trait] impl EventCrud for PgEventStorage {} @@ -165,10 +166,10 @@ impl Crud for PgEventStorage { new.program_id.as_str(), new.event_name, Into::>::into(new.priority), - serde_json::to_value(&new.targets).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.report_descriptors).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.payload_descriptors).map_err( AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.interval_period).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.targets)?, + to_json_value(new.report_descriptors)?, + to_json_value(new.payload_descriptors)?, + to_json_value(new.interval_period)?, serde_json::to_value(&new.intervals).map_err(AppError::SerdeJsonBadRequest)?, ) .fetch_one(&self.db) @@ -244,11 +245,10 @@ impl Crud for PgEventStorage { new.program_id.as_str(), new.event_name, Into::>::into(new.priority), - serde_json::to_value(&new.targets).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.report_descriptors).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.payload_descriptors) - .map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(&new.interval_period).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.targets)?, + to_json_value(new.report_descriptors)?, + to_json_value(new.payload_descriptors)?, + to_json_value(new.interval_period)?, serde_json::to_value(&new.intervals).map_err(AppError::SerdeJsonBadRequest)?, ) .fetch_one(&self.db) diff --git a/openadr-vtn/src/data_source/postgres/mod.rs b/openadr-vtn/src/data_source/postgres/mod.rs index 77347e4..3dbd35d 100644 --- a/openadr-vtn/src/data_source/postgres/mod.rs +++ b/openadr-vtn/src/data_source/postgres/mod.rs @@ -6,7 +6,9 @@ use crate::data_source::{AuthSource, DataSource, EventCrud, ProgramCrud, ReportC use dotenvy::dotenv; use sqlx::PgPool; use std::sync::Arc; +use serde::Serialize; use tracing::{error, info}; +use crate::error::AppError; mod event; mod program; @@ -66,3 +68,7 @@ impl PostgresStorage { }) } } + +fn to_json_value(v: Option) -> Result, AppError> { + v.map(|v| serde_json::to_value(v).map_err(AppError::SerdeJsonBadRequest)).transpose() +} \ No newline at end of file diff --git a/openadr-vtn/src/data_source/postgres/program.rs b/openadr-vtn/src/data_source/postgres/program.rs index 10452f0..ac5023d 100644 --- a/openadr-vtn/src/data_source/postgres/program.rs +++ b/openadr-vtn/src/data_source/postgres/program.rs @@ -8,6 +8,7 @@ use openadr_wire::target::TargetLabel; use openadr_wire::Program; use sqlx::PgPool; use tracing::{error, trace}; +use crate::data_source::postgres::to_json_value; #[async_trait] impl ProgramCrud for PgProgramStorage {} @@ -174,12 +175,12 @@ impl Crud for PgProgramStorage { new.country, new.principal_subdivision, // TODO this will serialize 'null' as JSON in the DB instead of using the NULL from the DB - serde_json::to_value(new.interval_period).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(new.program_descriptions).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.interval_period)?, + to_json_value(new.program_descriptions)?, new.binding_events, new.local_price, - serde_json::to_value(new.payload_descriptors).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(new.targets).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.payload_descriptors)?, + to_json_value(new.targets)?, ) .fetch_one(&self.db) .await? @@ -276,13 +277,12 @@ impl Crud for PgProgramStorage { new.program_type, new.country, new.principal_subdivision, - serde_json::to_value(new.interval_period).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(new.program_descriptions) - .map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.interval_period)?, + to_json_value(new.program_descriptions)?, new.binding_events, new.local_price, - serde_json::to_value(new.payload_descriptors).map_err(AppError::SerdeJsonBadRequest)?, - serde_json::to_value(new.targets).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.payload_descriptors)?, + to_json_value(new.targets)?, ) .fetch_one(&self.db) .await? diff --git a/openadr-vtn/src/data_source/postgres/report.rs b/openadr-vtn/src/data_source/postgres/report.rs index e11ae98..3b49286 100644 --- a/openadr-vtn/src/data_source/postgres/report.rs +++ b/openadr-vtn/src/data_source/postgres/report.rs @@ -7,6 +7,7 @@ use openadr_wire::report::{ReportContent, ReportId}; use openadr_wire::Report; use sqlx::PgPool; use tracing::error; +use crate::data_source::postgres::to_json_value; #[async_trait] impl ReportCrud for PgReportStorage {} @@ -90,7 +91,7 @@ impl Crud for PgReportStorage { new.event_id.as_str(), new.client_name, new.report_name, - serde_json::to_value(new.payload_descriptors).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.payload_descriptors)?, serde_json::to_value(new.resources).map_err(AppError::SerdeJsonBadRequest)?, ) .fetch_one(&self.db) @@ -154,7 +155,7 @@ impl Crud for PgReportStorage { new.event_id.as_str(), new.client_name, new.report_name, - serde_json::to_value(new.payload_descriptors).map_err(AppError::SerdeJsonBadRequest)?, + to_json_value(new.payload_descriptors)?, serde_json::to_value(new.resources).map_err(AppError::SerdeJsonBadRequest)?, ) .fetch_one(&self.db)