Files
rezervovator/src/backend/mail.rs
T

81 lines
2.3 KiB
Rust
Raw Normal View History

2024-02-10 19:52:20 +01:00
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
}
}