58 lines
2.0 KiB
Rust
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."))
|
|
}
|
|
} |