refactor: rename availability

This commit is contained in:
Max Hohlfeld 2025-01-26 19:28:39 +01:00
parent 864141121a
commit 09821c4b8d
18 changed files with 67 additions and 61 deletions

View File

@ -2,7 +2,7 @@ use rinja::Template;
use crate::{ use crate::{
filters, filters,
models::{Availabillity, AvailabillityAssignmentState, Event, Function}, models::{Availability, AvailabillityAssignmentState, Event, Function},
}; };
pub mod delete; pub mod delete;
@ -12,7 +12,7 @@ pub mod post_new;
#[template(path = "events/plan_personal_table.html")] #[template(path = "events/plan_personal_table.html")]
pub struct PlanEventPersonalTablePartialTemplate { pub struct PlanEventPersonalTablePartialTemplate {
event: Event, event: Event,
availabillities: Vec<(Availabillity, AvailabillityAssignmentState)>, availabillities: Vec<(Availability, AvailabillityAssignmentState)>,
further_posten_required: bool, further_posten_required: bool,
further_fuehrungsassistent_required: bool, further_fuehrungsassistent_required: bool,
further_wachhabender_required: bool, further_wachhabender_required: bool,

View File

@ -7,7 +7,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::assignment::PlanEventPersonalTablePartialTemplate, endpoints::assignment::PlanEventPersonalTablePartialTemplate,
models::{ models::{
Assignment, AssignmentChangeset, AssignmentContext, Availabillity, Event, Function, Role, Assignment, AssignmentChangeset, AssignmentContext, Availability, Event, Function, Role,
User, User,
}, },
utils::{ utils::{
@ -45,7 +45,7 @@ pub async fn post(
} }
let Some(availabillity) = let Some(availabillity) =
Availabillity::read_by_id_including_user(pool.get_ref(), query.availabillity).await? Availability::read_by_id_including_user(pool.get_ref(), query.availabillity).await?
else { else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };

View File

@ -3,7 +3,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::IdPath, endpoints::IdPath,
models::{Availabillity, User}, utils::ApplicationError, models::{Availability, User}, utils::ApplicationError,
}; };
#[actix_web::delete("/availabillity/delete/{id}")] #[actix_web::delete("/availabillity/delete/{id}")]
@ -12,7 +12,7 @@ pub async fn delete(
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
path: web::Path<IdPath>, path: web::Path<IdPath>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availabillity) = Availabillity::read_by_id(pool.get_ref(), path.id).await? else { let Some(availabillity) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
@ -20,7 +20,7 @@ pub async fn delete(
return Err(ApplicationError::Unauthorized); return Err(ApplicationError::Unauthorized);
} }
Availabillity::delete(pool.get_ref(), availabillity.id).await?; Availability::delete(pool.get_ref(), availabillity.id).await?;
Ok(HttpResponse::Ok().finish()) Ok(HttpResponse::Ok().finish())
} }

View File

