refactor: add html content type to all template responses

This commit is contained in:
Max Hohlfeld 2025-02-05 09:21:12 +01:00
parent 349a539765
commit 3a085a025a
30 changed files with 122 additions and 97 deletions

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{area::NewOrEditAreaTemplate, IdPath}, endpoints::{area::NewOrEditAreaTemplate, IdPath},
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/area/edit/{id}")] #[actix_web::get("/area/edit/{id}")]
@ -24,7 +23,7 @@ async fn get(
area: Some(area_in_db), area: Some(area_in_db),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} else { } else {
Ok(HttpResponse::NotFound().finish()) Ok(HttpResponse::NotFound().finish())
} }

View File

@ -1,15 +1,14 @@
use crate::{ use crate::{
endpoints::area::NewOrEditAreaTemplate, endpoints::area::NewOrEditAreaTemplate,
models::{Role, User}, models::{Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use brass_macros::db_test; use brass_macros::db_test;
use rinja::Template;
#[cfg(test)] #[cfg(test)]
use crate::utils::test_helper::{ use crate::utils::test_helper::{
assert_snapshot, read_body, test_get, DbTestContext, RequestConfig, StatusCode assert_snapshot, read_body, test_get, DbTestContext, RequestConfig, StatusCode,
}; };
#[actix_web::get("/area/new")] #[actix_web::get("/area/new")]
@ -23,7 +22,7 @@ async fn get(user: web::ReqData<User>) -> Result<impl Responder, ApplicationErro
area: None, area: None,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }
#[db_test] #[db_test]

View File

@ -1,5 +1,4 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
@ -10,7 +9,7 @@ use crate::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
}, },
ApplicationError, ApplicationError, TemplateResponse,
}, },
}; };
@ -61,5 +60,5 @@ pub async fn delete(
further_wachhabender_required, further_wachhabender_required,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,6 +1,5 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use garde::Validate; use garde::Validate;
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
@ -14,7 +13,7 @@ use crate::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
}, },
ApplicationError, ApplicationError, TemplateResponse,
}, },
}; };
@ -98,5 +97,5 @@ pub async fn post(
further_wachhabender_required, further_wachhabender_required,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,14 +1,14 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use chrono::NaiveDate; use chrono::NaiveDate;
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::endpoints::availability::NewOrEditAvailabilityTemplate; use crate::endpoints::availability::NewOrEditAvailabilityTemplate;
use crate::models::{ use crate::models::{
find_free_time_slots, only_one_availability_exists_and_is_whole_day, Availability, AvailabilityTime, User find_free_time_slots, only_one_availability_exists_and_is_whole_day, Availability,
AvailabilityTime, User,
}; };
use crate::utils::ApplicationError; use crate::utils::{ApplicationError, TemplateResponse};
use crate::{END_OF_DAY, START_OF_DAY}; use crate::{END_OF_DAY, START_OF_DAY};
#[derive(Deserialize)] #[derive(Deserialize)]
@ -51,5 +51,5 @@ pub async fn get(
slot_suggestions: free_slots, slot_suggestions: free_slots,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -4,7 +4,7 @@ use crate::{
find_free_time_slots, only_one_availability_exists_and_is_whole_day, Assignment, find_free_time_slots, only_one_availability_exists_and_is_whole_day, Assignment,
AvailabilityTime, Function, Vehicle, AvailabilityTime, Function, Vehicle,
}, },
utils::{event_planning_template::generate_vehicles_assigned_and_available, ApplicationError}, utils::{event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, TemplateResponse},
}; };
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use chrono::{NaiveDate, Utc}; use chrono::{NaiveDate, Utc};
@ -148,5 +148,5 @@ async fn get(
availabillities, availabillities,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,12 +1,11 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{availability::NewOrEditAvailabilityTemplate, IdPath}, endpoints::{availability::NewOrEditAvailabilityTemplate, IdPath},
models::{find_free_time_slots, Availability, AvailabilityTime, User}, models::{find_free_time_slots, Availability, AvailabilityTime, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
END_OF_DAY, START_OF_DAY, END_OF_DAY, START_OF_DAY,
}; };
@ -64,5 +63,5 @@ pub async fn get(
slot_suggestions: suggestions, slot_suggestions: suggestions,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,6 +1,5 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use brass_macros::db_test; use brass_macros::db_test;
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
#[cfg(test)] #[cfg(test)]
@ -13,7 +12,7 @@ use chrono::{NaiveDate, NaiveTime};
use crate::{ use crate::{
endpoints::{events::NewEventTemplate, IdPath}, endpoints::{events::NewEventTemplate, IdPath},
models::{Assignment, Event, Function, Location, Role, User}, models::{Assignment, Event, Function, Location, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/events/{id}/edit")] #[actix_web::get("/events/{id}/edit")]
@ -55,7 +54,7 @@ pub async fn get(
.any(|x| x.function == Function::Wachhabender), .any(|x| x.function == Function::Wachhabender),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }
#[db_test] #[db_test]
@ -101,9 +100,7 @@ async fn produces_template(context: &DbTestContext) {
note: None, note: None,
}; };
Event::create(&context.db_pool, changeset) Event::create(&context.db_pool, changeset).await.unwrap();
.await
.unwrap();
let app = context.app().await; let app = context.app().await;
let config = RequestConfig { let config = RequestConfig {

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{events::NewEventTemplate, NaiveDateQuery}, endpoints::{events::NewEventTemplate, NaiveDateQuery},
models::{Location, Role, User}, models::{Location, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/events/new")] #[actix_web::get("/events/new")]
@ -31,8 +30,8 @@ pub async fn get(
event: None, event: None,
amount_of_planned_posten: 0, amount_of_planned_posten: 0,
is_fuehrungsassistent_planned: false, is_fuehrungsassistent_planned: false,
is_wachhabender_planned: false is_wachhabender_planned: false,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -5,13 +5,13 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::IdPath, endpoints::IdPath,
filters, filters,
models::{Availability, AvailabillityAssignmentState, AvailabilityTime, Event, Function, Role, User, Vehicle}, models::{Availability, AvailabilityTime, AvailabillityAssignmentState, Event, Function, Role, User, Vehicle},
utils::{ utils::{
event_planning_template::{ event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required, generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
generate_vehicles_assigned_and_available, generate_vehicles_assigned_and_available,
}, },
ApplicationError, ApplicationError, TemplateResponse,
}, },
}; };
@ -68,5 +68,5 @@ pub async fn get(
vehicles_available, vehicles_available,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,11 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use chrono::{NaiveDate, Utc}; use chrono::{NaiveDate, Utc};
use rinja::Template; use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[derive(Template)] #[derive(Template)]
@ -37,5 +37,5 @@ pub async fn get(
today: Utc::now().date_naive(), today: Utc::now().date_naive(),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,7 +1,7 @@
use actix_web::{HttpResponse, Responder}; use actix_web::Responder;
use rinja::Template; use rinja::Template;
use crate::utils::ApplicationError; use crate::utils::{ApplicationError, TemplateResponse};
#[derive(Template)] #[derive(Template)]
#[template(path = "imprint.html")] #[template(path = "imprint.html")]
@ -11,5 +11,5 @@ struct ImprintTemplate {}
pub async fn get_imprint() -> Result<impl Responder, ApplicationError> { pub async fn get_imprint() -> Result<impl Responder, ApplicationError> {
let template = ImprintTemplate {}; let template = ImprintTemplate {};
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{location::LocationTemplate, IdPath}, endpoints::{location::LocationTemplate, IdPath},
models::{Area, Location, Role, User}, models::{Area, Location, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/locations/edit/{id}")] #[actix_web::get("/locations/edit/{id}")]
@ -38,5 +37,5 @@ pub async fn get(
location: Some(location), location: Some(location),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::location::LocationTemplate, endpoints::location::LocationTemplate,
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/locations/new")] #[actix_web::get("/locations/new")]
@ -29,5 +28,5 @@ pub async fn get(
location: None, location: None,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,10 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template; use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
models::{Area, Location, Role, User}, models::{Area, Location, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[derive(Template)] #[derive(Template)]
@ -55,5 +55,5 @@ pub async fn get(
grouped_locations, grouped_locations,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,7 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template; use rinja::Template;
use crate::{models::User, utils::ApplicationError}; use crate::{
models::User,
utils::{ApplicationError, TemplateResponse},
};
#[derive(Template)] #[derive(Template)]
#[template(path = "user/profile_change_password.html")] #[template(path = "user/profile_change_password.html")]
@ -11,5 +14,5 @@ struct ProfileChangePasswordTemplate {}
pub async fn get(_user: web::ReqData<User>) -> Result<impl Responder, ApplicationError> { pub async fn get(_user: web::ReqData<User>) -> Result<impl Responder, ApplicationError> {
let template = ProfileChangePasswordTemplate {}; let template = ProfileChangePasswordTemplate {};
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{user::NewOrEditUserTemplate, IdPath}, endpoints::{user::NewOrEditUserTemplate, IdPath},
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/users/edit/{id}")] #[actix_web::get("/users/edit/{id}")]
@ -39,5 +38,5 @@ pub async fn get_edit(
area_id: Some(user_in_db.area_id), area_id: Some(user_in_db.area_id),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -3,7 +3,7 @@ use actix_web::{http::header::LOCATION, web, HttpResponse, Responder};
use rinja::Template; use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use crate::utils::ApplicationError; use crate::utils::{ApplicationError, TemplateResponse};
#[derive(Template)] #[derive(Template)]
#[template(path = "user/login.html")] #[template(path = "user/login.html")]
@ -30,6 +30,6 @@ async fn get(
next: query.next.clone(), next: query.next.clone(),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }
} }

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::user::NewOrEditUserTemplate, endpoints::user::NewOrEditUserTemplate,
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/users/new")] #[actix_web::get("/users/new")]
@ -30,5 +29,5 @@ pub async fn get_new(
area_id: None, area_id: None,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,9 +1,9 @@
use crate::{ use crate::{
models::{Area, Function, Role, User}, models::{Area, Function, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template; use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
@ -44,5 +44,5 @@ pub async fn get_overview(
users, users,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,11 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template; use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
filters, filters,
models::{Area, Role, User}, models::{Area, Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[derive(Template)] #[derive(Template)]
@ -26,5 +26,5 @@ pub async fn get(
let template = ProfileTemplate { user }; let template = ProfileTemplate { user };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,10 +1,12 @@
use actix_identity::Identity; use actix_identity::Identity;
use actix_web::{get, http::header::LOCATION, web, HttpResponse, Responder}; use actix_web::{get, http::header::LOCATION, web, HttpResponse, Responder};
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{models::Registration, utils::ApplicationError}; use crate::{
models::Registration,
utils::{ApplicationError, TemplateResponse},
};
use super::ResetPasswordTemplate; use super::ResetPasswordTemplate;
@ -38,5 +40,5 @@ pub async fn get(
submit_button_label: "Registrieren", submit_button_label: "Registrieren",
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -4,7 +4,10 @@ use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{models::PasswordReset, utils::ApplicationError}; use crate::{
models::PasswordReset,
utils::{ApplicationError, TemplateResponse},
};
use super::ResetPasswordTemplate; use super::ResetPasswordTemplate;
@ -38,10 +41,10 @@ pub async fn get(
submit_button_label: "Passwort zurücksetzen", submit_button_label: "Passwort zurücksetzen",
}; };
return Ok(HttpResponse::Ok().body(template.render()?)) return Ok(template.to_response()?);
} }
} }
let template = ForgotPasswordTemplate {}; let template = ForgotPasswordTemplate {};
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,11 +1,10 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{vehicle::VehicleNewOrEditTemplate, IdPath}, endpoints::{vehicle::VehicleNewOrEditTemplate, IdPath},
models::{Role, User, Vehicle}, models::{Role, User, Vehicle},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/vehicles/{id}")] #[actix_web::get("/vehicles/{id}")]
@ -27,5 +26,5 @@ pub async fn get(
vehicle: Some(vehicle), vehicle: Some(vehicle),
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,10 +1,9 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template;
use crate::{ use crate::{
endpoints::vehicle::VehicleNewOrEditTemplate, endpoints::vehicle::VehicleNewOrEditTemplate,
models::{Role, User}, models::{Role, User},
utils::ApplicationError, utils::{ApplicationError, TemplateResponse},
}; };
#[actix_web::get("/vehicles/new")] #[actix_web::get("/vehicles/new")]
@ -18,5 +17,5 @@ pub async fn get(user: web::ReqData<User>) -> Result<impl Responder, Application
vehicle: None, vehicle: None,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,18 +1,24 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, Responder};
use rinja::Template; use rinja::Template;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{models::{User, Vehicle, Role}, utils::ApplicationError}; use crate::{
models::{Role, User, Vehicle},
utils::{ApplicationError, TemplateResponse},
};
#[derive(Template)] #[derive(Template)]
#[template(path = "vehicles/overview.html")] #[template(path = "vehicles/overview.html")]
pub struct VehiclesOverviewTemplate { pub struct VehiclesOverviewTemplate {
user: User, user: User,
vehicles: Vec<Vehicle> vehicles: Vec<Vehicle>,
} }
#[actix_web::get("/vehicles")] #[actix_web::get("/vehicles")]
pub async fn get(user: web::ReqData<User>, pool: web::Data<PgPool>) -> Result<impl Responder, ApplicationError> { pub async fn get(
user: web::ReqData<User>,
pool: web::Data<PgPool>,
) -> Result<impl Responder, ApplicationError> {
if user.role != Role::Admin { if user.role != Role::Admin {
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
@ -21,8 +27,8 @@ pub async fn get(user: web::ReqData<User>, pool: web::Data<PgPool>) -> Result<im
let template = VehiclesOverviewTemplate { let template = VehiclesOverviewTemplate {
user: user.into_inner(), user: user.into_inner(),
vehicles vehicles,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,12 +1,14 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate, endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, VehicleAssignement}, models::{Event, Role, User, VehicleAssignement},
utils::{event_planning_template::generate_vehicles_assigned_and_available, ApplicationError}, utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse,
},
}; };
#[derive(Deserialize)] #[derive(Deserialize)]
@ -55,5 +57,5 @@ pub async fn delete(
vehicles_available, vehicles_available,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -1,12 +1,14 @@
use actix_web::{web, HttpResponse, Responder}; use actix_web::{web, HttpResponse, Responder};
use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate, endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, Vehicle, VehicleAssignement}, models::{Event, Role, User, Vehicle, VehicleAssignement},
utils::{event_planning_template::generate_vehicles_assigned_and_available, ApplicationError}, utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse,
},
}; };
#[derive(Deserialize)] #[derive(Deserialize)]
@ -44,7 +46,8 @@ pub async fn post(
}; };
let existing_assignments_for_vehicle = let existing_assignments_for_vehicle =
VehicleAssignement::read_all_by_vehicle_and_date(pool.get_ref(), vehicle.id, event.date).await?; VehicleAssignement::read_all_by_vehicle_and_date(pool.get_ref(), vehicle.id, event.date)
.await?;
let has_start_time_during_event = let has_start_time_during_event =
|a: &VehicleAssignement| a.start_time >= event.start_time && a.start_time <= event.end_time; |a: &VehicleAssignement| a.start_time >= event.start_time && a.start_time <= event.end_time;
let has_end_time_during_event = let has_end_time_during_event =
@ -76,5 +79,5 @@ pub async fn post(
vehicles_available, vehicles_available,
}; };
Ok(HttpResponse::Ok().body(template.render()?)) Ok(template.to_response()?)
} }

View File

@ -4,6 +4,7 @@ pub mod event_planning_template;
pub mod manage_commands; pub mod manage_commands;
pub mod password_help; pub mod password_help;
pub mod token_generation; pub mod token_generation;
mod template_response_trait;
#[cfg(test)] #[cfg(test)]
pub mod test_helper; pub mod test_helper;
@ -11,6 +12,8 @@ pub mod test_helper;
pub use application_error::ApplicationError; pub use application_error::ApplicationError;
use chrono::{NaiveDate, Utc}; use chrono::{NaiveDate, Utc};
pub use template_response_trait::TemplateResponse;
pub fn get_return_url_for_date(date: &NaiveDate) -> String { pub fn get_return_url_for_date(date: &NaiveDate) -> String {
let today = Utc::now().date_naive(); let today = Utc::now().date_naive();
if date == &today { if date == &today {

View File

@ -0,0 +1,18 @@
use actix_web::{http::header::ContentType, HttpResponse};
use rinja::Template;
pub trait TemplateResponse {
fn to_response(&self) -> Result<HttpResponse, rinja::Error>;
}
impl<T: Template> TemplateResponse for T {
fn to_response(&self) -> Result<HttpResponse, rinja::Error> {
let rendered_template = self.render()?;
let response = HttpResponse::Ok()
.content_type(ContentType::html())
.body(rendered_template);
Ok(response)
}
}