feat: add location overview for admin and areamanager
This commit is contained in:
parent
0172e9bdad
commit
b4baa6ac9e
38
src/endpoints/location/get_overview.rs
Normal file
38
src/endpoints/location/get_overview.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
use actix_identity::Identity;
|
||||||
|
use actix_web::{web, HttpResponse, Responder};
|
||||||
|
use askama::Template;
|
||||||
|
use askama_actix::TemplateToResponse;
|
||||||
|
use sqlx::PgPool;
|
||||||
|
|
||||||
|
use crate::models::{Area, Location, Role, User};
|
||||||
|
|
||||||
|
#[derive(Template)]
|
||||||
|
#[template(path = "location/overview.html")]
|
||||||
|
pub struct LocationsTemplate {
|
||||||
|
user: User,
|
||||||
|
area: Option<Area>,
|
||||||
|
locations: Vec<Location>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[actix_web::get("/locations")]
|
||||||
|
pub async fn get(user: Identity, pool: web::Data<PgPool>) -> impl Responder {
|
||||||
|
let current_user = User::read_by_id(pool.get_ref(), user.id().unwrap().parse().unwrap()).await.unwrap();
|
||||||
|
|
||||||
|
if current_user.role == Role::AreaManager || current_user.role == Role::Admin {
|
||||||
|
let mut area = None;
|
||||||
|
let locations;
|
||||||
|
|
||||||
|
if current_user.role == Role::Admin {
|
||||||
|
locations = Location::read_all_including_area(pool.get_ref()).await.unwrap();
|
||||||
|
} else {
|
||||||
|
locations = Location::read_by_area(pool.get_ref(), current_user.area_id).await.unwrap();
|
||||||
|
area = Some(Area::read_by_id(pool.get_ref(), current_user.area_id).await.unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
let template = LocationsTemplate { user: current_user, area, locations};
|
||||||
|
|
||||||
|
return template.to_response()
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse::BadRequest().body("Fehler beim Zugriff auf die Veranstaltungsorte!");
|
||||||
|
}
|
@ -1,32 +1 @@
|
|||||||
use actix_identity::Identity;
|
pub mod get_overview;
|
||||||
use actix_web::{web, HttpResponse, Responder};
|
|
||||||
use askama::Template;
|
|
||||||
use askama_actix::TemplateToResponse;
|
|
||||||
use sqlx::PgPool;
|
|
||||||
|
|
||||||
use crate::models::{Area, Location, Role, User};
|
|
||||||
|
|
||||||
#[derive(Template)]
|
|
||||||
#[template(path = "locations.html")]
|
|
||||||
pub struct LocationsTemplate {
|
|
||||||
user: User,
|
|
||||||
area: Area,
|
|
||||||
locations: Vec<Location>
|
|
||||||
}
|
|
||||||
|
|
||||||
#[actix_web::get("/locations")]
|
|
||||||
pub async fn get(user: Identity, pool: web::Data<PgPool>) -> impl Responder {
|
|
||||||
let current_user = User::read_by_id(pool.get_ref(), user.id().unwrap().parse().unwrap()).await.unwrap();
|
|
||||||
|
|
||||||
if current_user.role == Role::AreaManager {
|
|
||||||
if let Ok(locations) = Location::read_by_area(pool.get_ref(), current_user.area_id).await {
|
|
||||||
let area = Area::read_by_id(pool.get_ref(), current_user.area_id).await.unwrap();
|
|
||||||
|
|
||||||
let template = LocationsTemplate { user: current_user, area, locations};
|
|
||||||
|
|
||||||
return template.to_response()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return HttpResponse::BadRequest().body("Fehler beim Zugriff auf die Veranstaltungsorte!");
|
|
||||||
}
|
|
||||||
|
@ -10,7 +10,7 @@ pub struct IdPath {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(cfg: &mut ServiceConfig) {
|
pub fn init(cfg: &mut ServiceConfig) {
|
||||||
cfg.service(location::get);
|
cfg.service(location::get_overview::get);
|
||||||
|
|
||||||
cfg.service(user::get_overview::get_overview);
|
cfg.service(user::get_overview::get_overview);
|
||||||
cfg.service(user::get_new::get_new);
|
cfg.service(user::get_new::get_new);
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
use sqlx::{query, PgPool};
|
use sqlx::{query, PgPool};
|
||||||
|
|
||||||
|
use super::Area;
|
||||||
|
|
||||||
pub struct Location {
|
pub struct Location {
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub area_id: i32,
|
pub area_id: i32,
|
||||||
|
pub area: Option<Area>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Location {
|
impl Location {
|
||||||
@ -30,6 +33,28 @@ impl Location {
|
|||||||
id: lr.id,
|
id: lr.id,
|
||||||
name: lr.name.to_string(),
|
name: lr.name.to_string(),
|
||||||
area_id: lr.areaid,
|
area_id: lr.areaid,
|
||||||
|
area: None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(locations)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn read_all_including_area(pool: &PgPool) -> anyhow::Result<Vec<Location>> {
|
||||||
|
let records = query!("SELECT location.id AS locationId, location.name, location.areaId, area.id, area.name AS areaName FROM location JOIN area ON location.areaId = area.id;")
|
||||||
|
.fetch_all(pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let locations = records
|
||||||
|
.iter()
|
||||||
|
.map(|lr| Location {
|
||||||
|
id: lr.locationid,
|
||||||
|
name: lr.name.to_string(),
|
||||||
|
area_id: lr.areaid,
|
||||||
|
area: Some(Area {
|
||||||
|
id: lr.id,
|
||||||
|
name: lr.areaname.to_string(),
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<div class="level">
|
<div class="level">
|
||||||
<div class="level-left">
|
<div class="level-left">
|
||||||
<h3 class="title is-3">
|
<h3 class="title is-3">
|
||||||
Veranstaltungsorte im Bereich {{ area.name }}
|
Veranstaltungsorte im Bereich
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="level-right">
|
<div class="level-right">
|
@ -33,6 +33,12 @@
|
|||||||
Nutzerverwaltung
|
Nutzerverwaltung
|
||||||
</a>
|
</a>
|
||||||
{% when Role::Admin %}
|
{% when Role::Admin %}
|
||||||
|
<a class="navbar-item">
|
||||||
|
Planung
|
||||||
|
</a>
|
||||||
|
<a href="/locations" class="navbar-item">
|
||||||
|
Veranstaltungsorte
|
||||||
|
</a>
|
||||||
<a href="/users" class="navbar-item">
|
<a href="/users" class="navbar-item">
|
||||||
Nutzerverwaltung
|
Nutzerverwaltung
|
||||||
</a>
|
</a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user