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
4 h agolast push
Python 38.4% HTML 30.3% TypeScript 17.2% CSS 11% JavaScript 3.2%

[ka6] fix connecteur multibrosses.com: le WordPress du site (hébergé Flywheel/Fastly) est en panne depuis le 2026-09-11 au matin — toutes les routes dynamiques PHP (accueil, /shop/, /wp-json/*, ?rest_route=, sitemaps) répondent 200 avec le JSON parasite {"success":true} (seul le statique comme robots.txt survit; confirmé mondial via Scrapfly ASP+render_js, ce n'est pas un blocage anti-bot). Ce dict JSON valide passait le parsing et le connecteur Woo le traitait comme un catalogue vide → sync « ok / 0 produit » trompeur qui a purgé les 141 produits (volume historique). Ajout du garde-fou _get_list() dans woocommerce.py: la liste Store API est toujours un tableau JSON, un objet (erreur Woo {"code":...} ou JSON parasite) lève désormais une erreur → statut error honnête, produits préservés, réintégration auto au retour du site. Sync réel: multibrosses.com error explicite (plus de faux ok/0); non-régression multi-eco.com (8 produits, = prod), artisandulac.ca (448 produits, ~ volume prod), labete.ca (0 sans erreur, chemin _woo_uninstalled intact)

Simon-Pierre Boucher committed 15 days ago (Sep 12, 2026) parent 1038407

1 changed file +18 −2

modified fabrika/connectors/woocommerce.py +18 −2
@@ -323,19 +323,35 @@ class WooCommerceConnector(BaseConnector):
323 323 continue
324 324 return out
325 325
326 + def _get_list(self, url: str):
327 + """Page de la liste Store API — toujours un tableau JSON à la source.
328 +
329 + Un objet ici = erreur Woo ({"code": ...}) ou site cassé qui sert un
330 + JSON parasite en 200 (ex. multibrosses.com sous Flywheel :
331 + {"success":true} sur toutes les routes PHP) — c'est une panne, pas un
332 + catalogue vide : sans ce garde-fou le sync passe « ok / 0 produit »
333 + et purge silencieusement tout le catalogue.
334 + """
335 + items = self._get_items(url)
336 + if isinstance(items, dict):
337 + raise ValueError(
338 + f"réponse Store API inattendue (objet au lieu d'une liste): "
339 + f"{str(items)[:120]}")
340 + return items
341 +
326 342 def fetch(self) -> list[Product]:
327 343 out: list[Product] = []
328 344 page = 1
329 345 first_page_exc: Exception | None = None
330 346 while page <= self.max_pages:
331 347 try:
332 − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}"))
348 + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}"))
333 349 except Exception as exc:
334 350 if page == 1 and not self._use_rest_route:
335 351 # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route=
336 352 self._use_rest_route = True
337 353 try:
338 − items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}"))
354 + items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}"))
339 355 except Exception:
340 356 self._use_rest_route = False
341 357 first_page_exc = exc
342 358