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 ::{
planned_event ::PlannedEvent ,
tripdetails ::{ TripDetails , TripDetailsToAdd } ,
user ::AdminUser ,
} ;
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) ]
2023-05-24 12:11:55 +02:00
struct AddPlannedEventForm < ' r > {
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 > ,
2023-05-24 12:11:55 +02:00
data : Form < AddPlannedEventForm < '_ > > ,
2023-04-04 12:19:56 +02:00
_admin : AdminUser ,
) -> 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
2023-07-23 19:45:48 +02:00
PlannedEvent ::create ( db , data . name , data . planned_amount_cox , trip_details ) . await ;
2023-04-04 12:19:56 +02:00
Flash ::success ( Redirect ::to ( " / " ) , " Successfully planned the event " )
}
2023-05-03 22:40:22 +02:00
//TODO: add constraints (e.g. planned_amount_cox > 0)
#[ derive(FromForm) ]
2023-05-24 12:11:55 +02:00
struct UpdatePlannedEventForm < ' r > {
2023-05-03 22:40:22 +02:00
id : i64 ,
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-05-03 22:40:22 +02:00
}
#[ put( " /planned-event " , data = " <data> " ) ]
async fn update (
db : & State < SqlitePool > ,
2023-05-24 12:11:55 +02:00
data : Form < UpdatePlannedEventForm < '_ > > ,
2023-05-03 22:40:22 +02:00
_admin : AdminUser ,
) -> Flash < Redirect > {
match PlannedEvent ::find_by_id ( db , data . id ) . await {
Some ( planned_event ) = > {
planned_event
2023-06-08 11:28:25 +02:00
. update (
db ,
data . planned_amount_cox ,
data . max_people ,
data . notes ,
data . always_show ,
)
2023-05-03 22:40:22 +02:00
. await ;
Flash ::success ( Redirect ::to ( " / " ) , " Successfully edited the event " )
}
None = > Flash ::error ( Redirect ::to ( " / " ) , " Planned event id not found " ) ,
}
}
2023-04-04 12:19:56 +02:00
#[ get( " /planned-event/<id>/delete " ) ]
async fn delete ( db : & State < SqlitePool > , id : i64 , _admin : AdminUser ) -> Flash < Redirect > {
2023-04-26 12:21:30 +02:00
match PlannedEvent ::find_by_id ( db , id ) . await {
Some ( planned_event ) = > {
planned_event . delete ( db ) . await ;
Flash ::success ( Redirect ::to ( " / " ) , " Successfully deleted the event " )
}
None = > Flash ::error ( Redirect ::to ( " / " ) , " PlannedEvent does not exist " ) ,
}
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! ( ) ;
let _ = PlannedEvent ::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 ) ;
assert_eq! ( response . headers ( ) . get ( " Location " ) . next ( ) , Some ( " / " ) ) ;
let flash_cookie = response
. cookies ( )
. get ( " _flash " )
. expect ( " Expected flash cookie " ) ;
assert_eq! (
flash_cookie . value ( ) ,
" 7:successSuccessfully deleted the event "
) ;
let event = PlannedEvent ::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 ) ;
assert_eq! ( response . headers ( ) . get ( " Location " ) . next ( ) , Some ( " / " ) ) ;
let flash_cookie = response
. cookies ( )
. get ( " _flash " )
. expect ( " Expected flash cookie " ) ;
assert_eq! ( flash_cookie . value ( ) , " 5:errorPlannedEvent does not exist " ) ;
let _ = PlannedEvent ::find_by_id ( & db , 1 ) . await . unwrap ( ) ;
}
2023-07-31 21:29:03 +02:00
#[ sqlx::test ]
fn test_update ( ) {
let db = testdb! ( ) ;
let event = PlannedEvent ::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¬es=new-planned-event-text " ) ; // Add the form data to the request body;
let response = req . dispatch ( ) . await ;
assert_eq! ( response . status ( ) , Status ::SeeOther ) ;
assert_eq! ( response . headers ( ) . get ( " Location " ) . next ( ) , Some ( " / " ) ) ;
let flash_cookie = response
. cookies ( )
. get ( " _flash " )
. expect ( " Expected flash cookie " ) ;
assert_eq! (
flash_cookie . value ( ) ,
" 7:successSuccessfully edited the event "
) ;
let event = PlannedEvent ::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¬es=new-planned-event-text " ) ; // Add the form data to the request body;
let response = req . dispatch ( ) . await ;
assert_eq! ( response . status ( ) , Status ::SeeOther ) ;
assert_eq! ( response . headers ( ) . get ( " Location " ) . next ( ) , Some ( " / " ) ) ;
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 ) ;
assert_eq! ( response . headers ( ) . get ( " Location " ) . next ( ) , Some ( " / " ) ) ;
let flash_cookie = response
. cookies ( )
. get ( " _flash " )
. expect ( " Expected flash cookie " ) ;
assert_eq! (
flash_cookie . value ( ) ,
" 7:successSuccessfully planned the event "
) ;
let event = PlannedEvent ::find_by_id ( & db , 2 ) . await . unwrap ( ) ;
assert_eq! ( event . name , " my-cool-new-event " ) ;
}
2023-07-31 21:15:28 +02:00
}