@ -5,7 +5,7 @@ use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::endpoints::availability::{calc_free_slots_cor, NewOrEditAvailabilityTemplate}; use crate::endpoints::availability::{calc_free_slots_cor, NewOrEditAvailabilityTemplate};
use crate::models::{Availabillity, User}; use crate::models::{Availability, User};
use crate::utils::ApplicationError; use crate::utils::ApplicationError;
#[derive(Deserialize)] #[derive(Deserialize)]
@ -21,14 +21,14 @@ pub async fn get(
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
query: web::Query<AvailabilityNewQuery>, query: web::Query<AvailabilityNewQuery>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let availabillities = Availabillity::read_by_date_and_area_including_user( let availabillities = Availability::read_by_date_and_area_including_user(
pool.get_ref(), pool.get_ref(),
query.date, query.date,
user.area_id, user.area_id,
) )
.await?; .await?;
let availabilities_from_user: Vec<&Availabillity> = availabillities let availabilities_from_user: Vec<&Availability> = availabillities
.iter() .iter()
.filter(|a| a.user_id == user.id) .filter(|a| a.user_id == user.id)
.collect(); .collect();

View File

@ -7,7 +7,7 @@ use rinja::Template;
use serde::Deserialize; use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::models::{Area, Availabillity, Event, Role, User}; use crate::models::{Area, Availability, Event, Role, User};
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct CalendarQuery { pub struct CalendarQuery {
@ -30,7 +30,7 @@ struct CalendarTemplate {
Option<String>, Option<String>,
Vec<Vehicle>, Vec<Vehicle>,
)>, )>,
availabillities: Vec<Availabillity>, availabillities: Vec<Availability>,
} }
#[actix_web::get("/")] #[actix_web::get("/")]
@ -57,14 +57,14 @@ async fn get(
None => None, None => None,
}; };
let availabillities = Availabillity::read_by_date_and_area_including_user( let availabillities = Availability::read_by_date_and_area_including_user(
pool.get_ref(), pool.get_ref(),
date, date,
query.area.unwrap_or(user.area_id), query.area.unwrap_or(user.area_id),
) )
.await?; .await?;
let availabilities_from_user: Vec<&Availabillity> = availabillities let availabilities_from_user: Vec<&Availability> = availabillities
.iter() .iter()
.filter(|a| a.user_id == user.id) .filter(|a| a.user_id == user.id)
.collect(); .collect();

View File

