v1.0: First production version

This first version allows login of pre-existing users, creation and update of truths
by admins, vote on the truths by users, their display as well as a simple graph
for the vote results.
Everything persisting in a SQLite database.
This commit is contained in:
trotFunky 2024-07-23 21:51:42 +01:00
commit 9911895b5b
22 changed files with 4790 additions and 0 deletions

102
src/main.rs Normal file
View file

@ -0,0 +1,102 @@
#[macro_use] extern crate rocket;
use rocket::{Rocket, Build, futures};
use rocket::fs::{FileServer, relative};
use rocket::http::CookieJar;
use rocket::response::Redirect;
use rocket::serde::{Serialize, Deserialize, json::Json};
use rocket_dyn_templates::{Template, context};
use rocket_db_pools::{sqlx, sqlx::Row, Database, Connection};
mod database_records;
mod auth;
mod vote;
mod truth;
mod database;
use database::Db;
use database_records::*;
use auth::User;
#[get("/<week_number>")]
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()
};
// 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_number: week_number,
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_number: week_number,
truths: truths,
user: user,
other_players: other_players,
})
}
}
#[get("/")]
async fn index(mut db: Connection<Db>) -> Redirect {
let current_week: u8 = match sqlx::query("SELECT max(week) AS last_week FROM Truths;")
.fetch_one(&mut **db).await {
Ok(v) => v.try_get(0).ok().unwrap_or_else(|| 1), // If error, go back to 1
Err(error) => {
error!("Error while getting current week : {error:?}");
1
}
};
Redirect::to(uri!("/", week(week_number = if current_week == 0 {1} else {current_week})))
}
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", FileServer::from(relative!("static_files")))
.mount("/", routes![index, vote::fetch_vote_data, vote::vote, truth::create_truth, truth::edit_truth, week, auth::login])
.attach(database::stage())
.attach(Template::fairing())
}
// TODO: Random Row ID