From 3a085a025ae2676ab5758dd2e982c93c20ff54ee Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Wed, 5 Feb 2025 09:21:12 +0100 Subject: [PATCH] refactor: add html content type to all template responses --- web/src/endpoints/area/get_edit.rs | 5 ++--- web/src/endpoints/area/get_new.rs | 9 ++++----- web/src/endpoints/assignment/delete.rs | 5 ++--- web/src/endpoints/assignment/post_new.rs | 5 ++--- web/src/endpoints/availability/get_new.rs | 8 ++++---- web/src/endpoints/availability/get_overview.rs | 4 ++-- web/src/endpoints/availability/get_update.rs | 5 ++--- web/src/endpoints/events/get_edit.rs | 9 +++------ web/src/endpoints/events/get_new.rs | 9 ++++----- web/src/endpoints/events/get_plan.rs | 6 +++--- web/src/endpoints/export/get_availability.rs | 6 +++--- web/src/endpoints/imprint.rs | 6 +++--- web/src/endpoints/location/get_edit.rs | 5 ++--- web/src/endpoints/location/get_new.rs | 7 +++---- web/src/endpoints/location/get_overview.rs | 6 +++--- web/src/endpoints/user/get_changepassword.rs | 9 ++++++--- web/src/endpoints/user/get_edit.rs | 5 ++--- web/src/endpoints/user/get_login.rs | 4 ++-- web/src/endpoints/user/get_new.rs | 7 +++---- web/src/endpoints/user/get_overview.rs | 6 +++--- web/src/endpoints/user/get_profile.rs | 6 +++--- web/src/endpoints/user/get_register.rs | 8 +++++--- web/src/endpoints/user/get_reset.rs | 9 ++++++--- web/src/endpoints/vehicle/get_edit.rs | 5 ++--- web/src/endpoints/vehicle/get_new.rs | 7 +++---- web/src/endpoints/vehicle/get_overview.rs | 18 ++++++++++++------ web/src/endpoints/vehicle_assignment/delete.rs | 8 +++++--- .../endpoints/vehicle_assignment/post_new.rs | 11 +++++++---- web/src/utils/mod.rs | 3 +++ web/src/utils/template_response_trait.rs | 18 ++++++++++++++++++ 30 files changed, 122 insertions(+), 97 deletions(-) create mode 100644 web/src/utils/template_response_trait.rs diff --git a/web/src/endpoints/area/get_edit.rs b/web/src/endpoints/area/get_edit.rs index 0a4ab168..55e1b685 100644 --- a/web/src/endpoints/area/get_edit.rs +++ b/web/src/endpoints/area/get_edit.rs @@ -1,11 +1,10 @@ use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; use sqlx::PgPool; use crate::{ endpoints::{area::NewOrEditAreaTemplate, IdPath}, models::{Area, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/area/edit/{id}")] @@ -24,7 +23,7 @@ async fn get( area: Some(area_in_db), }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } else { Ok(HttpResponse::NotFound().finish()) } diff --git a/web/src/endpoints/area/get_new.rs b/web/src/endpoints/area/get_new.rs index c7714f9b..e52dae39 100644 --- a/web/src/endpoints/area/get_new.rs +++ b/web/src/endpoints/area/get_new.rs @@ -1,15 +1,14 @@ use crate::{ endpoints::area::NewOrEditAreaTemplate, 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 rinja::Template; #[cfg(test)] 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")] @@ -23,7 +22,7 @@ async fn get(user: web::ReqData) -> Result Result { let template = ImprintTemplate {}; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/location/get_edit.rs b/web/src/endpoints/location/get_edit.rs index 6776c4e7..3a4ce5f0 100644 --- a/web/src/endpoints/location/get_edit.rs +++ b/web/src/endpoints/location/get_edit.rs @@ -1,11 +1,10 @@ use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; use sqlx::PgPool; use crate::{ endpoints::{location::LocationTemplate, IdPath}, models::{Area, Location, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/locations/edit/{id}")] @@ -38,5 +37,5 @@ pub async fn get( location: Some(location), }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/location/get_new.rs b/web/src/endpoints/location/get_new.rs index 94842eac..bb7e502e 100644 --- a/web/src/endpoints/location/get_new.rs +++ b/web/src/endpoints/location/get_new.rs @@ -1,11 +1,10 @@ -use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; +use actix_web::{web, Responder}; use sqlx::PgPool; use crate::{ endpoints::location::LocationTemplate, models::{Area, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/locations/new")] @@ -29,5 +28,5 @@ pub async fn get( location: None, }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/location/get_overview.rs b/web/src/endpoints/location/get_overview.rs index edb03fcf..eda6be98 100644 --- a/web/src/endpoints/location/get_overview.rs +++ b/web/src/endpoints/location/get_overview.rs @@ -1,10 +1,10 @@ -use actix_web::{web, HttpResponse, Responder}; +use actix_web::{web, Responder}; use rinja::Template; use sqlx::PgPool; use crate::{ models::{Area, Location, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[derive(Template)] @@ -55,5 +55,5 @@ pub async fn get( grouped_locations, }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_changepassword.rs b/web/src/endpoints/user/get_changepassword.rs index b26e22da..d5bc5d79 100644 --- a/web/src/endpoints/user/get_changepassword.rs +++ b/web/src/endpoints/user/get_changepassword.rs @@ -1,7 +1,10 @@ -use actix_web::{web, HttpResponse, Responder}; +use actix_web::{web, Responder}; use rinja::Template; -use crate::{models::User, utils::ApplicationError}; +use crate::{ + models::User, + utils::{ApplicationError, TemplateResponse}, +}; #[derive(Template)] #[template(path = "user/profile_change_password.html")] @@ -11,5 +14,5 @@ struct ProfileChangePasswordTemplate {} pub async fn get(_user: web::ReqData) -> Result { let template = ProfileChangePasswordTemplate {}; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_edit.rs b/web/src/endpoints/user/get_edit.rs index 1076049b..2492db4c 100644 --- a/web/src/endpoints/user/get_edit.rs +++ b/web/src/endpoints/user/get_edit.rs @@ -1,11 +1,10 @@ use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; use sqlx::PgPool; use crate::{ endpoints::{user::NewOrEditUserTemplate, IdPath}, models::{Area, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/users/edit/{id}")] @@ -39,5 +38,5 @@ pub async fn get_edit( area_id: Some(user_in_db.area_id), }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_login.rs b/web/src/endpoints/user/get_login.rs index dbcce787..1b23eec4 100644 --- a/web/src/endpoints/user/get_login.rs +++ b/web/src/endpoints/user/get_login.rs @@ -3,7 +3,7 @@ use actix_web::{http::header::LOCATION, web, HttpResponse, Responder}; use rinja::Template; use serde::Deserialize; -use crate::utils::ApplicationError; +use crate::utils::{ApplicationError, TemplateResponse}; #[derive(Template)] #[template(path = "user/login.html")] @@ -30,6 +30,6 @@ async fn get( next: query.next.clone(), }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } } diff --git a/web/src/endpoints/user/get_new.rs b/web/src/endpoints/user/get_new.rs index ae00a75d..349a3e1d 100644 --- a/web/src/endpoints/user/get_new.rs +++ b/web/src/endpoints/user/get_new.rs @@ -1,11 +1,10 @@ -use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; +use actix_web::{web, Responder}; use sqlx::PgPool; use crate::{ endpoints::user::NewOrEditUserTemplate, models::{Area, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/users/new")] @@ -30,5 +29,5 @@ pub async fn get_new( area_id: None, }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_overview.rs b/web/src/endpoints/user/get_overview.rs index 94f0e956..621e0799 100644 --- a/web/src/endpoints/user/get_overview.rs +++ b/web/src/endpoints/user/get_overview.rs @@ -1,9 +1,9 @@ use crate::{ 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 sqlx::PgPool; @@ -44,5 +44,5 @@ pub async fn get_overview( users, }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_profile.rs b/web/src/endpoints/user/get_profile.rs index ac9b5ac4..607aaefe 100644 --- a/web/src/endpoints/user/get_profile.rs +++ b/web/src/endpoints/user/get_profile.rs @@ -1,11 +1,11 @@ -use actix_web::{web, HttpResponse, Responder}; +use actix_web::{web, Responder}; use rinja::Template; use sqlx::PgPool; use crate::{ filters, models::{Area, Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[derive(Template)] @@ -26,5 +26,5 @@ pub async fn get( let template = ProfileTemplate { user }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_register.rs b/web/src/endpoints/user/get_register.rs index 0ff0982c..0f1384f9 100644 --- a/web/src/endpoints/user/get_register.rs +++ b/web/src/endpoints/user/get_register.rs @@ -1,10 +1,12 @@ use actix_identity::Identity; use actix_web::{get, http::header::LOCATION, web, HttpResponse, Responder}; -use rinja::Template; use serde::Deserialize; use sqlx::PgPool; -use crate::{models::Registration, utils::ApplicationError}; +use crate::{ + models::Registration, + utils::{ApplicationError, TemplateResponse}, +}; use super::ResetPasswordTemplate; @@ -38,5 +40,5 @@ pub async fn get( submit_button_label: "Registrieren", }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/user/get_reset.rs b/web/src/endpoints/user/get_reset.rs index 855f2166..5515864b 100644 --- a/web/src/endpoints/user/get_reset.rs +++ b/web/src/endpoints/user/get_reset.rs @@ -4,7 +4,10 @@ use rinja::Template; use serde::Deserialize; use sqlx::PgPool; -use crate::{models::PasswordReset, utils::ApplicationError}; +use crate::{ + models::PasswordReset, + utils::{ApplicationError, TemplateResponse}, +}; use super::ResetPasswordTemplate; @@ -38,10 +41,10 @@ pub async fn get( submit_button_label: "Passwort zurücksetzen", }; - return Ok(HttpResponse::Ok().body(template.render()?)) + return Ok(template.to_response()?); } } let template = ForgotPasswordTemplate {}; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/vehicle/get_edit.rs b/web/src/endpoints/vehicle/get_edit.rs index 33215a3c..1add5d0a 100644 --- a/web/src/endpoints/vehicle/get_edit.rs +++ b/web/src/endpoints/vehicle/get_edit.rs @@ -1,11 +1,10 @@ use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; use sqlx::PgPool; use crate::{ endpoints::{vehicle::VehicleNewOrEditTemplate, IdPath}, models::{Role, User, Vehicle}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/vehicles/{id}")] @@ -27,5 +26,5 @@ pub async fn get( vehicle: Some(vehicle), }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/endpoints/vehicle/get_new.rs b/web/src/endpoints/vehicle/get_new.rs index 805462b7..e7dc4695 100644 --- a/web/src/endpoints/vehicle/get_new.rs +++ b/web/src/endpoints/vehicle/get_new.rs @@ -1,10 +1,9 @@ -use actix_web::{web, HttpResponse, Responder}; -use rinja::Template; +use actix_web::{web, Responder}; use crate::{ endpoints::vehicle::VehicleNewOrEditTemplate, models::{Role, User}, - utils::ApplicationError, + utils::{ApplicationError, TemplateResponse}, }; #[actix_web::get("/vehicles/new")] @@ -18,5 +17,5 @@ pub async fn get(user: web::ReqData) -> Result + vehicles: Vec, } #[actix_web::get("/vehicles")] -pub async fn get(user: web::ReqData, pool: web::Data) -> Result { +pub async fn get( + user: web::ReqData, + pool: web::Data, +) -> Result { if user.role != Role::Admin { return Err(ApplicationError::Unauthorized); } @@ -21,8 +27,8 @@ pub async fn get(user: web::ReqData, pool: web::Data) -> Result= event.start_time && a.start_time <= event.end_time; let has_end_time_during_event = @@ -76,5 +79,5 @@ pub async fn post( vehicles_available, }; - Ok(HttpResponse::Ok().body(template.render()?)) + Ok(template.to_response()?) } diff --git a/web/src/utils/mod.rs b/web/src/utils/mod.rs index cba7f012..9afff1f2 100644 --- a/web/src/utils/mod.rs +++ b/web/src/utils/mod.rs @@ -4,6 +4,7 @@ pub mod event_planning_template; pub mod manage_commands; pub mod password_help; pub mod token_generation; +mod template_response_trait; #[cfg(test)] pub mod test_helper; @@ -11,6 +12,8 @@ pub mod test_helper; pub use application_error::ApplicationError; use chrono::{NaiveDate, Utc}; +pub use template_response_trait::TemplateResponse; + pub fn get_return_url_for_date(date: &NaiveDate) -> String { let today = Utc::now().date_naive(); if date == &today { diff --git a/web/src/utils/template_response_trait.rs b/web/src/utils/template_response_trait.rs new file mode 100644 index 00000000..bab9a7ec --- /dev/null +++ b/web/src/utils/template_response_trait.rs @@ -0,0 +1,18 @@ +use actix_web::{http::header::ContentType, HttpResponse}; +use rinja::Template; + +pub trait TemplateResponse { + fn to_response(&self) -> Result; +} + +impl TemplateResponse for T { + fn to_response(&self) -> Result { + let rendered_template = self.render()?; + + let response = HttpResponse::Ok() + .content_type(ContentType::html()) + .body(rendered_template); + + Ok(response) + } +}