56 lines
1.6 KiB
Rust
56 lines
1.6 KiB
Rust
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<User>,
|
|
pool: web::Data<PgPool>,
|
|
form: web::Form<NewOrEditEventForm>,
|
|
) -> Result<impl Responder, ApplicationError> {
|
|
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())
|
|
}
|