dialtone_sqlx 0.1.0

Dialtone SQLx Back-End
Documentation
use dialtone_common::rest::sites::site_data::{
    ClientDefaults, DialtoneWebClient, PublicSiteInfo, SiteData, SiteNames,
};
use dialtone_common::rest::sites::theme::Theme;
use sqlx::types::Json;
use sqlx::{Executor, Postgres};

pub async fn create_site(
    exec: impl Executor<'_, Database = Postgres>,
    host_name: &str,
    short_name: String,
    long_name: Option<String>,
    default_theme: Option<Theme>,
) -> Result<(), sqlx::Error> {
    let host_name = host_name.to_lowercase();
    let default_theme = match default_theme {
        None => Theme::GreenOnBlack,
        Some(t) => t,
    };
    let long_name = match long_name {
        None => short_name.clone(),
        Some(n) => n,
    };
    let site_data = SiteData {
        public: PublicSiteInfo {
            names: SiteNames {
                short_name,
                long_name,
            },
            client_defaults: ClientDefaults {
                dialtone_webclient: DialtoneWebClient {
                    default_theme,
                    ..DialtoneWebClient::default()
                },
                ..ClientDefaults::default()
            },
            ..PublicSiteInfo::default()
        },
        ..SiteData::default()
    };
    sqlx::query(
        r#"
INSERT INTO site_info ( host_name, site_data )
VALUES ( $1, $2 )
returning host_name
        "#,
    )
    .bind(host_name)
    .bind(Json(site_data))
    .fetch_one(exec)
    .await?;

    Ok(())
}