Skip to content

Meduse connector architecture ​

This page describes source-backed connector structure in axelites/menzzo-meduse at the pinned revision below. It distinguishes connector records from adapter code and does not infer which rows, workers, schedules, credentials, or remote services are active.

Code layout and connector records ​

Shared models and application commands live under app/; integration packages live under the repository-root Modules/ directory. The supplied snapshot has no app/Modules/ tree. The top-level modules include Menzzo, Logidav, MeublePromo, Mosaikasa, MakeUp, Bigbuy, Vidaxl, Ameubleo, and MerchantCenter. A module directory proves code exists, not that its database connector is enabled or deployed.

The central connectors record is deliberately small: name, code, and is_enabled. Connector::connectorResources() relates it to connector_resource_version, whose rows hold a resource class plus last_update and last_sync. Protocol, field mapping, queue choice, and file paths are implemented by individual commands and jobs rather than described by a generic connector configuration. See the Connector model, resource-version model, and their table migrations.

VersioningVersion::log() stores a per-resource version, snapshot, changeset, context, author, and timestamp. Creating a version updates last_update for connector-resource rows with a matching resource name. CatalogProduct calls this logger when its normal model save detects tracked changes. Exporters such as Modules/Menzzo/Jobs/ExportProducts use the resource row’s last_sync as a change cursor, then shape the changed catalog products for a destination. These timestamps are code-level cursors; they do not prove remote receipt. See VersioningVersion, CatalogProduct, and Menzzo product export.

connector_resource_data stores connector/resource identifiers and an infos payload; connector_resource_product and connector_resource_product_model associate catalog product/model IDs with platform IDs. These are separate from the version log. The initial connector_resource_data migration and a later connector-ID migration show schema evolution; current database contents and applied migration state were not inspected. See resource data, resource-product mapping, and model mapping.

Seeders are not runtime state. MenzzoDatabaseSeeder creates connector code menzzo disabled by default and a CatalogProduct resource row; NewShopifyWebsiteSeeder creates newshopifywebsite enabled in the central database and tenants. Other code queries connector codes such as logidav, meublepromo, and Mosaikasa, but the reviewed seeders do not establish that corresponding rows exist or are enabled. The Bigbuy and Vidaxl supplier importers also update catalog/staging tables directly and do not establish an enabled connectors row. See Menzzo seeder and New Shopify website seeder.

Adapter inventory ​

ModuleSource-visible transport, purpose, and entrypointSchedule and completion boundary
MenzzoExportProducts maps catalog products to JSONL and uploads through FTP to Magento’s export/pending; separate processors export image references, product-file references, families, and menus.ScheduleServiceProvider defines menzzo:products-export every minute. Product updates also dispatch to export-products. Meduse marks its job after the FTP write; the Magento importer and acknowledgement are traced separately in the receiving repository.
LogidavThe Meduse Logidav FTP helper supports new-product JSON and product, stock, price, and quantity CSV handoffs. Logidav’s ProductMeduseDataUpdateProcessor is a distinct mz_meduse_queue processor which emits FTP CSV.Meduse’s ScheduleServiceProvider defines product handoffs every minute, stock every 30 minutes, price every five minutes, and quantity every six hours. The Logidav reader for Meduse’s export-logidav feed exits before its FTP reader.
MeublePromoExportProducts serializes tenant catalog changes to pipe-delimited CSV and sends them by FTP to /meduse/connectors/meublepromo/export/pending; family, image, file, and menu processors are separate.ScheduleServiceProvider defines the product export every minute. The code marks Meduse-side work, not remote import; tenant and connector-row state were not checked.
MosaikasaShopifyService uses Shopify Admin GraphQL for product, variant, collection, image, menu, and bulk-operation work. The event provider dispatches product name, attribute, image, and association handlers.ScheduleServiceProvider defines price work daily at 00:30, bulk-operation checks every five minutes, status/stock work every four hours, availability bulk work every two hours, and selected daily syncs. Those are source schedules, not proof of API calls or store state.
MakeUpmeduse:makeup:export-all-products reads the make_up tenant and uses MakeUpService Shopify GraphQL mutations for products, variants, media, and collections. The makeup:update-menu command writes menu state through Shopify GraphQL.The MakeUpServiceProvider discovers its console commands; no MakeUp schedule provider was found. MakeUpCatalogCategoryController calls the menu command inline. Product/collection identifiers are written back to connector mapping tables; API success and tenant state were not verified.
Bigbuymenzzo:import:bigbuy-products-suplier reads supplier CSV files from an SFTP disk and updates catalog price/enabled fields plus Bigbuy quantity and shipping data. Core menzzo:import:bigbuy-categories and menzzo:import:bigbuy-products read local mz_bigbuy_* staging tables into catalog categories/products.The BigbuyServiceProvider registers the supplier command; no Bigbuy schedule provider was found. The producer which populates product-export staging tables is not identified in this snapshot. These supplier imports do not establish connector-row state or a product/order export path.
Vidaxlmenzzo:import:vidaxl-products-category downloads a supplier CSV over HTTP to local data/vidaxl/products, then updates tenant catalog raw values/flat price and availability plus the Vidaxl product table. The feed URL is a source constant and is intentionally omitted here.The VidaxlServiceProvider registers the command; no Vidaxl schedule provider was found. A failed download raises an exception; no tracked import status or remote product write is shown.
Ameubleoexport-catalog-feed, export-menu-feed, and export-attributes-feed create JSONL product, menu, and French attribute feeds for the Ameubleo WooCommerce plugin. The exporters write to config-selected paths on Storage::disk('public') using a temporary file and atomic rename; this is local public storage, not FTP.The schedule provider staggers these commands every six hours at minutes 00, 15, and 30. Commands support dry-run and return/log errors; the WooCommerce consumer and feed fetch are outside the supplied source.
MerchantCentermerchant-center:google-shopping-products maps catalog products to Google product entries and uses either MerchantApiService or the legacy GoogleShoppingService batch service to send them over HTTP. The Spanish path builds candidates from the Mosaikasa Shopify catalog and submits product-input batches.ScheduleServiceProvider defines daily product syncs and a disabled-product check; Spain sync/verification and optional cleanup are gated by module configuration and scheduled at 06:00, 08:00, and 09:00 UTC respectively. Dry-run, batch results, and command failure states exist in source; account/API completion was not checked.

