Implement ToSql for custom types in Site model.

This commit is contained in:
Dorian 2018-09-27 09:03:51 -04:00
parent 9f02fe5f75
commit 11311997fd
2 changed files with 33 additions and 6 deletions

View File

@ -20,8 +20,13 @@ pub mod security;
pub mod web; pub mod web;
use diesel::Queryable; use diesel::Queryable;
use diesel::serialize::{Output, Result, ToSql};
use diesel::sql_types::Jsonb;
use diesel::pg::Pg;
use std::collections::HashMap; use std::collections::HashMap;
use std::default::Default; use std::default::Default;
use std::io::Write;
use std::vec::Vec;
use chrono::{DateTime, NaiveDateTime, Utc}; use chrono::{DateTime, NaiveDateTime, Utc};
use serde_json::Value; use serde_json::Value;
@ -144,9 +149,9 @@ pub struct Site {
pub landing_page: String, pub landing_page: String,
pub header: String, pub header: String,
pub footer: String, pub footer: String,
pub menu: Vec<MenuItems>, pub menu: MenuItemsWrapper,
pub config: HashMap<String, Value>, pub config: ConfigWrapper,
#[serde(skip_deserializing)] #[serde(skip_deserializing)]
links: HashMap<String, Value>, links: HashMap<String, Value>,
@ -207,9 +212,31 @@ impl Queryable<schema::sites::SqlType, diesel::pg::Pg> for Site {
landing_page: row.2, landing_page: row.2,
header: row.3, header: row.3,
footer: row.4, footer: row.4,
menu, menu: MenuItemsWrapper(menu),
config, config: ConfigWrapper(config),
links: HashMap::new(), links: HashMap::new(),
} }
} }
} }
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct MenuItemsWrapper(Vec<MenuItems>);
impl ToSql<Jsonb, Pg> for MenuItemsWrapper {
fn to_sql<W: Write>(&self, out: &mut Output<W, Pg>) -> Result {
let value = serde_json::to_value(*(Box::new(&self.0))).unwrap();
ToSql::<Jsonb, diesel::pg::Pg>::to_sql(&value, out)
}
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct ConfigWrapper(HashMap<String, Value>);
impl ToSql<Jsonb, Pg> for ConfigWrapper {
fn to_sql<W: Write>(&self, out: &mut Output<W, Pg>) -> Result {
let value = serde_json::to_value(*(Box::new(&self.0))).unwrap();
ToSql::<Jsonb, diesel::pg::Pg>::to_sql(&value, out)
}
}

View File

@ -303,8 +303,8 @@ fn update_site((request, updated_site): (HttpRequest, Json<Site>)) -> HttpRespon
landing_page.eq(&updated_site.landing_page), landing_page.eq(&updated_site.landing_page),
header.eq(&updated_site.header), header.eq(&updated_site.header),
footer.eq(&updated_site.footer), footer.eq(&updated_site.footer),
menu.eq(&updated_site.menu), menu.eq(Some(&updated_site.menu)),
config.eq(&updated_site.config), config.eq(Some(&updated_site.config)),
)) ))
.get_result(&database); .get_result(&database);