Dahili Notlar ve Gizli Bilgiler

1.6k görüntülenme Markdown

Personel-arası notları ve talepte saklanan gizli bilgileri yöneten dokuz uç.

Genel Bakış

Bu dokuz uç talebin müşterinin hiç görmediği tarafıyla ilgilenir. Altısı personel-arası notları ve dosyalarını yönetir. Üçü ise etiketli gizli bilgileri tutar; sunucu erişimi gibi konuşma sırasında paylaşılan şeyler oraya konur.

İkisi de talebin kendi satırında, şifrelenmiş olarak yaşar. Ayrı tabloları yoktur, bu yüzden sayfalama ya da süzme de yoktur: liste her seferinde eksiksiz gelir.

Not eklemek bildirim üretmez ve talebin durumunu değiştirmez. Müşteriye görünmeyen ama konuşmanın parçası olan bir metin istiyorsanız aradığınız şey not değil, gizli işaretli bir yanıttır.

Referans

Notları Listeleme

get/api/v1/admin/tickets/{id}/notes
Tickets/GetTicketNotes admin

Talebe personelin bıraktığı notları döndürür.

Dönen alanlar data[] — 8
idstringNotun kimliği. Onaltı haneli bir dizedir; sıra numarası değildir.
author_idintNotu yazanın numarası.
messagestringNotun metni.
pinnedboolSabitlenmiş mi. Sabit notlar panelde üstte durur.
aiboolYapay zekânın yazıp yazmadığı. Panelde ayrı bir yazarla gösterilir.
legacyboolEski biçimden gelip gelmediği.
created_atstring | nullYazılma anı.
attachmentsarrayEkler: kimliği, görünen adı, saklanan adı ve boyutu.
Hatalar 2
not_found404Talep bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/tickets/402/notes' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Sayfalama YOKTUR: notlarin tamami tek seferde gelir ve talebin satirindan cozulur.
$notes = Api::Tickets()->GetTicketNotes(['id' => $id])['data'];

Not Ekleme

post/api/v1/admin/tickets/{id}/notes
Tickets/AddTicketNote admin

Talebe personel-arası bir not düşer.

Gövde 4
messagestringreqNotun metni.
pinnedboolNotu sabitler.
aiboolNotu yapay zekâ kaynaklı işaretler.
attachmentsstring | object | arrayEklenecek dosyalar.
Dönen alanlar 201 — data
dataobjectEklenen not. Listedeki öğeyle aynı şekildedir.
Hatalar 4
message_required422Not metni boş.
blocked_by_gate422Bir kanca notu reddetti.
not_found404Talep bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets/402/notes' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message":"Muhasebeye devredildi.","pinned":true}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    message: 'Escalated to the billing team.',
    pinned: true,
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'message' => 'Escalated to the billing team.',
        'pinned'  => true,
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Not MUSTERIYE GITMEZ ve bildirim uretmez; yalniz personel gorur.
$note = Api::Tickets()->AddTicketNote([
    'id'      => $id,
    'message' => 'Escalated to the billing team.',
])['data'];

Notu Güncelleme

patch/api/v1/admin/tickets/{id}/notes/{note_id}
Tickets/UpdateTicketNote admin

Notun metnini ya da sabitlenme durumunu değiştirir.

Gövde 2
messagestringYeni metin.
pinnedboolSabitler ya da sabitlemeyi kaldırır.
Dönen alanlar data
dataobjectGüncel not. Listedeki öğeyle aynı şekildedir.
Hatalar 5
no_changes422Hiçbir alan verilmedi. Boş gövde sessizce geçilmez.
message_required422Not metni boş.
update_failed422Güncelleme yazılamadı.
not_found404Talep ya da not bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/tickets/402/notes/1d9e35094420c723' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"pinned":false}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ pinned: false }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['pinned' => false]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bos govde NO-OP degil HATADIR; en az bir alan gonderin.
Api::Tickets()->UpdateTicketNote([
    'id' => $id, 'note_id' => $noteId, 'pinned' => false,
]);

