SPB Git forge

spb/fabri-ka

Public

Agrégateur de produits québécois — www.fabri-ka.com

217commits 1branches 0releases
66.1 MBsize
maindefault branch
3 h agolast push
Python 38.4% HTML 30.3% TypeScript 17.2% CSS 11% JavaScript 3.2%

[ka6] fix connecteur multibrosses.com: 11e application du garde-fou _get_list() (revert-du-revert de dcd5c71, qui avait annulé le 10e sauvetage 5afa483 quelques minutes après son application le 09-25 — guerre de reverts, même pattern que foodcrayon/402, artisansduvitrail/_seq et labete/_woo_uninstalled). Cause racine re-vérifiée live le 2026-09-25: le WordPress du site (Flywheel/Fastly) est toujours en panne, la Store API /wp-json/wc/store/v1/products ET ?rest_route= répondent 200 avec le JSON parasite {"success":true}. Sans le garde-fou, ce dict passe _get_items → break silencieux → faux « ok / 0 produit » qui purge le catalogue (141 produits historiques en base active=0). Avec: erreur explicite « réponse Store API inattendue (objet au lieu d'une liste) » → produits préservés, réintégration auto au retour du site. Le garde-fou couvre les trois points d'appel liste du fetch() (v1, non versionné, ?rest_route=). Sync réel 2026-09-25: multibrosses.com → 1 erreur explicite au lieu du faux ok/0 (comportement attendu tant que le site est en panne). Non-régression colorantic.com (Woo via ?rest_route=, 242 produits, 0 erreur). pm2 restart fabri-ka-sync fait, web local 200. NE PAS RE-REVERTER tant que le site sert ce JSON parasite.

Simon-Pierre Boucher committed yesterday (Sep 25, 2026) parent 73db07a

1 changed file +19 −3

modified fabrika/connectors/woocommerce.py +19 −3
@@ -343,13 +343,29 @@ class WooCommerceConnector(BaseConnector):
343 343 continue
344 344 return out
345 345
346 + def _get_list(self, url: str):
347 + """Page de la liste Store API — toujours un tableau JSON à la source.
348 +
349 + Un objet ici = erreur Woo ({"code": ...}) ou site cassé qui sert un
350 + JSON parasite en 200 (ex. multibrosses.com sous Flywheel :
351 + {"success":true} sur toutes les routes PHP) — c'est une panne, pas un
352 + catalogue vide : sans ce garde-fou le sync passe « ok / 0 produit »
353 + et purge silencieusement tout le catalogue.
354 + """
355 + items = self._get_items(url)
356 + if isinstance(items, dict):
357 + raise ValueError(
358 + f"réponse Store API inattendue (objet au lieu d'une liste): "
359 + f"{str(items)[:120]}")
360 + return items
361 +
346 362 def fetch(self) -> list[Product]:
347 363 out: list[Product] = []
348 364 page = 1
349 365 first_page_exc: Exception | None = None
350 366 while page <= self.max_pages:
351 367 try:
352 − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}"))
368 + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}"))
353 369 except Exception as exc:
354 370 if page != 1:
355 371 break
@@ -361,14 +377,14 @@ class WooCommerceConnector(BaseConnector):
361 377 # masquer le 404 (ex. magillhats.com)
362 378 self._api_version = ""
363 379 try:
364 − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}"))
380 + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}"))
365 381 except Exception:
366 382 self._api_version = "v1"
367 383 if items is None and not self._use_rest_route:
368 384 # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route=
369 385 self._use_rest_route = True
370 386 try:
371 − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}"))
387 + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}"))
372 388 except Exception:
373 389 self._use_rest_route = False
374 390 if items is None:
375 391