From b964063dbb4cd90883ff50eadd255a4d9493d55d Mon Sep 17 00:00:00 2001 From: Simon Goller Date: Mon, 29 Apr 2024 06:29:25 +0200 Subject: [PATCH] Finalize permission service --- Cargo.lock | 1 + rest/Cargo.toml | 1 + rest/src/permission.rs | 266 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 263 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55a2b25..c92621f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1112,6 +1112,7 @@ dependencies = [ "bytes", "http-body", "serde", + "serde_json", "service", "tokio", "uuid", diff --git a/rest/Cargo.toml b/rest/Cargo.toml index 801ab91..bbecd2f 100644 --- a/rest/Cargo.toml +++ b/rest/Cargo.toml @@ -10,6 +10,7 @@ axum = "0.7.5" bytes = "1.6.0" http-body = "1.0.0" serde = "1.0.198" +serde_json = "1.0.116" [dependencies.tokio] version = "1.37.0" diff --git a/rest/src/permission.rs b/rest/src/permission.rs index 3b26440..0b9d12d 100644 --- a/rest/src/permission.rs +++ b/rest/src/permission.rs @@ -1,19 +1,81 @@ -use axum::{body::Body, extract::State, response::Response, routing::post, Json, Router}; +use std::sync::Arc; + +use axum::{ + body::Body, + extract::State, + response::Response, + routing::{delete, get, post}, + Json, Router, +}; use serde::{Deserialize, Serialize}; -use uuid::Uuid; use crate::{error_handler, RestStateDef}; use service::PermissionService; #[derive(Debug, Serialize, Deserialize)] pub struct User { - #[serde(default)] - pub id: Uuid, pub name: String, } +impl From<&service::User> for User { + fn from(user: &service::User) -> Self { + Self { + name: user.name.to_string(), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Role { + pub name: String, +} +impl From<&service::Role> for Role { + fn from(role: &service::Role) -> Self { + Self { + name: role.name.to_string(), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Privilege { + pub name: String, +} +impl From<&service::Privilege> for Privilege { + fn from(privilege: &service::Privilege) -> Self { + Self { + name: privilege.name.to_string(), + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct UserRole { + pub user: String, + pub role: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RolePrivilege { + pub role: String, + pub privilege: String, +} pub fn generate_route() -> Router { - Router::new().route("/user/", post(add_user::)) + Router::new() + .route("/user/", get(get_all_users::)) + .route("/user/", post(add_user::)) + .route("/user/", delete(remove_user::)) + .route("/role/", get(get_all_roles::)) + .route("/role/", post(add_role::)) + .route("/role/", delete(delete_role::)) + .route("/privilege/", get(get_all_privileges::)) + .route("/user-role/", post(add_user_role::)) + .route("/user-role/", delete(remove_user_role::)) + .route("/role-privilege/", post(add_role_privilege::)) + .route( + "/role-privilege/", + delete(remove_role_privilege::), + ) } pub async fn add_user( @@ -27,6 +89,23 @@ pub async fn add_user( .permission_service() .create_user(user.name.as_str()) .await?; + Ok(Response::builder() + .status(201) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn remove_user( + rest_state: State, + Json(user): Json, +) -> Response { + println!("Removing user: {:?}", user); + error_handler( + (async { + rest_state.permission_service().delete_user(&user).await?; Ok(Response::builder() .status(200) .body(Body::from("")) @@ -35,3 +114,180 @@ pub async fn add_user( .await, ) } + +pub async fn add_role( + rest_state: State, + Json(role): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .create_role(role.name.as_str()) + .await?; + Ok(Response::builder() + .status(200) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn delete_role( + rest_state: State, + Json(role): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .delete_role(role.as_str()) + .await?; + Ok(Response::builder() + .status(200) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn add_user_role( + rest_state: State, + Json(user_role): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .add_user_role(user_role.user.as_str(), user_role.role.as_str()) + .await?; + Ok(Response::builder() + .status(201) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn remove_user_role( + rest_state: State, + Json(user_role): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .delete_user_role(user_role.user.as_str(), user_role.role.as_str()) + .await?; + Ok(Response::builder() + .status(200) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn add_role_privilege( + rest_state: State, + Json(role_privilege): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .add_role_privilege( + role_privilege.role.as_str(), + role_privilege.privilege.as_str(), + ) + .await?; + Ok(Response::builder() + .status(201) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn remove_role_privilege( + rest_state: State, + Json(role_privilege): Json, +) -> Response { + error_handler( + (async { + rest_state + .permission_service() + .delete_role_privilege( + role_privilege.role.as_str(), + role_privilege.privilege.as_str(), + ) + .await?; + Ok(Response::builder() + .status(200) + .body(Body::from("")) + .unwrap()) + }) + .await, + ) +} + +pub async fn get_all_users(rest_state: State) -> Response { + error_handler( + (async { + let users: Arc<[User]> = rest_state + .permission_service() + .get_all_users() + .await? + .iter() + .map(|u| User::from(u)) + .collect(); + Ok(Response::builder() + .status(200) + .body(Body::from(serde_json::to_string(&users).unwrap())) + .unwrap()) + }) + .await, + ) +} + +pub async fn get_all_roles(rest_state: State) -> Response { + error_handler( + (async { + let roles: Arc<[Role]> = rest_state + .permission_service() + .get_all_roles() + .await? + .iter() + .map(|u| Role::from(u)) + .collect(); + Ok(Response::builder() + .status(200) + .body(Body::from(serde_json::to_string(&roles).unwrap())) + .unwrap()) + }) + .await, + ) +} + +pub async fn get_all_privileges(rest_state: State) -> Response { + error_handler( + (async { + let privileges: Arc<[Privilege]> = rest_state + .permission_service() + .get_all_privileges() + .await? + .iter() + .map(|u| Privilege::from(u)) + .collect(); + Ok(Response::builder() + .status(200) + .body(Body::from(serde_json::to_string(&privileges).unwrap())) + .unwrap()) + }) + .await, + ) +}