Notu Silme

delete/api/v1/admin/tickets/{id}/notes/{note_id}
Tickets/DeleteTicketNote admin

Notu ve dosyalarını kaldırır.

Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
note_idstringSilinen notun kimliği.
Hatalar 3
delete_failed422Silme yazılamadı.
not_found404Talep ya da not bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/tickets/402/notes/1d9e35094420c723' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId);
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);
// Notun ekleri de gider; JSON'dan cikarilir ve dosyalar diskten silinir.
Api::Tickets()->DeleteTicketNote(['id' => $id, 'note_id' => $noteId]);

Not Ekini İndirme

get/api/v1/admin/tickets/{id}/notes/{note_id}/attachments/{att_id}
Tickets/GetTicketNoteAttachment admin

Bir nota iliştirilmiş dosyayı içeriğiyle döndürür.

Dönen alanlar data — 6
idstringEkin kimliği.
namestringGörünen adı.
file_namestringDiskte saklanan adı.
file_sizeintDosyanın boyutu.
mimestringDosyanın türü.
content_base64stringDosyanın içeriği. Metne çevrilmiş hâlde gelir.
Hatalar 2
not_found404Ek bulunamadı ya da dosyası eksik.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/tickets/402/notes/1d9e35094420c723/attachments/71c918b7ff525444' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch(
  `https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}/attachments/${attId}`,
  { headers: { Authorization: `Bearer ${apiKey}` } },
);
const { data } = await res.json();
$url = 'https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId . '/attachments/' . $attId;

$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);
// Not ekleri talebin satirinda yasar; yanit ekleriyle AYNI uctan istenmezler.
$att = Api::Tickets()->GetTicketNoteAttachment([
    'id' => $id, 'note_id' => $noteId, 'att_id' => $attId,
])['data'];

Not Ekini Silme

delete/api/v1/admin/tickets/{id}/notes/{note_id}/attachments/{att_id}
Tickets/DeleteTicketNoteAttachment admin

Bir not ekini kaydından ve diskten kaldırır.

Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
attachment_idstringSilinen ekin kimliği.
Hatalar 2
not_found404Talep, not ya da ek bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/tickets/402/notes/1d9e35094420c723/attachments/71c918b7ff525444' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(
  `https://panel.ornek.com/api/v1/admin/tickets/${id}/notes/${noteId}/attachments/${attId}`,
  { method: 'DELETE', headers: { Authorization: `Bearer ${apiKey}` } },
);

const body = await res.json();
$url = 'https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/notes/' . $noteId . '/attachments/' . $attId;

$ch = curl_init($url);
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);
// Ek kaldirilir ama notun kendisi kalir; notu silmek ise eklerini de goturur.
Api::Tickets()->DeleteTicketNoteAttachment([
    'id' => $id, 'note_id' => $noteId, 'att_id' => $attId,
]);

Gizli Bilgileri Listeleme

get/api/v1/admin/tickets/{id}/private-data
Tickets/GetTicketPrivateData admin içerik açık döner

Talebe eklenmiş etiketli gizli bilgileri döndürür.

Dönen alanlar data[] — 5
idstringKaydın kimliği.
labelstringNeyin bilgisi olduğu.
contentstringBilginin kendisi. Şifreli saklanır, burada çözülmüş gelir.
reply_idintBağlı olduğu yanıt. Sıfır, talebin geneline ait demektir.
created_atstring | nullEklenme anı.
Hatalar 2
not_found404Talep bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/tickets/402/private-data' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/private-data');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Icerik ACIK doner: bu cagriyi loglayan bir istemci sunucu sifresini de loglar.
$items = Api::Tickets()->GetTicketPrivateData(['id' => $id])['data'];

Gizli Bilgi Ekleme

post/api/v1/admin/tickets/{id}/private-data
Tickets/AddTicketPrivateData admin

