FabulaVotes/src/week.rs
trotFunky 67ce54e992 v1.1: Add weekly introductions
- Create a new migration adding a Weeks table, allowing for new weekly introductions
     and paving the way for multiple week handling.
 - Add route to update the weekly introduction
 - Move the week rendering to a specific week file
 - Update the templates to use the week number from the week data
 - Update templates to render and edit weekly introductions
2024-07-23 21:51:51 +01:00

116 lines
4 KiB
Rust

use pulldown_cmark::{Options, Parser};
use rocket::fairing::AdHoc;
use rocket::form::Form;
use rocket::http::CookieJar;
use rocket::response::Redirect;
use rocket_db_pools::{sqlx, Connection};
use rocket_dyn_templates::{context, Template};
use crate::auth;
use crate::auth::User;
use crate::database::Db;
use crate::database_records::{DisplayTruth, Player, Truth, Week};
#[get("/<week_number>")]
pub async fn week(week_number: u8, mut db: Connection<Db>, cookies: &CookieJar<'_>) -> Template {
let user: User = auth::get_user(week_number, &mut db, cookies).await;
let other_players = if user.logged_in {
match sqlx::query_as("SELECT id, name FROM Players WHERE id <> $1 AND is_admin == 0 ORDER BY name")
.bind(user.id)
.fetch_all(&mut **db).await {
Ok(v) => v,
Err(error) => {
println!("Some error while getting players : {error}");
Vec::<Player>::new()
}
}
} else {
Vec::<Player>::new()
};
let week_data: Week = match sqlx::query_as("SELECT number, is_last_week, rendered_text, raw_text FROM Weeks WHERE number == $1")
.bind(week_number)
.fetch_one(&mut **db)
.await {
Ok(week) => week,
Err(error) => {
error!("Error while retrieving week data : {error}");
Week {number: 0, is_last_week: true, rendered_text: "".to_string(), raw_text: "".to_string() }
}
};
// FIXME : This is fucking *trash* but fucking hell mate
if user.is_admin {
let truths: Vec<Truth> = match sqlx::query_as("SELECT * FROM Truths WHERE week == $1 ORDER BY number")
.bind(week_number)
.fetch_all(&mut **db).await {
Ok(v) => v,
Err(error) => {
error!("Error while getting truths : {error}");
Vec::<Truth>::new()
}
};
Template::render("index", context! {
week_data: week_data,
truths: truths,
user: user,
other_players: other_players,
})
} else {
let truths: Vec<DisplayTruth> = match sqlx::query_as("SELECT id, number, author_id, rendered_text FROM Truths WHERE week == $1 ORDER BY number")
.bind(week_number)
.fetch_all(&mut **db).await {
Ok(v) => v,
Err(error) => {
error!("Error while getting truths : {error}");
Vec::<DisplayTruth>::new()
}
};
Template::render("index", context! {
week_data: week_data,
truths: truths,
user: user,
other_players: other_players,
})
}
}
#[post("/<week>/edit", data="<raw_intro>")]
pub async fn update_week(week: u8, raw_intro: Form<String>,
mut db: Connection<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 semaine."));
return Redirect::to(uri!("/"));
}
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(raw_intro.as_str(), options);
let mut rendered_markdown = String::new();
pulldown_cmark::html::push_html(&mut rendered_markdown, markdown_parser);
match sqlx::query("UPDATE Weeks SET raw_text = $1, rendered_text = $2 WHERE number == $3;")
.bind(&raw_intro.as_str())
.bind(rendered_markdown)
.bind(week)
.fetch_optional(&mut **db)
.await {
Ok(_) => {
debug!("Week successfully updated")
}
Err(error) => {
error!("Error while updating week {week} data : {error}");
cookies.add(("toast_error", "Il y a eu un problème lors du changement de la semaine"));
}
};
Redirect::to(uri!("/"))
}