diff options
Diffstat (limited to 'server/src/routes/api')
-rw-r--r-- | server/src/routes/api/mod.rs | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs index b39950c..e74b134 100644 --- a/server/src/routes/api/mod.rs +++ b/server/src/routes/api/mod.rs @@ -4,12 +4,23 @@ Copyright (C) 2023 metamuffin <metamuffin.org> */ +use std::ops::Deref; + use super::ui::{ account::{login_logic, LoginForm}, error::MyResult, }; use crate::database::Database; -use rocket::{get, post, response::Redirect, serde::json::Json, State}; +use rocket::{ + get, + http::MediaType, + outcome::Outcome, + post, + request::{self, FromRequest}, + response::Redirect, + serde::json::Json, + Request, State, +}; use serde_json::{json, Value}; #[get("/api")] @@ -27,3 +38,38 @@ pub fn r_api_account_login(database: &State<Database>, data: Json<LoginForm>) -> let token = login_logic(database, &data.username, &data.password)?; Ok(json!(token)) } + +pub struct AcceptJson(bool); +impl Deref for AcceptJson { + type Target = bool; + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl<'r> FromRequest<'r> for AcceptJson { + type Error = (); + + 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 { + Outcome::Success(AcceptJson( + request + .accept() + .map(|a| a.preferred().exact_eq(&MediaType::JSON)) + .unwrap_or(false), + )) + }) + } +} |