diff --git a/src/endpoints/area/get_edit.rs b/src/endpoints/area/get_edit.rs new file mode 100644 index 00000000..1e58fd76 --- /dev/null +++ b/src/endpoints/area/get_edit.rs @@ -0,0 +1,31 @@ +use actix_web::{web, HttpResponse, Responder}; +use askama_actix::TemplateToResponse; +use sqlx::PgPool; + +use crate::{ + endpoints::{area::NewOrEditAreaTemplate, IdPath}, + models::{Area, Role, User}, + utils::ApplicationError, +}; + +#[actix_web::get("/area/edit/{id}")] +async fn get( + user: web::ReqData, + pool: web::Data, + path: web::Path, +) -> Result { + if user.role != Role::Admin { + return Err(ApplicationError::Unauthorized); + } + + if let Some(area_in_db) = Area::read_by_id(pool.get_ref(), path.id).await? { + let template = NewOrEditAreaTemplate { + user: user.into_inner(), + area: Some(area_in_db), + }; + + return Ok(template.to_response()); + } else { + return Ok(HttpResponse::NotFound().finish()); + } +} diff --git a/src/endpoints/area/get_new.rs b/src/endpoints/area/get_new.rs index 58cb4e68..3e222286 100644 --- a/src/endpoints/area/get_new.rs +++ b/src/endpoints/area/get_new.rs @@ -1,14 +1,7 @@ use actix_web::{web, HttpResponse, Responder}; -use askama::Template; use askama_actix::TemplateToResponse; -use crate::models::{Role, User}; - -#[derive(Template)] -#[template(path = "area/new.html")] -struct NewAreaTemplate { - user: User, -} +use crate::{endpoints::area::NewOrEditAreaTemplate, models::{Role, User}}; #[actix_web::get("/area/new")] async fn get(user: web::ReqData) -> impl Responder { @@ -16,8 +9,9 @@ async fn get(user: web::ReqData) -> impl Responder { return HttpResponse::Unauthorized().finish(); } - let template = NewAreaTemplate { + let template = NewOrEditAreaTemplate { user: user.into_inner(), + area: None }; template.to_response() diff --git a/src/endpoints/area/mod.rs b/src/endpoints/area/mod.rs index 661e73cf..ec124c5a 100644 --- a/src/endpoints/area/mod.rs +++ b/src/endpoints/area/mod.rs @@ -1,2 +1,14 @@ pub mod get_new; pub mod post_new; +pub mod get_edit; + +use askama::Template; + +use crate::models::{Area, Role, User}; + +#[derive(Template)] +#[template(path = "area/new_or_edit.html")] +struct NewOrEditAreaTemplate { + user: User, + area: Option, +} diff --git a/src/endpoints/location/get_overview.rs b/src/endpoints/location/get_overview.rs index 97d7ea96..5a513144 100644 --- a/src/endpoints/location/get_overview.rs +++ b/src/endpoints/location/get_overview.rs @@ -32,7 +32,7 @@ pub async fn get(user: web::ReqData, pool: web::Data) -> impl Resp .unwrap(); let area = Area::read_by_id(pool.get_ref(), user.area_id) .await - .unwrap(); + .unwrap().unwrap(); grouped_locations = vec![(area, Vec::new())]; } diff --git a/src/endpoints/mod.rs b/src/endpoints/mod.rs index d4f8223e..8a371028 100644 --- a/src/endpoints/mod.rs +++ b/src/endpoints/mod.rs @@ -59,6 +59,7 @@ pub fn init(cfg: &mut ServiceConfig) { cfg.service(area::get_new::get); cfg.service(area::post_new::post); + cfg.service(area::get_edit::get); cfg.service(export::get_availability::get); cfg.service(export::get_availability_data::get); diff --git a/src/endpoints/user/get_overview.rs b/src/endpoints/user/get_overview.rs index e5eb6ee2..4634796c 100644 --- a/src/endpoints/user/get_overview.rs +++ b/src/endpoints/user/get_overview.rs @@ -27,7 +27,7 @@ pub async fn get_overview(user: Identity, pool: web::Data) -> impl Respo area = Some( Area::read_by_id(pool.get_ref(), current_user.area_id) .await - .unwrap(), + .unwrap().unwrap(), ); users = User::read_all_by_area(pool.get_ref(), current_user.area_id) .await diff --git a/src/endpoints/user/get_profile.rs b/src/endpoints/user/get_profile.rs index d1b44297..2f472d3d 100644 --- a/src/endpoints/user/get_profile.rs +++ b/src/endpoints/user/get_profile.rs @@ -16,7 +16,7 @@ pub async fn get(user: web::ReqData, pool: web::Data) -> impl Resp let area = Area::read_by_id(pool.get_ref(), user.area_id).await.unwrap(); let mut user = user.into_inner(); - user.area = Some(area); + user.area = area; let template = ProfileTemplate { user }; diff --git a/src/models/area.rs b/src/models/area.rs index 873249ae..8781ecc0 100644 --- a/src/models/area.rs +++ b/src/models/area.rs @@ -1,26 +1,33 @@ +use super::Result; use sqlx::{query, query_as, PgPool}; #[derive(Clone, Debug)] pub struct Area { pub id: i32, - pub name: String + pub name: String, } impl Area { - pub async fn create(pool: &PgPool, name: &str) -> anyhow::Result { - let result = query!("INSERT INTO area (name) VALUES ($1) RETURNING id;", name).fetch_one(pool).await?; + pub async fn create(pool: &PgPool, name: &str) -> Result { + let result = query!("INSERT INTO area (name) VALUES ($1) RETURNING id;", name) + .fetch_one(pool) + .await?; Ok(result.id) } - pub async fn read_by_id(pool: &PgPool, id: i32) -> anyhow::Result { - let record = query_as!(Area, "SELECT * FROM area WHERE id = $1", id).fetch_one(pool).await?; + pub async fn read_by_id(pool: &PgPool, id: i32) -> Result> { + let record = query_as!(Area, "SELECT * FROM area WHERE id = $1", id) + .fetch_optional(pool) + .await?; Ok(record) } - pub async fn read_all(pool: &PgPool) -> anyhow::Result> { - let records = query_as!(Area, "SELECT * FROM area").fetch_all(pool).await?; + pub async fn read_all(pool: &PgPool) -> Result> { + let records = query_as!(Area, "SELECT * FROM area") + .fetch_all(pool) + .await?; Ok(records) } diff --git a/src/models/password_reset.rs b/src/models/password_reset.rs index f257a70c..c2555dcf 100644 --- a/src/models/password_reset.rs +++ b/src/models/password_reset.rs @@ -10,7 +10,7 @@ pub trait Token { pub struct NoneToken {} impl Token for NoneToken { - async fn delete(&self, pool: &PgPool) -> Result<()> { + async fn delete(&self, _pool: &PgPool) -> Result<()> { unimplemented!() } } diff --git a/templates/area/new.html b/templates/area/new.html deleted file mode 100644 index 8fba2321..00000000 --- a/templates/area/new.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends "nav.html" %} - -{% block content %} -
-
-
-

Neuen Bereich anlegen

- -
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
- -
- -
-
-
- -
-
-
- - -{% endblock %} diff --git a/templates/area/new_or_edit.html b/templates/area/new_or_edit.html new file mode 100644 index 00000000..930f4f40 --- /dev/null +++ b/templates/area/new_or_edit.html @@ -0,0 +1,68 @@ +{% extends "nav.html" %} + +{% block content %} +
+
+ {% if area.is_some() %} +
+

Bereich '{{ area.as_ref().unwrap().name }}' anlegen

+ {% else %} + +

Neuen Bereich anlegen

+ {% endif %} + +
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+ + +{% endblock %}