Malzeme Yazma — ingredients/create · update · delete ✓ Canlı

Malzeme/stok kartlarını yazar (oluştur/güncelle/sil). Alan adları ingredients/list okuma şekliyle simetriktir. Sahiplik/idempotency/hata/echo kuralları katalog yazma ile ortaktır.

← API Uçları · Scope: ingredients:write.

ingredients/create

POST /plugin-api/ingredients/create
{
  "title": "Mozzarella",             // ZORUNLU (2..100)
  "unit": "kg",                      // ZORUNLU (<=32; kg/lt/adet…)
  "alert": 5,                        // ops — düşük-stok eşiği (>= 0)
  "tax": 10,                         // ops — KDV % (0..100)
  "idempotencyKey": "ing-1"          // ops
}
Stok/maliyet yazılamaz: stock (envanter hareketiyle değişir), ort (maliyet) ve depo kırılımı API'ye kapalı. Yeni malzeme stok 0 ile oluşur.

ingredients/update

POST /plugin-api/ingredients/update
{ "id": "x9-01", "alert": 10 }   // {id} + title/unit/alert/tax'tan en az biri

{ id } + title/unit/alert/tax'tan en az biri. Sahiplik kontrollü (notOwned).

ingredients/delete

POST /plugin-api/ingredients/delete
{ "id": "x9-01" }
// 200 → { "success": true, "data": { "id": "x9-01", "deleted": true } }

Sahiplik kontrollü.

Yanıt şekli (create/update)

ingredients/list ile aynı şekil: { id, title, unit, stock, alert, tax }.

Sahiplik modeli (ZORUNLU kural)

  • create ile oluşturduğunuz her kayıt eklentinize damgalanır (sahiplik).
  • update ve delete yalnız KENDİ oluşturduğunuz kayıtlarda çalışır — işletmenin veya başka eklentinin kaydını düzenleyemez/silemezsiniz → plugin.catalog.notOwned. (Slack chat.delete deseni.)
  • İşletme personeli panelden sizin kayıtlarınızı da düzenleyip silebilir (tam yetki). Personel düzenlemesi sahiplik damgasını korur — kayıt "sizin" kalır.
  • Hangi kayıtların size ait olduğunu create yanıtındaki id ile kendi tarafınızda takip edin; okuma uçları sahiplik bilgisi döndürmez.

Idempotency

Tüm create uçları: idempotencyKey (≤128 char, önerilir) → retry'da duplicate yazmaz, ilk başarılı yanıtı aynen döner (24sa pencere; eklenti+tenant+entity başına). Eşzamanlı 2. istek işlenirken → plugin.catalog.duplicateInProgress (kısa bekle, aynı key ile tekrar dene). update/delete doğal idempotenttir (silinmiş kayda tekrar delete → plugin.catalog.notFound).

Hata mesajları

Hatalar HTTP 200 + { success:false, message } (rate limit 429 hariç).

messageAnlam
joi doğrulama mesajıEksik/yanlış tip alan veya tanımsız alan (kütle-atama engeli)
plugin.scope.deniedGerekli yazma scope'u (ingredients:write) onaylı değil
plugin.catalog.notFoundid ile kayıt bulunamadı
plugin.catalog.notOwnedKayıt sizin eklentinizce oluşturulmamış (update/delete reddi)
plugin.catalog.duplicateInProgressAynı idempotencyKey ile eşzamanlı 2. istek
plugin.rateLimitedOrtak write kovası aşıldı (HTTP 429; varsayılan 20/dk — Limitler)

Webhook etkileşimi (echo dahil)

Her başarılı yazma ilgili kanonik event'i tetikler (ingredient.*).

Event abone tüm eklentilere gider — çağrıyı yapan eklenti dahil (echo; Shopify/Stripe davranışı). Kendi yazmanızı ayırt etmek için create yanıtındaki id'yi saklayıp event data.id ile eşleyin. Event data'sı bu uçların yanıt data'sıyla aynı şekildedir.