use actix_web::{http::header::LOCATION, web, HttpResponse, Responder}; use sqlx::PgPool; use crate::{ endpoints::events::NewOrEditEventForm, utils::{self, ApplicationError}, }; use brass_db::{ models::{Event, EventChangeset, EventContext, Role, User}, validation::AsyncValidate, }; #[actix_web::post("/events/new")] pub async fn post( user: web::ReqData, pool: web::Data, form: web::Form, ) -> Result { if user.role != Role::Admin && user.role != Role::AreaManager { return Err(ApplicationError::Unauthorized); } let changeset = EventChangeset { amount_of_posten: form.amount, clothing: form.clothing, location_id: form.location, time: (form.date.and_time(form.start), form.end), name: form.name.clone(), note: form .note .clone() .and_then(|n| if !n.is_empty() { Some(n) } else { None }), voluntary_wachhabender: form.voluntarywachhabender, voluntary_fuehrungsassistent: form.voluntaryfuehrungsassistent, }; let event_context = EventContext { event: None, user: &user.into_inner(), pool: pool.get_ref(), }; if let Err(e) = changeset.validate_with_context(&event_context).await { return Ok(HttpResponse::UnprocessableEntity().body(e.to_string())); }; Event::create(pool.get_ref(), changeset).await?; let url = utils::get_return_url_for_date(&form.date); Ok(HttpResponse::Found() .insert_header((LOCATION, url.clone())) .insert_header(("HX-LOCATION", url)) .finish()) }