diff --git a/crates/ezidam/src/guards.rs b/crates/ezidam/src/guards.rs new file mode 100644 index 0000000..4fdf242 --- /dev/null +++ b/crates/ezidam/src/guards.rs @@ -0,0 +1,5 @@ +mod completed_setup; +mod need_setup; + +pub use completed_setup::CompletedSetup; +pub use need_setup::NeedSetup; diff --git a/crates/ezidam/src/guards/completed_setup.rs b/crates/ezidam/src/guards/completed_setup.rs new file mode 100644 index 0000000..057eb35 --- /dev/null +++ b/crates/ezidam/src/guards/completed_setup.rs @@ -0,0 +1,34 @@ +use crate::database::Database; +use rocket::http::Status; +use rocket::request::{FromRequest, Outcome}; +use rocket::Request; +use users::User; + +#[derive(Debug)] +pub enum Error { + GetDatabase, + Request(users::Error), +} + +pub struct CompletedSetup; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for CompletedSetup { + type Error = Error; + + async fn from_request(request: &'r Request<'_>) -> Outcome { + let db = match request.guard::<&Database>().await { + Outcome::Success(database) => database, + Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetDatabase)), + Outcome::Forward(f) => return Outcome::Forward(f), + }; + + match User::get_initial_admin(&**db).await { + Ok(initial_admin) => match initial_admin { + Some(_) => Outcome::Success(CompletedSetup), + None => Outcome::Forward(()), + }, + Err(e) => Outcome::Failure((Status::InternalServerError, Error::Request(e))), + } + } +} diff --git a/crates/ezidam/src/guards/need_setup.rs b/crates/ezidam/src/guards/need_setup.rs new file mode 100644 index 0000000..953c50b --- /dev/null +++ b/crates/ezidam/src/guards/need_setup.rs @@ -0,0 +1,34 @@ +use crate::database::Database; +use rocket::http::Status; +use rocket::request::{FromRequest, Outcome}; +use rocket::Request; +use users::User; + +#[derive(Debug)] +pub enum Error { + GetDatabase, + Request(users::Error), +} + +pub struct NeedSetup; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for NeedSetup { + type Error = Error; + + async fn from_request(request: &'r Request<'_>) -> Outcome { + let db = match request.guard::<&Database>().await { + Outcome::Success(database) => database, + Outcome::Failure(e) => return Outcome::Failure((e.0, Error::GetDatabase)), + Outcome::Forward(f) => return Outcome::Forward(f), + }; + + match User::get_initial_admin(&**db).await { + Ok(initial_admin) => match initial_admin { + Some(_) => Outcome::Forward(()), + None => Outcome::Success(NeedSetup), + }, + Err(e) => Outcome::Failure((Status::InternalServerError, Error::Request(e))), + } + } +} diff --git a/crates/ezidam/src/lib.rs b/crates/ezidam/src/lib.rs index 2ce7d16..9abf03f 100644 --- a/crates/ezidam/src/lib.rs +++ b/crates/ezidam/src/lib.rs @@ -3,6 +3,7 @@ use rocket::{Build, Rocket}; mod database; mod error; mod file_from_bytes; +mod guards; mod page; mod response_timer; mod routes;