use rocket::form::Form; use rocket::http::CookieJar; use rocket::response::Redirect; use rocket_db_pools::{sqlx, Connection}; use pulldown_cmark::{Parser, Options}; use sqlx::Row; use crate::{auth, database, week}; #[derive(FromForm)] pub struct TruthUpdateForm { truth_raw_text: String, truth_author: u8, } #[post("//edit/", data="
")] pub async fn edit_truth(week: u8, truth_number: u8, form: Form, mut db: Connection, cookies: &CookieJar<'_>) -> Redirect { let user = auth::get_user(week, &mut db, cookies).await; if !user.is_admin { cookies.add(("toast_error", "Vous n'avez pas la permission de changer la vérité.")); return Redirect::to(uri!(week::week(week))); } let mut options = Options::empty(); options.insert(Options::ENABLE_STRIKETHROUGH); options.insert(Options::ENABLE_FOOTNOTES); options.insert(Options::ENABLE_MATH); options.insert(Options::ENABLE_TABLES); let markdown_parser = Parser::new_ext(form.truth_raw_text.as_str(), options); let mut rendered_markdown = String::new(); pulldown_cmark::html::push_html(&mut rendered_markdown, markdown_parser); match sqlx::query("UPDATE Truths SET raw_text = $1, rendered_text = $2, author_id = $3 WHERE week == $4 AND number == $5;") .bind(&form.truth_raw_text) .bind(rendered_markdown) .bind(form.truth_author) .bind(week) .bind(truth_number) .fetch_optional(&mut **db) .await { Ok(_) => { debug!("Truth successfully updated") } Err(error) => { error!("Error while updating truth {truth_number} from week {week} : {error}"); cookies.add(("toast_error", "Il y a eu un problème lors du changement de la vérité")); } }; Redirect::to(uri!(week::week(week))) } #[post("//new_truth", data="")] pub async fn create_truth(week: u8, form: Form, mut db: Connection, cookies: &CookieJar<'_>) -> Redirect { let user = auth::get_user(week, &mut db, cookies).await; if !user.is_admin { cookies.add(("toast_error", "Vous n'avez pas la permission d'ajouter de vérité.")); return Redirect::to(uri!(week::week(week))); } let truth_number: u8 = match sqlx::query("SELECT max(number) from Truths WHERE week == $1;") .bind(week) .fetch_one(&mut **db) .await { Ok(row) => match row.try_get::(0).ok() { Some(max_truth_number) => max_truth_number+1, None => 0 }, Err(_) => 1 // If we can't fetch a row, this is the first one. }; if truth_number == 0 { error!("Error while getting max truth number."); cookies.add(("toast_error", "Erreur lors de l'ajout de la vérité...")); return Redirect::to(uri!(week::week(week))); } let mut options = Options::empty(); options.insert(Options::ENABLE_STRIKETHROUGH); options.insert(Options::ENABLE_FOOTNOTES); options.insert(Options::ENABLE_MATH); options.insert(Options::ENABLE_TABLES); let markdown_parser = Parser::new_ext(form.truth_raw_text.as_str(), options); let mut rendered_markdown = String::new(); pulldown_cmark::html::push_html(&mut rendered_markdown, markdown_parser); match sqlx::query("INSERT INTO Truths (week, number, rendered_text, raw_text, author_id) VALUES ($1, $2, $3, $4, $5);") .bind(week) .bind(truth_number) .bind(rendered_markdown) .bind(&form.truth_raw_text) .bind(form.truth_author) .fetch_optional(&mut **db) .await { Ok(_) => { debug!("Truth successfully updated") } Err(error) => { error!("Error while creating truth {truth_number} from week {week} : {error}"); cookies.add(("toast_error", "Il y a eu un problème lors du changement de la vérité")); } }; debug!("Truth was successfully added"); Redirect::to(uri!(week::week(week))) }