Diciamo che ho un'app mobile, Android / iOS e un backend java Spring. Data la connettività mobile, il numero di round trip della rete deve essere limitato, idealmente, 1 o meno per schermo.
Ora, supponiamo di voler aggiungere / riscrivere alcune funzionalità di messaggistica quando 2+ utenti di app possono inviarsi reciprocamente messaggi.
Ci sono 2 tabelle / risorse (semplificate qui). "Conversazione" e "Messaggio". Ogni conversazione contiene più messaggi.
conversation
-----------------
id
type
last_message_test
last_message_username
message_count
etc
message
------------
id
conversation_id
user_id
user name
text
timestamp
I record di conversazione contengono alcune informazioni sull'ultimo messaggio che è stato fatto in modo che una schermata che elenca solo l'intestazione di molte conversazioni possa mostrare il suo contenuto più recente senza dover interrogare la tabella dei messaggi effettiva (anche il numero dei messaggi).
idealmente ci sarebbero chiamate come questa:
POST /api/conversation => create a new conversation
POST /api/conversation/1234/message => post a new message in conversation 1234
GET /api/conversation?searchparam1=1&searchparam2=2 => retrieve certain conversation without their full actual content
GET /api/converstaion/1234/message => retrieve all the messages of a given conversation, 1234
Ecco i problemi però:
problema A) Quando si postula un nuovo messaggio, questo crea una nuova risorsa di messaggio ma è anche l'effetto collaterale di un aggiornamento (asincrono / di messaggistica) sul corrispondente record di "conversazione". Quindi, il POST di una nuova risorsa di tipo A attiva un PATCH di un'altra risorsa di tipo B. Va bene?
problema B) Quando si postula il primo messaggio, non c'è ancora un record di conversazione. Entrambi devono essere creati, prima il record "conversazione", quindi il record "messaggio" che conterrà il nuovo ID conversazione (idealmente in una transazione). Come farlo in un modo di riposo senza dover fare 2 chiamate api?
Fondamentalmente cercando di trovare il giusto compromesso tra:
- numero di chiamate di riposo
- campi db duplicati e query
- stile di riposo dell'API orientata alle risorse
Forse non è davvero possibile senza aggiungere nuove risorse artificiali o operazioni / punti finali "batch / bundle / aggregati"? qualsiasi raccomandazione apprezzata, grazie!