Improved closing days. Add more than one closing days interval is now possible.

This commit is contained in:
2025-03-24 11:43:16 +01:00
parent 2cb0a31abf
commit 0f940a9f5e
11 changed files with 174 additions and 84 deletions
+30 -12
View File
@@ -8,6 +8,7 @@ use crate::components::data_form::ForValidation;
cfg_if! { if #[cfg(feature = "ssr")] {
use crate::error::AppError;
use chrono::Local;
pub async fn hours_for_day(day: Weekday) -> Result<Vec<DayHour>, AppError> {
use crate::backend::get_pool;
@@ -21,6 +22,18 @@ cfg_if! { if #[cfg(feature = "ssr")] {
Ok(hours.into_iter().map(|h| { DayHour::new(h.from, h.to, h.discount)}).collect())
}
async fn purge_closing_days() -> Result<(), AppError> {
use crate::backend::get_pool;
let pool = get_pool().await?;
sqlx::query("DELETE FROM closing_time WHERE to_date < $1")
.bind(Local::now())
.execute(&pool)
.await?;
Ok(())
}
}}
#[server]
@@ -97,7 +110,7 @@ pub async fn get_closing_time() -> Result<Option<ClosingTime>, ServerFnError> {
use sqlx::{Error, query_as};
let pool = get_pool().await?;
let ct = query_as::<_, ClosingTime>("SELECT * FROM closing_time")
let ct = query_as::<_, ClosingTime>("SELECT * FROM closing_time ORDER BY from_date")
.fetch_one(&pool)
.await;
@@ -113,44 +126,49 @@ pub async fn get_closing_time() -> Result<Option<ClosingTime>, ServerFnError> {
}
#[server]
pub async fn update_closing_time(time: ClosingTime) -> Result<ApiResponse<()>, ServerFnError> {
pub async fn get_closing_times() -> Result<Vec<ClosingTime>, ServerFnError> {
use crate::backend::get_pool;
use sqlx::query_as;
let pool = get_pool().await?;
purge_closing_days().await?;
Ok(query_as::<_, ClosingTime>("SELECT * FROM closing_time ORDER BY from_date").fetch_all(&pool).await?)
}
#[server]
pub async fn insert_closing_time(time: ClosingTime) -> Result<ApiResponse<()>, ServerFnError> {
use crate::perm_check;
use crate::backend::get_pool;
perm_check!(is_admin);
let pool = get_pool().await?;
let mut tx = pool.begin().await?;
sqlx::query("DELETE FROM closing_time")
.execute(&mut *tx)
.await?;
sqlx::query("INSERT INTO closing_time(from_date, to_date) VALUES($1, $2)")
.bind(time.from_date)
.bind(time.to_date)
.execute(&mut *tx)
.execute(&pool)
.await?;
tx.commit().await?;
Ok(ApiResponse::Data(()))
}
impl ForValidation for UpdateClosingTime {
impl ForValidation for InsertClosingTime {
fn entity(&self) -> &dyn Validate {
&self.time
}
}
#[server]
pub async fn delete_closing_time() -> Result<ApiResponse<()>, ServerFnError> {
pub async fn delete_closing_time(id: i32) -> Result<ApiResponse<()>, ServerFnError> {
use crate::perm_check;
use crate::backend::get_pool;
perm_check!(is_admin);
let pool = get_pool().await?;
sqlx::query("DELETE FROM closing_time")
sqlx::query("DELETE FROM closing_time WHERE id = $1")
.bind(id)
.execute(&pool)
.await?;