8.9 KiB
8.9 KiB
sessionId
| sessionId |
|---|
| session-260713-090509-126z |
Requirements
Objectif
Migrer les entités SeaORM de src/models du format Relation/DeriveRelation/Related vers le format SeaORM 2.x basé sur #[sea_orm::model], avec les relations HasOne et HasMany, sans modifier le schéma SQL ni les contrats applicatifs.
Périmètre inclus
- Migrer les quatre modèles pilotes
attachment,category,channeletmessage. - Migrer ensuite les autres entités présentes sous
src/models:server,user,role,server_user,role_user,channel_user,channel_user_permission,channel_role_permission,server_user_permission,server_role_permissionetcomputed_permission. - Préserver les noms de tables/colonnes, les types nullable, les clés primaires et les comportements
Cascade,SetNulletNoAction. - Conserver les implémentations
ActiveModelBehavioret leurs valeurs par défaut (Uuid::new_v4/Uuid::now_v7,is_default, etc.). - Utiliser la syntaxe effectivement supportée par
sea-orm 2.0.0-rc.42.
Hors périmètre
- Aucun changement dans
src/repositories,src/routes, DTO, réponses HTTP ou frontend. - Aucun changement dans
migration/src/m20220101_000001_create_table.rsou dans le schéma SQL. - Aucun ajout de tests spécifiques demandé dans cette étape.
- Aucun mapping ORM artificiel pour
computed_permission.resource_id, qui reste polymorphe entre serveur, catégorie et channel.
Critères d’acceptation
- Chaque entité migrée utilise un seul format SeaORM 2.x, sans ancien enum
Relationouimpl Relatedrésiduel inutile. - Les relations pilotes compilent avec la release candidate déclarée.
- La relation auto-référente de
Messageexpose un parent optionnel et plusieurs réponses, avecSetNullà la suppression du parent. - Les champs relationnels ne deviennent pas des colonnes d’
ActiveModel. - Les commandes de compilation intermédiaires et finales réussissent, sans exiger à ce stade l’adaptation des repositories.
Technical Design
État actuel
Cargo.tomldéclaresea-orm = 2.0.0-rc.42avec les backends SQLite/Postgres/MySQL etschema-sync; le workspace utilise Rust édition 2024.- Les fichiers
src/models/attachment.rs,category.rs,channel.rsetmessage.rsutilisent actuellementDeriveEntityModel, un enumRelationavecDeriveRelation, puis desimpl Related<...>. message.rscontient déjà les cas particuliersreply_to_id: Option<Uuid>,ReplyToauto-référent avecSetNulletRepliesviavia_rel.channel.rscombine relations vers des champs nullable (server_id,category_id), une relationHasManyvers les messages et l’enum SQLChannelType.- Les autres entités suivent le même patron généré; leurs relations existantes doivent être transposées sans élargir le périmètre fonctionnel.
src/repositories/server.rsutilisecategory::Entity::find().find_with_related(channel::Entity). Cet usage est explicitement laissé inchangé pour cette étape; la compatibilité de compilation sera constatée, et son adaptation fera l’objet d’une étape ultérieure si nécessaire.
Décisions
- Migration incrémentale : commencer par
attachment,category,channel,message, lancercargo check, puis migrer les entités restantes par groupes dépendants. - Relations dans
Model: représenter les relations parent/enfant avec les types SeaORM 2.x validés par la release candidate (HasOne/HasManyou leur forme exacte requise), en conservant les cardinalités et actions SQL. - Schéma inchangé : les attributs de relation refléteront les migrations existantes; aucune migration SQL ne sera ajoutée.
- Polymorphisme explicite : ne pas déclarer de relation sur
computed_permission.resource_id. - ActiveModel séparé : vérifier que les champs de relation sont ignorés par les insertions/mises à jour et que les constructeurs
new()restent inchangés.
Modifications proposées
- Dans chaque fichier
src/models/*.rs, ajouter l’attribut de modèle SeaORM 2.x et déplacer les relations du blocRelationvers les champs relationnels deModel. - Remplacer les
impl Relatedet les enumsRelationdevenus inutiles, sans modifier les champs scalaires ni les dérivations nécessaires aux DTO/OpenAPI. - Pour
message.rs, représenterchannel,user,reply_to,attachmentsetreplies; préserver la relation inverse auto-référente et l’actionon_delete = SetNull. - Pour
channel.rs, conserverCategory,Server,MessageetChannelUser, avec les relations optionnelles cohérentes aveccategory_idetserver_id. - Pour
server.rs,user.rs,role.rset les tables de jonction/permissions, transposer les relations présentes dans leurs enums actuels et vérifier les colonnes source/cible contre la migration. - Ne pas modifier
src/models/mod.rsouprelude.rssauf si la syntaxe SeaORM 2.x l’exige pour résoudre les types d’entités.
Fichiers concernés
- Pilote :
src/models/attachment.rs,src/models/category.rs,src/models/channel.rs,src/models/message.rs. - Lots suivants :
src/models/server.rs,user.rs,role.rs,server_user.rs,role_user.rs,channel_user.rs,channel_user_permission.rs,channel_role_permission.rs,server_user_permission.rs,server_role_permission.rs,computed_permission.rs. - Référence en lecture seule :
migration/src/m20220101_000001_create_table.rs. - Explicitement non modifiés :
src/repositories/**,src/routes/**,frontend/**et les migrations.
Risques et garde-fous
- La syntaxe de
#[sea_orm::model]et des relations auto-référentes peut différer entre la documentation stable etrc.42; valider la version verrouillée avant d’écrire les modèles. - Les relations inverses et les relations multiples vers la même entité peuvent provoquer des ambiguïtés de nommage; utiliser des noms de champs distincts et compiler après chaque groupe.
- Une compilation peut révéler que
find_with_relatednécessite encore l’ancien traitRelated; ne pas corriger les repositories dans cette étape, mais documenter précisément le blocage pour la suite. - Comparer chaque relation avec la migration pour éviter de transformer une colonne polymorphe ou nullable en relation incorrecte.
Testing
Validation autorisée
La validation est volontairement limitée à la compilation, conformément au périmètre demandé.
- Après le groupe pilote, exécuter
cargo check. - Après chaque groupe d’entités restant, exécuter
cargo check. - En fin de migration, exécuter
cargo fmt --all -- --checkpuiscargo check. - Vérifier par recherche statique que les entités migrées ne contiennent plus d’ancien enum
Relationou d’impl Relatedinutile. - Vérifier manuellement que les repositories et routes n’ont pas été modifiés; leurs adaptations et tests relationnels sont reportés.
Delivery Steps
✓ Step 1: Migrer les quatre modèles pilotes
Les entités pilotes utilisent le format SeaORM 2.x et compilent avec la release candidate verrouillée.
- Adapter
src/models/attachment.rs,category.rs,channel.rsetmessage.rs. - Déclarer les relations dans
Modelavec les types et la syntaxe exacts supportés parsea-orm 2.0.0-rc.42. - Préserver
ChannelType, les champs optionnels et les actionsCascade,SetNulletNoAction. - Représenter dans
message.rsle parentreply_toet lesrepliessans relation sur une colonne polymorphe. - Exécuter
cargo checkimmédiatement après ce pilote.
✓ Step 2: Migrer les entités de base et de jonction
Les modèles de serveurs, utilisateurs, rôles et tables de jonction sont convertis sans changement de colonnes SQL.
- Migrer
server.rs,user.rs,role.rs,server_user.rs,role_user.rsetchannel_user.rs. - Migrer les entités de permissions
channel_user_permission.rs,channel_role_permission.rs,server_user_permission.rsetserver_role_permission.rs. - Transposer chaque relation existante avec ses colonnes source/cible et sa cardinalité.
- Conserver les implémentations
ActiveModelBehavioret les valeurs par défaut propres à chaque modèle. - Exécuter
cargo checkaprès ce groupe.
✓ Step 3: Finaliser le modèle polymorphe et nettoyer les anciens patrons
Toutes les entités de src/models utilisent exclusivement le format SeaORM 2.x, tandis que computed_permission conserve son champ polymorphe sans faux lien ORM.
- Migrer
src/models/computed_permission.rsen conservantresource_idcomme simple colonne. - Supprimer dans les entités migrées les enums
Relation, dérivations etimpl Relateddevenus inutiles. - Vérifier que les relations ne sont pas incluses dans les colonnes d’
ActiveModel. - Contrôler les noms de champs relationnels et les éventuelles ambiguïtés de relations multiples.
- Exécuter
cargo fmt --all -- --checkpuiscargo check. - Ne modifier ni repositories, ni routes, ni migrations; relever séparément toute incompatibilité de
find_with_relatedpour une future étape.