diff --git a/crates/ezidam/src/routes.rs b/crates/ezidam/src/routes.rs index 2888439..1156525 100644 --- a/crates/ezidam/src/routes.rs +++ b/crates/ezidam/src/routes.rs @@ -1,6 +1,7 @@ use rocket::{Build, Rocket}; pub mod root; +pub mod setup; pub(self) mod prelude { pub use crate::database::Database; @@ -22,6 +23,9 @@ pub(self) mod prelude { } pub fn routes(rocket_builder: Rocket) -> Rocket { - // Root - rocket_builder.mount("/", root::routes()) + rocket_builder + // Root + .mount("/", root::routes()) + // Setup + .mount("/setup", setup::routes()) } diff --git a/crates/ezidam/src/routes/root.rs b/crates/ezidam/src/routes/root.rs index a104971..a29a399 100644 --- a/crates/ezidam/src/routes/root.rs +++ b/crates/ezidam/src/routes/root.rs @@ -1,9 +1,9 @@ use super::prelude::*; -use rocket::{get, routes}; +use rocket::get; use settings::Settings; -pub fn routes() -> Vec { - routes![logo, setup, homepage] +pub fn routes() -> Vec { + routes![logo, homepage, redirect_to_setup] } #[get("/logo")] @@ -39,11 +39,6 @@ mod test { } } -#[get("/setup")] -async fn setup() -> Page { - Page::Setup() -} - pub mod content { use rocket::serde::Serialize; @@ -54,7 +49,12 @@ pub mod content { } } -#[get("/homepage")] +#[get("/")] +async fn redirect_to_setup(_setup: NeedSetup) -> Redirect { + Redirect::to(uri!("/setup")) +} + +#[get("/", rank = 2)] async fn homepage() -> Page { Page::Homepage(content::Homepage { abc: "string".to_string(), diff --git a/crates/ezidam/src/routes/setup.rs b/crates/ezidam/src/routes/setup.rs new file mode 100644 index 0000000..588d1d2 --- /dev/null +++ b/crates/ezidam/src/routes/setup.rs @@ -0,0 +1,61 @@ +use super::prelude::*; +use rocket::{get, post}; +use settings::Settings; +use users::User; + +pub fn routes() -> Vec { + routes![setup_completed, setup, create_first_account] +} + +#[get("/")] +async fn setup_completed(_setup: CompletedSetup) -> Redirect { + Redirect::to(uri!(super::root::homepage)) +} + +#[get("/", rank = 2)] +async fn setup() -> Page { + Page::Setup +} + +#[derive(Debug, FromForm)] +pub struct CreateFirstAccount<'r> { + pub username: &'r str, + pub password: &'r str, +} + +#[post("/", data = "
")] +async fn create_first_account( + form: Form>, + _setup: NeedSetup, + mut db: Connection, +) -> Result { + let form = form.into_inner(); + + // Generate UserID + let user_id = task::spawn_blocking(UserID::default).await?; + + // Hash password + let password = form.password.to_string(); + let password = task::spawn_blocking(move || Password::new(&password)).await??; + + let mut transaction = db.begin().await?; + + // Insert in database + User::insert( + &mut transaction, + &user_id, + true, + form.username, + Some(&password), + ) + .await?; + + // Store UserID in settings + Settings::set_first_admin(&mut transaction, &user_id).await?; + + transaction.commit().await?; + + // TODO: login with openid/oauth + + Ok(Redirect::to(uri!("/"))) +} diff --git a/crates/ezidam/templates/setup.html.tera b/crates/ezidam/templates/setup.html.tera index 702a5b7..cd8e93c 100644 --- a/crates/ezidam/templates/setup.html.tera +++ b/crates/ezidam/templates/setup.html.tera @@ -1,41 +1,46 @@ {% extends "base" %} {% block content %} - +
- + + +
-
-
-

Welcome to Ezidam!

-

Initial setup

-
-
first admin account
-
-
- - + +
+
+

Welcome to Ezidam!

+

Initial setup

-
- -
- +
first admin account
+
+
+ + +
+
+ +
+ +
-
-
-
-
- - Continue - +
+
+
+ + + + +
-
+