Revert "[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."
This reverts commit 20c199ad41a618f3b51e6845a23f651b0d6c7c64.
1 changed file +3 −19
modified
fabrika/connectors/woocommerce.py
+3 −19
@@ -343,29 +343,13 @@ 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 | − | |
| 362 | 346 | def fetch(self) -> list[Product]: |
| 363 | 347 | out: list[Product] = [] |
| 364 | 348 | page = 1 |
| 365 | 349 | first_page_exc: Exception | None = None |
| 366 | 350 | while page <= self.max_pages: |
| 367 | 351 | try: |
| 368 | − items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 352 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 369 | 353 | except Exception as exc: |
| 370 | 354 | if page != 1: |
| 371 | 355 | break |
@@ -377,14 +361,14 @@ class WooCommerceConnector(BaseConnector): | ||
| 377 | 361 | # masquer le 404 (ex. magillhats.com) |
| 378 | 362 | self._api_version = "" |
| 379 | 363 | try: |
| 380 | − items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 364 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 381 | 365 | except Exception: |
| 382 | 366 | self._api_version = "v1" |
| 383 | 367 | if items is None and not self._use_rest_route: |
| 384 | 368 | # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route= |
| 385 | 369 | self._use_rest_route = True |
| 386 | 370 | try: |
| 387 | − items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 371 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 388 | 372 | except Exception: |
| 389 | 373 | self._use_rest_route = False |
| 390 | 374 | if items is None: |
| 391 | 375 | |