[Intum Pomoc](https://intum.pl/pomoc.md) / [API](https://intum.pl/pomoc/czat-firmowy/api.md)

# [Czat firmowy](https://intum.pl/pomoc/czat-firmowy/api/czat.md)

Pokoje i wiadomości czatu firmowego przez API. Moduł `chat` musi być aktywny na koncie,
a token mieć uprawnienie **chat**.

**Autoryzacja:** `Authorization: Bearer TOKEN`
**Content-Type:** `application/json; charset=utf-8`

## API Endpoints

| Metoda | Ścieżka | Opis |
|--------|---------|------|
| GET | `/chat.json` | Pokoje zalogowanego usera (sidebar panelu) |
| GET | `/chat/rooms.json` | Wszystkie pokoje konta (tylko admin; wyszukiwarka `q`, `kind`) |
| GET | `/chat/rooms/:id.json` | Pojedynczy pokój |
| POST | `/chat/rooms.json` | Utworzenie/znalezienie pokoju (patrz rodzaje niżej) |
| PATCH | `/chat/rooms/:id.json` | Zmiana nazwy pokoju (owner/admin) |
| DELETE | `/chat/rooms/:id.json` | Usunięcie pokoju (owner/admin) |
| GET | `/chat/rooms/:id/members.json` | Członkowie pokoju (nazwa, login, email, avatar) |
| POST | `/chat/rooms/:id/add_member.json?user_id=X` | Dodanie osoby (pokoje group/subject) |
| POST | `/chat/rooms/:id/remove_member.json?user_id=X` | Usunięcie osoby (owner/admin) |
| POST | `/chat/rooms/:id/join.json` | Dołączenie do pokoju group |
| POST | `/chat/rooms/:id/leave.json` | Opuszczenie pokoju (DM-a nie da się opuścić) |
| POST | `/chat/rooms/:id/mark_read.json` | Oznaczenie pokoju jako przeczytany |
| GET | `/chat/rooms/:id/messages.json` | Historia pokoju, od najnowszych (`before_id` do paginacji) |
| POST | `/chat/rooms/:id/messages.json` | Wysłanie wiadomości |
| GET | `/chat/messages.json` | Wszystkie wiadomości konta (tylko admin; `q`, `kind`, `room_id`) |
| PATCH | `/chat/messages/:id.json` | Edycja własnej wiadomości |
| DELETE | `/chat/messages/:id.json` | Usunięcie wiadomości (autor/admin) |
| POST | `/chat/messages/:id/toggle_reaction.json?emoji=👍` | Dodanie/zdjęcie reakcji |

Uwaga: `:id` pokoju i wiadomości to uuid (string). W URL-ach panelu pokoje mają numer
per konto (`scoped_id`, np. `/chat/3-nazwa`), ale API używa uuid z pola `id`.

## Rodzaje pokoi (`kind`)

- `dm` - rozmowa 1:1, unikalna per para userów. POST z `user_id` **znajduje albo tworzy**:

```json
{ "chat_room": { "kind": "dm", "user_id": 5 } }
```

- `group` - nazwany kanał; twórca zostaje ownerem, `user_ids` dodaje członków:

```json
{ "chat_room": { "kind": "group", "name": "Ogólny", "user_ids": [5, 7] } }
```

- `subject` - rozmowa w kontekście obiektu (jeden pokój per obiekt, find-or-create).
  Dozwolone `subject_type`: `Organize::Task`, `Organize::Project`, `Organize::Team`,
  `Mail::Email`, `Helpdesk::Ticket`, `Crm::Client`. Dostęp dziedziczony z obiektu
  (wymagane uprawnienie modułu). Pokój teamu od razu dołącza członków zespołu:

```json
{ "chat_room": { "kind": "subject", "subject_type": "Organize::Task", "subject_id": 123 } }
```

## Wysłanie wiadomości

```json
{ "chat_message": { "content": "Treść wiadomości", "parent_id": null } }
```

- `content` - markdown; `parent_id` (uuid) spina wątek (odpowiedź pod wiadomością)
- **Wzmianka** w treści to token z ID: `@[Imię Nazwisko](user:5)` - user 5 dostanie
  powiadomienie (jeśli jest członkiem pokoju); `@all` / `@here` powiadamia wszystkich
  członków z włączonym dzwonkiem
- Wiadomości mają `kind`: `message` (od usera), `system` (automatyczne, np. dodanie
  członka), `agent` (od agenta AI)

## Typowe przepływy

1. **Napisz do osoby**: znajdź user_id (`GET /account/users.json?q=nazwisko`) →
   `POST /chat/rooms.json` (kind: dm, user_id) → `POST /chat/rooms/:id/messages.json`
2. **Napisz o zadaniu**: `POST /chat/rooms.json` (kind: subject, Organize::Task, subject_id) →
   wyślij wiadomość; rozmowa pokaże się też w timeline zadania między komentarzami
3. **Podsumuj rozmowę**: `GET /chat/rooms/:id/messages.json` (od najnowszych; doczytuj
   starsze przez `before_id` = id ostatniej pobranej) → streść treści