Talebe etiketli bir gizli bilgi ekler.

Gövde 3
labelstringreqNeyin bilgisi olduğu.
contentstringreqBilginin kendisi. Saklanırken şifrelenir.
reply_idintBelirli bir yanıta bağlar.
Dönen alanlar 201 — data
dataobjectEklenen kayıt. Listedeki öğeyle aynı şekildedir.
Hatalar 3
label_content_required422Etiket ya da içerik boş.
not_found404Talep bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/tickets/402/private-data' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"label":"Sunucu erisimi","content":"host: 203.0.113.10"}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    label: 'Server SSH',
    content: 'host: 203.0.113.10\nuser: admin',
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/private-data');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'label'   => 'Server SSH',
        'content' => "host: 203.0.113.10\nuser: admin",
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Bir yanita baglamak icin numarasini verin; sifir talebin geneline birakir.
Api::Tickets()->AddTicketPrivateData([
    'id'       => $id,
    'label'    => 'Server SSH',
    'content'  => $credentials,
    'reply_id' => $replyId,
]);

Gizli Bilgiyi Silme

delete/api/v1/admin/tickets/{id}/private-data/{item_id}
Tickets/DeleteTicketPrivateData admin

Talepten bir gizli bilgi kaydını kaldırır.

Dönen alanlar data — 2
deletedboolSilme çalıştı mı.
item_idstringSilinen kaydın kimliği.
Hatalar 2
not_found404Talep ya da kayıt bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/tickets/402/private-data/pd_65a4f0c8a1b23' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/tickets/${id}/private-data/${itemId}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/tickets/' . $id . '/private-data/' . $itemId);
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);
// Talep kapaninca erisim bilgisini SILMEK iyi bir aliskanliktir; kayit kalicidir.
Api::Tickets()->DeleteTicketPrivateData(['id' => $id, 'item_id' => $itemId]);

Tuzaklar

Gizli bilgiler açık metin döner

Bu kayıtlar veritabanında şifreli durur, ama okuma ucu içeriği çözülmüş verir. Yani bu kapsamı taşıyan bir anahtar, orada duran sunucu parolalarını okuyabilir. İstek ve yanıtları günlüğe yazan bir istemci parolayı da günlüğe yazar; anahtarı dar tutun ve bu çağrının gövdesini kaydetmeyin.

Hepsi tek bir şifreli blokta durur

Notlar ve gizli bilgiler ayrı satırlar değil, talebin satırındaki tek bir şifreli alandır. Her yazma bu bloğun tamamını yeniden kaydeder. İki istek aynı anda not eklerse ikincisi birincinin üzerine yazabilir; toplu iş yaparken aynı talebe paralel yazmayın.

Kimlikler sıra numarası değildir

Notlar ve ekleri dizeyle adreslenir; listedeki sırasıyla değil. Eski panel konumu kullanıyordu ve araya not eklemek ya da silmek o konumu kaydırıyordu. Kendi tarafınızda sıra numarası saklarsanız bir gün başka bir notu güncellersiniz; dönen kimliği saklayın.

Boş güncelleme hata verir

Not güncellemesinde hiçbir alan göndermezseniz çağrı reddedilir. Talep güncellemesi böyle davranmaz: orada değişmeyen alan sessizce geçilir. Farklı bir kaynaktan gelen veriyi olduğu gibi aktaran bir eşitleme betiği, değişiklik yokken burada hata alır. Göndermeden önce elinizde gerçekten bir alan olduğunu sınayın.

Birleştirme notları ve gizli bilgileri taşımaz

Talepleri birleştirmek yanıtları ve eklerini ana talebe taşır, sonra diğer talep satırlarını siler. Notlar ve gizli bilgiler o satırlarda yaşadığı için birlikte gider. Aynısı talebi silmek için de geçerlidir. Bir sunucu parolasının tek kopyası orada duruyorsa birleştirmeden önce okuyup ana talebe yeniden yazın.

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.