Paket detay ekranındaki işlem menüsüne (slot: packet.detail.actions) eklediğin butonlar tıklanınca actionUrl'ine imzalı POST gelir. Ortak sözleşme (istek/yanıt/imza) Genel Bakış'ta; burada bu slot'a özel kısımlar var.
← Aksiyon Uçları (Genel Bakış)
| slot | target.type | target.id |
|---|---|---|
| packet.detail.actions | packet | paket id |
Payload şekli her slot için aynıdır: { type:"action", hook, tenantId, slot, target:{type,id}, actor:{userId,role}, occurredAt, id } — bkz. Genel Bakış.
Hook adlarını sen tanımlarsın (butonun action.hook'u — bkz. Aksiyon Butonları). Aynı slot'ta birden çok buton olabilir; gelen istekte hook ile ayırt et, tanımadığına { success:false, level:"error" } dön.
// hook ile hangi buton, target ile hangi nesne anlaşılır.
// kurye örneği: başarı → toast (hızlı bilgi), hata/uyarı → popup (önemli sonuç).
if (envlp.hook === 'packet.sendToCourier') {
const packetId = envlp.target.id; // target.type === 'packet'
const cfg = await getConfig(env, envlp.tenantId);
if (!cfg?.courierUrl)
return Response.json({ success: false, level: 'warning', display: 'popup', message: 'Kurye adresi ayarlı değil' });
await forwardToCourier(cfg, packetId); // … paketi kurye sistemine ilet …
return Response.json({ success: true, level: 'success', display: 'toast', message: 'Kuryeye gönderildi' });
}
// Tanımadığın hook'a:
return Response.json({ success: false, level: 'error', display: 'popup', message: 'Bilinmeyen işlem' });target.id taşır. Ürünler/müşteri/adres/toplam gibi dolu order'ı GET /plugin-api/packets/get ile orders:read kullanarak çek.webhookSecret + ham gövde + ±5 dk; geçersizse 401 dön (imza şeması).target.id'nin (paket) gerçekten istek sahibi tenant'a (tenantId) ait olduğunu kendi tarafında teyit et.id (retry/çift tık) tekrar gelebilir → id ile dedup; işlemi (örn. kuryeye gönderme) aynı packetId için tekrarlama.