diff options
author | metamuffin <metamuffin@disroot.org> | 2023-08-02 11:23:48 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-08-02 11:23:48 +0200 |
commit | 59e6e7a6feafaf1dada3054466d415cca047ca1a (patch) | |
tree | 220f4a8d492ced2ffb587d0c99e44f7e2d5f5b9f /server/src/routes/api/mod.rs | |
parent | 96abb9182e20cc4ab80d272de26cbce427b94473 (diff) | |
download | jellything-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.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), + )) + }) + } +} |