refactor: fix typo in table name

This commit is contained in:
Max Hohlfeld 2025-05-12 21:16:13 +02:00
parent 1cf97b8c96
commit 3875f75f2a
49 changed files with 322 additions and 316 deletions

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
"query": "UPDATE availability SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
"describe": {
"columns": [],
"parameters": {
@ -13,5 +13,5 @@
},
"nullable": []
},
"hash": "a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea"
"hash": "09dd3e14c1d48847a9618b188ee7e7ac51e23fe98c53e27c400cadc50ccd6c2f"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n LEFT JOIN assignment ON availabillity.Id = assignment.availabillityId\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.id = $1;\n ",
"query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n LEFT JOIN assignment ON availability.Id = assignment.availabilityId\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.id = $1;\n ",
"describe": {
"columns": [
{
@ -131,5 +131,5 @@
false
]
},
"hash": "890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558"
"hash": "1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;",
"query": "DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabilityId = $2;",
"describe": {
"columns": [],
"parameters": {
@ -11,5 +11,5 @@
},
"nullable": []
},
"hash": "7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a"
"hash": "1c9387e3723fe4b7d1b10908a3580e7ebf4d56250f8f008ee030a158b02cb86e"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1 AND vehicleAssignement.vehicleId = $2;",
"query": "SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1 AND vehicleassignment.vehicleId = $2;",
"describe": {
"columns": [
{
@ -37,5 +37,5 @@
false
]
},
"hash": "159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d"
"hash": "22470315a6113d51ed84e262b6dd2e41a7c16d9dda06eb06c272345722f994ae"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp)\n VALUES ($1, $2, $3, $4, $5);\n ",
"query": "\n INSERT INTO assignment (eventId, availabilityId, function, startTimestamp, endTimestamp)\n VALUES ($1, $2, $3, $4, $5);\n ",
"describe": {
"columns": [],
"parameters": {
@ -25,5 +25,5 @@
},
"nullable": []
},
"hash": "1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da"
"hash": "47bd20303899d5e804f8651c17428ee92f80321d1a5423be52e4f9a275180748"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM availabillity WHERE id = $1",
"query": "SELECT * FROM availability WHERE id = $1",
"describe": {
"columns": [
{
@ -42,5 +42,5 @@
false
]
},
"hash": "0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b"
"hash": "686a344fde1d9d3d7cfb431b30cd455f37854d8b728a7aac679e5c60f84cb08c"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;",
"query": "UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabilityId = $5;",
"describe": {
"columns": [],
"parameters": {
@ -25,5 +25,5 @@
},
"nullable": []
},
"hash": "75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478"
"hash": "6a95b789e0f9fc868d8695a33614184ae14ee690d03cd7455a80430d0cb8ba63"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.starttimestamp::date = $1\n AND user_.areaId = $2\n AND availabillity.startTimestamp <= $3 AND availabillity.endTimestamp >= $4;\n ",
"query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.starttimestamp::date = $1\n AND user_.areaId = $2\n AND availability.startTimestamp <= $3 AND availability.endTimestamp >= $4;\n ",
"describe": {
"columns": [
{
@ -134,5 +134,5 @@
false
]
},
"hash": "85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953"
"hash": "7b3d623440f6ab8060223289d13687921a5c27317ea27d1b2c960b5e809a7497"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1;",
"query": "SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1;",
"describe": {
"columns": [
{
@ -36,5 +36,5 @@
false
]
},
"hash": "126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f"
"hash": "7c0145a715f40405e4401a6bb0bc27152a88c585d66da008d2729fb61d2d84b9"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n vehicleAssignement.eventId,\n vehicleAssignement.vehicleId,\n vehicleAssignement.starttimestamp,\n vehicleAssignement.endtimestamp\n FROM vehicleAssignement\n JOIN event ON vehicleAssignement.eventId = event.id\n WHERE vehicleAssignement.vehicleid = $1\n AND event.starttimestamp::date = $2;\n ",
"query": "\n SELECT\n vehicleassignment.eventId,\n vehicleassignment.vehicleId,\n vehicleassignment.starttimestamp,\n vehicleassignment.endtimestamp\n FROM vehicleassignment\n JOIN event ON vehicleassignment.eventId = event.id\n WHERE vehicleassignment.vehicleid = $1\n AND event.starttimestamp::date = $2;\n ",
"describe": {
"columns": [
{
@ -37,5 +37,5 @@
false
]
},
"hash": "4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf"
"hash": "7d1f191fbff87ffc8d429221f6f42557a5ab9e6eab8e0f10f5bad6055a64f617"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM vehicleassignement WHERE eventId = $1 AND vehicleId = $2;",
"query": "DELETE FROM vehicleassignment WHERE eventId = $1 AND vehicleId = $2;",
"describe": {
"columns": [],
"parameters": {
@ -11,5 +11,5 @@
},
"nullable": []
},
"hash": "48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156"
"hash": "7db7ce0d13489ce3c0d967322f071a11174aa3c86ed405d352a3e3fb7ed10804"
}

View File

@ -1,17 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment)\n VALUES ($1, $2, $3, $4);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int4",
"Timestamptz",
"Timestamptz",
"Text"
]
},
"nullable": []
},
"hash": "843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.AvailabillityId = $1;\n ",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.AvailabilityId = $1;\n ",
"describe": {
"columns": [
{
@ -10,7 +10,7 @@
},
{
"ordinal": 1,
"name": "availabillityid",
"name": "availabilityid",
"type_info": "Int4"
},
{
@ -53,5 +53,5 @@
false
]
},
"hash": "40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff"
"hash": "8893828aa4509fc81f078b313a88c34d05eb7c5988e4d595768bc7dd47a7892f"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.eventId = $1;\n ",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.eventId = $1;\n ",
"describe": {
"columns": [
{
@ -10,7 +10,7 @@
},
{
"ordinal": 1,
"name": "availabillityid",
"name": "availabilityid",
"type_info": "Int4"
},
{
@ -53,5 +53,5 @@
false
]
},
"hash": "478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff"
"hash": "9315f185d76ae8e25c9bb0273fce388ca559c4494f82d31524f224c6b70000f9"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM availabillity WHERE id = $1",
"query": "DELETE FROM availability WHERE id = $1",
"describe": {
"columns": [],
"parameters": {
@ -10,5 +10,5 @@
},
"nullable": []
},
"hash": "fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13"
"hash": "96b1394c0dc24a9633af101d53af4844e919aca853ebeb9bab6b37a0d68c3b59"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availabillity.starttimestamp::date >= $2 AND\n availabillity.starttimestamp::date <= $3;\n ",
"query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availability.starttimestamp::date >= $2 AND\n availability.starttimestamp::date <= $3;\n ",
"describe": {
"columns": [
{
@ -139,5 +139,5 @@
false
]
},
"hash": "5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9"
"hash": "a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378"
}

View File

@ -0,0 +1,17 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO availability (userId, startTimestamp, endTimestamp, comment)\n VALUES ($1, $2, $3, $4);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int4",
"Timestamptz",
"Timestamptz",
"Text"
]
},
"nullable": []
},
"hash": "a55c1e8926f4aa039d8b14a054cb7d4e80387970467bf940c79433c08cb4f879"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.startTimestamp::date = $1\n AND user_.areaId = $2;\n ",
"query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availability\n JOIN user_ ON availability.userId = user_.id\n WHERE availability.startTimestamp::date = $1\n AND user_.areaId = $2;\n ",
"describe": {
"columns": [
{
@ -132,5 +132,5 @@
false
]
},
"hash": "18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942"
"hash": "ae18073da63db05840fdd113a2a4727a7e2531cc54ca2bf35ba4f4f86d35a4d3"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO vehicleassignement (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
"query": "INSERT INTO vehicleassignment (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
"describe": {
"columns": [],
"parameters": {
@ -13,5 +13,5 @@
},
"nullable": []
},
"hash": "bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811"
"hash": "b76b8744228a18fee84e5f895d5b831e4fce2169daedc3d472c96bdaf4b29dae"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE\n assignment.eventId = $1 AND\n assignment.availabillityId = $2;\n ",
"query": "\n SELECT\n assignment.eventId,\n assignment.availabilityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE\n assignment.eventId = $1 AND\n assignment.availabilityId = $2;\n ",
"describe": {
"columns": [
{
@ -10,7 +10,7 @@
},
{
"ordinal": 1,
"name": "availabillityid",
"name": "availabilityid",
"type_info": "Int4"
},
{
@ -54,5 +54,5 @@
false
]
},
"hash": "9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022"
"hash": "d2014068ac3b84a3682054e13e20ada311b1c36389b60ce8800d52ba4047730c"
}

View File

@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment\n FROM availabillity\n WHERE availabillity.userId = $1\n AND availabillity.starttimestamp::date = $2;\n ",
"query": "\n SELECT\n availability.id,\n availability.userId,\n availability.startTimestamp,\n availability.endTimestamp,\n availability.comment\n FROM availability\n WHERE availability.userId = $1\n AND availability.starttimestamp::date = $2;\n ",
"describe": {
"columns": [
{
@ -43,5 +43,5 @@
true
]
},
"hash": "13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233"
"hash": "f90aa1fd76ddf0f667fc77f1cbb02b219aff6d73a3ee1e0afeb9eeea7e194f9d"
}

View File

@ -0,0 +1,3 @@
ALTER TABLE availabillity RENAME TO availability;
ALTER TABLE assignment RENAME COLUMN availabillityId TO availabilityId;
ALTER TABLE vehicleassignement RENAME TO vehicleassignment;

View File

@ -11,6 +11,9 @@ snapshot_kind: text
<input type="hidden" name="date" value="2025-01-01">
<input type="hidden" name="voluntarywachhabender" id="voluntarywachhabender" value="false">
<input type="hidden" name="voluntaryfuehrungsassistent" id="voluntaryfuehrungsassistent"
value="false">
<div class="field is-horizontal">
@ -109,9 +112,9 @@ snapshot_kind: text
<div class="control">
<label class="checkbox">
<input class="checkbox" type="checkbox" name="voluntarywachhabender" value="true"
<input class="checkbox" type="checkbox"
>
_="on click put (the value of #voluntarywachhabender) as inverseBool into the value of #voluntarywachhabender">
</label>
</div>
@ -128,9 +131,9 @@ snapshot_kind: text
<div class="control">
<label class="checkbox">
<input class="checkbox" type="checkbox" name="voluntaryfuehrungsassistent" value="true"
<input class="checkbox" type="checkbox"
>
_="on click put (the value of #voluntaryfuehrungsassistent) as inverseBool into the value of #voluntaryfuehrungsassistent">
</label>
</div>

View File

@ -7,7 +7,7 @@ use crate::{
models::{Assignment, Event, Role, User},
utils::{
event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
generate_availability_assignment_list, generate_status_whether_staff_is_required,
},
ApplicationError, TemplateResponse,
},
@ -15,7 +15,7 @@ use crate::{
#[derive(Deserialize)]
struct AssignmentDeleteQuery {
availabillity: i32,
availability: i32,
event: i32,
}
@ -38,14 +38,14 @@ pub async fn delete(
return Err(ApplicationError::Unauthorized);
}
let Some(assignment) = Assignment::read(pool.get_ref(), event.id, query.availabillity).await?
let Some(assignment) = Assignment::read(pool.get_ref(), event.id, query.availability).await?
else {
return Ok(HttpResponse::NotFound().finish());
};
Assignment::delete(pool.get_ref(), event.id, assignment.availabillity_id).await?;
Assignment::delete(pool.get_ref(), event.id, assignment.availability_id).await?;
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?;
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let (
further_posten_required,
further_fuehrungsassistent_required,
@ -54,7 +54,7 @@ pub async fn delete(
let template = PlanEventPersonalTablePartialTemplate {
event,
availabillities,
availabilities,
further_posten_required,
further_fuehrungsassistent_required,
further_wachhabender_required,
@ -115,7 +115,7 @@ mod tests {
let app = context.app().await;
let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(),
uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::AreaManager,
function: vec![Function::Posten],
user_area: 1,
@ -139,7 +139,7 @@ mod tests {
let app = context.app().await;
let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(),
uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::Staff,
function: vec![Function::Posten],
user_area: 1,
@ -154,7 +154,7 @@ mod tests {
async fn doesnt_work_when_event_does_not_exist(context: &DbTestContext) {
let app = context.app().await;
let config = RequestConfig {
uri: "/assignments/delete?availabillity=1&event=1".to_string(),
uri: "/assignments/delete?availability=1&event=1".to_string(),
role: Role::AreaManager,
function: vec![Function::Posten],
user_area: 1,
@ -171,7 +171,7 @@ mod tests {
let app = context.app().await;
let config = RequestConfig {
uri: "/assignments/delete?availabillity=2&event=1".to_string(),
uri: "/assignments/delete?availability=2&event=1".to_string(),
role: Role::AreaManager,
function: vec![Function::Posten],
user_area: 1,

View File

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

View File

@ -11,7 +11,7 @@ use crate::{
},
utils::{
event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
generate_availability_assignment_list, generate_status_whether_staff_is_required,
},
ApplicationError, TemplateResponse,
},
@ -19,7 +19,7 @@ use crate::{
#[derive(Deserialize)]
pub struct AssignmentQuery {
availabillity: i32,
availability: i32,
function: u8,
event: i32,
}
@ -43,14 +43,14 @@ pub async fn post(
return Err(ApplicationError::Unauthorized);
}
let Some(availabillity) =
Availability::read_by_id_including_user(pool.get_ref(), query.availabillity).await?
let Some(availability) =
Availability::read_by_id_including_user(pool.get_ref(), query.availability).await?
else {
return Ok(HttpResponse::NotFound().finish());
};
let availability_user_not_in_event_location_area =
availabillity.user.as_ref().unwrap().area_id != event.location.as_ref().unwrap().area_id;
availability.user.as_ref().unwrap().area_id != event.location.as_ref().unwrap().area_id;
if availability_user_not_in_event_location_area {
return Ok(HttpResponse::BadRequest()
@ -65,23 +65,23 @@ pub async fn post(
};
let assignments_for_event = Assignment::read_all_by_event(pool.get_ref(), event.id).await?;
let assignments_for_availabillity =
Assignment::read_all_by_availabillity(pool.get_ref(), availabillity.id).await?;
let assignments_for_availability =
Assignment::read_all_by_availability(pool.get_ref(), availability.id).await?;
let context = AssignmentContext {
event: event.clone(),
availabillity: availabillity.clone(),
user_function: availabillity.user.as_ref().unwrap().function.clone(),
availability: availability.clone(),
user_function: availability.user.as_ref().unwrap().function.clone(),
assignments_for_event,
assignments_for_availabillity,
assignments_for_availability,
};
if let Err(e) = changeset.validate_with(&context) {
return Ok(HttpResponse::BadRequest().body(e.to_string()));
};
Assignment::create(pool.get_ref(), event.id, availabillity.id, changeset).await?;
Assignment::create(pool.get_ref(), event.id, availability.id, changeset).await?;
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?;
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let (
further_posten_required,
@ -91,7 +91,7 @@ pub async fn post(
let template = PlanEventPersonalTablePartialTemplate {
event,
availabillities,
availabilities,
further_posten_required,
further_fuehrungsassistent_required,
further_wachhabender_required,

View File

@ -6,21 +6,21 @@ use crate::{
models::{Availability, User}, utils::ApplicationError,
};
#[actix_web::delete("/availabillity/delete/{id}")]
#[actix_web::delete("/availability/delete/{id}")]
pub async fn delete(
user: web::ReqData<User>,
pool: web::Data<PgPool>,
path: web::Path<IdPath>,
) -> Result<impl Responder, ApplicationError> {
let Some(availabillity) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish());
};
if availabillity.user_id != user.id {
if availability.user_id != user.id {
return Err(ApplicationError::Unauthorized);
}
Availability::delete(pool.get_ref(), availabillity.id).await?;
Availability::delete(pool.get_ref(), availability.id).await?;
Ok(HttpResponse::Ok().finish())
}

View File

@ -12,7 +12,7 @@ struct AvailabilityNewQuery {
date: NaiveDate,
}
#[actix_web::get("/availabillity/new")]
#[actix_web::get("/availability/new")]
pub async fn get(
user: web::ReqData<User>,
pool: web::Data<PgPool>,
@ -22,10 +22,10 @@ pub async fn get(
Availability::read_by_user_and_date(pool.get_ref(), user.id, &query.date).await?;
let slot_suggestions = find_free_date_time_slots(&availabilities_from_user);
let user_can_create_availabillity =
let user_can_create_availability =
availabilities_from_user.is_empty() || !slot_suggestions.is_empty();
if !user_can_create_availabillity {
if !user_can_create_availability {
return Ok(HttpResponse::BadRequest().finish());
}

View File

@ -24,7 +24,7 @@ pub struct CalendarQuery {
#[template(path = "index.html")]
struct CalendarTemplate {
user: User,
user_can_create_availabillity: bool,
user_can_create_availability: bool,
date: NaiveDate,
selected_area: Option<i32>,
areas: Vec<Area>,
@ -35,7 +35,7 @@ struct CalendarTemplate {
Option<String>,
Vec<Vehicle>,
)>,
availabillities: Vec<Availability>,
availabilities: Vec<Availability>,
}
#[actix_web::get("/")]
@ -62,7 +62,7 @@ async fn get(
None => None,
};
let availabillities = Availability::read_by_date_and_area_including_user(
let availabilities = Availability::read_by_date_and_area_including_user(
pool.get_ref(),
date,
query.area.unwrap_or(user.area_id),
@ -73,10 +73,10 @@ async fn get(
Availability::read_by_user_and_date(pool.get_ref(), user.id, &date).await?;
//println!("{availabilities_from_user:#?}");
let user_can_create_availabillity = availabilities_from_user.is_empty()
let user_can_create_availability = availabilities_from_user.is_empty()
|| !find_free_date_time_slots(&availabilities_from_user).is_empty();
//println!("{} || {} || {} = {user_can_create_availabillity}", availabilities_from_user.is_empty(),
//println!("{} || {} || {} = {user_can_create_availability}", availabilities_from_user.is_empty(),
// !only_one_availability_exists_and_is_whole_day(&availabilities_from_user),
// !find_free_time_slots(&availabilities_from_user).is_empty());
@ -104,9 +104,9 @@ async fn get(
posten
.into_iter()
.map(|p| {
availabillities
availabilities
.iter()
.find(|a| a.id == p.availabillity_id)
.find(|a| a.id == p.availability_id)
.unwrap()
.user
.as_ref()
@ -116,9 +116,9 @@ async fn get(
})
.collect(),
fuehrungsassistent.first().map(|fa| {
availabillities
availabilities
.iter()
.find(|a| a.id == fa.availabillity_id)
.find(|a| a.id == fa.availability_id)
.unwrap()
.user
.as_ref()
@ -127,9 +127,9 @@ async fn get(
.clone()
}),
wachhabender.first().map(|wh| {
availabillities
availabilities
.iter()
.find(|a| a.id == wh.availabillity_id)
.find(|a| a.id == wh.availability_id)
.unwrap()
.user
.as_ref()
@ -143,12 +143,12 @@ async fn get(
let template = CalendarTemplate {
user: user.into_inner(),
user_can_create_availabillity,
user_can_create_availability,
date,
selected_area,
areas,
events_and_assignments,
availabillities,
availabilities,
};
Ok(template.to_response()?)

View File

@ -8,7 +8,7 @@ use crate::{
utils::{ApplicationError, TemplateResponse},
};
#[actix_web::get("/availabillity/edit/{id}")]
#[actix_web::get("/availability/edit/{id}")]
pub async fn get(
user: web::ReqData<User>,
pool: web::Data<PgPool>,

View File

@ -27,7 +27,7 @@ struct NewOrEditAvailabilityTemplate<'a> {
}
#[derive(Deserialize)]
pub struct AvailabillityForm {
pub struct AvailabilityForm {
pub startdate: NaiveDate,
pub enddate: NaiveDate,
pub starttime: NaiveTime,

View File

@ -3,16 +3,16 @@ use garde::Validate;
use sqlx::PgPool;
use crate::{
endpoints::availability::{find_adjacend_availability, AvailabillityForm},
endpoints::availability::{find_adjacend_availability, AvailabilityForm},
models::{Availability, AvailabilityChangeset, AvailabilityContext, User},
utils::{self, ApplicationError},
};
#[actix_web::post("/availabillity/new")]
#[actix_web::post("/availability/new")]
pub async fn post(
user: web::ReqData<User>,
pool: web::Data<PgPool>,
form: web::Form<AvailabillityForm>,
form: web::Form<AvailabilityForm>,
) -> Result<impl Responder, ApplicationError> {
let existing_availabilities =
Availability::read_by_user_and_date(pool.get_ref(), user.id, &form.startdate).await?;

View File

@ -4,19 +4,19 @@ use sqlx::PgPool;
use crate::{
endpoints::{
availability::{find_adjacend_availability, AvailabillityForm},
availability::{find_adjacend_availability, AvailabilityForm},
IdPath,
},
models::{Availability, AvailabilityChangeset, AvailabilityContext, User},
utils::{self, ApplicationError},
};
#[actix_web::post("/availabillity/edit/{id}")]
#[actix_web::post("/availability/edit/{id}")]
pub async fn post(
user: web::ReqData<User>,
pool: web::Data<PgPool>,
path: web::Path<IdPath>,
form: web::Form<AvailabillityForm>,
form: web::Form<AvailabilityForm>,
) -> Result<impl Responder, ApplicationError> {
let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish());

View File

@ -5,10 +5,10 @@ use sqlx::PgPool;
use crate::{
endpoints::IdPath,
filters,
models::{Availability, AvailabillityAssignmentState, Event, Role, User, Vehicle},
models::{Availability, AvailabilityAssignmentState, Event, Role, User, Vehicle},
utils::{
event_planning_template::{
generate_availabillity_assignment_list, generate_status_whether_staff_is_required,
generate_availability_assignment_list, generate_status_whether_staff_is_required,
generate_vehicles_assigned_and_available,
},
ApplicationError, TemplateResponse,
@ -20,7 +20,7 @@ use crate::{
pub struct PlanEventTemplate {
user: User,
event: Event,
availabillities: Vec<(Availability, AvailabillityAssignmentState)>,
availabilities: Vec<(Availability, AvailabilityAssignmentState)>,
further_posten_required: bool,
further_fuehrungsassistent_required: bool,
further_wachhabender_required: bool,
@ -46,7 +46,7 @@ pub async fn get(
return Err(ApplicationError::Unauthorized);
}
let availabillities = generate_availabillity_assignment_list(pool.get_ref(), &event).await?;
let availabilities = generate_availability_assignment_list(pool.get_ref(), &event).await?;
let (
further_posten_required,
@ -60,7 +60,7 @@ pub async fn get(
let template = PlanEventTemplate {
user: user.into_inner(),
event,
availabillities,
availabilities,
further_posten_required,
further_fuehrungsassistent_required,
further_wachhabender_required,

View File

@ -64,11 +64,11 @@ pub async fn post(
let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY));
for assignment in &assignments_for_event {
let availability = Availability::read_by_id(pool.get_ref(), assignment.availabillity_id)
let availability = Availability::read_by_id(pool.get_ref(), assignment.availability_id)
.await?
.unwrap();
let all_assignments =
Assignment::read_all_by_availabillity(pool.get_ref(), assignment.availabillity_id)
Assignment::read_all_by_availability(pool.get_ref(), assignment.availability_id)
.await?;
if all_assignments.len() == 1 {
@ -141,7 +141,7 @@ pub async fn post(
function: a.function,
time: changeset.time,
};
Assignment::update(pool.get_ref(), a.event_id, a.availabillity_id, c).await?;
Assignment::update(pool.get_ref(), a.event_id, a.availability_id, c).await?;
}
}

View File

@ -25,11 +25,11 @@ struct Export {
year: u16,
month: u8,
area: String,
availabillities: Vec<ExportAvailabillity>,
availabilities: Vec<ExportAvailability>,
}
#[derive(Serialize)]
struct ExportAvailabillity {
struct ExportAvailability {
name: String,
area: String,
function: UserFunction,
@ -63,12 +63,12 @@ pub async fn get(
user.area_id
};
let availabillities =
let availabilities =
Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id).await?;
let export_availabillities = availabillities
let export_availabilities = availabilities
.into_iter()
.map(|a| ExportAvailabillity {
.map(|a| ExportAvailability {
name: a.user.as_ref().unwrap().name.clone(),
area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(),
function: a.user.unwrap().function,
@ -88,7 +88,7 @@ pub async fn get(
year: query.year,
month: query.month,
area,
availabillities: export_availabillities,
availabilities: export_availabilities,
};
let (out, content_type) = match query.format.as_str() {

View File

@ -4,7 +4,7 @@ use sqlx::PgPool;
use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, VehicleAssignement},
models::{Event, Role, User, VehicleAssignment},
utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse,
@ -37,12 +37,12 @@ pub async fn delete(
}
let Some(vehicle_assignment) =
VehicleAssignement::read(pool.get_ref(), event.id, query.vehicle).await?
VehicleAssignment::read(pool.get_ref(), event.id, query.vehicle).await?
else {
return Ok(HttpResponse::NotFound().finish());
};
VehicleAssignement::delete(
VehicleAssignment::delete(
pool.get_ref(),
vehicle_assignment.event_id,
vehicle_assignment.vehicle_id,

View File

@ -4,7 +4,7 @@ use sqlx::PgPool;
use crate::{
endpoints::vehicle_assignment::PlanVehiclesPartialTemplate,
models::{Event, Role, User, Vehicle, VehicleAssignement},
models::{Event, Role, User, Vehicle, VehicleAssignment},
utils::{
event_planning_template::generate_vehicles_assigned_and_available, ApplicationError,
TemplateResponse,
@ -45,16 +45,16 @@ pub async fn post(
return Ok(HttpResponse::NotFound().finish());
};
let existing_assignments_for_vehicle = VehicleAssignement::read_all_by_vehicle_and_date(
let existing_assignments_for_vehicle = VehicleAssignment::read_all_by_vehicle_and_date(
pool.get_ref(),
vehicle.id,
event.start.date(),
)
.await?;
let has_start_time_during_event =
|a: &VehicleAssignement| a.start >= event.start && a.start <= event.end;
|a: &VehicleAssignment| a.start >= event.start && a.start <= event.end;
let has_end_time_during_event =
|a: &VehicleAssignement| a.end >= event.start && a.end <= event.end;
|a: &VehicleAssignment| a.end >= event.start && a.end <= event.end;
let availability_already_assigned = existing_assignments_for_vehicle
.iter()
@ -65,7 +65,7 @@ pub async fn post(
.body("Vehicle already assigned to a timely conflicting event."));
}
VehicleAssignement::create(pool.get_ref(), event.id, vehicle.id, event.start, event.end)
VehicleAssignment::create(pool.get_ref(), event.id, vehicle.id, event.start, event.end)
.await?;
let (vehicles_assigned, vehicles_available) =

View File

@ -5,7 +5,7 @@ use super::{assignment_changeset::AssignmentChangeset, Function, Result};
pub struct Assignment {
pub event_id: i32,
pub availabillity_id: i32,
pub availability_id: i32,
pub function: Function,
pub start: NaiveDateTime,
pub end: NaiveDateTime,
@ -15,16 +15,16 @@ impl Assignment {
pub async fn create(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
availability_id: i32,
changeset: AssignmentChangeset,
) -> Result<()> {
query!(
r##"
INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp)
INSERT INTO assignment (eventId, availabilityId, function, startTimestamp, endTimestamp)
VALUES ($1, $2, $3, $4, $5);
"##,
event_id,
availabillity_id,
availability_id,
changeset.function as Function,
changeset.time.0.and_utc(),
changeset.time.1.and_utc()
@ -35,22 +35,22 @@ impl Assignment {
Ok(())
}
pub async fn read_all_by_availabillity(
pub async fn read_all_by_availability(
pool: &PgPool,
availabillity_id: i32,
availability_id: i32,
) -> Result<Vec<Assignment>> {
let records = query!(
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.availabilityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
FROM assignment
WHERE assignment.AvailabillityId = $1;
WHERE assignment.AvailabilityId = $1;
"##,
availabillity_id
availability_id
)
.fetch_all(pool)
.await?;
@ -59,7 +59,7 @@ impl Assignment {
.iter()
.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
availability_id: r.availabilityid,
function: r.function,
start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(),
@ -74,7 +74,7 @@ impl Assignment {
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.availabilityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
@ -90,7 +90,7 @@ impl Assignment {
.iter()
.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
availability_id: r.availabilityid,
function: r.function,
start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(),
@ -103,30 +103,30 @@ impl Assignment {
pub async fn read(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
availability_id: i32,
) -> Result<Option<Assignment>> {
let record = query!(
r##"
SELECT
assignment.eventId,
assignment.availabillityId,
assignment.availabilityId,
assignment.function AS "function: Function",
assignment.startTimestamp,
assignment.endTimestamp
FROM assignment
WHERE
assignment.eventId = $1 AND
assignment.availabillityId = $2;
assignment.availabilityId = $2;
"##,
event_id,
availabillity_id
availability_id
)
.fetch_optional(pool)
.await?;
let assignemnet = record.map(|r| Assignment {
event_id: r.eventid,
availabillity_id: r.availabillityid,
availability_id: r.availabilityid,
function: r.function,
start: r.starttimestamp.naive_utc(),
end: r.endtimestamp.naive_utc(),
@ -138,18 +138,18 @@ impl Assignment {
pub async fn update(
pool: &PgPool,
event_id: i32,
availabillity_id: i32,
availability_id: i32,
changeset: AssignmentChangeset,
) -> Result<()> {
query!("UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;", changeset.function as Function, changeset.time.0.and_utc(), changeset.time.1.and_utc(), event_id, availabillity_id).execute(pool).await?;
query!("UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabilityId = $5;", changeset.function as Function, changeset.time.0.and_utc(), changeset.time.1.and_utc(), event_id, availability_id).execute(pool).await?;
Ok(())
}
pub async fn delete(pool: &PgPool, event_id: i32, availabillity_id: i32) -> Result<()> {
query!("DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;",
pub async fn delete(pool: &PgPool, event_id: i32, availability_id: i32) -> Result<()> {
query!("DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabilityId = $2;",
event_id,
availabillity_id
availability_id
)
.execute(pool)
.await?;

View File

@ -8,7 +8,7 @@ use super::{
#[derive(Validate)]
#[garde(allow_unvalidated)]
#[garde(context(AssignmentContext as ctx))]
/// check before: event and availabillity and must exist and user of availabillity is in event location
/// check before: event and availability and must exist and user of availability is in event location
pub struct AssignmentChangeset {
#[garde(
custom(user_of_availability_has_function),
@ -18,24 +18,24 @@ pub struct AssignmentChangeset {
#[garde(
custom(available_time_fits),
custom(start_date_time_lies_before_end_date_time),
custom(availabillity_not_already_assigned)
custom(availability_not_already_assigned)
)]
pub time: (NaiveDateTime, NaiveDateTime),
}
pub struct AssignmentContext {
pub event: Event,
pub availabillity: Availability,
pub availability: Availability,
pub user_function: UserFunction,
pub assignments_for_event: Vec<Assignment>,
pub assignments_for_availabillity: Vec<Assignment>,
pub assignments_for_availability: Vec<Assignment>,
}
fn available_time_fits(
value: &(NaiveDateTime, NaiveDateTime),
context: &AssignmentContext,
) -> garde::Result {
if value.0 < context.availabillity.start || value.1 > context.availabillity.end {
if value.0 < context.availability.start || value.1 > context.availability.end {
return Err(garde::Error::new(
"time not made available can't be assigned",
));
@ -65,7 +65,7 @@ fn event_has_free_slot_for_function(
.assignments_for_event
.iter()
.filter(|a| {
a.availabillity_id != context.availabillity.id && a.event_id != context.event.id
a.availability_id != context.availability.id && a.event_id != context.event.id
})
.collect();
@ -86,15 +86,15 @@ fn event_has_free_slot_for_function(
Ok(())
}
fn availabillity_not_already_assigned(
fn availability_not_already_assigned(
value: &(NaiveDateTime, NaiveDateTime),
context: &AssignmentContext,
) -> garde::Result {
let list: Vec<&Assignment> = context
.assignments_for_availabillity
.assignments_for_availability
.iter()
.filter(|a| {
a.availabillity_id != context.availabillity.id && a.event_id != context.event.id
a.availability_id != context.availability.id && a.event_id != context.event.id
})
.collect();
@ -107,7 +107,7 @@ fn availabillity_not_already_assigned(
.any(|a| has_start_time_during_assignment(a) || has_end_time_during_assignment(a))
{
return Err(garde::Error::new(
"availabillity is already assigned for that time",
"availability is already assigned for that time",
));
}

View File

@ -14,7 +14,6 @@ pub struct Availability {
}
impl Availability {
// TODO: fix db name
pub async fn create(
pool: &PgPool,
user_id: i32,
@ -22,7 +21,7 @@ impl Availability {
) -> Result<()> {
query!(
r#"
INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment)
INSERT INTO availability (userId, startTimestamp, endTimestamp, comment)
VALUES ($1, $2, $3, $4);
"#,
user_id,
@ -44,11 +43,11 @@ impl Availability {
let records = query!(
r##"
SELECT
availabillity.id,
availabillity.userId,
availabillity.startTimestamp,
availabillity.endTimestamp,
availabillity.comment,
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
@ -59,9 +58,9 @@ impl Availability {
user_.locked,
user_.lastLogin,
user_.receiveNotifications
FROM availabillity
JOIN user_ ON availabillity.userId = user_.id
WHERE availabillity.startTimestamp::date = $1
FROM availability
JOIN user_ ON availability.userId = user_.id
WHERE availability.startTimestamp::date = $1
AND user_.areaId = $2;
"##,
date,
@ -70,7 +69,7 @@ impl Availability {
.fetch_all(pool)
.await?;
let availabillities = records
let availabilities = records
.iter()
.map(|r| Availability {
id: r.id,
@ -95,7 +94,7 @@ impl Availability {
})
.collect();
Ok(availabillities)
Ok(availabilities)
}
pub async fn read_by_date_time_area_including_user(
@ -107,11 +106,11 @@ impl Availability {
let records = query!(
r##"
SELECT
availabillity.id,
availabillity.userId,
availabillity.startTimestamp,
availabillity.endTimestamp,
availabillity.comment,
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
@ -122,11 +121,11 @@ impl Availability {
user_.locked,
user_.lastLogin,
user_.receiveNotifications
FROM availabillity
JOIN user_ ON availabillity.userId = user_.id
WHERE availabillity.starttimestamp::date = $1
FROM availability
JOIN user_ ON availability.userId = user_.id
WHERE availability.starttimestamp::date = $1
AND user_.areaId = $2
AND availabillity.startTimestamp <= $3 AND availabillity.endTimestamp >= $4;
AND availability.startTimestamp <= $3 AND availability.endTimestamp >= $4;
"##,
date,
area_id,
@ -136,7 +135,7 @@ impl Availability {
.fetch_all(pool)
.await?;
let availabillities = records
let availabilities = records
.iter()
.map(|r| Availability {
id: r.id,
@ -161,18 +160,18 @@ impl Availability {
})
.collect();
Ok(availabillities)
Ok(availabilities)
}
pub async fn read_by_id_including_user(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!(
r##"
SELECT
availabillity.id,
availabillity.userId,
availabillity.startTimestamp,
availabillity.endTimestamp,
availabillity.comment,
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
@ -183,17 +182,17 @@ impl Availability {
user_.locked,
user_.lastLogin,
user_.receiveNotifications
FROM availabillity
LEFT JOIN assignment ON availabillity.Id = assignment.availabillityId
JOIN user_ ON availabillity.userId = user_.id
WHERE availabillity.id = $1;
FROM availability
LEFT JOIN assignment ON availability.Id = assignment.availabilityId
JOIN user_ ON availability.userId = user_.id
WHERE availability.id = $1;
"##,
id
)
.fetch_optional(pool)
.await?;
let availabillity = record.map(|r| Availability {
let availability = record.map(|r| Availability {
id: r.id,
user_id: r.userid,
user: Some(User {
@ -215,15 +214,15 @@ impl Availability {
comment: r.comment.clone(),
});
Ok(availabillity)
Ok(availability)
}
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 availability WHERE id = $1", id)
.fetch_optional(pool)
.await?;
let availabillity = record.map(|record| Availability {
let availability = record.map(|record| Availability {
id: record.id,
user_id: record.userid,
user: None,
@ -232,7 +231,7 @@ impl Availability {
comment: record.comment.clone(),
});
Ok(availabillity)
Ok(availability)
}
pub async fn read_for_export(
@ -243,11 +242,11 @@ impl Availability {
let records = query!(
r##"
SELECT
availabillity.id,
availabillity.userId,
availabillity.startTimestamp,
availabillity.endTimestamp,
availabillity.comment,
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
@ -259,12 +258,12 @@ impl Availability {
user_.lastLogin,
user_.receiveNotifications,
area.name AS areaName
FROM availabillity
JOIN user_ ON availabillity.userId = user_.id
FROM availability
JOIN user_ ON availability.userId = user_.id
JOIN area ON user_.areaId = area.id
WHERE user_.areaId = $1 AND
availabillity.starttimestamp::date >= $2 AND
availabillity.starttimestamp::date <= $3;
availability.starttimestamp::date >= $2 AND
availability.starttimestamp::date <= $3;
"##,
area_id,
date_range.0,
@ -273,7 +272,7 @@ impl Availability {
.fetch_all(pool)
.await?;
let availabillities = records
let availabilities = records
.iter()
.map(|r| Availability {
id: r.id,
@ -301,7 +300,7 @@ impl Availability {
})
.collect();
Ok(availabillities)
Ok(availabilities)
}
pub async fn read_by_user_and_date(
@ -312,14 +311,14 @@ impl Availability {
let records = query!(
r##"
SELECT
availabillity.id,
availabillity.userId,
availabillity.startTimestamp,
availabillity.endTimestamp,
availabillity.comment
FROM availabillity
WHERE availabillity.userId = $1
AND availabillity.starttimestamp::date = $2;
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment
FROM availability
WHERE availability.userId = $1
AND availability.starttimestamp::date = $2;
"##,
user_id,
date
@ -327,7 +326,7 @@ impl Availability {
.fetch_all(pool)
.await?;
let availabillities = records
let availabilities = records
.iter()
.map(|r| Availability {
id: r.id,
@ -339,12 +338,12 @@ impl Availability {
})
.collect();
Ok(availabillities)
Ok(availabilities)
}
pub async fn update(pool: &PgPool, id: i32, changeset: AvailabilityChangeset) -> Result<()> {
query!(
"UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
"UPDATE availability SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4",
changeset.time.0.and_utc(),
changeset.time.1.and_utc(),
changeset.comment,
@ -357,7 +356,7 @@ impl Availability {
}
pub async fn delete(pool: &PgPool, id: i32) -> Result<()> {
query!("DELETE FROM availabillity WHERE id = $1", id)
query!("DELETE FROM availability WHERE id = $1", id)
.execute(pool)
.await?;
Ok(())

View File

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

View File

@ -1,14 +0,0 @@
#[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

@ -1,9 +1,9 @@
mod area;
mod assignement;
mod assignment;
mod assignment_changeset;
mod availability;
mod availability_assignment_state;
mod availability_changeset;
mod availabillity;
mod availabillity_assignment_state;
mod event;
mod event_changeset;
mod function;
@ -15,17 +15,16 @@ mod user;
mod user_changeset;
mod user_funtion;
mod vehicle;
mod vehicle_assignement;
mod vehicle_assignment;
pub use area::Area;
pub use assignement::Assignment;
pub use assignment::Assignment;
pub use assignment_changeset::{AssignmentChangeset, AssignmentContext};
pub use availability::Availability;
pub use availability_assignment_state::AvailabilityAssignmentState;
pub use availability_changeset::{
find_free_date_time_slots, AvailabilityChangeset, AvailabilityContext,
};
pub use availabillity::Availability;
pub use availabillity_assignment_state::AvailabillityAssignmentState;
use chrono::NaiveDateTime;
pub use event::Event;
pub use event_changeset::{EventChangeset, EventContext};
pub use function::Function;
@ -37,7 +36,9 @@ pub use user::User;
pub use user_changeset::UserChangeset;
pub use user_funtion::UserFunction;
pub use vehicle::Vehicle;
pub use vehicle_assignement::VehicleAssignement;
pub use vehicle_assignment::VehicleAssignment;
use chrono::NaiveDateTime;
type Result<T> = std::result::Result<T, sqlx::Error>;

View File

@ -3,14 +3,14 @@ use sqlx::{query, PgPool};
use super::Result;
pub struct VehicleAssignement {
pub struct VehicleAssignment {
pub event_id: i32,
pub vehicle_id: i32,
pub start: NaiveDateTime,
pub end: NaiveDateTime,
}
impl VehicleAssignement {
impl VehicleAssignment {
pub async fn create(
pool: &PgPool,
event_id: i32,
@ -19,7 +19,7 @@ impl VehicleAssignement {
end: NaiveDateTime,
) -> Result<()> {
query!(
"INSERT INTO vehicleassignement (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
"INSERT INTO vehicleassignment (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);",
event_id,
vehicle_id,
start.and_utc(),
@ -35,11 +35,11 @@ impl VehicleAssignement {
pool: &PgPool,
event_id: i32,
vehicle_id: i32,
) -> Result<Option<VehicleAssignement>> {
let record = query!("SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1 AND vehicleAssignement.vehicleId = $2;", event_id, vehicle_id).fetch_optional(pool)
) -> Result<Option<VehicleAssignment>> {
let record = query!("SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1 AND vehicleassignment.vehicleId = $2;", event_id, vehicle_id).fetch_optional(pool)
.await?;
let vehicle_assignment = record.map(|r| VehicleAssignement {
let vehicle_assignment = record.map(|r| VehicleAssignment {
event_id: r.eventid,
vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(),
@ -52,9 +52,9 @@ impl VehicleAssignement {
pub async fn read_all_by_event(
pool: &PgPool,
event_id: i32,
) -> Result<Vec<VehicleAssignement>> {
) -> Result<Vec<VehicleAssignment>> {
let records = query!(
"SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1;",
"SELECT * FROM vehicleassignment WHERE vehicleassignment.eventId = $1;",
event_id
)
.fetch_all(pool)
@ -62,7 +62,7 @@ impl VehicleAssignement {
let vehicle_assignments = records
.iter()
.map(|r| VehicleAssignement {
.map(|r| VehicleAssignment {
event_id: r.eventid,
vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(),
@ -77,17 +77,17 @@ impl VehicleAssignement {
pool: &PgPool,
vehicle_id: i32,
date: NaiveDate,
) -> Result<Vec<VehicleAssignement>> {
) -> Result<Vec<VehicleAssignment>> {
let records = query!(
r#"
SELECT
vehicleAssignement.eventId,
vehicleAssignement.vehicleId,
vehicleAssignement.starttimestamp,
vehicleAssignement.endtimestamp
FROM vehicleAssignement
JOIN event ON vehicleAssignement.eventId = event.id
WHERE vehicleAssignement.vehicleid = $1
vehicleassignment.eventId,
vehicleassignment.vehicleId,
vehicleassignment.starttimestamp,
vehicleassignment.endtimestamp
FROM vehicleassignment
JOIN event ON vehicleassignment.eventId = event.id
WHERE vehicleassignment.vehicleid = $1
AND event.starttimestamp::date = $2;
"#,
vehicle_id,
@ -98,7 +98,7 @@ impl VehicleAssignement {
let vehicle_assignments = records
.iter()
.map(|r| VehicleAssignement {
.map(|r| VehicleAssignment {
event_id: r.eventid,
vehicle_id: r.vehicleid,
start: r.starttimestamp.naive_utc(),
@ -111,7 +111,7 @@ impl VehicleAssignement {
pub async fn delete(pool: &PgPool, event_id: i32, vehicle_id: i32) -> Result<()> {
query!(
"DELETE FROM vehicleassignement WHERE eventId = $1 AND vehicleId = $2;",
"DELETE FROM vehicleassignment WHERE eventId = $1 AND vehicleId = $2;",
event_id,
vehicle_id
)

View File

@ -1,17 +1,17 @@
use sqlx::PgPool;
use crate::models::{
Assignment, Availability, AvailabillityAssignmentState, Event, Function, Vehicle,
VehicleAssignement,
Assignment, Availability, AvailabilityAssignmentState, Event, Function, Vehicle,
VehicleAssignment,
};
use super::ApplicationError;
pub async fn generate_availabillity_assignment_list(
pub async fn generate_availability_assignment_list(
pool: &PgPool,
event: &Event,
) -> Result<Vec<(Availability, AvailabillityAssignmentState)>, ApplicationError> {
let availabillities_in_db = Availability::read_by_date_time_area_including_user(
) -> Result<Vec<(Availability, AvailabilityAssignmentState)>, ApplicationError> {
let availabilities_in_db = Availability::read_by_date_time_area_including_user(
pool,
event.start.date(),
(event.start, event.end),
@ -19,9 +19,9 @@ pub async fn generate_availabillity_assignment_list(
)
.await?;
let mut availabillities = Vec::new();
for availabillity in availabillities_in_db {
let assignments = Assignment::read_all_by_availabillity(pool, availabillity.id).await?;
let mut availabilities = Vec::new();
for availability in availabilities_in_db {
let assignments = Assignment::read_all_by_availability(pool, availability.id).await?;
if let Some(assignment) = assignments
.iter()
@ -29,19 +29,19 @@ pub async fn generate_availabillity_assignment_list(
{
let state = match assignment.function {
Function::Posten => {
AvailabillityAssignmentState::AssignedPosten(assignment.availabillity_id)
AvailabilityAssignmentState::AssignedPosten(assignment.availability_id)
}
Function::Fuehrungsassistent => {
AvailabillityAssignmentState::AssignedFührungsassistent(
assignment.availabillity_id,
AvailabilityAssignmentState::AssignedFührungsassistent(
assignment.availability_id,
)
}
Function::Wachhabender => {
AvailabillityAssignmentState::AssignedWachhabender(assignment.availabillity_id)
AvailabilityAssignmentState::AssignedWachhabender(assignment.availability_id)
}
};
availabillities.push((availabillity, state));
availabilities.push((availability, state));
continue;
}
@ -53,15 +53,15 @@ pub async fn generate_availabillity_assignment_list(
.iter()
.any(|a| has_start_time_during_event(a) || has_end_time_during_event(a))
{
availabillities.push((availabillity, AvailabillityAssignmentState::Conflicting));
availabilities.push((availability, AvailabilityAssignmentState::Conflicting));
continue;
}
availabillities.push((availabillity, AvailabillityAssignmentState::Unassigned));
availabilities.push((availability, AvailabilityAssignmentState::Unassigned));
}
//println!(" {availabillities:#?}");
Ok(availabillities)
//println!(" {availabilities:#?}");
Ok(availabilities)
}
pub async fn generate_status_whether_staff_is_required(
@ -100,7 +100,7 @@ pub async fn generate_vehicles_assigned_and_available(
) -> Result<(Vec<Vehicle>, Vec<Vehicle>), ApplicationError> {
let all_vehicles = Vehicle::read_all(pool).await?;
let existing_vehicle_assignments_for_event =
VehicleAssignement::read_all_by_event(pool, event.id).await?;
VehicleAssignment::read_all_by_event(pool, event.id).await?;
let (vehicles_assigned, vehicles_available): (Vec<Vehicle>, Vec<Vehicle>) =
all_vehicles.into_iter().partition(|v| {
existing_vehicle_assignments_for_event

View File

@ -4,7 +4,7 @@
<section class="section">
<div class="container">
{% let is_edit = id.is_some() %}
<form method="post" action="/availabillity/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}">
<form method="post" action="/availability/{% if is_edit %}edit/{{ id.unwrap() }}{% else %}new{% endif %}">
<h1 class="title">{% if is_edit %}Bearbeite{% else %}Neue{% endif %} Vefügbarkeit für den {{ date|date_d }}</h1>
<input type="hidden" name="startdate" value="{{ date }}">

View File

@ -19,35 +19,35 @@
</tr>
</thead>
<tbody>
{% for (availabillity, status) in availabillities %}
{% let u = availabillity.user.as_ref().unwrap() %}
{% for (availability, status) in availabilities %}
{% let u = availability.user.as_ref().unwrap() %}
<tr>
<td>{{ u.name }}</td>
<td>
{{ u.function|show_tree|safe }}
</td>
<td>
{{ availabillity.start.format("%R") }} bis {{ availabillity.end.format("%d.%m.%Y %R") }}
{{ availability.start.format("%R") }} bis {{ availability.end.format("%d.%m.%Y %R") }}
</td>
<td>
{{ availabillity.comment.as_deref().unwrap_or("") }}
{{ availability.comment.as_deref().unwrap_or("") }}
</td>
<td>
<div class="dropdown">
<div class="dropdown-trigger">
<button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
{% match status %}
{% when AvailabillityAssignmentState::AssignedPosten(_) %}
{% when AvailabilityAssignmentState::AssignedPosten(_) %}
<span>als Posten geplant</span>
<svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" />
</svg>
{% when AvailabillityAssignmentState::AssignedFührungsassistent(_) %}
{% when AvailabilityAssignmentState::AssignedFührungsassistent(_) %}
<span>als Führungsassistent geplant</span>
<svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" />
</svg>
{% when AvailabillityAssignmentState::AssignedWachhabender(_) %}
{% when AvailabilityAssignmentState::AssignedWachhabender(_) %}
<span>als Wachhabender geplant</span>
<svg class="icon">
<use href="/static/feather-sprite.svg#edit-2" />
@ -64,27 +64,27 @@
<div class="dropdown-content" hx-target="closest table" hx-swap="outerHTML">
{% if u.function.is_posten() %}
<a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=1" {% if
!further_posten_required || status !=AvailabillityAssignmentState::Unassigned|ref %}disabled{% endif %}>
hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=1" {% if
!further_posten_required || status !=AvailabilityAssignmentState::Unassigned|ref %}disabled{% endif %}>
als Posten planen</a>
{% endif %}
{% if u.function.is_fuehrungsassistent() %}
<a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=5" {% if
!further_fuehrungsassistent_required || status !=AvailabillityAssignmentState::Unassigned|ref
hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=5" {% if
!further_fuehrungsassistent_required || status !=AvailabilityAssignmentState::Unassigned|ref
%}disabled{% endif %}>als Führungsassistent planen</a>
{% endif %}
{% if u.function.is_wachhabender() %}
<a class="dropdown-item"
hx-post="/assignments/new?event={{ event.id }}&availabillity={{ availabillity.id }}&function=10" {% if
!further_wachhabender_required || status !=AvailabillityAssignmentState::Unassigned|ref %}disabled{%
hx-post="/assignments/new?event={{ event.id }}&availability={{ availability.id }}&function=10" {% if
!further_wachhabender_required || status !=AvailabilityAssignmentState::Unassigned|ref %}disabled{%
endif %}>als Wachhabender planen</a>
{% endif %}
{% if status != AvailabillityAssignmentState::Unassigned|ref && status !=
AvailabillityAssignmentState::Conflicting|ref %}
{% if status != AvailabilityAssignmentState::Unassigned|ref && status !=
AvailabilityAssignmentState::Conflicting|ref %}
<hr class="dropdown-divider" />
<a class="dropdown-item"
hx-delete="/assignments/delete?event={{ event.id }}&availabillity={{ availabillity.id }}"
hx-delete="/assignments/delete?event={{ event.id }}&availability={{ availability.id }}"
class="button is-small">entplanen</a>
{% endif %}
</div>

View File

@ -185,8 +185,8 @@
</div>
{% if selected_area.is_none() || selected_area.unwrap() == user.area_id %}
<div class="level-right">
{% let btn_disabled = !user_can_create_availabillity %}
<button class="button is-link is-light" hx-get="/availabillity/new?date={{ date }}" {{
{% let btn_disabled = !user_can_create_availability %}
<button class="button is-link is-light" hx-get="/availability/new?date={{ date }}" {{
btn_disabled|cond_show("disabled") }} hx-target="closest body">
<svg class="icon">
<use href="/static/feather-sprite.svg#plus-circle" />
@ -197,7 +197,7 @@
{% endif %}
</div>
{% if availabillities.len() == 0 %}
{% if availabilities.len() == 0 %}
<div class="box">
<h5 class="subtitle is-5">keine Verfügbarkeiten eingetragen</h5>
</div>
@ -214,30 +214,30 @@
</tr>
</thead>
<tbody>
{% for availabillity in availabillities %}
{% let u = availabillity.user.as_ref().unwrap() %}
{% for availability in availabilities %}
{% let u = availability.user.as_ref().unwrap() %}
<tr>
<td>{{ u.name }}</td>
<td>
{{ u.function|show_tree|safe }}
</td>
<td>
{{ availabillity.start|dt_t }} Uhr bis {{ availabillity.end|dt_ff }} Uhr
{{ availability.start|dt_t }} Uhr bis {{ availability.end|dt_ff }} Uhr
</td>
<td>
{{ availabillity.comment.as_deref().unwrap_or("") }}
{{ availability.comment.as_deref().unwrap_or("") }}
</td>
<td>
{% if availabillity.user_id == user.id %}
{% if availability.user_id == user.id %}
<div class="buttons is-right">
<a class="button is-primary is-light" hx-boost="true"
href="/availabillity/edit/{{ availabillity.id }}">
href="/availability/edit/{{ availability.id }}">
<svg class="icon">
<use href="/static/feather-sprite.svg#edit" />
</svg>
<span>Bearbeiten</span>
</a>
<button class="button is-danger is-light" hx-delete="/availabillity/delete/{{ availabillity.id }}"
<button class="button is-danger is-light" hx-delete="/availability/delete/{{ availability.id }}"
hx-target="closest tr" hx-swap="delete" hx-trigger="confirmed">
<svg class="icon">
<use href="/static/feather-sprite.svg#x-circle" />