Products Manager APP

Features

Connecteurs Plateformes

Le module Connectors permet la synchronisation bidirectionnelle avec 14 plateformes e-commerce, marketplaces et ERP.

Plateformes supportees

E-commerce

PlateformeAuthSpecificites
ShopifyREST Admin API 2024-01HMAC webhook, GraphQL bulk
WooCommerceBasic AuthBatch 100/req
Magento 2Bearer TokenMSI stock multi-source
BigCommerceX-Auth-Token + V3GTIN natif
SyliusJWT + API PlatformPrix en centimes
SquarespaceBearer TokenStock delta
WiziShopAPI KeyPolling uniquement

Marketplaces

PlateformeAuthSpecificites
Amazon SP-APIOAuth2 + STSListings, stock, prix
CDiscountLogin + PasswordOffres par EAN
Fnacshop_id + api_keyOffres EAN/ISBN
MiraklAPI KeyMulti-marketplace
Google Merchant CenterOAuth2Content API, feed XML

Enterprise

PlateformeAuthSpecificites
SFCC (Salesforce)OAuth2 + OCAPI v24.5Token cache
SAP CommerceOAuth2 + OCC v2Hybris

Architecture

Pattern ABC (Abstract Base Class)

Chaque connecteur implemente l'interface PlatformConnector :

class PlatformConnector(ABC):
    @abstractmethod
    async def push_products(self, products: list[ProductPushPayload]) -> SyncResult: ...

    @abstractmethod
    async def pull_products(self, since: datetime | None) -> list[dict]: ...

    @abstractmethod
    async def push_stock(self, updates: list[StockUpdate]) -> SyncResult: ...

    @abstractmethod
    async def push_prices(self, updates: list[PriceUpdate]) -> SyncResult: ...

    @abstractmethod
    async def validate_credentials(self) -> bool: ...

Registry

Le PLATFORM_REGISTRY centralise les 14 connecteurs avec chargement paresseux (lazy-loaded) :

  • Chaque plateforme definit un config_schema (champs requis, types, validation)
  • Categorie : e-commerce, marketplace, enterprise
  • Documentation auto-generee par doc_generator.py

Securite des credentials

Les identifiants sont chiffres avec Fernet (AES-128-CBC) :

  • Cle de chiffrement : SECRET_ENCRYPTION_KEY (variable d'environnement obligatoire)
  • Stockage : colonne JSONB credentials dans PlatformConnectorModel (db_core)
  • Dechiffrement uniquement au moment de l'appel API

La variable SECRET_ENCRYPTION_KEY est obligatoire en production. Sans elle, les credentials ne sont pas chiffres.

Validation SSRF

Toutes les URLs externes sont validees avant connexion :

  • Resolution DNS + verification IP (pas d'IP privee/loopback)
  • Whitelist de ports autorises (80, 443)
  • Fonction : validate_external_url() dans api/core/url_validator.py

Verification des webhooks

Les webhooks entrants sont verifies selon la plateforme :

PlateformeMethode
ShopifyHMAC-SHA256 base64
WooCommerceHMAC-SHA256
BigCommerceToken statique
MagentoBasic Auth (fail-closed)

Tous les webhooks sont fail-closed : si la verification echoue, le webhook est rejete (HTTP 401).

Synchronisation automatique

Celery Beat

TacheFrequenceQueue
sync-push-stockHoraireconnectors
sync-push-pricesQuotidienconnectors
sync-pull-productsConfigurableconnectors

Flux de synchronisation

  1. Push produits : chunks de 100 produits, retry avec backoff exponentiel
  2. Push stock : delta uniquement (stock modifie depuis dernier sync)
  3. Push prix : prix modifies depuis dernier sync
  4. Pull produits : import incremental depuis last_sync_at

Les jobs sont traces dans PlatformSyncJobModel avec statut, duree, nombre de produits traites et erreurs.

Configuration frontend

La page /settings/integrations affiche les plateformes par categorie (e-commerce / marketplace / enterprise) avec :

  • Grille de cartes avec logo et statut de connexion
  • Page detail par plateforme avec 3 onglets : Config, Sync, Historique
  • Test de connexion en un clic

Endpoints API

MethodeEndpointDescription
GET/api/v1/connectors/Liste des connecteurs configures
POST/api/v1/connectors/Creer un connecteur
PATCH/api/v1/connectors/{id}Modifier un connecteur
DELETE/api/v1/connectors/{id}Supprimer un connecteur
POST/api/v1/connectors/{id}/testTester la connexion
POST/api/v1/connectors/{id}/sync/pushLancer un push produits
POST/api/v1/connectors/{id}/sync/pullLancer un pull produits
GET/api/v1/connectors/{id}/jobsHistorique des syncs