use crate::schema; use rocket::form::Form; use rocket::serde::json::{Json, json, Value}; use rocket::http::Status; use rocket::request::{self, Request, FromRequest}; use rocket::outcome::Outcome::{Success, Failure}; use rocket::response::{Redirect, Flash}; pub struct Referer(String); #[derive(Debug)] pub enum ReferrerError { Missing, MoreThanOne } #[derive(Debug, Responder)] pub enum ApiResponse { Status(Status), Redirect(Redirect), Value(Value), Flash(Flash) } #[rocket::async_trait] impl<'r> FromRequest<'r> for Referer { type Error = ReferrerError; async fn from_request(req: &'r Request<'_>) -> request::Outcome { let referers : Vec<_> = req.headers().get("Referer").collect(); match referers.len() { 0 => Failure((Status::BadRequest, ReferrerError::Missing)), 1 => Success(Referer(referers[0].to_string())), _ => Failure((Status::BadRequest, ReferrerError::MoreThanOne)), } } } #[get("/gamenights")] pub async fn gamenights(conn: schema::DbConn) -> ApiResponse { let gamenights = schema::get_all_gamenights(conn).await; ApiResponse::Value(json!(gamenights)) } #[post("/gamenight", format = "application/json", data = "")] pub async fn gamenight_post_json(conn: schema::DbConn, gamenight_json: Json) -> ApiResponse { schema::insert_gamenight(conn, gamenight_json.into_inner()).await; ApiResponse::Status(Status::Accepted) } #[post("/gamenight", format = "application/x-www-form-urlencoded", data = "")] pub async fn gamenight_post_form(referer: Option, conn: schema::DbConn, gamenight_form: Form) -> ApiResponse { schema::insert_gamenight(conn, gamenight_form.into_inner()).await; match referer { None => ApiResponse::Status(Status::Accepted), Some(referer) => ApiResponse::Flash(Flash::success(Redirect::to(referer.0), "Added Gamenight.")) } }