Ürün Gereksinimleri

1.6k görüntülenme Markdown

Ürünün sipariş anında sorduğu alanları, kurallarını, ikonlarını ve kategorilerini yöneten on bir uç.

Genel Bakış

Gereksinim, ürünün sipariş anında müşteriden istediği veri alanıdır: sunucu adı, alan adı, lisans anahtarı, kurulum betiği. Add-on'lardan tek bir şeyle ayrılır: fiyatı yoktur. Add-on satılan bir seçenektir, gereksinim sorulan bir sorudur.

Asıl mesele cevabın nereye gittiğidir. module_co_names eşlemesi, müşterinin verdiği cevabın hangi modülde hangi alana düşeceğini belirler; eşleme yoksa cevap saklanır ama hizmet kurulurken kullanılmaz.

Referans

Gereksinimleri Listeleme

get/api/v1/admin/products/requirements
Products/GetProductRequirements admin sayfalı

Katalogdaki gereksinim tanımlarını döndürür.

Sorgu parametreleri 5
groupstringAna grup anahtarına göre süzer.
categoryintGereksinim kategorisine göre süzer.
searchstringGereksinim adında arar.
pageintVarsayılan 1.
limitintVarsayılan 25, en çok 100.
Dönen alanlar data[] — 7
idintGereksinim kimliği.
namestringGereksinim adı, geçerli dilde.
descriptionstringAçıklama.
groupstringAna grup anahtarı.
categoryintGereksinim kategorisinin kimliği.
statusstringactive ya da inactive.
rankintGörüntülenme sırası.
Meta 4
totalintSüzgece uyan toplam kayıt.
pageintBulunduğunuz sayfa.
limitintSayfa boyutu.
next_pageintSonraki sayfa. Sıfır son sayfada olduğunuz anlamına gelir.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -G 'https://panel.ornek.com/api/v1/admin/products/requirements' \
  -H "Authorization: Bearer $API_KEY" \
  -d group=server
const url = new URL('https://panel.ornek.com/api/v1/admin/products/requirements');
url.searchParams.set('group', 'server');

const res  = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const body = await res.json();
$url = 'https://panel.ornek.com/api/v1/admin/products/requirements?' . http_build_query(['group' => 'server']);

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->GetProductRequirements([], ['group' => 'server']);

Gereksinim Detayı

get/api/v1/admin/products/requirements/{id}
Products/GetProductRequirement admin modül eşlemesi

Bir gereksinimi tüm kuralları, modül eşlemesi ve her dildeki seçenekleriyle döndürür.

Dönen alanlar data — 9
idintGereksinim kimliği.
groupstringAna grup anahtarı.
categoryintGereksinim kategorisinin kimliği.
statusstringactive ya da inactive.
rankintGörüntülenme sırası.
module_co_namesobjectModül adından o modüldeki alan adına eşleme. Boş değer eşlenmemiş demektir: cevap saklanır ama modüle geçmez.
typestringMüşterinin gördüğü alan tipi: text, textarea, select, radio, checkbox ya da file.
propertiesobjectTipe göre kurallar: zorunluluk, en büyük dosya boyutu, izinli uzantılar.
langsobjectDil kodundan içerik nesnesine eşleme.
namestringGereksinimin adı.
descriptionstringMüşteriye gösterilen açıklama.
optionsobject[]Bu dildeki seçenekler. Yalnız seçim tiplerinde dolar; diğerlerinde boş dizidir.
idintSeçenek kimliği.
namestringSeçeneğin o dildeki adı.
mkeystringSeçeneğin modüle geçirilecek karşılığı. Boş bırakılabilir.
Hatalar 2
not_found404Gereksinim bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/products/requirements/42' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements/42', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements/42');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->GetProductRequirement(['id' => 42]);

// Bos eslesme, cevabin module ULASMAYACAGI anlamina gelir.
$mapped = ($response['data']['module_co_names']['HetznerCloud'] ?? '') !== '';
Yanıt
{
  "data": {
    "id": 42,
    "group": "server",
    "category": 297,
    "status": "active",
    "rank": 0,
    "module_co_names": { "HetznerCloud": "user_data" },
    "type": "textarea",
    "properties": { "compulsory": false },
    "langs": {
      "en": {
        "name": "User Data",
        "description": "Cloud-init data run at first boot.",
        "options": []
      }
    }
  }
}

Gereksinim Oluşturma

post/api/v1/admin/products/requirements
Products/CreateProductRequirement admin 201

Katalogda yeni bir gereksinim tanımı açar.

