diff --git a/.junie/plans/formalize-permission-event-payloads.md b/.junie/plans/formalize-permission-event-payloads.md index b5de9ac..0183f1e 100644 --- a/.junie/plans/formalize-permission-event-payloads.md +++ b/.junie/plans/formalize-permission-event-payloads.md @@ -5,19 +5,30 @@ sessionId: session-260713-161459-1v9e # Requirements ### Objectif -Créer dans `src/domain/` les payloads explicites correspondant à **tous les événements actuellement émis par `src/repositories/`**, afin qu’ils soient réutilisables par plusieurs endpoints et consommateurs sans dépendre des modèles SeaORM, des repositories ou des DTO Gateway. + +Créer dans `src/domain/` les payloads explicites correspondant à **tous les événements actuellement émis par +`src/repositories/`**, afin qu’ils soient réutilisables par plusieurs endpoints et consommateurs sans dépendre des +modèles SeaORM, des repositories ou des DTO Gateway. ### Inclus -- Remplacer les payloads implicites des 20 émissions recensées dans `category.rs`, `channel.rs`, `group.rs`, `message.rs`, `server.rs` et `user.rs` par des contrats de domaine dédiés. + +- Remplacer les payloads implicites des 20 émissions recensées dans `category.rs`, `channel.rs`, `role`, `message.rs`, + `server.rs` et `user.rs` par des contrats de domaine dédiés. - Couvrir les événements de création, mise à jour, suppression et changement utilisateur/serveur existants. -- Prévoir des payloads dédiés pour les données complètes des créations/mises à jour et pour les identifiants nécessaires aux suppressions ; ne pas utiliser de tuple anonyme. -- Conserver les contrats de permissions déjà demandés : `ServerUserChanged`, `RoleUserChanged`, `ServerRolePermissionChanged`, `ServerUserPermissionChanged`, `ChannelRolePermissionChanged` et `ChannelUserPermissionChanged`. -- Ajouter les contrats CRUD pour les ressources `Category`, `Channel`, `Group`, `Message`, `Server` et `User`, ainsi que les payloads d’identifiants de suppression et le payload `UserChanged` si nécessaire pour `user_changed`. -- Utiliser `Uuid` et des noms explicites (`category_id`, `channel_id`, `group_id`/`role_id`, `message_id`, `server_id`, `user_id`) plutôt que `id` lorsque le domaine est connu. +- Prévoir des payloads dédiés pour les données complètes des créations/mises à jour et pour les identifiants nécessaires + aux suppressions ; ne pas utiliser de tuple anonyme. +- Conserver les contrats de permissions déjà demandés : `ServerUserChanged`, `RoleUserChanged`, + `ServerRolePermissionChanged`, `ServerUserPermissionChanged`, `ChannelRolePermissionChanged` et + `ChannelUserPermissionChanged`. +- Ajouter les contrats CRUD pour les ressources `Category`, `Channel`, `Group`, `Message`, `Server` et `User`, ainsi que + les payloads d’identifiants de suppression et le payload `UserChanged` si nécessaire pour `user_changed`. +- Utiliser `Uuid` et des noms explicites (`category_id`, `channel_id`, `group_id`/`role_id`, `message_id`, `server_id`, + `user_id`) plutôt que `id` lorsque le domaine est connu. - Dériver `Clone` et `Debug` sur chaque struct, avec une composition compatible avec `Send + Sync + 'static`. - Exposer les contrats depuis `crate::domain` pour une utilisation multi-endpoint. ### Exclus + - Aucun branchement des nouveaux types dans les repositories et aucune modification de `Repositories`. - Aucun changement de nom de topic, de logique CRUD, d’ordre mutation puis émission ou de comportement de suppression. - Aucun abonnement ou traitement dans `src/core/permission_sync.rs`. @@ -27,22 +38,36 @@ Créer dans `src/domain/` les payloads explicites correspondant à **tous les é # Technical Design ### Contexte actuel -- Les 20 appels `EventBus::emit` sont répartis entre six repositories ; `computed_permission.rs` ne produit actuellement aucun événement. -- Les créations et mises à jour transmettent des modèles SeaORM, tandis que les suppressions transmettent généralement un `Uuid`; `server_user_created` transmet un tuple `(server_id, user_id)`. -- `message_deleted` et `user_deleted` vérifient déjà `rows_affected` avant émission, alors que d’autres suppressions devront conserver leur comportement actuel dans cette étape. -- `src/routes/gateway/mod.rs` consomme certains événements de canal avec ses propres modèles ; les contrats de domaine resteront indépendants. + +- Les 20 appels `EventBus::emit` sont répartis entre six repositories ; `computed_permission.rs` ne produit actuellement + aucun événement. +- Les créations et mises à jour transmettent des modèles SeaORM, tandis que les suppressions transmettent généralement + un `Uuid`; `server_user_created` transmet un tuple `(server_id, user_id)`. +- `message_deleted` et `user_deleted` vérifient déjà `rows_affected` avant émission, alors que d’autres suppressions + devront conserver leur comportement actuel dans cette étape. +- `src/routes/gateway/mod.rs` consomme certains événements de canal avec ses propres modèles ; les contrats de domaine + resteront indépendants. ### Organisation proposée + - Ajouter `src/domain/mod.rs` et un sous-module par famille émettrice : - - `category.rs`, `channel.rs`, `group.rs`, `message.rs`, `server.rs` et `user.rs` pour les événements CRUD et les changements de relation. - - `server_role_permission.rs`, `server_user_permission.rs`, `channel_role_permission.rs` et `channel_user_permission.rs` pour les contrats de permissions. -- Définir dans chaque module les payloads spécifiques nécessaires aux topics de sa famille, par exemple `CategoryChanged`/`CategoryDeleted`, `ChannelChanged`/`ChannelDeleted`, `MessageChanged`/`MessageDeleted`, `ServerChanged`/`ServerDeleted` et `UserChanged`/`UserDeleted`. -- Utiliser des structs distinctes lorsque les événements de création/mise à jour transportent plusieurs propriétés et lorsqu’une suppression ne nécessite que l’identifiant ; le contenu exact doit refléter les informations actuellement véhiculées par les modèles, sans importer SeaORM dans `domain`. -- Conserver `ServerUserChanged` et `RoleUserChanged` comme contrats relationnels identifiés, avec les champs `server_id`, `role_id` et `user_id`. + - `category.rs`, `channel.rs`, `role`, `message.rs`, `server.rs` et `user.rs` pour les événements CRUD et les + changements de relation. + - `server_role_permission.rs`, `server_user_permission.rs`, `channel_role_permission.rs` et + `channel_user_permission.rs` pour les contrats de permissions. +- Définir dans chaque module les payloads spécifiques nécessaires aux topics de sa famille, par exemple + `CategoryChanged`/`CategoryDeleted`, `ChannelChanged`/`ChannelDeleted`, `MessageChanged`/`MessageDeleted`, + `ServerChanged`/`ServerDeleted` et `UserChanged`/`UserDeleted`. +- Utiliser des structs distinctes lorsque les événements de création/mise à jour transportent plusieurs propriétés et + lorsqu’une suppression ne nécessite que l’identifiant ; le contenu exact doit refléter les informations actuellement + véhiculées par les modèles, sans importer SeaORM dans `domain`. +- Conserver `ServerUserChanged` et `RoleUserChanged` comme contrats relationnels identifiés, avec les champs + `server_id`, `role_id` et `user_id`. - Réexporter sélectivement tous les contrats depuis `crate::domain`; ajouter `pub mod domain;` dans `src/lib.rs`. - Ne modifier ni `src/repositories/mod.rs`, ni `src/core/permission_sync.rs`, ni les routes Gateway. ### Contrats de données + Tous les contrats suivent ce style : ```rust @@ -59,32 +84,46 @@ pub struct ChannelDeleted { pub channel_id: Uuid, } ``` -Les payloads de ressource complète reprennent explicitement les champs utiles du modèle courant ; les payloads de suppression reprennent l’identifiant nommé de la ressource. Les six contrats de permissions utilisent respectivement `server_id`, `role_id`, `channel_id` et `user_id` selon leur responsabilité, sans bitmask implicite ni modèle persisté. + +Les payloads de ressource complète reprennent explicitement les champs utiles du modèle courant ; les payloads de +suppression reprennent l’identifiant nommé de la ressource. Les six contrats de permissions utilisent respectivement +`server_id`, `role_id`, `channel_id` et `user_id` selon leur responsabilité, sans bitmask implicite ni modèle persisté. ### Risques et garde-fous -- Les contrats CRUD devront être suffisamment complets pour ne pas perdre d’information lors du futur branchement des repositories ; la liste de champs sera vérifiée contre `src/models/*.rs`. -- Le changement ultérieur des payloads de topics de canal pourra nécessiter une adaptation du Gateway ; cette intégration est explicitement exclue. -- Les payloads ne doivent pas être centralisés dans `repositories` ni dépendre de SeaORM, afin de rester utilisables par plusieurs endpoints. + +- Les contrats CRUD devront être suffisamment complets pour ne pas perdre d’information lors du futur branchement des + repositories ; la liste de champs sera vérifiée contre `src/models/*.rs`. +- Le changement ultérieur des payloads de topics de canal pourra nécessiter une adaptation du Gateway ; cette + intégration est explicitement exclue. +- Les payloads ne doivent pas être centralisés dans `repositories` ni dépendre de SeaORM, afin de rester utilisables par + plusieurs endpoints. # Testing ### Validation + - Ajouter des assertions ou tests de compilation pour instancier chaque contrat public et accéder à tous ses champs. -- Vérifier les familles couvrant chaque émission : `category_*`, `channel_*`, `group_*`, `message_*`, `server_*` et `user_*`, y compris les suppressions et `server_user_created`. +- Vérifier les familles couvrant chaque émission : `category_*`, `channel_*`, `group_*`, `message_*`, `server_*` et + `user_*`, y compris les suppressions et `server_user_created`. - Vérifier `Clone`, `Debug`, `Send`, `Sync` et `'static` pour tous les payloads. - Vérifier les imports via `crate::domain::{...}` et exécuter `cargo check` ainsi que les tests ciblés. ### Limites de validation -Les émissions réelles, les changements de topics, la consommation par `PermissionSyncService`, les recalculs de permissions et l’intégration Gateway restent hors périmètre ; le demandeur réalisera leur branchement ultérieurement. + +Les émissions réelles, les changements de topics, la consommation par `PermissionSyncService`, les recalculs de +permissions et l’intégration Gateway restent hors périmètre ; le demandeur réalisera leur branchement ultérieurement. ### ✓ Step 1: Recenser les émissions et les modèles + - Vérifier les topics et les champs actuellement transmis par chaque repository. - Vérifier les modèles correspondants pour définir les contrats complets. ### ✓ Step 2: Créer les modules et payloads de domaine + - Ajouter les modules `src/domain/` et les structs CRUD, relationnelles et de permissions. - Exposer les contrats depuis `crate::domain` sans modifier les repositories. ### ✓ Step 3: Ajouter la validation des contrats + - Ajouter des assertions de compilation couvrant les structs et leurs champs. - Exécuter `cargo check` et les tests ciblés. \ No newline at end of file diff --git a/src/repositories/mod.rs b/src/repositories/mod.rs index b0d72ab..ac599b0 100644 --- a/src/repositories/mod.rs +++ b/src/repositories/mod.rs @@ -3,8 +3,8 @@ pub type AnyResult = anyhow::Result; use crate::repositories::category::CategoryRepository; use crate::repositories::channel::ChannelRepository; use crate::repositories::computed_permission::ComputedPermissionRepository; -use crate::repositories::group::GroupRepository; use crate::repositories::message::MessageRepository; +use crate::repositories::role::RoleRepository; use crate::repositories::server::ServerRepository; use crate::repositories::server_item_order::ServerItemOrderRepository; use crate::repositories::user::UserRepository; @@ -15,8 +15,8 @@ use std::sync::Arc; mod category; mod channel; mod computed_permission; -mod group; mod message; +mod role; mod server; mod server_item_order; pub mod types; @@ -33,7 +33,7 @@ pub struct Repositories { pub server: ServerRepository, pub category: CategoryRepository, pub channel: ChannelRepository, - pub group: GroupRepository, + pub role: RoleRepository, pub message: MessageRepository, pub user: UserRepository, pub computed_permission: ComputedPermissionRepository, @@ -54,7 +54,7 @@ impl Repositories { channel: ChannelRepository { context: context.clone(), }, - group: GroupRepository { + role: RoleRepository { context: context.clone(), }, message: MessageRepository { diff --git a/src/repositories/group.rs b/src/repositories/role.rs similarity index 62% rename from src/repositories/group.rs rename to src/repositories/role.rs index 2b9a3e4..eb3efbe 100644 --- a/src/repositories/group.rs +++ b/src/repositories/role.rs @@ -1,15 +1,15 @@ -use crate::models::role; +use crate::models::{role, role_user}; use crate::repositories::{AnyResult, RepositoryContext}; -use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter}; +use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set}; use std::sync::Arc; use uuid::Uuid; #[derive(Clone, Debug)] -pub struct GroupRepository { +pub struct RoleRepository { pub context: Arc, } -impl GroupRepository { +impl RoleRepository { pub async fn get_all_by_server(&self, server_id: Uuid) -> AnyResult> { Ok(role::Entity::find() .filter(role::Column::ServerId.eq(server_id)) @@ -17,6 +17,28 @@ impl GroupRepository { .await?) } + pub async fn get_default_by_server(&self, server_id: Uuid) -> AnyResult> { + Ok(role::Entity::find() + .filter(role::Column::ServerId.eq(server_id)) + .filter(role::Column::IsDefault.eq(true)) + .one(&self.context.db) + .await?) + } + + pub async fn add_to_default(&self, user_id: Uuid, server_id: Uuid) -> AnyResult<()> { + let default_role = self.get_default_by_server(server_id).await?; + if let Some(default_role) = default_role { + role_user::ActiveModel { + role_id: Set(default_role.id), + user_id: Set(user_id), + ..Default::default() + } + .insert(&self.context.db) + .await?; + } + Ok(()) + } + pub async fn get_all(&self) -> AnyResult> { Ok(role::Entity::find().all(&self.context.db).await?) } diff --git a/src/routes/core/handlers.rs b/src/routes/core/handlers.rs index f409c8e..ac1cfc0 100644 --- a/src/routes/core/handlers.rs +++ b/src/routes/core/handlers.rs @@ -52,11 +52,16 @@ pub async fn join( *init_token_lock = None; } - state - .repositories - .server - .add_user(state.default_server.id, user.id) - .await?; + tokio::try_join!( + state + .repositories + .server + .add_user(state.default_server.id, user.id), + state + .repositories + .role + .add_to_default(user.id, state.default_server.id) + )?; Ok(StatusCode::CREATED) } diff --git a/src/routes/mod.rs b/src/routes/mod.rs index 098ba3f..85e84f4 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -1,6 +1,6 @@ -use crate::http::middleware; use crate::http::OxRouter; -use axum::{middleware as axum_middleware, Router}; +use crate::http::middleware; +use axum::{Router, middleware as axum_middleware}; use utoipa::OpenApi; use utoipa_swagger_ui::SwaggerUi; @@ -10,9 +10,9 @@ pub mod category; pub mod channel; pub mod core; pub mod gateway; -pub mod group; pub mod message; pub mod openapi; +pub mod role; pub mod server; pub mod user; @@ -22,7 +22,7 @@ pub fn router() -> OxRouter { .merge(server::routes::router()) .merge(category::routes::router()) .merge(channel::routes::router()) - .merge(group::routes::router()) + .merge(role::routes::router()) .merge(message::routes::router()) .merge(user::routes::router()) .layer(axum_middleware::from_fn(middleware::require_auth)); diff --git a/src/routes/openapi.rs b/src/routes/openapi.rs index 2c90760..3ffa62a 100644 --- a/src/routes/openapi.rs +++ b/src/routes/openapi.rs @@ -30,11 +30,11 @@ use utoipa::{Modify, OpenApi}; channel::handlers::create, channel::handlers::update, channel::handlers::delete, - group::handlers::get_all, - group::handlers::get_by_id, - group::handlers::create, - group::handlers::update, - group::handlers::delete, + role::handlers::get_all, + role::handlers::get_by_id, + role::handlers::create, + role::handlers::update, + role::handlers::delete, message::handlers::get_all, message::handlers::get_by_id, message::handlers::create, @@ -59,9 +59,9 @@ use utoipa::{Modify, OpenApi}; channel::dto::ChannelResponse, channel::dto::CreateChannelRequest, channel::dto::UpdateChannelRequest, - group::dto::GroupResponse, - group::dto::CreateGroupRequest, - group::dto::UpdateGroupRequest, + role::dto::RoleResponse, + role::dto::CreateRoleRequest, + role::dto::UpdateRoleRequest, message::dto::MessageResponse, message::dto::CreateMessageRequest, message::dto::UpdateMessageRequest, @@ -76,7 +76,7 @@ use utoipa::{Modify, OpenApi}; (name = "Servers", description = "Gestion des serveurs"), (name = "Categories", description = "Gestion des catégories"), (name = "Channels", description = "Gestion des salons"), - (name = "Groups", description = "Gestion des groupes"), + (name = "roles", description = "Gestion des rolees"), (name = "Messages", description = "Gestion des messages"), (name = "Core", description = "Endpoints de base (enregistrement, etc.)"), ) diff --git a/src/routes/group/domain.rs b/src/routes/role/domain.rs similarity index 100% rename from src/routes/group/domain.rs rename to src/routes/role/domain.rs diff --git a/src/routes/group/dto.rs b/src/routes/role/dto.rs similarity index 87% rename from src/routes/group/dto.rs rename to src/routes/role/dto.rs index ad4c81a..3d8f61c 100644 --- a/src/routes/group/dto.rs +++ b/src/routes/role/dto.rs @@ -4,7 +4,7 @@ use utoipa::ToSchema; use uuid::Uuid; #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct CreateGroupRequest { +pub struct CreateRoleRequest { pub server_id: Uuid, #[schema(example = "Modérateurs")] pub name: String, @@ -13,14 +13,14 @@ pub struct CreateGroupRequest { } #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct UpdateGroupRequest { +pub struct UpdateRoleRequest { #[schema(example = "Modérateurs (MAJ)")] pub name: String, pub is_default: bool, } #[derive(Debug, Serialize, Deserialize, ToSchema)] -pub struct GroupResponse { +pub struct RoleResponse { pub id: Uuid, pub server_id: Uuid, pub name: String, diff --git a/src/routes/group/handlers.rs b/src/routes/role/handlers.rs similarity index 68% rename from src/routes/group/handlers.rs rename to src/routes/role/handlers.rs index b8a9c2d..12a9c26 100644 --- a/src/routes/group/handlers.rs +++ b/src/routes/role/handlers.rs @@ -1,12 +1,12 @@ use crate::core::state::AppState; use crate::http::context::Superuser; use crate::http::error::HTTPError; -use crate::routes::group::dto::{CreateGroupRequest, GroupResponse, UpdateGroupRequest}; -use crate::routes::group::mapper; +use crate::routes::role::dto::{CreateRoleRequest, RoleResponse, UpdateRoleRequest}; +use crate::routes::role::mapper; use axum::{ + Json, extract::{Path, State}, http::StatusCode, - Json, }; use uuid::Uuid; @@ -15,13 +15,13 @@ use uuid::Uuid; get, path = "/groups", responses( - (status = 200, description = "Liste des groupes récupérée avec succès", body = [GroupResponse]), + (status = 200, description = "Liste des groupes récupérée avec succès", body = [RoleResponse]), (status = 500, description = "Erreur interne du serveur") ), - tag = "Groups" + tag = "Roles" )] -pub async fn get_all(State(state): State) -> Result>, HTTPError> { - let groups = state.repositories.group.get_all().await?; +pub async fn get_all(State(state): State) -> Result>, HTTPError> { + let groups = state.repositories.role.get_all().await?; Ok(Json( groups .into_iter() @@ -35,22 +35,22 @@ pub async fn get_all(State(state): State) -> Result, Path(id): Path, -) -> Result, HTTPError> { +) -> Result, HTTPError> { let group = state .repositories - .group + .role .get_by_id(id) .await? .ok_or(HTTPError::NotFound)?; @@ -62,13 +62,13 @@ pub async fn get_by_id( #[utoipa::path( post, path = "/groups", - request_body = CreateGroupRequest, + request_body = CreateRoleRequest, responses( - (status = 201, description = "Groupe créé avec succès", body = GroupResponse), + (status = 201, description = "Role créé avec succès", body = RoleResponse), (status = 404, description = "Serveur non trouvé"), (status = 500, description = "Erreur interne du serveur") ), - tag = "Groups", + tag = "Roles", security( ("bearerAuth" = []) ) @@ -76,8 +76,8 @@ pub async fn get_by_id( pub async fn create( _admin: Superuser, State(state): State, - Json(payload): Json, -) -> Result<(StatusCode, Json), HTTPError> { + Json(payload): Json, +) -> Result<(StatusCode, Json), HTTPError> { // Vérifier que le serveur existe state .repositories @@ -87,7 +87,7 @@ pub async fn create( .ok_or(HTTPError::BadRequest("Server not found".to_string()))?; let active_model = mapper::create_request_to_am(payload); - let group = state.repositories.group.create(active_model).await?; + let group = state.repositories.role.create(active_model).await?; Ok(( StatusCode::CREATED, Json(mapper::group_model_to_group_response(group)), @@ -98,16 +98,16 @@ pub async fn create( #[utoipa::path( put, path = "/groups/{id}", - request_body = UpdateGroupRequest, + request_body = UpdateRoleRequest, responses( - (status = 200, description = "Groupe mis à jour avec succès", body = GroupResponse), - (status = 404, description = "Groupe non trouvé"), + (status = 200, description = "Role mis à jour avec succès", body = RoleResponse), + (status = 404, description = "Role non trouvé"), (status = 500, description = "Erreur interne du serveur") ), params( ("id" = Uuid, Path, description = "ID du groupe") ), - tag = "Groups", + tag = "Roles", security( ("bearerAuth" = []) ) @@ -116,18 +116,18 @@ pub async fn update( _admin: Superuser, State(state): State, Path(id): Path, - Json(payload): Json, -) -> Result, HTTPError> { + Json(payload): Json, +) -> Result, HTTPError> { // Vérifier l'existence let group = state .repositories - .group + .role .get_by_id(id) .await? .ok_or(HTTPError::NotFound)?; let active_model = mapper::update_request_to_am(group.id, group.server_id, payload); - let group = state.repositories.group.update(active_model).await?; + let group = state.repositories.role.update(active_model).await?; Ok(Json(mapper::group_model_to_group_response(group))) } @@ -137,14 +137,14 @@ pub async fn update( delete, path = "/groups/{id}", responses( - (status = 204, description = "Groupe supprimé avec succès"), - (status = 404, description = "Groupe non trouvé"), + (status = 204, description = "Role supprimé avec succès"), + (status = 404, description = "Role non trouvé"), (status = 500, description = "Erreur interne du serveur") ), params( ("id" = Uuid, Path, description = "ID du groupe") ), - tag = "Groups", + tag = "Roles", security( ("bearerAuth" = []) ) @@ -154,7 +154,7 @@ pub async fn delete( State(state): State, Path(id): Path, ) -> Result { - if state.repositories.group.delete(id).await? { + if state.repositories.role.delete(id).await? { Ok(StatusCode::NO_CONTENT) } else { Err(HTTPError::NotFound) diff --git a/src/routes/group/mapper.rs b/src/routes/role/mapper.rs similarity index 71% rename from src/routes/group/mapper.rs rename to src/routes/role/mapper.rs index 96c4904..bed0903 100644 --- a/src/routes/group/mapper.rs +++ b/src/routes/role/mapper.rs @@ -1,10 +1,10 @@ use crate::models::role; -use crate::routes::group::dto::{CreateGroupRequest, GroupResponse, UpdateGroupRequest}; +use crate::routes::role::dto::{CreateRoleRequest, RoleResponse, UpdateRoleRequest}; use sea_orm::Set; use uuid::Uuid; -pub fn group_model_to_group_response(model: role::Model) -> GroupResponse { - GroupResponse { +pub fn group_model_to_group_response(model: role::Model) -> RoleResponse { + RoleResponse { id: model.id, server_id: model.server_id, name: model.name, @@ -13,7 +13,7 @@ pub fn group_model_to_group_response(model: role::Model) -> GroupResponse { } } -pub fn create_request_to_am(req: CreateGroupRequest) -> role::ActiveModel { +pub fn create_request_to_am(req: CreateRoleRequest) -> role::ActiveModel { role::ActiveModel { id: Set(Uuid::new_v4()), server_id: Set(req.server_id), @@ -26,7 +26,7 @@ pub fn create_request_to_am(req: CreateGroupRequest) -> role::ActiveModel { pub fn update_request_to_am( id: Uuid, server_id: Uuid, - req: UpdateGroupRequest, + req: UpdateRoleRequest, ) -> role::ActiveModel { role::ActiveModel { id: Set(id), diff --git a/src/routes/group/mod.rs b/src/routes/role/mod.rs similarity index 100% rename from src/routes/group/mod.rs rename to src/routes/role/mod.rs diff --git a/src/routes/group/routes.rs b/src/routes/role/routes.rs similarity index 100% rename from src/routes/group/routes.rs rename to src/routes/role/routes.rs diff --git a/src/routes/group/service.rs b/src/routes/role/service.rs similarity index 100% rename from src/routes/group/service.rs rename to src/routes/role/service.rs