From 59e6e7a6feafaf1dada3054466d415cca047ca1a Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 2 Aug 2023 11:23:48 +0200 Subject: node api on the same route --- server/src/routes/api/mod.rs | 48 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'server/src/routes/api/mod.rs') 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 */ +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, data: Json) -> 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> + + ::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), + )) + }) + } +} -- cgit v1.2.3-70-g09d2