See the workflow map for concrete triggers, processors, file paths, and completion boundaries.

Queue and transport boundaries ​

Meduse dispatches jobs such as ProcessNewProduct, product export, image export, and menu export to named Laravel queues including process-new-product, export-products, export, and export-product-images. The repository’s config/queue.php defaults to the sync driver unless QUEUE_CONNECTION overrides it. Therefore Queue::push, dispatch, and onQueue() identify a code path and queue label, but do not prove asynchronous execution, a worker, or an immediate HTTP response. The deployed override and worker state were not inspected.

Logidav’s Meduse queue is separate from Meduse’s Laravel queue. In Logidav, MeduseQueueProcessorCommand polls rows represented by mz_meduse_queue, while the generic QueueService::addQueue() currently overwrites its meduseQueue argument with false and inserts into the regular Queue path. MeduseQueueService is an empty class. The specific ProductMeduseDataUpdateProcessor reads Meduse-queue rows and writes a pipe-delimited CSV to FTP under syncProduct/pending; this is a file handoff, not proof of RabbitMQ delivery. See Logidav QueueService, MeduseQueueService, and ProductMeduseDataUpdateProcessor.

Evidence gaps ​

  • Database rows, connector enablement, timestamps, applied migrations, tenant state, credentials, scheduler execution, and queue workers were not read. Seeder defaults and scheduled definitions are not deployment evidence.
  • The Logidav consumer command for Meduse’s export-logidav/pending CSV has an unconditional die('stopped') before the FTP reader. The reader and its complete/failed handling below that line are unreachable in this source revision; see the consumer command.
  • SyncAfterMagentoUpdate::insertIntoConnectorResourceData() queries an existing row with connector_id = 'product', while its create branch writes the numeric Menzzo connector ID. This source mismatch needs owner review before treating that lookup as an idempotency check.
  • Some inbound paths use saveQuietly() or bulk SQL updates, which bypass normal model events. The source does not establish that every inbound price, quantity, or availability change creates a VersioningVersion row or advances all downstream export cursors.
  • Both the Mosaikasa and Logidav schedule providers define shopify:manage-product-status every four hours. The reviewed source does not establish which providers are loaded together or whether the deployed scheduler runs one or both definitions.
  • The code identifies image references and serializes them into FTP feeds. The Magento media consumers now trace destination downloads and persistence separately; CDN availability and the rendered product-page result remain unverified.

Internal developer documentation for Menzzo systems.