use crate::model::{ role::Role, user::{AdminUser, UserWithDetails, VorstandUser}, }; use rocket::{ form::Form, get, post, request::FlashMessage, response::{Flash, Redirect}, routes, FromForm, Route, State, }; use rocket_dyn_templates::{tera::Context, Template}; use sqlx::SqlitePool; #[get("/role")] async fn index( db: &State, admin: VorstandUser, flash: Option>, ) -> Template { let roles = Role::all(db).await; let mut context = Context::new(); if let Some(msg) = flash { context.insert("flash", &msg.into_inner()); } context.insert("roles", &roles); context.insert( "loggedin_user", &UserWithDetails::from_user(admin.user, db).await, ); Template::render("admin/role", context.into_json()) } #[derive(FromForm)] pub struct RoleToUpdate<'r> { pub formatted_name: &'r str, pub desc: &'r str, } #[post("/role/", data = "")] async fn update( db: &State, data: Form>, role_id: i32, admin: AdminUser, ) -> Flash { let role = Role::find_by_id(db, role_id).await; let Some(role) = role else { return Flash::error(Redirect::to("/admin/role"), "Role does not exist!"); }; match role .update(db, &admin, &data.formatted_name, &data.desc) .await { Ok(_) => Flash::success(Redirect::to("/admin/role"), "Rolle bearbeitet"), Err(e) => Flash::error(Redirect::to("/admin/role"), e), } } pub fn routes() -> Vec { routes![index, update] }