refactor: db availability into own files

This commit is contained in:
Max Hohlfeld 2025-07-08 14:22:37 +02:00
parent dcfb097114
commit 1b7a44b8cd
12 changed files with 67 additions and 67 deletions

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"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 ", "query": "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\nFROM availability\nJOIN\n user_ ON availability.userId = user_.id\nJOIN\n area ON user_.areaId = area.id\nWHERE\n user_.areaId = $1\n AND availability.starttimestamp::date >= $2\n AND availability.starttimestamp::date <= $3;\n",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -139,5 +139,5 @@
false false
] ]
}, },
"hash": "a05ae42af4e579697f6ddae93aa52fbc826a58edb71a23b54a589c56e1b50378" "hash": "604c4d56e84c5b36a0c217a4b6fd6920d845b62bf05249e4f5fb4acad79fe2b2"
} }

View File

@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"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 ", "query": "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\nFROM availability\nJOIN\n user_ ON availability.userId = user_.id\nWHERE\n availability.id = $1;\n",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@ -131,5 +131,5 @@
false false
] ]
}, },
"hash": "1b85bca9dc5c0ec4568a07846ccda76468e81d9335548ef6f8b25c6e290b9cd0" "hash": "79daa9585c09f2f98db217067d7bd634440dfff960c34404fe7acc16fbc9b0fc"
} }

View File

@ -0,0 +1,26 @@
SELECT
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
user_.salt,
user_.role AS "role: Role",
user_.function AS "function: UserFunction",
user_.areaId,
user_.locked,
user_.lastLogin,
user_.receiveNotifications,
area.name AS areaName
FROM availability
JOIN
user_ ON availability.userId = user_.id
JOIN
area ON user_.areaId = area.id
WHERE
user_.areaId = $1
AND availability.starttimestamp::date >= $2
AND availability.starttimestamp::date <= $3;

View File

@ -0,0 +1,21 @@
SELECT
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
user_.salt,
user_.role AS "role: Role",
user_.function AS "function: UserFunction",
user_.areaId,
user_.locked,
user_.lastLogin,
user_.receiveNotifications
FROM availability
JOIN
user_ ON availability.userId = user_.id
WHERE
availability.id = $1;

View File

@ -28,7 +28,7 @@ impl<'a> AsyncValidate<'a> for AssignmentChangeset {
context: &'a Self::Context, context: &'a Self::Context,
) -> Result<(), crate::validation::AsyncValidateError> { ) -> Result<(), crate::validation::AsyncValidateError> {
let Some(availability) = let Some(availability) =
Availability::read_by_id_including_user(context.pool, context.availability_id).await? Availability::read_including_user(context.pool, context.availability_id).await?
else { else {
return Err(AsyncValidateError::new( return Err(AsyncValidateError::new(
"Angegebener Verfügbarkeit des Nutzers existiert nicht.", "Angegebener Verfügbarkeit des Nutzers existiert nicht.",

View File

@ -73,6 +73,7 @@ impl Availability {
Ok(availabilities) Ok(availabilities)
} }
/// loads availabilities for the area and the same day as the start date and which fully lie inside the daterange
pub async fn read_all_by_daterange_and_area_including_user_for_event_planning( pub async fn read_all_by_daterange_and_area_including_user_for_event_planning(
pool: &PgPool, pool: &PgPool,
date_range: (NaiveDateTime, NaiveDateTime), date_range: (NaiveDateTime, NaiveDateTime),
@ -116,34 +117,10 @@ impl Availability {
Ok(availabilities) Ok(availabilities)
} }
pub async fn read_by_id_including_user(pool: &PgPool, id: i32) -> Result<Option<Availability>> { pub async fn read_including_user(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!( let record = query_file!("sql/availability/read_including_user.sql", id)
r##" .fetch_optional(pool)
SELECT .await?;
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
user_.salt,
user_.role AS "role: Role",
user_.function AS "function: UserFunction",
user_.areaId,
user_.locked,
user_.lastLogin,
user_.receiveNotifications
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 availability = record.map(|r| Availability { let availability = record.map(|r| Availability {
id: r.id, id: r.id,
@ -170,7 +147,7 @@ impl Availability {
Ok(availability) Ok(availability)
} }
pub async fn read_by_id(pool: &PgPool, id: i32) -> Result<Option<Availability>> { pub async fn read(pool: &PgPool, id: i32) -> Result<Option<Availability>> {
let record = query!("SELECT * FROM availability WHERE id = $1", id) let record = query!("SELECT * FROM availability WHERE id = $1", id)
.fetch_optional(pool) .fetch_optional(pool)
.await?; .await?;
@ -187,37 +164,13 @@ impl Availability {
Ok(availability) Ok(availability)
} }
pub async fn read_for_export( pub async fn read_all_by_daterange_and_area_including_user_for_export(
pool: &PgPool, pool: &PgPool,
date_range: (NaiveDate, NaiveDate), date_range: (NaiveDate, NaiveDate),
area_id: i32, area_id: i32,
) -> Result<Vec<Availability>> { ) -> Result<Vec<Availability>> {
let records = query!( let records = query_file!(
r##" "sql/availability/read_all_by_daterange_and_area_including_user_for_export.sql",
SELECT
availability.id,
availability.userId,
availability.startTimestamp,
availability.endTimestamp,
availability.comment,
user_.name,
user_.email,
user_.password,
user_.salt,
user_.role AS "role: Role",
user_.function AS "function: UserFunction",
user_.areaId,
user_.locked,
user_.lastLogin,
user_.receiveNotifications,
area.name AS areaName
FROM availability
JOIN user_ ON availability.userId = user_.id
JOIN area ON user_.areaId = area.id
WHERE user_.areaId = $1 AND
availability.starttimestamp::date >= $2 AND
availability.starttimestamp::date <= $3;
"##,
area_id, area_id,
date_range.0, date_range.0,
date_range.1 date_range.1

View File

@ -125,7 +125,7 @@ async fn time_can_be_extended_if_edit(
let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY)); let mut common_time = (start.and_time(START_OF_DAY), end.and_time(END_OF_DAY));
for assignment in assignments_for_event { for assignment in assignments_for_event {
let availability = Availability::read_by_id(pool, assignment.availability_id) let availability = Availability::read(pool, assignment.availability_id)
.await? .await?
.unwrap(); .unwrap();
let all_assignments = let all_assignments =

View File

@ -1,4 +1,4 @@
use sqlx::{query, PgPool}; use sqlx::{PgPool, query};
use super::Result; use super::Result;

View File

@ -10,7 +10,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(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };

View File

@ -14,7 +14,7 @@ pub async fn get(
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(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };

View File

@ -18,7 +18,7 @@ pub async fn post(
path: web::Path<IdPath>, path: web::Path<IdPath>,
form: web::Form<AvailabilityForm>, form: web::Form<AvailabilityForm>,
) -> Result<impl Responder, ApplicationError> { ) -> Result<impl Responder, ApplicationError> {
let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { let Some(availability) = Availability::read(pool.get_ref(), path.id).await? else {
return Ok(HttpResponse::NotFound().finish()); return Ok(HttpResponse::NotFound().finish());
}; };

View File

@ -62,7 +62,7 @@ pub async fn get(
}; };
let availabilities = let availabilities =
Availability::read_for_export(pool.get_ref(), (start_date, end_date), area_id).await?; Availability::read_all_by_daterange_and_area_including_user_for_export(pool.get_ref(), (start_date, end_date), area_id).await?;
let export_availabilities = availabilities let export_availabilities = availabilities
.into_iter() .into_iter()