Tag (Tag)
En une phrase : une valeur d'un des vocabulaires multi-valués du catalogue — thème éditorial, contre-indication voyageur, affaire à prendre — gérée par les super-admins et traduite en trois langues.
Rôle métier
Le registre de tags donne au catalogue des propriétés structurées et cherchables tout en laissant les super-admins étendre les vocabulaires sans déploiement. Chaque tag appartient à un vocabulaire (type, énum TagType côté code) :
theme— le classement éditorial des activités (nature, gastronomie, romantique…), l'axe de curation des road-trips ;restriction— les contre-indications qu'une activité présente (claustrophobie, vertige, mobilité réduite…), destinées à terme au filtrage selon le profil du voyageur ;thing_to_bring— la liste d'affaires que le voyageur doit emporter (coupe-vent, maillot de bain…), du contenu montré avant la révélation ; agrégée à l'échelle du tour (dédupliquée sur toutes les étapes et tous les plans, sans trahir l'itinéraire) parGET /api/tour/{id}/things-to-bring, lue par le voyageur avant de confirmer son voyage ;suitability— les garanties affirmatives (adapté aux enfants, chiens bienvenus, accessible en fauteuil roulant…), la polarité inverse d'une restriction.
Le slug est l'identifiant machine stable du tag : c'est lui que les filtres et l'import de l'ancien système référencent. Les libellés (name_fr canonique, name_en / name_de optionnels, descriptions idem) sont du contenu localisé côté serveur — le premier de l'application — car un libellé inventé hier par un super-admin ne peut pas vivre dans les traductions embarquées des clients ; ceux-ci retombent sur le français quand une traduction manque. Un tag peut aussi porter une icône (Lucide, optionnelle) que les clients affichent à côté du libellé.
Cycle de vie
Créé et édité par les super-admins (CRUD /api/tags). Le slug et le vocabulaire ne changent jamais après création — renommer un tag, c'est éditer ses libellés. Un tag encore porté par des activités ne peut pas être supprimé (409 ; RESTRICT en base) : il faut d'abord le détacher partout.
Relations métier
| Relation | Sens métier |
|---|---|
| ← Étiquetage | Les activités qui portent ce tag |
Règles métier
- Les valeurs sont des données, les vocabulaires sont du code : ajouter un tag est un geste d'administration ; ajouter un vocabulaire (
TagType) est une décision produit qui passe par le code — la recherche, la validation et les clients doivent le connaître. - Seuls les vocabulaires multi-valués et non ordonnés entrent au registre. Les propriétés exclusives ou ordinales (difficulté physique, catégorie, statut, standing) restent des colonnes à énum : un tag leur ferait perdre l'ordre et la garantie mono-valeur.
- La polarité est une propriété du vocabulaire. Une
restrictionest un avertissement : sa présence exclut, son absence vaut « rien à signaler ». Unesuitabilityest une garantie : sa présence inclut, son absence vaut « inconnu » — jamais « supporté par défaut ». C'est pourquoiwheelchair-accessiblen'est pas la négation de la restrictionreduced-mobility: accessible / hostile / inconnu sont trois états, et l'accessibilité se déclare, elle ne se déduit pas d'une absence d'avertissement. Le filtrage voyageur en découlera : restrictions = exclusion (NOT EXISTS), suitabilities = inclusion conjonctive (une exigence = unEXISTS). - Unicité par vocabulaire (
type+slug) :otherpeut exister à la fois comme thème et comme restriction. - Le vocabulaire seedé provient de l'ancien système, nettoyé : les coquilles (« Suprise », « clostrophobie ») et les valeurs parasites se résorbent dans la correspondance chaîne → slug du pipeline d'import, jamais dans le schéma. Les migrations portent ce socle de production ;
TagSeederl'étend en développement avec un catalogue plus riche, sans jamais écraser une valeur existante.
Historique : les thèmes ont d'abord été un énum figé (
activity_themes, une ligne par valeur d'énum) avec un vocabulaire « petit, fixe et assumé ». Le vocabulaire hérité a débordé cette hypothèse (partyajouté au coup par coup ;romantic,teambuilding,wellness,othermanquants) : les thèmes ont rejoint le registre et l'énum a été supprimé.

