Tenant Sync
Sync Flow
Section titled “Sync Flow”Supplier API/Feed │ ▼┌──────────────┐ ┌──────────────┐ ┌──────────────┐│ Connector │────►│ magic_pim │────►│ magic_b2b_ ││ (parse) │ │ (master DB) │ │ {tenant} │└──────────────┘ └──────────────┘ └──────────────┘Connector Module
Section titled “Connector Module”Location: /mnt/data/magic_pim/backend/src/modules/connectors/
Key Files
Section titled “Key Files”| File | Purpose |
|---|---|
index.ts | Main connector orchestration |
types.ts | Shared TypeScript type definitions |
database.ts | PostgreSQL upsert operations |
sync-state.ts | Track sync status |
excel-parser.ts | CSV/Excel parsing |
suppliers/spranz.ts | Spranz stock feed handler (stock sync only) |
suppliers/xdconnect.ts | XD Connect feed handler |
suppliers/xdconnect-categories.ts | XD Connect category sync |
suppliers/pfconcept.ts | PF Concept feed handler |
suppliers/pfconcept-imagedata.ts | PF Concept image metadata sync |
suppliers/midocean.ts | Midocean handler |
suppliers/toppoint.ts | Toppoint handler |
suppliers/newwave.ts | NewWave Textiles handler (Cutter & Buck, Clique, Craft, Jobman) |
Database Operations
Section titled “Database Operations”// Bulk upsert productsupsertProducts(products: ProductData[])
// Single product upsert with variant_code handlingupsertProduct(product: ProductData)
// Update stock levelsupsertStock(stockData: StockData[])
// Update pricing tiersupsertPrices(priceData: PriceData[])
// Category managementupsertCategories(categories: CategoryData[])
// Sync statisticsgetConnectorStats(): Promise<ConnectorStats>Sync Triggers
Section titled “Sync Triggers”Manual Sync
Section titled “Manual Sync”Via Admin Panel → ADVANCED → Connectors → “Sync Now” button
# Or via APIcurl -X POST "https://admin-development.magiceverse.online/admin/connectors/sync" \ -H "Content-Type: application/json" \ -d '{"connector_id": "spranz_stock", "force": true}'Scheduled Sync
Section titled “Scheduled Sync”Configured per connector:
| Connector | Schedule |
|---|---|
| spranz_stock | 2x daily (06:00, 18:00) |
| xdconnect_products | Hourly |
| xdconnect_stock | Every 15 minutes |
| xdconnect_prices | Daily |
| xdconnect_categories | Daily |
| pfconcept_products | Daily at 05:00 |
| pfconcept_stock | 2x daily (02:00, 13:00) |
| pfconcept_imagedata | Daily |
| midocean_products | Configured |
| toppoint_products | Configured |
| newwave_products | Configured |
Medusa Sync
Section titled “Medusa Sync”After importing to aplt_products, data can be synced to native Medusa product tables:
POST /admin/connectors/medusa-syncThis creates standard Medusa products from APLT data, enabling native Medusa features (cart, checkout, payments).
Sync to Tenants
Section titled “Sync to Tenants”The PIM database is accessed directly by tenant backends via shared PostgreSQL:
- All tenants connect to
host.docker.internal:5432 - Each tenant reads from its own
magic_b2b_{tenant}database - Product data is copied from PIM to tenant databases during connector sync
Error Handling
Section titled “Error Handling”- Failed syncs are logged with error details
- Partial syncs continue processing remaining items
- Force download option bypasses cached data
- Sync state tracked in
sync_statetable