81 lines
2.3 KiB
Rust
81 lines
2.3 KiB
Rust
use cfg_if::cfg_if;
|
|||
|
|
use leptos::*;
|
||
|
|
use validator::Validate;
|
||
|
|
use crate::backend::data::{ApiResponse, Message, MessageType};
|
||
|
|
use crate::components::data_form::ForValidation;
|
||
|
|
|
||
|
|
cfg_if! { if #[cfg(feature = "ssr")] {
|
||
|
|
use sqlx::{PgPool, query, query_as};
|
||
|
|
use sqlx::Error;
|
||
|
|
use crate::backend::get_pool;
|
||
|
|
use crate::error::AppError;
|
||
|
|
use log::info;
|
||
|
|
|
||
|
|
pub async fn message_for_type(msg_type: &MessageType, pool: &PgPool) -> Result<Message, Error> {
|
||
|
|
Ok(query_as::<_, Message>("SELECT * FROM message WHERE msg_type = $1")
|
||
|
|
.bind(msg_type)
|
||
|
|
.fetch_one(pool)
|
||
|
|
.await?)
|
||
|
|
}
|
||
|
|
|
||
|
|
pub async fn init_message(msg_type: &MessageType, pool: &PgPool) -> Result<(), Error> {
|
||
|
|
query("INSERT INTO message(msg_type, subject, text) VALUES($1, '', '')")
|
||
|
|
.bind(msg_type)
|
||
|
|
.execute(pool)
|
||
|
|
.await?;
|
||
|
|
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
|
||
|
|
pub async fn check_messages(pool: &PgPool) -> Result<(), AppError> {
|
||
|
|
let types = [
|
||
|
|
MessageType::NewReservation,
|
||
|
|
MessageType::NewReservationCust,
|
||
|
|
MessageType::ReservationApp,
|
||
|
|
MessageType::ReservationCanceled];
|
||
|
|
|
||
|
|
for msg_type in types {
|
||
|
|
let msg = message_for_type(&msg_type, pool).await;
|
||
|
|
if let Err(e) = msg {
|
||
|
|
if matches!(e, Error::RowNotFound) {
|
||
|
|
info!("Creating initial message for type {:?}", msg_type);
|
||
|
|
init_message(&msg_type, pool).await?;
|
||
|
|
} else {
|
||
|
|
return Err(e.into())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
}}
|
||
|
|
|
||
|
|
#[server]
|
||
|
|
pub async fn get_message(msg_type: MessageType) -> Result<Message, ServerFnError> {
|
||
|
|
let pool = get_pool().await?;
|
||
|
|
|
||
|
|
Ok(message_for_type(&msg_type, &pool).await?)
|
||
|
|
}
|
||
|
|
|
||
|
|
#[server]
|
||
|
|
pub async fn update_message(message: Message) -> Result<ApiResponse<()>, ServerFnError> {
|
||
|
|
use crate::perm_check;
|
||
|
|
|
||
|
|
perm_check!(is_admin);
|
||
|
|
let pool = get_pool().await?;
|
||
|
|
|
||
|
|
query("UPDATE message SET subject = $1, text = $2 WHERE msg_type = $3")
|
||
|
|
.bind(message.subject)
|
||
|
|
.bind(message.text)
|
||
|
|
.bind(message.msg_type)
|
||
|
|
.execute(&pool)
|
||
|
|
.await?;
|
||
|
|
|
||
|
|
Ok(ApiResponse::Data(()))
|
||
|
|
}
|
||
|
|
|
||
|
|
impl ForValidation for UpdateMessage {
|
||
|
|
fn entity(&self) -> &dyn Validate {
|
||
|
|
&self.message
|
||
|
|
}
|
||
|
|
}
|