L2.1 : résout entity_type via l'API Metadata (D21)
Context.{entity_type} attend le TableName du Metadata, pas le nom
d'entité de l'AD (Container -> Containers, mais Alias -> Alias) : un nom
faux partait en HTTP 500 de compilation LINQ. Nouveau service
entity-resolver.js : table Name|TableName (insensible à la casse) ->
TableName, agrégée sur les applications déployées (via
GET /configuration/applications — les applications sans contexte
requêtable n'y figurent pas et n'apportent 0 entité Metadata), cache TTL
partagé, invalidation par onSwitch (D8). Branché dans wms-query-service
(query/count/schema/search) et call_query_api.
Nom inconnu -> échec avant tout appel réseau de requête, suggestions
proches + renvoi vers get_entity_metadata. Metadata injoignable -> le
nom passe tel quel avec un warning dans la réponse.
Mesures (LIMAGRAIN, via le protocole) :
- query_wms_entities("Container", limit 1) -> succès, 1 ligne, résolu
Containers
- query_wms_entities("Alias") -> succès, invariant (pas de pluriel)
- query_wms_entities("Item") -> "Item" n'existe pas dans le modèle
Reading. Proches : RFMenuItems, Sites. 288 entités disponibles —
aucune ligne [API] POST dans stderr
- count_wms_entities("Product") -> 51160
- get_entity_schema("Container") et call_query_api("Container") : mêmes
résolutions
- 288 TableName distincts sur 5 applications, aucun conflit
Name -> TableName (mesuré le 24/08/2026)
Docs : D21 dans DECISIONS.md ; CLAUDE.md (piège retiré des points
ouverts, liste d'entités corrigée Aliases -> Alias, entity-resolver dans
la structure) ; exemple singulier/pluriel dans wms://query-examples ;
ROADMAP allégée (cause racine + L2.1 + L3.3 livrés).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -353,6 +353,41 @@ publication du dépôt.
|
||||
|
||||
---
|
||||
|
||||
## D21 — `Context.{...}` attend le `TableName` du Metadata, résolu par service
|
||||
|
||||
**Piège.** Les expressions LINQ de `QueryExecute` référencent les entités par
|
||||
le `TableName` de l'API Metadata, **pas** par le nom d'entité de l'Application
|
||||
Dictionary. Ce n'est pas une pluralisation : `Container` -> `Containers`, mais
|
||||
`Alias` -> `Alias` (invariant), et `Item` n'existe pas. Un nom faux part en
|
||||
HTTP 500 (erreur de compilation `'ApplicationReadingContext' ne contient pas
|
||||
de définition pour '...'`). Seul `TableName` fait foi — **ne réinventez pas de
|
||||
règle grammaticale**.
|
||||
|
||||
**Décision.** `src/services/entity-resolver.js` construit une table
|
||||
`Name | TableName (insensible à la casse) -> TableName` et tous les points
|
||||
d'interpolation (`wms-query-service`, `call_query_api`) passent par elle.
|
||||
Mesures du 24/08/2026 (`LIMAGRAI2512`) :
|
||||
|
||||
- Le contexte de lecture est **commun au tenant** : la table agrège le
|
||||
Metadata de toutes les applications. La liste vient de
|
||||
`GET /configuration/applications` (5 applications déployées avec version) —
|
||||
les applications EasyBuilder sans contexte requêtable (`CustomApp`…) n'y
|
||||
figurent pas et ne fournissent de toute façon **0 entité** Metadata.
|
||||
- 288 `TableName` distincts, aucun conflit `Name -> TableName` entre
|
||||
applications.
|
||||
|
||||
Comportements :
|
||||
|
||||
- **Nom inconnu** : échec avant tout appel réseau de requête, message avec
|
||||
suggestions proches et renvoi vers `get_entity_metadata`.
|
||||
- **Metadata injoignable** : le nom passe tel quel (comportement historique)
|
||||
et la réponse porte un `warning` — on ne bloque pas tout le serveur pour un
|
||||
cache irrécupérable.
|
||||
- Cache : TTL partagé (`WORKFLOW_CACHE_TTL`), chargement paresseux,
|
||||
invalidation par abonnement `onSwitch()` (D8, D10).
|
||||
|
||||
---
|
||||
|
||||
## D22 — Routage des outils par table explicite, plus par préfixe de nom
|
||||
|
||||
**Piège.** Le handler `tools/call` de `src/index.js` routait par préfixe de nom
|
||||
|
||||
Reference in New Issue
Block a user