API Marketplace Mozaiq — v1
Contrat entre les sites Mozaiq (client : core/Marketplace.php) et la marketplace (serveur de référence : ../marketplace/). Le futur site vitrine / marketplace publique doit implémenter (ou réutiliser) ces routes.
URL de base : https://plugins.mozaiq-cms.fr/api/v1 (constante MQ_MARKETPLACE_URL, option marketplace_url).
En-têtes envoyés par chaque site
| En-tête | Exemple |
|---|---|
X-Mozaiq-Site | UUID du site (option('site_uuid')) |
X-Mozaiq-Url | https://boutique.fr |
X-Mozaiq-Version | 1.0.0 |
X-Mozaiq-Type | site · shop · hybrid |
X-Mozaiq-Php | 8.3.6 |
Authorization | Bearer <jeton> (optionnel, compte marketplace lié) |
Routes
GET /catalog
Paramètres : type (plugin|theme), q, category, sort (popular|new|rating|free), site_type, page, per_page.
{ "items": [ { "slug": "stripe-payments", "type": "plugin", "name": "…", "description": "…", "version": "1.0.0",
"author": "…", "category": "paiement", "icon": "card", "color": "linear-gradient(…)", "price": 0, "currency": "EUR",
"rating": 4.9, "reviews": 322, "downloads": 21400, "verified": true, "scope": ["shop","hybrid"],
"requires": "1.0.0", "requires_php": "8.1", "buy_url": null, "updated_at": "…" } ],
"total": 5, "page": 1, "pages": 1,
"categories": [ { "slug": "paiement", "name": "Paiement", "count": 1 } ] }
GET /packages/{slug}
Détail + long_description + versions[] (version, changelog, requires, size, sha256, created_at).
GET /packages/{slug}/download?license=…&core=1.0.0
Renvoie l’archive application/zip de la dernière version compatible (X-Package-Sha256). Erreurs : 402 licence requise/invalide (buy_url), 404, 409 aucune version compatible.
L’archive contient un dossier <slug>/ avec plugin.json ou theme.json à sa racine.
POST /updates
{ "core": "1.0.0", "php": "8.3", "site": "uuid", "url": "https://…",
"packages": [ { "slug": "google-analytics", "type": "plugin", "version": "1.2.0", "license": "" } ] }
Réponse :
{ "updates": [ { "slug": "google-analytics", "type": "plugin", "version": "1.3.0", "name": "…", "requires_license": false } ],
"core": { "latest": "1.0.0", "update": false } }
Le CMS met la réponse en cache 12 h (bouton « Vérifier les mises à jour » pour forcer).
POST /sites
Enregistrement / ping d’un site : { site, url, name, type, core, php, language } → { "ok": true }.
GET /licenses/verify?key=…&slug=… → { "valid": true }
GET /core/latest → { "version": "1.0.0", "download": "…/mozaiq-latest.zip" }
POST /developer/packages (développeurs)
Authorization: Bearer <jeton développeur> + multipart package=@extension.zip. Valide le manifeste, vérifie la propriété du slug et que la version est supérieure, stocke l’archive, calcule le SHA-256. 201 { "ok": true, "published": { "slug", "version", "type" } } · 401 jeton invalide · 422 archive/manifeste invalide.
Côté CLI : php bin/mozaiq plugin:publish <slug> --token=….
Champs marketplace dans le manifeste
"marketplace": { "category": "paiement", "price": 9, "currency": "EUR", "color": "#635bff",
"long_description": "…", "changelog": "…" }
Modèle de données du serveur de référence
mk_developers, mk_packages, mk_versions, mk_licenses, mk_sites, mk_installs, mk_categories, mk_meta (voir marketplace/schema.sql).
À construire pour la marketplace publique (prochaine étape)
- Comptes développeurs (inscription, génération de jeton, reversements)
- Paiement des extensions (Stripe) → création de
mk_licenses+ e-mail de la clé - Pages produit, avis/notes, captures d’écran, recherche
- Revue/modération des paquets avant publication (
status = pending) - Signature des archives (en plus du SHA-256)