Gövde 12
groupstringzorunluAna grup anahtarı. Grup listesi ucundan alınır.
categoryintzorunluGereksinim kategorisinin kimliği.
nameobjectzorunluDil kodundan ada eşleme. Geçerli dilin adı olmalı.
descriptionobjectDil kodundan açıklamaya eşleme.
typestringAlan tipi: text, textarea, select, radio, checkbox ya da file. Varsayılan text.
statusstringactive ya da inactive.
rankintGörüntülenme sırası.
compulsoryboolAlanı zorunlu kılar. Boş bırakılırsa sipariş tamamlanamaz.
max_file_sizeintEn büyük dosya boyutu. Yalnız dosya tipinde anlamlı.
allowed_extensionsstringİzinli dosya uzantıları. Yalnız dosya tipinde anlamlı.
module_co_namesobjectModül adından o modüldeki alan adına eşleme.
optionsobjectSeçenek anahtarından {name, mkey} nesnesine eşleme. Yalnız seçim tiplerinde; göndermek tüm seti değiştirir.
Dönen alanlar data — 9
dataobjectOluşan gereksinim. Detay ucuyla aynı şekildedir.
Hatalar 5
group_required422group boş.
category_required422category boş.
name_required422Geçerli dilde ad yok.
create_failed422Oluşturma reddedildi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/requirements' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"group":"server","category":4,"type":"text","name":{"en":"Server Hostname"},"compulsory":true}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    group: 'server',
    category: 4,
    type: 'text',
    name: { en: 'Server Hostname' },
    compulsory: true,
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'group'      => 'server',
        'category'   => 4,
        'type'       => 'text',
        'name'       => ['en' => 'Server Hostname'],
        'compulsory' => true,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Cevabin modulde bir yere dusmesi icin eslemeyi de verin.
$response = Api::Products()->CreateProductRequirement([
    'group'           => 'server',
    'category'        => 4,
    'type'            => 'text',
    'name'            => ['en' => 'Server Hostname'],
    'module_co_names' => ['HetznerCloud' => 'hostname'],
]);

Gereksinimi Güncelleme

patch/api/v1/admin/products/requirements/{id}
Products/UpdateProductRequirement admin seçenekler hep-veya-hiç

Gönderdiğiniz alanları uygular, geri kalanını olduğu gibi bırakır. Seçenekleri gönderirseniz set olduğu gibi değişir.

Gövde 12
groupstringAna grup anahtarı. Grup listesi ucundan alınır.
categoryintGereksinim kategorisinin kimliği.
nameobjectDil kodundan ada eşleme. Dil dil birleştirilir.
descriptionobjectDil kodundan açıklamaya eşleme.
typestringAlan tipi: text, textarea, select, radio, checkbox ya da file. Göndermezseniz kayıtlı tip kalır.
statusstringactive ya da inactive.
rankintGörüntülenme sırası.
compulsoryboolAlanı zorunlu kılar. Boş bırakılırsa sipariş tamamlanamaz.
max_file_sizeintEn büyük dosya boyutu. Yalnız dosya tipinde anlamlı.
allowed_extensionsstringİzinli dosya uzantıları. Yalnız dosya tipinde anlamlı.
module_co_namesobjectModül adından o modüldeki alan adına eşleme.
optionsobjectSeçenek anahtarından {name, mkey} nesnesine eşleme. Yalnız seçim tiplerinde; göndermek tüm seti değiştirir.
Dönen alanlar data — 9
dataobjectGüncel gereksinim. Detay ucuyla aynı şekildedir.
Hatalar 3
not_found404Gereksinim bulunamadı.
update_failed422Güncelleme reddedildi.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/products/requirements/7' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"inactive","compulsory":false}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements/7', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ status: 'inactive', compulsory: false }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements/7');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'     => 'inactive',
        'compulsory' => false,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Tek bir secenegi degistirmek icin bile TUM seti gonderin.
$req     = Api::Products()->GetProductRequirement(['id' => 7])['data'];
$options = $req['langs']['en']['options'];

// ... $options uzerinde degisiklik ...

Api::Products()->UpdateProductRequirement([
    'id'      => 7,
    'options' => $options,
]);

Gereksinimi Silme

delete/api/v1/admin/products/requirements/{id}
Products/DeleteProductRequirement admin geri alınamaz

Gereksinim tanımını siler. Dil kayıtları da gider.

Dönen alanlar data — 2
deletedboolSilme başarılı mı.
idintSilinen gereksinimin kimliği.
Hatalar 3
not_found404Gereksinim bulunamadı.
blocked_by_gate422gate:product.requirement_delete kancası işlemi veto etti.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/products/requirements/7' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements/7', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements/7');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->DeleteProductRequirement(['id' => 7]);

Gereksinim İkonu Yükleme

post/api/v1/admin/products/requirements/{id}/icon
Products/UploadRequirementIcon admin SVG

Gereksinim ikonunu yükler. Görsel dosyalar ve SVG kabul edilir.

Gövde 1
imagestringzorunluİkon görseli. base64 veri adresi ya da indirilebilir bir bağlantı.
Dönen alanlar data — 1
urlstringİkonun genel adresi.
Hatalar 5
not_found404Gereksinim bulunamadı.
file_required422Dosya alanı boş.
file_invalid422Dosya çözümlenemedi ya da tipi kabul edilmedi.
file_failed422Dosya saklanamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/requirements/7/icon' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"image":"data:image/png;base64,iVBORw0KGgo..."}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements/7/icon', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ image: 'data:image/png;base64,iVBORw0KGgo...' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements/7/icon');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'image' => 'data:image/svg+xml;base64,' . base64_encode($svg),
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->UploadRequirementIcon([
    'id'    => 7,
    'image' => 'data:image/svg+xml;base64,' . base64_encode($svg),
]);

