6.7 KiB
sessionId
| 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.
Inclus
- Remplacer les payloads implicites des 20 émissions recensées dans
category.rs,channel.rs,role,message.rs,server.rsetuser.rspar 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,ChannelRolePermissionChangedetChannelUserPermissionChanged. - Ajouter les contrats CRUD pour les ressources
Category,Channel,Group,Message,ServeretUser, ainsi que les payloads d’identifiants de suppression et le payloadUserChangedsi nécessaire pouruser_changed. - Utiliser
Uuidet des noms explicites (category_id,channel_id,group_id/role_id,message_id,server_id,user_id) plutôt queidlorsque le domaine est connu. - Dériver
CloneetDebugsur chaque struct, avec une composition compatible avecSend + Sync + 'static. - Exposer les contrats depuis
crate::domainpour 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. - Aucun pont avec les événements ou DTO de
src/routes/gateway/mod.rs. - Aucun partage direct des modèles SeaORM comme contrat de domaine.
Technical Design
Contexte actuel
- Les 20 appels
EventBus::emitsont répartis entre six repositories ;computed_permission.rsne 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_createdtransmet un tuple(server_id, user_id). message_deletedetuser_deletedvérifient déjàrows_affectedavant émission, alors que d’autres suppressions devront conserver leur comportement actuel dans cette étape.src/routes/gateway/mod.rsconsomme certains événements de canal avec ses propres modèles ; les contrats de domaine resteront indépendants.
Organisation proposée
- Ajouter
src/domain/mod.rset un sous-module par famille émettrice :category.rs,channel.rs,role,message.rs,server.rsetuser.rspour les événements CRUD et les changements de relation.server_role_permission.rs,server_user_permission.rs,channel_role_permission.rsetchannel_user_permission.rspour 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/ServerDeletedetUserChanged/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
ServerUserChangedetRoleUserChangedcomme contrats relationnels identifiés, avec les champsserver_id,role_idetuser_id. - Réexporter sélectivement tous les contrats depuis
crate::domain; ajouterpub mod domain;danssrc/lib.rs. - Ne modifier ni
src/repositories/mod.rs, nisrc/core/permission_sync.rs, ni les routes Gateway.
Contrats de données
Tous les contrats suivent ce style :
use uuid::Uuid;
#[derive(Clone, Debug)]
pub struct ServerUserChanged {
pub server_id: Uuid,
pub user_id: Uuid,
}
#[derive(Clone, Debug)]
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é.
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
repositoriesni 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_*etuser_*, y compris les suppressions etserver_user_created. - Vérifier
Clone,Debug,Send,Syncet'staticpour tous les payloads. - Vérifier les imports via
crate::domain::{...}et exécutercargo checkainsi 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.
✓ 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::domainsans modifier les repositories.
✓ Step 3: Ajouter la validation des contrats
- Ajouter des assertions de compilation couvrant les structs et leurs champs.
- Exécuter
cargo checket les tests ciblés.