From c95800330ab386b9fb4aa9e5fb1876d5a969b024 Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Sun, 5 Mar 2023 23:34:47 +0100
Subject: [PATCH] ezidam: guards to check if setup is complete or not
---
crates/ezidam/src/guards.rs | 5 +++
crates/ezidam/src/guards/completed_setup.rs | 34 +++++++++++++++++++++
crates/ezidam/src/guards/need_setup.rs | 34 +++++++++++++++++++++
crates/ezidam/src/lib.rs | 1 +
4 files changed, 74 insertions(+)
create mode 100644 crates/ezidam/src/guards.rs
create mode 100644 crates/ezidam/src/guards/completed_setup.rs
create mode 100644 crates/ezidam/src/guards/need_setup.rs
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;