Sto costruendo un servizio REST. Questo servizio consente all'utente di creare un'entità che ha un indirizzo. Per semplificare, diciamo che questa altra entità è 'Casa', quindi 'A casa ha un indirizzo'.
Il sistema deve geocodificare tutte le case, quindi insieme all'indirizzo, una casa deve avere latitudine / longitudine al momento della creazione, ma queste non sono richieste all'utente.
L'utente verrà invitato a inserire un indirizzo. Da questo indirizzo il sistema proverà a recuperare latitudine / longitudine usando un servizio di terze parti. Questo servizio restituirà la migliore corrispondenza per l'indirizzo inserito dall'utente, quindi a volte restituirà un indirizzo diverso (ad esempio potrebbe accadere che ci siano due strade diverse con lo stesso nome in città diverse e che i servizi possano restituire informazioni relative a quella sbagliata ).
Devo assicurarmi che l'indirizzo che sto memorizzando con la casa sia quello desiderato dall'utente, quindi il flusso di lavoro per l'utente sarebbe qualcosa del tipo:
- L'utente desidera creare una nuova casa.
- L'utente Inserisci un indirizzo.
- L'utente vede la migliore corrispondenza per quell'indirizzo in una mappa.
- L'utente conferma che l'indirizzo è OK.
- Il sistema salva la casa con l'indirizzo e il lat / long recuperati dal servizio.
Approccio 1
Il modello delle entità sarebbe:
- House ha un indirizzo
- L'indirizzo ha una coordinata (lat / long)
e avrei un endpoint per gli indirizzi POST e un altro per le case POST. Il flusso di lavoro sarebbe:
- L'utente desidera creare una nuova casa.
- L'utente Inserisci un indirizzo e crea un POST per l'endpoint degli indirizzi .
- Il sistema recupera il lat / long per la migliore corrispondenza.
- Il sistema salva l'indirizzo recuperato dal servizio di geocoding nel DB. Si noti che può essere diverso dall'indirizzo inserito dall'utente.
- Come risposta alla richiesta POST, il sistema restituisce l'indirizzo che è stato salvato e lo mostra all'utente.
- L'utente conferma che l'indirizzo è OK.
- Il sistema esegue un POST all'endpoint delle case con l'ID per l'indirizzo che è stato creato in precedenza, quindi in DB la casa sarà collegata all'indirizzo già creato in precedenza.
Con questo approccio, se l'utente non accetta l'indirizzo fornito, finirei con alcuni indirizzi "orfani" (indirizzi che non sono collegati ad alcuna Casa). Avrei bisogno di fare una pulizia periodica sul DB per quegli indirizzi.
Approccio 2
In questo approccio, avrei un endpoint / validate-address, quindi l'utente avrebbe POST un indirizzo e il sistema restituirebbe la migliore corrispondenza. A questo punto non verrà creato nulla nel DB. L'utente accetterebbe quindi l'indirizzo restituito e farebbe un POST a / case con le informazioni della casa e l'indirizzo.
Con questo approccio, non posso assicurare che tutti gli indirizzi nel DB siano georeferenziati correttamente poiché alcuni utenti potrebbero effettuare un POST a / case senza una precedente chiamata a / validate-address.
Inoltre, non sembra corretto da una prospettiva REST avere una richiesta POST / indirizzo di convalida che non crei nulla sul DB.
Quale sarebbe l'approccio migliore a questa situazione? Riesci a vedere un approccio alternativo a questi due? Qualsiasi feedback sarebbe apprezzato.