Projektowanie REST API dla apki typu czat

0

Cześć, mam małe pytanka co do projektowania API

Robię w ramach nauki taką apkę do czatowania, gdzie user ma dostęp do kanału (serwera), na których są wyświetlane pokoje zawierające konwersacje (wiadomości)
To wszystko wyświetlane w przeglądarce

Mam na razie m.in. takie endpointy:

GET /rooms/{id}/messages - pobiera konwersację dla danego pokoju
POST /rooms/{id}/messages - wysyła wiadomość na danym pokoju

Teraz chciałbym aby po zalogowaniu na początek wyświetlał się userowi pokój, na którym ma najwięcej nowych wiadomości

Czy powinno to być zrobione:

  1. w ramach już istniejącego endpointa GET /rooms/{id}/messages
  2. czy dorobić jakiś nowy, który na podstawie parametru userId zwróci pokój z wiadomościami (tylko jak nazwać?)

Opcja pierwsza wydaje się bez sensu, no bo niby jak...


Pytanie drugie, załóżmy że chcę oznaczać wiadomości na liście pobieranej z GET /rooms/{id}/messages przez jako przeczytane/nieprzeczyte przez danego usera.
W db istnieje tabela, która przechowuje id użytkowników, którzy przeczytali wiadomości (relacja 1 do N)

Jak brać id usera?

  1. Korzystam ze sprign security i tokenów JWT, które wysyłam z każdym żądaniem - mam context usera i mogę z niego jakoś pobrać id
  2. Czy dorobić dla żądania request param userId i na podstawie tego sprawdzać w bazie czy user już przeczytał, dodatkowo walidować czy wysłane id usera to id właściciela tokenu

Chyba opcja druga?

3

Możesz zrobić:
/rooms/most-unread-messages/messages
(most-unread-messages - to taki specjalny rodzaj pokoju)

Przeważnie nie ma sensu przekazywanie userId jeśli taki możesz wyciągnąć z tokena.

0

Dorobiłbym jakiś endpoint z metadanymi. Np. /meta/{userId}/rooms lub (jeśli da się wyciągnąć userId z tokenu) coś w stylu /meta/rooms (zależy od konwencji, spotkałem się także z przedrostkami /my, /me, /current itp. - wybierz coś, co ci bardziej pasuje).

1 użytkowników online, w tym zalogowanych: 0, gości: 1