@ -8,7 +8,7 @@ use crate::{
availability::{calc_free_slots_cor, NewOrEditAvailabilityTemplate}, availability::{calc_free_slots_cor, NewOrEditAvailabilityTemplate},
IdPath, IdPath,
}, },
models::{Availabillity, User}, models::{Availability, User},
utils::ApplicationError, utils::ApplicationError,
}; };
@ -25,7 +25,7 @@ pub async fn get(
path: web::Path<IdPath>, path: web::Path<IdPath>,
query: web::Query<EditAvailabilityQuery>, query: web::Query<EditAvailabilityQuery>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availabillity) = Availabillity::read_by_id(pool.get_ref(), path.id).await? else { let Some(availabillity) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
@ -44,14 +44,14 @@ pub async fn get(
let has_time = availabillity.start_time.is_some() && availabillity.end_time.is_some(); let has_time = availabillity.start_time.is_some() && availabillity.end_time.is_some();
let suggestions = if has_time { let suggestions = if has_time {
let availabillities = Availabillity::read_by_date_and_area_including_user( let availabillities = Availability::read_by_date_and_area_including_user(
pool.get_ref(), pool.get_ref(),
availabillity.date, availabillity.date,
user.area_id, user.area_id,
) )
.await?; .await?;
let availabilities_from_user: Vec<&Availabillity> = availabillities let availabilities_from_user: Vec<&Availability> = availabillities
.iter() .iter()
.filter(|a| a.user_id == user.id) .filter(|a| a.user_id == user.id)
.collect(); .collect();

View File

@ -2,7 +2,7 @@ use chrono::{NaiveDate, NaiveTime};
use rinja::Template; use rinja::Template;
use crate::filters; use crate::filters;
use crate::models::{Availabillity, Role, User}; use crate::models::{Availability, Role, User};
pub mod delete; pub mod delete;
pub mod get_new; pub mod get_new;
@ -24,7 +24,7 @@ struct NewOrEditAvailabilityTemplate<'a> {
slot_suggestions: Vec<(NaiveTime, NaiveTime)>, slot_suggestions: Vec<(NaiveTime, NaiveTime)>,
} }
fn calc_free_slots_cor(availabilities: &Vec<&Availabillity>) -> Vec<(NaiveTime, NaiveTime)> { fn calc_free_slots_cor(availabilities: &Vec<&Availability>) -> Vec<(NaiveTime, NaiveTime)> {
let mut times = Vec::new(); let mut times = Vec::new();
for a in availabilities { for a in availabilities {

View File

@ -4,7 +4,7 @@ use serde::Deserialize;
use sqlx::PgPool; use sqlx::PgPool;
use crate::{ use crate::{
models::{Availabillity, User}, models::{Availability, User},
utils::{self, ApplicationError}, utils::{self, ApplicationError},
}; };
@ -22,7 +22,7 @@ pub async fn post(
pool: web::Data<PgPool>, pool: web::Data<PgPool>,
form: web::Form<AvailabillityForm>, form: web::Form<AvailabillityForm>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
Availabillity::create( Availability::create(
pool.get_ref(), pool.get_ref(),
user.id, user.id,
form.date, form.date,

View File

@ -3,7 +3,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::{availability::post_new::AvailabillityForm, IdPath}, endpoints::{availability::post_new::AvailabillityForm, IdPath},
models::{Availabillity, User}, models::{Availability, User},
utils::{self, ApplicationError}, utils::{self, ApplicationError},
}; };
@ -14,7 +14,7 @@ pub async fn post(
path: web::Path<IdPath>, path: web::Path<IdPath>,
form: web::Form<AvailabillityForm>, form: web::Form<AvailabillityForm>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availabillity) = Availabillity::read_by_id(pool.get_ref(), path.id).await? else { let Some(availabillity) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };
@ -26,7 +26,7 @@ pub async fn post(
|| availabillity.end_time != form.till || availabillity.end_time != form.till
|| availabillity.comment != form.comment || availabillity.comment != form.comment
{ {
Availabillity::update( Availability::update(
pool.get_ref(), pool.get_ref(),
availabillity.id, availabillity.id,
form.from, form.from,

View File

@ -5,7 +5,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::IdPath, endpoints::IdPath,
filters, filters,
models::{Availabillity, AvailabillityAssignmentState, Event, Function, Role, User, Vehicle}, models::{Availability, 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,
@ -20,7 +20,7 @@ use crate::{
pub struct PlanEventTemplate { pub struct PlanEventTemplate {
user: User, user: User,
event: Event, event: Event,
availabillities: Vec<(Availabillity, AvailabillityAssignmentState)>, availabillities: Vec<(Availability, AvailabillityAssignmentState)>,
further_posten_required: bool, further_posten_required: bool,
further_fuehrungsassistent_required: bool, further_fuehrungsassistent_required: bool,
further_wachhabender_required: bool, further_wachhabender_required: bool,

View File

@ -7,7 +7,7 @@ use sqlx::PgPool;
use crate::{ use crate::{
endpoints::IdPath, endpoints::IdPath,
models::{ models::{
Assignment, AssignmentChangeset, Availabillity, Event, EventChangeset, EventContext, Assignment, AssignmentChangeset, Availability, Event, EventChangeset, EventContext,
Function, Location, Role, User, Function, Location, Role, User,
}, },
utils::{self, ApplicationError}, utils::{self, ApplicationError},
@ -79,7 +79,7 @@ pub async fn post(
NaiveTime::parse_from_str("23:59", "%R").unwrap(), NaiveTime::parse_from_str("23:59", "%R").unwrap(),
); );
for assignment in &assignments_for_event { for assignment in &assignments_for_event {
let availability = Availabillity::read_by_id(pool.get_ref(), assignment.availabillity_id) let availability = Availability::read_by_id(pool.get_ref(), assignment.availabillity_id)
.await? .await?
.unwrap(); .unwrap();
let all_assignments = let all_assignments =

View File

@ -4,7 +4,7 @@ use chrono::{Months, NaiveDate, NaiveTime, Utc};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use sqlx::PgPool; use sqlx::PgPool;
use crate::models::{Availabillity, Function, Role, User}; use crate::models::{Availability, Function, Role, User};
#[derive(Deserialize)] #[derive(Deserialize)]
struct ExportQuery { struct ExportQuery {
@ -64,7 +64,7 @@ pub async fn get(
}; };
let availabillities = let availabillities =
Availabillity::read_for_export(pool.get_ref(), (start_date, end_date), area_id) Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id)
.await .await
.unwrap(); .unwrap();

View File

@ -1,7 +1,7 @@
use chrono::NaiveTime; use chrono::NaiveTime;
use garde::Validate; use garde::Validate;
use super::{start_time_lies_before_end_time, Assignment, Availabillity, Event, Function}; use super::{start_time_lies_before_end_time, Assignment, Availability, Event, Function};
#[derive(Validate)] #[derive(Validate)]
#[garde(allow_unvalidated)] #[garde(allow_unvalidated)]
@ -23,7 +23,7 @@ pub struct AssignmentChangeset {
pub struct AssignmentContext { pub struct AssignmentContext {
pub event: Event, pub event: Event,
pub availabillity: Availabillity, pub availabillity: Availability,
pub user_function: Function, pub user_function: Function,
pub assignments_for_event: Vec<Assignment>, pub assignments_for_event: Vec<Assignment>,
pub assignments_for_availabillity: Vec<Assignment>, pub assignments_for_availabillity: Vec<Assignment>,

View File

@ -0,0 +1,3 @@
pub struct AvailabilityChangeset {
}

View File

@ -4,7 +4,7 @@ use sqlx::{query, PgPool};
use super::{Area, Function, Result, Role, User}; use super::{Area, Function, Result, Role, User};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Availabillity { pub struct Availability {
pub id: i32, pub id: i32,
pub user_id: i32, pub user_id: i32,
pub user: Option<User>, pub user: Option<User>,
@ -14,21 +14,7 @@ pub struct Availabillity {
pub comment: Option<String>, pub comment: Option<String>,
} }
#[derive(PartialEq, Eq, Debug)] impl Availability {
pub enum AvailabillityAssignmentState {
// availabillity is not assigned at all or at least not timely conflicting
Unassigned,
// availabillity is assigned for another event that is timely conflicting
Conflicting,
// availabillity is assigned to this event as Posten
AssignedPosten(i32),
// availabillity is assigned to this event as Führungsassistent
AssignedFührungsassistent(i32),
// availabillity is assigned to this event as Wachhabender
AssignedWachhabender(i32),
}
impl Availabillity {
pub async fn create( pub async fn create(
pool: &PgPool, pool: &PgPool,
user_id: i32, user_id: i32,
@ -58,7 +44,7 @@ impl Availabillity {
pool: &PgPool, pool: &PgPool,
date: NaiveDate, date: NaiveDate,
area_id: i32, area_id: i32,
) -> Result<Vec<Availabillity>> { ) -> Result<Vec<Availability>> {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
@ -91,7 +77,7 @@ impl Availabillity {
let availabillities = records let availabillities = records
.iter() .iter()
.map(|r| Availabillity { .map(|r| Availability {
id: r.id, id: r.id,
user_id: r.userid, user_id: r.userid,
user: Some(User { user: Some(User {
@ -121,7 +107,7 @@ impl Availabillity {
pub async fn read_by_id_including_user( pub async fn read_by_id_including_user(
pool: &PgPool, pool: &PgPool,
id: i32, id: i32,
) -> Result<Option<Availabillity>> { ) -> Result<Option<Availability>> {
let record = query!( let record = query!(
r##" r##"
SELECT SELECT
@ -152,7 +138,7 @@ impl Availabillity {
.await?; .await?;
let availabillity = record.and_then(|r| { let availabillity = record.and_then(|r| {
Some(Availabillity { Some(Availability {
id: r.id, id: r.id,
user_id: r.userid, user_id: r.userid,
user: Some(User { user: Some(User {
@ -179,13 +165,13 @@ impl Availabillity {
Ok(availabillity) Ok(availabillity)
} }
pub async fn read_by_id(pool: &PgPool, id: i32) -> Result<Option<Availabillity>> { pub async fn read_by_id(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!("SELECT * FROM availabillity WHERE id = $1", id) let record = query!("SELECT * FROM availabillity WHERE id = $1", id)
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
let availabillity = record.and_then(|record| { let availabillity = record.and_then(|record| {
Some(Availabillity { Some(Availability {
id: record.id, id: record.id,
user_id: record.userid, user_id: record.userid,
user: None, user: None,
@ -203,7 +189,7 @@ impl Availabillity {
pool: &PgPool, pool: &PgPool,
date_range: (NaiveDate, NaiveDate), date_range: (NaiveDate, NaiveDate),
area_id: i32, area_id: i32,
) -> Result<Vec<Availabillity>> { ) -> Result<Vec<Availability>> {
let records = query!( let records = query!(
r##" r##"
SELECT SELECT
@ -240,7 +226,7 @@ impl Availabillity {
let availabillities = records let availabillities = records
.iter() .iter()
.map(|r| Availabillity { .map(|r| Availability {
id: r.id, id: r.id,
user_id: r.userid, user_id: r.userid,
user: Some(User { user: Some(User {

View File

@ -0,0 +1,14 @@
#[derive(PartialEq, Eq, Debug)]
pub enum AvailabillityAssignmentState {
// availabillity is not assigned at all or at least not timely conflicting
Unassigned,
// availabillity is assigned for another event that is timely conflicting
Conflicting,
// availabillity is assigned to this event as Posten
AssignedPosten(i32),
// availabillity is assigned to this event as Führungsassistent
AssignedFührungsassistent(i32),
// availabillity is assigned to this event as Wachhabender
AssignedWachhabender(i32),
}

View File

@ -2,6 +2,7 @@ mod area;
mod assignement; mod assignement;
mod assignment_changeset; mod assignment_changeset;
mod availabillity; mod availabillity;
mod availabillity_assignment_state;
mod event; mod event;
mod event_changeset; mod event_changeset;
mod function; mod function;
@ -12,11 +13,13 @@ mod role;
mod user; mod user;
mod vehicle; mod vehicle;
mod vehicle_assignement; mod vehicle_assignement;
mod availability_changeset;
pub use area::Area; pub use area::Area;
pub use assignement::Assignment; pub use assignement::Assignment;
pub use assignment_changeset::{AssignmentChangeset, AssignmentContext}; pub use assignment_changeset::{AssignmentChangeset, AssignmentContext};
pub use availabillity::{Availabillity, AvailabillityAssignmentState}; pub use availabillity::Availability;
pub use availabillity_assignment_state::AvailabillityAssignmentState;
use chrono::NaiveTime; use chrono::NaiveTime;
pub use event::Event; pub use event::Event;
pub use event_changeset::{EventChangeset, EventContext}; pub use event_changeset::{EventChangeset, EventContext};

View File

@ -1,7 +1,7 @@
use sqlx::PgPool; use sqlx::PgPool;
use crate::models::{ use crate::models::{
Assignment, Availabillity, AvailabillityAssignmentState, Event, Function, Vehicle, VehicleAssignement, Assignment, Availability, AvailabillityAssignmentState, Event, Function, Vehicle, VehicleAssignement,
}; };
use super::ApplicationError; use super::ApplicationError;
@ -9,8 +9,8 @@ use super::ApplicationError;
pub async fn generate_availabillity_assignment_list( pub async fn generate_availabillity_assignment_list(
pool: &PgPool, pool: &PgPool,
event: &Event, event: &Event,
) -> Result<Vec<(Availabillity, AvailabillityAssignmentState)>, ApplicationError> { ) -> Result<Vec<(Availability, AvailabillityAssignmentState)>, ApplicationError> {
let availabillities_in_db = Availabillity::read_by_date_and_area_including_user( let availabillities_in_db = Availability::read_by_date_and_area_including_user(
pool, pool,
event.date, event.date,
event.location.as_ref().unwrap().area_id, event.location.as_ref().unwrap().area_id,