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 ,
2024-01-24 22:47:53 +01:00
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 " ) ;
2024-05-21 18:34:17 +02:00
} ;
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
}
2023-07-31 21:15:28 +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 ( ) ;
2023-07-31 21:15:28 +02:00
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 " ) ) ;
2023-07-31 21:15:28 +02:00
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 " ) ;
2023-07-31 21:15:28 +02:00
2024-05-28 09:08:48 +02:00
let event = Event ::find_by_id ( & db , 1 ) . await ;
2023-07-31 21:15:28 +02:00
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 " ) ) ;
2023-07-31 21:15:28 +02:00
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 " ) ;
2023-07-31 21:15:28 +02:00
2024-05-28 09:08:48 +02:00
let _ = Event ::find_by_id ( & db , 1 ) . await . unwrap ( ) ;
2023-07-31 21:15:28 +02:00
}
2023-07-31 21:29:03 +02:00
#[ 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 ( ) ;
2023-07-31 21:29:03 +02:00
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
2024-01-24 23:04:35 +01:00
. body ( " id=1&planned_amount_cox=2&max_people=3¬es=new-planned-event-text&name=test " ) ; // Add the form data to the request body;
2023-07-31 21:29:03 +02:00
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 " ) ) ;
2023-07-31 21:29:03 +02:00
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 "
2023-07-31 21:29:03 +02:00
) ;
2024-05-28 09:08:48 +02:00
let event = Event ::find_by_id ( & db , 1 ) . await . unwrap ( ) ;
2023-07-31 21:29:03 +02:00
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
2024-01-24 23:04:35 +01:00
. body (
" id=1337&planned_amount_cox=2&max_people=3¬es=new-planned-event-text&name=test " ,
) ; // Add the form data to the request body;
2023-07-31 21:29:03 +02:00
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 " ) ) ;
2023-07-31 21:29:03 +02:00
let flash_cookie = response
. cookies ( )
. get ( " _flash " )
. expect ( " Expected flash cookie " ) ;
assert_eq! ( flash_cookie . value ( ) , " 5:errorPlanned event id not found " ) ;
}
2023-07-31 21:33:49 +02:00
#[ 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 " ) ) ;
2023-07-31 21:33:49 +02:00
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 " ) ;
2023-07-31 21:33:49 +02:00
2024-05-28 09:08:48 +02:00
let event = Event ::find_by_id ( & db , 2 ) . await . unwrap ( ) ;
2023-07-31 21:33:49 +02:00
assert_eq! ( event . name , " my-cool-new-event " ) ;
}
2023-07-31 21:15:28 +02:00
}