Eklentinin tüm bildirimsel tanımı: istediği scope'lar, abone olduğu event'ler, eklediği UI (sayfa/menü/buton/form), akış-durduran hook'lar ve fiyatlandırma. Sunucu manifest'i normalize eder: yalnız whitelist'teki scope/event/slot ve https origin'ler geçer; geçersiz girdiler sessizce düşer.
Her alanın detayı kendi sayfasında — bu sayfa şemayı tek yerde toplar. Kavramlar: Mimari.
{
"requestedScopes": ["orders:read", "events:subscribe", "hooks:packet.close", …],
"events": ["packet.created", "packet.closed", …], // abone olunan event'ler
"nav": [{ "slot": "sidebar.main", "pageId": "panel", "icon": "box", "label": { "tr": "…" } }],
"pages": [{ "id": "panel", "path": "/embed/panel/", "customUiOrigin": "https://…", "title": { "tr": "…" } }],
"settingsPageId": "settings", // pages[]'ten bir id
"buttons": [{ "id": "send", "slot": "packet.detail.actions", "label": {…},
"action": { "type": "hook"|"page"|"form", … }, "confirm": {…} }],
"forms": [{ "id": "kurye-form", "submitLabel": {…}, "fields": [{ "key", "type", "label", … }] }],
"hooks": [{ "action": "packet.close", "ui": { "kind": "iframe", "pageId": "…" },
"timeoutMs": 5000, "failMode": "open", "includeData": true }],
"actionUrl": "https://…/api/action", // senkron buton/hook hedefi (https)
"pricing": { "model": "subscription", "monthly": { "amount": 10000 }, "yearly": { "amount": 100000 } }
}Not: webhookUrl ve connectUrl manifest'in değil sürümün alanlarıdır (endpoint tanımı). actionUrl manifest içindedir.
| Alan | Tip | Açıklama |
|---|---|---|
| requestedScopes | string[] | İstenen yetkiler (katalog + hook scope'ları). Scope Referansı. |
| events | string[] | Abone olunan webhook event'leri (events:subscribe ister). Event Kataloğu. |
| pages | array | { id, customUiOrigin(https), path, title? } — iframe Custom UI. Sayfalar. |
| nav | array | { slot, pageId, label?, icon? } — sol menü öğesi (ui:nav). Menü. |
| settingsPageId | string | pages[]'ten bir id — kur/ayarlar sayfası. Ayarlar. |
| buttons | array | { id, slot, label, action:{type:hook|page|form}, confirm? } (ui:button). Butonlar. |
| forms | array | { id, fields[], submitLabel? } — declarative form (ui:form). Formlar. |
| hooks | array | { action, ui, timeoutMs, failMode, includeData?, … } — before-action gate. Hook'lar. |
| actionUrl | string (https) | Senkron buton/hook hedefi (yoksa webhookUrl). Tek-apex'e dahil. |
| pricing | object | { model: free|subscription, monthly?{amount}, yearly?{amount}, trialDays?, revenueSharePercent? } — tutarlar kuruş (integer). |
Bu listeler dışındaki değerler normalize'da düşürülür. Aşağıdakiler doğrudan kod kataloğundan render edilir (drift'siz):
| scopes | orders:read · orders:write · products:read · products:write · packets:status · payment_methods:read · payment_methods:write · ingredients:read · ingredients:write · customers:read · users:read · events:subscribe · ui:button · ui:form · ui:widget · ui:nav · ui:page |
| events | table.closed · packet.created · packet.closed · product.created · product.updated · product.deleted · category.created · category.updated · category.deleted · user.created · user.updated · user.deleted · payment_method.created · payment_method.updated · payment_method.deleted · ingredient.created · ingredient.updated · ingredient.deleted |
| hook actions | table.close · packet.status.update · packet.close |
| nav slot | sidebar.main |
| button slot | packet.detail.actions |
| form field tipleri | text · textarea · number · checkbox · select · date |
| nav ikonları | receipt · puzzle · chart · box · users · tag · gear · bell |
pageId mevcut bir page'e işaret etmiyorsa) düşürülür — kaydedince DB'de göründüğünü doğrula. Cross-field kuralları da var (nav varsa ui:nav, sayfa varsa ui:page istenmeli; hook varsa hooks:<action> scope'u gerekir).