gamenight/src/api.rs

58 lines
2.0 KiB
Rust

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<Redirect>)
}
#[rocket::async_trait]
impl<'r> FromRequest<'r> for Referer {
type Error = ReferrerError;
async fn from_request(req: &'r Request<'_>) -> request::Outcome<Self, Self::Error> {
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 = "<gamenight_json>")]
pub async fn gamenight_post_json(conn: schema::DbConn, gamenight_json: Json<schema::GameNightNoId>) -> ApiResponse {
schema::insert_gamenight(conn, gamenight_json.into_inner()).await;
ApiResponse::Status(Status::Accepted)
}
#[post("/gamenight", format = "application/x-www-form-urlencoded", data = "<gamenight_form>")]
pub async fn gamenight_post_form(referer: Option<Referer>, conn: schema::DbConn, gamenight_form: Form<schema::GameNightNoId>) -> 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."))
}
}