aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/account/session.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/account/session.rs')
-rw-r--r--server/src/routes/ui/account/session.rs58
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(()),
+ }
+ })
+ }
+}