diff --git a/crates/ezidam/src/error/conversion.rs b/crates/ezidam/src/error/conversion.rs index 2b5e450..8106537 100644 --- a/crates/ezidam/src/error/conversion.rs +++ b/crates/ezidam/src/error/conversion.rs @@ -20,6 +20,12 @@ impl From for Error { } } +impl From for Error { + fn from(e: std::io::Error) -> Self { + Error::internal_server_error(e) + } +} + // Local crates impl From for Error { diff --git a/crates/ezidam/src/menu/items/admin.rs b/crates/ezidam/src/menu/items/admin.rs index da7ba9a..45ef654 100644 --- a/crates/ezidam/src/menu/items/admin.rs +++ b/crates/ezidam/src/menu/items/admin.rs @@ -35,11 +35,11 @@ impl AdminMenu { MainItem { id: AdminMenu::Settings.id(), label: "Server settings", - link: uri!(routes::admin::settings::admin_settings).to_string(), + link: uri!(routes::admin::settings::settings_branding).to_string(), icon: icons::SETTINGS, sub: Some(vec![SubItem { label: "Branding", - link: uri!(routes::admin::settings::admin_settings).to_string(), + link: uri!(routes::admin::settings::settings_branding).to_string(), }]), }, ] diff --git a/crates/ezidam/src/page.rs b/crates/ezidam/src/page.rs index 1fc1364..6b729fe 100644 --- a/crates/ezidam/src/page.rs +++ b/crates/ezidam/src/page.rs @@ -15,7 +15,7 @@ pub enum Page { Authorize(Authorize), Redirect(Redirect), AdminDashboard(AdminDashboard), - AdminSettings(AdminSettings), + AdminSettingsBranding(AdminSettingsBranding), } impl Page { @@ -28,7 +28,7 @@ impl Page { Page::Authorize(_) => "pages/oauth/authorize", Page::Redirect(_) => "pages/oauth/redirect", Page::AdminDashboard(_) => "pages/admin/dashboard", - Page::AdminSettings(_) => "pages/admin/settings", + Page::AdminSettingsBranding(_) => "pages/admin/settings_branding", } } @@ -41,7 +41,7 @@ impl Page { Page::Authorize(_) => "Authorize app", Page::Redirect(_) => "Redirecting", Page::AdminDashboard(_) => "Admin dashboard", - Page::AdminSettings(_) => "Server settings", + Page::AdminSettingsBranding(_) => "Server branding", } } @@ -56,7 +56,7 @@ impl Page { Page::Authorize(_) => None, Page::Redirect(_) => None, Page::AdminDashboard(_) => Some(AdminMenu::Dashboard.into()), - Page::AdminSettings(_) => Some(AdminMenu::Settings.into()), + Page::AdminSettingsBranding(_) => Some(AdminMenu::Settings.into()), } } @@ -69,7 +69,7 @@ impl Page { Page::Authorize(authorize) => Box::new(authorize), Page::Redirect(redirect) => Box::new(redirect), Page::AdminDashboard(dashboard) => Box::new(dashboard), - Page::AdminSettings(settings) => Box::new(settings), + Page::AdminSettingsBranding(branding) => Box::new(branding), } } } diff --git a/crates/ezidam/src/routes/admin.rs b/crates/ezidam/src/routes/admin.rs index 8b8faaa..3ceac96 100644 --- a/crates/ezidam/src/routes/admin.rs +++ b/crates/ezidam/src/routes/admin.rs @@ -6,7 +6,7 @@ pub mod dashboard; pub mod settings; pub fn routes() -> Vec { - routes![admin_dashboard, admin_settings] + routes![admin_dashboard, settings_branding, settings_update_branding] } pub mod content { @@ -23,7 +23,8 @@ pub mod content { #[derive(Serialize)] #[serde(crate = "rocket::serde")] #[derive(Clone)] - pub struct AdminSettings { + pub struct AdminSettingsBranding { pub user: JwtClaims, + pub business_name: String, } } diff --git a/crates/ezidam/src/routes/admin/settings.rs b/crates/ezidam/src/routes/admin/settings.rs index a31fd3b..b17228b 100644 --- a/crates/ezidam/src/routes/admin/settings.rs +++ b/crates/ezidam/src/routes/admin/settings.rs @@ -1,9 +1,61 @@ use crate::routes::prelude::*; -use rocket::get; +use rocket::fs::TempFile; +use rocket::{get, post}; +use settings::Settings; -#[get("/admin/settings")] -pub async fn admin_settings(mut db: Connection, admin: JwtAdmin) -> Result { - Ok(Page::AdminSettings(super::content::AdminSettings { - user: admin.0, - })) +#[get("/admin/settings/branding")] +pub async fn settings_branding(mut db: Connection, admin: JwtAdmin) -> Result { + let settings = Settings::get(&mut *db).await?; + + Ok(Page::AdminSettingsBranding( + super::content::AdminSettingsBranding { + user: admin.0, + business_name: settings.business_name().to_string(), + }, + )) +} + +#[derive(Debug, FromForm)] +pub struct UpdateBranding<'r> { + pub file: TempFile<'r>, + pub business_name: Option<&'r str>, + pub delete_logo: Option, +} + +#[post("/admin/settings/branding", data = "
")] +pub async fn settings_update_branding( + mut db: Connection, + _admin: JwtAdmin, + form: Form>, +) -> Result { + let mut transaction = db.begin().await?; + + match form.delete_logo { + Some(delete_logo) => { + if delete_logo { + Settings::delete_business_logo(&mut transaction).await?; + } + } + None => { + if let Some(business_name) = form.business_name { + Settings::set_business_name(&mut transaction, business_name).await?; + } + + if form.file.len() != 0 { + let file_path = form.file.path().ok_or_else(|| { + Error::internal_server_error("Failed to get path of uploaded file") + })?; + + // Read bytes from file + let file_bytes = rocket::tokio::fs::read(file_path).await?; + + // Save in database + Settings::set_business_logo(&mut transaction, &file_bytes).await?; + } + } + } + + transaction.commit().await?; + + Ok(Redirect::to(uri!(settings_branding))) } diff --git a/crates/ezidam/templates/pages/admin/settings.html.tera b/crates/ezidam/templates/pages/admin/settings.html.tera deleted file mode 100644 index 1b00229..0000000 --- a/crates/ezidam/templates/pages/admin/settings.html.tera +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "shell" %} - -{% block content %} - - - -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-{% endblock content %} diff --git a/crates/ezidam/templates/pages/admin/settings_branding.html.tera b/crates/ezidam/templates/pages/admin/settings_branding.html.tera new file mode 100644 index 0000000..ccc1c20 --- /dev/null +++ b/crates/ezidam/templates/pages/admin/settings_branding.html.tera @@ -0,0 +1,83 @@ +{% extends "shell" %} + +{% block content %} + + + +
+
+
+
+
+
+ +
+
+
+ +
+

