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.
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
}stock (envanter hareketiyle değişir), ort (maliyet) ve depo kırılımı API'ye kapalı. Yeni malzeme stok 0 ile oluşur.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).
POST /plugin-api/ingredients/delete
{ "id": "x9-01" }
// 200 → { "success": true, "data": { "id": "x9-01", "deleted": true } }Sahiplik kontrollü.
ingredients/list ile aynı şekil: { id, title, unit, stock, alert, tax }.
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.)id ile kendi tarafınızda takip edin; okuma uçları sahiplik bilgisi döndürmez.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).
Hatalar HTTP 200 + { success:false, message } (rate limit 429 hariç).
| message | Anlam |
|---|---|
| joi doğrulama mesajı | Eksik/yanlış tip alan veya tanımsız alan (kütle-atama engeli) |
| plugin.scope.denied | Gerekli yazma scope'u (ingredients:write) onaylı değil |
| plugin.catalog.notFound | id ile kayıt bulunamadı |
| plugin.catalog.notOwned | Kayıt sizin eklentinizce oluşturulmamış (update/delete reddi) |
| plugin.catalog.duplicateInProgress | Aynı idempotencyKey ile eşzamanlı 2. istek |
| plugin.rateLimited | Ortak write kovası aşıldı (HTTP 429; varsayılan 20/dk — Limitler) |
Her başarılı yazma ilgili kanonik event'i tetikler (ingredient.*).
id'yi saklayıp event data.id ile eşleyin. Event data'sı bu uçların yanıt data'sıyla aynı şekildedir.