129 lines
6.7 KiB
Markdown
129 lines
6.7 KiB
Markdown
---
|
||
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.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.
|
||
- 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`.
|
||
- 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::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`, `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
|
||
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 `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 `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.
|
||
|
||
### ✓ 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. |