rowt/src/tera/admin/planned_event.rs

274 lines
8.9 KiB
Rust
Raw Normal View History

2023-04-04 12:19:56 +02:00
use rocket::{
form::Form,
2023-05-03 22:40:22 +02:00
get, post, put,
2023-04-04 12:19:56 +02:00
response::{Flash, Redirect},
routes, FromForm, Route, State,
};
2023-07-25 13:22:11 +02:00
use serde::Serialize;
2023-04-04 12:19:56 +02:00
use sqlx::SqlitePool;
2023-07-25 13:22:11 +02:00
use crate::model::{
2024-05-28 09:08:48 +02:00
event::{self, Event},
2023-07-25 13:22:11 +02:00
tripdetails::{TripDetails, TripDetailsToAdd},
2024-05-28 09:08:48 +02:00
user::EventUser,
2023-07-25 13:22:11 +02:00
};
2023-04-04 12:19:56 +02:00
//TODO: add constraints (e.g. planned_amount_cox > 0)
2023-07-25 13:22:11 +02:00
#[derive(FromForm, Serialize)]
2024-05-28 09:08:48 +02:00
struct AddEventForm<'r> {
2023-05-24 12:11:55 +02:00
name: &'r str,
2023-04-04 12:19:56 +02:00
planned_amount_cox: i32,
2023-07-25 13:22:11 +02:00
tripdetails: TripDetailsToAdd<'r>,
2023-04-04 12:19:56 +02:00
}
#[post("/planned-event", data = "<data>")]
async fn create(
db: &State<SqlitePool>,
2024-05-28 09:08:48 +02:00
data: Form<AddEventForm<'_>>,
_admin: EventUser,
2023-04-04 12:19:56 +02:00
) -> Flash<Redirect> {
2023-07-25 13:22:11 +02:00
let data = data.into_inner();
let trip_details_id = TripDetails::create(db, data.tripdetails).await;
2023-04-26 17:02:47 +02:00
let trip_details = TripDetails::find_by_id(db, trip_details_id).await.unwrap(); //Okay, bc. we
//just created
//the object
2024-05-28 09:08:48 +02:00
Event::create(db, data.name, data.planned_amount_cox, trip_details).await;
2023-04-04 12:19:56 +02:00
2024-01-22 19:27:22 +01:00
Flash::success(Redirect::to("/planned"), "Event hinzugefügt")
2023-04-04 12:19:56 +02:00
}
2023-05-03 22:40:22 +02:00
//TODO: add constraints (e.g. planned_amount_cox > 0)
#[derive(FromForm)]
2024-05-28 09:08:48 +02:00
struct UpdateEventForm<'r> {
2023-05-03 22:40:22 +02:00
id: i64,
name: &'r str,
2023-05-03 22:40:22 +02:00
planned_amount_cox: i32,
max_people: i32,
2023-05-24 12:11:55 +02:00
notes: Option<&'r str>,
2023-06-08 11:28:25 +02:00
always_show: bool,
2023-08-09 11:54:18 +02:00
is_locked: bool,
2023-05-03 22:40:22 +02:00
}
#[put("/planned-event", data = "<data>")]
async fn update(
db: &State<SqlitePool>,
2024-05-28 09:08:48 +02:00
data: Form<UpdateEventForm<'_>>,
_admin: EventUser,
2023-05-03 22:40:22 +02:00
) -> Flash<Redirect> {
2024-05-28 09:08:48 +02:00
let update = event::EventUpdate {
2024-05-22 00:13:23 +02:00
name: data.name,
planned_amount_cox: data.planned_amount_cox,
max_people: data.max_people,
notes: data.notes,
always_show: data.always_show,
is_locked: data.is_locked,
};
2024-05-28 09:08:48 +02:00
match Event::find_by_id(db, data.id).await {
2023-05-03 22:40:22 +02:00
Some(planned_event) => {
2024-05-22 00:13:23 +02:00
planned_event.update(db, &update).await;
2024-01-22 19:27:22 +01:00
Flash::success(Redirect::to("/planned"), "Event erfolgreich bearbeitet")
2023-05-03 22:40:22 +02:00
}
2024-01-22 19:27:22 +01:00
None => Flash::error(Redirect::to("/planned"), "Planned event id not found"),
2023-05-03 22:40:22 +02:00
}
}
2023-04-04 12:19:56 +02:00
#[get("/planned-event/<id>/delete")]
2024-05-28 09:08:48 +02:00
async fn delete(db: &State<SqlitePool>, id: i64, _admin: EventUser) -> Flash<Redirect> {
let Some(event) = Event::find_by_id(db, id).await else {
return Flash::error(Redirect::to("/planned"), "Event does not exist");
};
match event.delete(db).await {
Ok(()) => Flash::success(Redirect::to("/planned"), "Event gelöscht"),
Err(e) => Flash::error(Redirect::to("/planned"), e),
2023-04-26 12:21:30 +02:00
}
2023-04-04 12:19:56 +02:00
}
pub fn routes() -> Vec<Route> {
2023-05-03 22:40:22 +02:00
routes![create, delete, update]
2023-04-04 12:19:56 +02:00
}
#[cfg(test)]
mod test {
use rocket::{
http::{ContentType, Status},
local::asynchronous::Client,
};
use sqlx::SqlitePool;
use super::*;
use crate::testdb;
#[sqlx::test]
fn test_delete() {
let db = testdb!();
2024-05-28 09:08:48 +02:00
let _ = Event::find_by_id(&db, 1).await.unwrap();
let rocket = rocket::build().manage(db.clone());
let rocket = crate::tera::config(rocket);
let client = Client::tracked(rocket).await.unwrap();
let login = client
.post("/auth")
.header(ContentType::Form) // Set the content type to form
.body("name=admin&password=admin"); // Add the form data to the request body;
login.dispatch().await;
let req = client.get("/admin/planned-event/1/delete");
let response = req.dispatch().await;
assert_eq!(response.status(), Status::SeeOther);
2024-01-22 19:27:22 +01:00
assert_eq!(response.headers().get("Location").next(), Some("/planned"));
let flash_cookie = response
.cookies()
.get("_flash")
.expect("Expected flash cookie");
2023-10-24 08:16:17 +02:00
assert_eq!(flash_cookie.value(), "7:successEvent gelöscht");
2024-05-28 09:08:48 +02:00
let event = Event::find_by_id(&db, 1).await;
assert_eq!(event, None);
}
#[sqlx::test]
fn test_delete_invalid_id() {
let db = testdb!();
let rocket = rocket::build().manage(db.clone());
let rocket = crate::tera::config(rocket);
let client = Client::tracked(rocket).await.unwrap();
let login = client
.post("/auth")
.header(ContentType::Form) // Set the content type to form
.body("name=admin&password=admin"); // Add the form data to the request body;
login.dispatch().await;
let req = client.get("/admin/planned-event/1337/delete");
let response = req.dispatch().await;
assert_eq!(response.status(), Status::SeeOther);
2024-01-22 19:27:22 +01:00
assert_eq!(response.headers().get("Location").next(), Some("/planned"));
let flash_cookie = response
.cookies()
.get("_flash")
.expect("Expected flash cookie");
2024-05-28 09:08:48 +02:00
assert_eq!(flash_cookie.value(), "5:errorEvent does not exist");
2024-05-28 09:08:48 +02:00
let _ = Event::find_by_id(&db, 1).await.unwrap();
}
#[sqlx::test]
fn test_update() {
let db = testdb!();
2024-05-28 09:08:48 +02:00
let event = Event::find_by_id(&db, 1).await.unwrap();
assert_eq!(event.notes, Some("trip_details for a planned event".into()));
let rocket = rocket::build().manage(db.clone());
let rocket = crate::tera::config(rocket);
let client = Client::tracked(rocket).await.unwrap();
let login = client
.post("/auth")
.header(ContentType::Form) // Set the content type to form
.body("name=admin&password=admin"); // Add the form data to the request body;
login.dispatch().await;
let req = client
.put("/admin/planned-event")
.header(ContentType::Form) // Set the content type to form
.body("id=1&planned_amount_cox=2&max_people=3&notes=new-planned-event-text&name=test"); // Add the form data to the request body;
let response = req.dispatch().await;
assert_eq!(response.status(), Status::SeeOther);
2024-01-22 19:27:22 +01:00
assert_eq!(response.headers().get("Location").next(), Some("/planned"));
let flash_cookie = response
.cookies()
.get("_flash")
.expect("Expected flash cookie");
assert_eq!(
flash_cookie.value(),
2024-01-22 19:27:22 +01:00
"7:successEvent erfolgreich bearbeitet"
);
2024-05-28 09:08:48 +02:00
let event = Event::find_by_id(&db, 1).await.unwrap();
assert_eq!(event.notes, Some("new-planned-event-text".into()));
}
#[sqlx::test]
fn test_update_invalid_id() {
let db = testdb!();
let rocket = rocket::build().manage(db.clone());
let rocket = crate::tera::config(rocket);
let client = Client::tracked(rocket).await.unwrap();
let login = client
.post("/auth")
.header(ContentType::Form) // Set the content type to form
.body("name=admin&password=admin"); // Add the form data to the request body;
login.dispatch().await;
let req = client
.put("/admin/planned-event")
.header(ContentType::Form) // Set the content type to form
.body(
"id=1337&planned_amount_cox=2&max_people=3&notes=new-planned-event-text&name=test",
); // Add the form data to the request body;
let response = req.dispatch().await;
assert_eq!(response.status(), Status::SeeOther);
2024-01-22 19:27:22 +01:00
assert_eq!(response.headers().get("Location").next(), Some("/planned"));
let flash_cookie = response
.cookies()
.get("_flash")
.expect("Expected flash cookie");
assert_eq!(flash_cookie.value(), "5:errorPlanned event id not found");
}
#[sqlx::test]
fn test_create() {
let db = testdb!();
let rocket = rocket::build().manage(db.clone());
let rocket = crate::tera::config(rocket);
let client = Client::tracked(rocket).await.unwrap();
let login = client
.post("/auth")
.header(ContentType::Form) // Set the content type to form
.body("name=admin&password=admin"); // Add the form data to the request body;
login.dispatch().await;
let req = client
.post("/admin/planned-event")
.header(ContentType::Form) // Set the content type to form
.body("name=my-cool-new-event&planned_amount_cox=42&tripdetails.planned_starting_time=10:01&tripdetails.max_people=3&tripdetails.day=2345-12-20"); // Add the form data to the request body;
let response = req.dispatch().await;
assert_eq!(response.status(), Status::SeeOther);
2024-01-22 19:27:22 +01:00
assert_eq!(response.headers().get("Location").next(), Some("/planned"));
let flash_cookie = response
.cookies()
.get("_flash")
.expect("Expected flash cookie");
2023-10-24 08:16:17 +02:00
assert_eq!(flash_cookie.value(), "7:successEvent hinzugefügt");
2024-05-28 09:08:48 +02:00
let event = Event::find_by_id(&db, 2).await.unwrap();
assert_eq!(event.name, "my-cool-new-event");
}
}