diff options
Diffstat (limited to 'server/src/routes/ui/account/session.rs')
-rw-r--r-- | server/src/routes/ui/account/session.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/server/src/routes/ui/account/session.rs b/server/src/routes/ui/account/session.rs new file mode 100644 index 0000000..9c50099 --- /dev/null +++ b/server/src/routes/ui/account/session.rs @@ -0,0 +1,58 @@ +use crate::{ + database::{Database, User}, + routes::ui::error::MyError, +}; +use anyhow::anyhow; +use rocket::{ + outcome::Outcome, + request::{self, FromRequest}, + Request, State, +}; + +pub struct Session { + pub user: User, +} + +impl Session { + pub async fn from_request_ut(req: &Request<'_>) -> Result<Self, MyError> { + let cookie = req + .cookies() + .get_private("user") + .ok_or(anyhow!("login required"))?; + let username = cookie.value(); + + let db = req.guard::<&State<Database>>().await.unwrap(); + let user = db + .users + .get(&username.to_string())? + .ok_or(anyhow!("user not found"))?; + + Ok(Session { user }) + } +} + +impl<'r> FromRequest<'r> for Session { + type Error = MyError; + + fn from_request<'life0, 'async_trait>( + request: &'r Request<'life0>, + ) -> core::pin::Pin< + Box< + dyn core::future::Future<Output = request::Outcome<Self, Self::Error>> + + core::marker::Send + + 'async_trait, + >, + > + where + 'r: 'async_trait, + 'life0: 'async_trait, + Self: 'async_trait, + { + Box::pin(async move { + match Self::from_request_ut(request).await { + Ok(x) => Outcome::Success(x), + Err(_) => Outcome::Forward(()), + } + }) + } +} |