Branding

+ +

Company logo

+
+ + +
+ business logo +
+ + +
+ + +
+ + +
+ +
+ +
+ + +

Business Profile

+
+
+
Business Name
+ +
+
+
+ + + + +
+
+
+
+
+{% endblock content %} diff --git a/crates/ezidam/templates/utils/logo.html.tera b/crates/ezidam/templates/utils/logo.html.tera index 4bcab29..b542dc0 100644 --- a/crates/ezidam/templates/utils/logo.html.tera +++ b/crates/ezidam/templates/utils/logo.html.tera @@ -1,3 +1,3 @@ - business logo + business logo diff --git a/crates/ezidam/templates/utils/logo_header.html.tera b/crates/ezidam/templates/utils/logo_header.html.tera index 93b5001..4f7cdc8 100644 --- a/crates/ezidam/templates/utils/logo_header.html.tera +++ b/crates/ezidam/templates/utils/logo_header.html.tera @@ -1,3 +1,3 @@ - business logo + business logo diff --git a/crates/settings/src/database.rs b/crates/settings/src/database.rs index e53af79..ec90311 100644 --- a/crates/settings/src/database.rs +++ b/crates/settings/src/database.rs @@ -52,6 +52,12 @@ impl Settings { Ok(()) } + pub async fn delete_business_logo(conn: impl SqliteExecutor<'_>) -> Result<(), Error> { + DatabaseSettings::set_business_logo(conn, None).await?; + + Ok(()) + } + pub async fn set_first_admin(conn: impl SqliteExecutor<'_>, id: &UserID) -> Result<(), Error> { DatabaseSettings::set_first_admin(conn, &id.0).await?;