diff --git a/src/endpoints/assignment/get_new.rs b/src/endpoints/assignment/get_new.rs new file mode 100644 index 00000000..dfe285a0 --- /dev/null +++ b/src/endpoints/assignment/get_new.rs @@ -0,0 +1,39 @@ +use actix_identity::Identity; +use actix_web::{web, HttpResponse, Responder}; +use askama::Template; +use askama_actix::TemplateToResponse; +use serde::Deserialize; +use sqlx::PgPool; + +use crate::models::{Event, Role, User}; + +#[derive(Deserialize)] +pub struct EventQuery { + event: i32 +} + +#[derive(Template)] +#[template(path = "assignment/new.html")] +pub struct NewAssignmentTemplate { + user: User, + event: Event +} + +#[actix_web::get("/assignments/new")] +pub async fn get(user: Identity, pool: web::Data, query: web::Query) -> impl Responder { + let current_user = User::read_by_id(pool.get_ref(), user.id().unwrap().parse().unwrap()) + .await + .unwrap(); + + if let Ok(event) = Event::read_by_id_including_location(pool.get_ref(), query.event).await { + if current_user.role == Role::Admin || current_user.role == Role::AreaManager && event.location.as_ref().unwrap().area_id == current_user.area_id { + let template = NewAssignmentTemplate { user: current_user, event }; + + return template.to_response(); + } + + return HttpResponse::Unauthorized().finish(); + } + + HttpResponse::BadRequest().body("Fehler beim Laden für Assignment") +} diff --git a/src/endpoints/assignment/mod.rs b/src/endpoints/assignment/mod.rs new file mode 100644 index 00000000..a9cb9a44 --- /dev/null +++ b/src/endpoints/assignment/mod.rs @@ -0,0 +1 @@ +pub mod get_new; diff --git a/src/endpoints/mod.rs b/src/endpoints/mod.rs index b51c63fc..b1d433aa 100644 --- a/src/endpoints/mod.rs +++ b/src/endpoints/mod.rs @@ -5,6 +5,7 @@ use serde::Deserialize; mod events; mod location; mod user; +mod assignment; #[derive(Deserialize)] pub struct IdPath { @@ -31,4 +32,6 @@ pub fn init(cfg: &mut ServiceConfig) { cfg.service(events::get_new::get); cfg.service(events::post_new::post); + + cfg.service(assignment::get_new::get); } diff --git a/src/models/event.rs b/src/models/event.rs index 80a2a92d..66407a63 100644 --- a/src/models/event.rs +++ b/src/models/event.rs @@ -101,7 +101,7 @@ impl Event { id: record.locationid, name: record.locationname.to_string(), area_id: record.locationareaid, - area: None + area: None, }), voluntary_wachhabender: record.voluntarywachhabender, amount_of_posten: record.amountofposten, @@ -112,4 +112,52 @@ impl Event { Ok(events) } + + pub async fn read_by_id_including_location(pool: &PgPool, id: i32) -> anyhow::Result { + let record = query!( + r#" + SELECT + event.id AS eventId, + event.date, + event.startTime, + event.endTime, + event.name, + event.locationId, + event.voluntaryWachhabender, + event.amountOfPosten, + event.clothing, + event.canceled, + location.id, + location.name AS locationName, + location.areaId AS locationAreaId + FROM event + JOIN location ON event.locationId = location.id + WHERE event.id = $1; + "#, + id + ) + .fetch_one(pool) + .await?; + + let event = Event { + id: record.eventid, + date: record.date, + start_time: record.starttime, + end_time: record.endtime, + name: record.name.to_string(), + location_id: record.locationid, + location: Some(Location { + id: record.locationid, + name: record.locationname.to_string(), + area_id: record.locationareaid, + area: None, + }), + voluntary_wachhabender: record.voluntarywachhabender, + amount_of_posten: record.amountofposten, + clothing: record.clothing.to_string(), + canceled: record.canceled, + }; + + Ok(event) + } } diff --git a/templates/assignment/new.html b/templates/assignment/new.html new file mode 100644 index 00000000..9337a95b --- /dev/null +++ b/templates/assignment/new.html @@ -0,0 +1,15 @@ +{% extends "nav.html" %} + +{% block content %} +
+
+
+

Planung für {{ event.name }}

+ +
+
+
+ + +{% endblock %} diff --git a/templates/index.html b/templates/index.html index 47a04559..3d9ae446 100644 --- a/templates/index.html +++ b/templates/index.html @@ -41,7 +41,7 @@