mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-15 11:18:42 +02:00
feat(api): /api/v1/grid calcule le fournisseur à la demande
L'API lisait uniquement la table grid_rows, écrite en effet de bord quand un
humain ouvre la page Grille. Un fournisseur jamais ouvert renvoyait donc
202 not_ready : une app ou un agent externe ne pouvait consulter que ce qui
avait déjà été parcouru dans l'interface, ce qui vide l'API de son intérêt.
/api/v1/grid déclenche désormais getProductRows() quand l'instantané manque.
Le calcul est déjà protégé en amont (cache 10 min + verrou anti-concurrence)
et persiste l'instantané, donc seul le premier appel paie le coût ; les
suivants repassent par le chemin SQL rapide.
- compute=1 (défaut) : calcul à la demande, meta.computedOnDemand signale
quand il a eu lieu. compute=0 : comportement strict d'avant.
- Fournisseur inconnu ou sans article : 404 explicite, distinct d'une panne
(500) et de « pas encore calculé » (202).
- /api/v1/products/{codein} fait de même lorsque `fournisseur` est fourni,
le calcul se faisant par lot fournisseur.
- openapi.json mis à jour : c'est ce document que lit un agent externe, il
annonçait « aucun endpoint ne déclenche de recalcul ».
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y26nRZxTR57K7h8yqsF675
This commit is contained in:
4 files changed
+106
-20
No files matched your search
@@ -41,6 +41,15 @@ export const gridQuerySchema = z.object({
|
||||
code2: z.string().min(1).optional(),
|
||||
code3: z.string().min(1).optional(),
|
||||
search: z.string().min(1).optional(),
|
||||
/**
|
||||
* `1` (défaut) : si le fournisseur n'a pas encore d'instantané, l'API le calcule
|
||||
* à la demande au lieu de répondre `not_ready`. C'est ce qui permet à une app ou
|
||||
* à un agent externe d'interroger n'importe quel fournisseur sans qu'un humain
|
||||
* ait ouvert la Grille avant. Le premier appel est alors plus lent (plusieurs
|
||||
* secondes) ; les suivants sont servis depuis l'instantané.
|
||||
* `0` : comportement strict, échoue vite en `not_ready`.
|
||||
*/
|
||||
compute: z.enum(["0", "1"]).default("1"),
|
||||
...sortShape,
|
||||
...paginationShape,
|
||||
});
|
||||
@@ -62,6 +71,11 @@ export const fournisseursQuerySchema = z.object({
|
||||
|
||||
export const productDetailSchema = z.object({
|
||||
fournisseur: z.string().min(1).optional(),
|
||||
/**
|
||||
* `1` (défaut) : calcule l'instantané à la demande si le produit n'y figure pas
|
||||
* encore. Nécessite `fournisseur`, le calcul se faisant par lot fournisseur.
|
||||
*/
|
||||
compute: z.enum(["0", "1"]).default("1"),
|
||||
});
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user