Add an accommodations reservations module #188
@ -146,3 +146,51 @@ pub async fn delete(m: FamilyAndAccommodationReservationInPath) -> HttpResult {
|
||||
|
||||
Ok(HttpResponse::Accepted().finish())
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
pub struct ValidateQuery {
|
||||
validate: bool,
|
||||
}
|
||||
|
||||
/// Validate or reject a reservation
|
||||
pub async fn validate_or_reject(
|
||||
m: FamilyAndAccommodationReservationInPath,
|
||||
q: web::Json<ValidateQuery>,
|
||||
) -> HttpResult {
|
||||
if !m.membership().is_admin {
|
||||
return Ok(HttpResponse::BadRequest().json("Only an admin can validate a reservation!"));
|
||||
}
|
||||
|
||||
if m.validated == Some(q.validate) {
|
||||
return Ok(
|
||||
HttpResponse::AlreadyReported().json("This reservation has already been processed!")
|
||||
);
|
||||
}
|
||||
|
||||
// In case of re-validation, check that the time is still available
|
||||
if m.validated == Some(false) && q.validate {
|
||||
let potential_conflicts =
|
||||
accommodations_reservations_service::get_reservations_for_time_interval(
|
||||
m.accommodation_id(),
|
||||
m.reservation_start as usize,
|
||||
m.reservation_end as usize,
|
||||
)
|
||||
.await?;
|
||||
|
||||
if potential_conflicts
|
||||
.iter()
|
||||
.any(|a| a.validated != Some(false))
|
||||
{
|
||||
return Ok(HttpResponse::Conflict().json(
|
||||
"This cannot be accepted as it would create a conflict with another reservation!",
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// Update reservation validation status
|
||||
let mut reservation = m.to_reservation();
|
||||
reservation.validated = Some(q.validate);
|
||||
accommodations_reservations_service::update(&mut reservation).await?;
|
||||
|
||||
Ok(HttpResponse::Accepted().finish())
|
||||
}
|
||||
|
@ -252,7 +252,10 @@ async fn main() -> std::io::Result<()> {
|
||||
"/family/{id}/accommodations/reservation/{reservation_id}",
|
||||
web::delete().to(accommodations_reservations_controller::delete),
|
||||
)
|
||||
// TODO : validate or reject
|
||||
.route(
|
||||
"/family/{id}/accommodations/reservation/{reservation_id}/validate",
|
||||
web::post().to(accommodations_reservations_controller::validate_or_reject),
|
||||
)
|
||||
// [ACCOMMODATIONS] Calendars controller
|
||||
// TODO : create
|
||||
// TODO : list
|
||||
|
Loading…
Reference in New Issue
Block a user