Gereksinim İkonunu Silme

delete/api/v1/admin/products/requirements/{id}/icon
Products/DeleteProductRequirementIcon admin

Yüklenmiş ikon görselini kaldırır.

Dönen alanlar data — 2
deletedboolSilme başarılı mı.
idintGereksinim kimliği.
Hatalar 2
not_found404Gereksinim bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/products/requirements/7/icon' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirements/7/icon', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirements/7/icon');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->DeleteProductRequirementIcon(['id' => 7]);

Kategorileri Listeleme

get/api/v1/admin/products/requirement-categories
Products/GetRequirementCategories admin

Gereksinim kategorilerini döndürür.

Dönen alanlar data[] — 4
idintKategori kimliği.
titlestringKategori başlığı.
parent_idintÜst kategorinin kimliği. Sıfır üst seviye demektir.
rankintGörüntülenme sırası.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/products/requirement-categories' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/products/requirement-categories', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirement-categories');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->GetRequirementCategories();

Kategori Oluşturma

post/api/v1/admin/products/requirement-categories
Products/CreateRequirementCategory admin 201

Gereksinim kategorisi açar.

Gövde 3
titlestringzorunluKategori başlığı.
parent_idintÜst kategorinin kimliği.
rankintGörüntülenme sırası.
Dönen alanlar data — 2
idintYeni kategorinin kimliği.
titlestringHTML temizliğinden sonraki başlık. Yanıt bu iki alanla sınırlı; üst kategori ve sıra için satırı kategori listesinden okuyun.
Hatalar 4
title_required422title boş.
blocked_by_gate422gate:product.category_save kancası işlemi veto etti.
create_failed422Ekleme başarısız oldu.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/products/requirement-categories' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Server Info","rank":1}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirement-categories', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ title: 'Server Info', rank: 1 }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirement-categories');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['title' => 'Server Info', 'rank' => 1]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$category = Api::Products()->CreateRequirementCategory(['title' => 'Server Info']);

Api::Products()->CreateProductRequirement([
    'group'    => 'server',
    'category' => $category['data']['id'],
    'name'     => ['en' => 'Server Hostname'],
]);

Kategoriyi Güncelleme

patch/api/v1/admin/products/requirement-categories/{id}
Products/UpdateRequirementCategory admin

Kategorinin başlığını, üstünü ya da sırasını değiştirir.

Gövde 3
titlestringKategori başlığı. Gönderirseniz boş olamaz.
parent_idintÜst kategorinin kimliği.
rankintGörüntülenme sırası.
Dönen alanlar data — 4
idintKategori kimliği.
titlestringKategori başlığı.
parent_idintÜst kategorinin kimliği.
rankintGörüntülenme sırası.
Hatalar 4
not_found404Kategori bulunamadı.
title_required422Başlık gönderildi ama boştu.
no_changes422Gövdede düzenlenebilir alan yok.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/products/requirement-categories/4' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"title":"Server Details"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirement-categories/4', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ title: 'Server Details' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirement-categories/4');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['title' => 'Server Details']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->UpdateRequirementCategory([
    'id'    => 4,
    'title' => 'Server Details',
]);

Kategoriyi Silme

delete/api/v1/admin/products/requirement-categories/{id}
Products/DeleteRequirementCategory admin

Gereksinim kategorisini siler.

Dönen alanlar data — 2
deletedboolSilme başarılı mı.
idintSilinen kategorinin kimliği.
Hatalar 2
not_found404Kategori bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/products/requirement-categories/4' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/requirement-categories/4', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/requirement-categories/4');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
$response = Api::Products()->DeleteRequirementCategory(['id' => 4]);

Tuzaklar

Eşlemesiz gereksinim modüle ulaşmaz

Müşteriye soru sormak yetmez. module_co_names içinde o modül için bir alan adı yoksa cevap kayıtta durur ve hizmet kurulurken hiç kullanılmaz. Hata da alınmaz: sunucu yanlış adla kurulur ve sebebi görünmez. Gereksinimi açarken eşlemeyi de verin.

Seçenekleri göndermek seti baştan yazar

Güncelleme gövdesinde options varsa mevcut seçeneklerin tamamı her dilde silinip yerine gönderdiğiniz set yazılır. Alanı hiç göndermemek seçenekleri korur.

Bazı alanlar yalnız kendi tipinde çalışır

En büyük dosya boyutu ve izinli uzantılar yalnız dosya tipinde, seçenekler yalnız seçim tiplerinde anlam taşır. Yanlış tipe gönderilen bir kural hata vermez; sessizce saklanır ve hiçbir zaman uygulanmaz.

Zorunlu alan siparişi durdurur

Zorunlu işaretli bir gereksinim boş bırakıldığında sipariş tamamlanmaz. Var olan bir ürüne sonradan zorunlu gereksinim eklemek, o üründen alışverişi o an için durdurur; eklemeden önce vitrinde sorulacak sorunun cevaplanabilir olduğundan emin olun.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.