forked from Ruderverein-Donau-Linz/rowt
65 lines
1.6 KiB
Rust
65 lines
1.6 KiB
Rust
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<SqlitePool>,
|
|
admin: VorstandUser,
|
|
flash: Option<FlashMessage<'_>>,
|
|
) -> 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/<role_id>", data = "<data>")]
|
|
async fn update(
|
|
db: &State<SqlitePool>,
|
|
data: Form<RoleToUpdate<'_>>,
|
|
role_id: i32,
|
|
admin: AdminUser,
|
|
) -> Flash<Redirect> {
|
|
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<Route> {
|
|
routes![index, update]
|
|
}
|