aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/api/mod.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-02 11:23:48 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-02 11:23:48 +0200
commit59e6e7a6feafaf1dada3054466d415cca047ca1a (patch)
tree220f4a8d492ced2ffb587d0c99e44f7e2d5f5b9f /server/src/routes/api/mod.rs
parent96abb9182e20cc4ab80d272de26cbce427b94473 (diff)
downloadjellything-59e6e7a6feafaf1dada3054466d415cca047ca1a.tar
jellything-59e6e7a6feafaf1dada3054466d415cca047ca1a.tar.bz2
jellything-59e6e7a6feafaf1dada3054466d415cca047ca1a.tar.zst
node api on the same route
Diffstat (limited to 'server/src/routes/api/mod.rs')
-rw-r--r--server/src/routes/api/mod.rs48
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),
+ ))
+ })
+ }
+}