Previously, most redirects targeted the root of the application. This was okay for the first part of development where only one week would be active, but would be annoying when using multiple weeks. Change those redirects to call week::week. Change the login path to be dependant on the current week as well, so it can be correctly redirected.
112 lines
4.1 KiB
Rust
112 lines
4.1 KiB
Rust
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("/<week>/edit/<truth_number>", data="<form>")]
|
|
pub async fn edit_truth(week: u8, truth_number: u8, form: Form<TruthUpdateForm>,
|
|
mut db: Connection<database::Db>, 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("/<week>/new_truth", data="<form>")]
|
|
pub async fn create_truth(week: u8, form: Form<TruthUpdateForm>,
|
|
mut db: Connection<database::Db>, 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::<u8, usize>(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)))
|
|
}
|