> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flextell.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Event'ler

> chat-log.{tenantId} kanalında yayınlanan event'lerin tam katalogu, payload şemaları ve örnekleri.

Flextell, sohbet kanalında şu an üç event yayınlar. Hepsi [`private-chat-log.{tenantId}`](/realtime/channels) kanalında tetiklenir.

<Note>
  Event adları **tam nitelikli** biçimde yayınlanır: `App\Events\ChatLogCreated`. Bazı Pusher istemcilerinde bu adlarla dinlemek için isim başına nokta (`.`) koymak gerekir: `.listen(".App\\Events\\ChatLogCreated", ...)`. Doğrudan Pusher client kullanıyorsanız nokta olmadan `bind("App\\Events\\ChatLogCreated", ...)` yazın.
</Note>

## `ChatLogCreated`

Bir tenant içinde yeni bir `chat_log` satırı oluştuğunda tetiklenir. Bu event:

* Panel kullanıcısı bir mesaj **gönderdiğinde**,
* Hasta tarafından bir mesaj **geldiğinde** (WhatsApp/Telegram),
* AI asistanı bir yanıt ürettiğinde

yayınlanır.

### Payload

Payload, [ChatLog API modeli](/api-reference)'nin serileştirilmiş halidir. İstisnai olarak, modelin tüm ilişkileri otomatik yüklenmez — yalnızca varsayılan alanlar gelir.

```json theme={null}
{
  "id": 1042,
  "tenant_id": 12,
  "conversation_id": 58,
  "sender_type": "customer",
  "sender_id": 391,
  "body": "Yarın randevumu alabilir miyim?",
  "media_type": null,
  "status": "received",
  "read_at": null,
  "created_at": "2026-04-19T10:12:00+03:00",
  "updated_at": "2026-04-19T10:12:00+03:00"
}
```

<Warning>
  Alan listesi zaman içinde genişleyebilir — istemci tarafında bilinmeyen alanları **göz ardı edin** ve yalnızca güvendiğiniz alanlara güvenin. Gerekirse detay için `GET /v1/conversations/{id}/messages/{messageId}` çağrısı atabilirsiniz.
</Warning>

### Tipik kullanım

```js theme={null}
channel.listen(".App\\Events\\ChatLogCreated", (message) => {
  if (message.conversation_id === currentConversationId) {
    appendMessage(message);
    scrollToBottom();
  } else {
    incrementUnreadBadge(message.conversation_id);
  }
});
```

## `ChatLogDeleted`

Bir mesaj soft-delete edildiğinde tetiklenir.

### Payload

```json theme={null}
{
  "chatLogId": 1042,
  "conversationId": 58,
  "deletedByUserName": "Dr. Ayşe Yılmaz"
}
```

<ResponseField name="chatLogId" type="integer">
  Silinen mesajın ID'si.
</ResponseField>

<ResponseField name="conversationId" type="integer">
  Silinen mesajın ait olduğu görüşmenin ID'si.
</ResponseField>

<ResponseField name="deletedByUserName" type="string | null">
  Silme işlemini yapan kullanıcının adı. Sistem tarafından silinmişse `null` gelebilir.
</ResponseField>

### Tipik kullanım

```js theme={null}
channel.listen(".App\\Events\\ChatLogDeleted", ({ chatLogId, conversationId, deletedByUserName }) => {
  removeMessageFromUi(chatLogId);

  showToast(`Bir mesaj silindi (${deletedByUserName ?? "sistem"}).`);
});
```

## `ConversationRead`

Bir kullanıcı görüşmeyi "okundu" olarak işaretlediğinde tetiklenir. Aynı kullanıcının farklı cihazlarda açık olan sekmelerini veya farklı panel kullanıcılarının paylaşılan görüşme ekranını senkronlamak için kullanışlıdır.

### Payload

```json theme={null}
{
  "conversation_id": 58
}
```

<ResponseField name="conversation_id" type="integer">
  Okundu olarak işaretlenen görüşmenin ID'si.
</ResponseField>

### Tipik kullanım

```js theme={null}
channel.listen(".App\\Events\\ConversationRead", ({ conversation_id }) => {
  markConversationRead(conversation_id); // UI'daki "●" badge'ini kaldır
});
```

## Event özet tablosu

| Event                         | Payload alanları                                   | Ne zaman tetiklenir?                   |
| ----------------------------- | -------------------------------------------------- | -------------------------------------- |
| `App\Events\ChatLogCreated`   | Tam `ChatLog` model şeması                         | Yeni mesaj oluştuğunda                 |
| `App\Events\ChatLogDeleted`   | `chatLogId`, `conversationId`, `deletedByUserName` | Mesaj soft-delete edildiğinde          |
| `App\Events\ConversationRead` | `conversation_id`                                  | Görüşme okundu olarak işaretlendiğinde |

## Sık sorulanlar

<AccordionGroup>
  <Accordion title="Bir event'i kaçırırsam geri alabilir miyim?">
    WebSocket teslim edilmemiş event'leri kuyrukta tutmaz. Yeniden bağlandığınızda eksikleri REST üzerinden doldurun — örneğin `GET /v1/conversations/{id}/messages?after=<lastMessageId>`.
  </Accordion>

  <Accordion title="Hangi ortamdayım nasıl anlarım?">
    Kanal adı tenant'a göre değişir; ortama göre değişmez. Ortam farkı **endpoint** (`dev.flextell.ai` vs `app.flextell.ai`) ve **Pusher key** üzerinde olur. Bkz. [Ortamlar](/environments).
  </Accordion>

  <Accordion title="Event payload'ı içinde gönderen kullanıcıyı nasıl bulurum?">
    `ChatLogCreated` payload'ında `sender_type` ve `sender_id` gelir. Gönderenin detaylı bilgisine ihtiyacınız varsa (isim, avatar vs.), REST tarafında `GET /v1/users/{id}` veya `GET /v1/customers/{id}` ile çekebilirsiniz. Sık tekrar eden bu çağrıları istemci tarafında cache'leyin.
  </Accordion>

  <Accordion title="Neden event adları bu kadar uzun?">
    Flextell bilinçli olarak tam nitelikli event adı (ör. `App\Events\ChatLogCreated`) yayınlar. Bu sayede ileride bir event adını değiştirmeye kalkarsak istemciler kırılmayı fark eder ve sessizce yanlış event'i dinlemez. İstemci kodunuzda event adlarını bir sabit olarak tutmak iyi bir pratiktir.
  </Accordion>
</AccordionGroup>
