Sto creando un'API e un modello di dati per un'applicazione di creazione di documenti multiutente e sto riscontrando problemi con una parte particolare del modello di dati / progettazione dell'API. Di seguito la mia linea di pensiero corrente:
Ci sono due azioni simili che possono accadere mentre un utente sta scrivendo un documento:
- Un utente può salvare manualmente un documento. Questo crea una revisione e possono esserci molte revisioni per un singolo documento.
- Un autosalvataggio viene attivato periodicamente mentre un utente sta modificando il documento. Poiché le operazioni di salvataggio automatico possono svolgersi abbastanza frequentemente e disporre di dati ridondanti, può esistere un solo salvataggio automatico per un singolo documento.
Queste azioni sono utilizzate per creare un paio di funzioni:
- Gli utenti possono ripristinare una vecchia revisione del documento.
- Le salvataggi automatici impediscono all'utente di perdere il proprio lavoro.
- Blocco del documento di base: se un utente crea un salvataggio automatico per un documento, un altro utente non può iniziare a modificarlo. Quando un utente attiva un salvataggio manuale, creando una revisione, il salvataggio automatico associato al documento verrà eliminato e quindi un altro utente potrebbe iniziare a lavorare sul documento.
Ecco uno schema del modello di dati che ho:
_________ ______________________
|Documents| |DocumentRevisions |
|---------| ------< |----------------------|
|id: int | |id: int |
|_________| |documentBody: string |
| |createdAt: datetime |
| |______________________|
____|________________
|DocumentDrafts |
|---------------------|
|id: int |
|documentBody: string |
|_____________________|
E qui ci sono alcuni degli endpoint che ho:
- RICEVI / documenti /
- POST / documenti // revisioni
- Questo è chiamato su un salvataggio manuale
- PUT / documenti // bozza
- Questo è chiamato su autosave
Queste sono le cose che non mi piacciono di questo modello attuale:
- L'endpoint
POST /documents/<documentId>/revisions
deve anche modificare la tabella DocumentDrafts per riflettere il fatto che il documento è ora in uno stato "pulito" e può essere modificato da un altro utente - L'endpoint
PUT /documents/<documentId>/draft
interrompe alcune regole di REST incluso l'uso della singola parola "bozza" (perché può esserci solo una bozza di un documento)
Penso che il requisito che un solo salvataggio automatico possa esistere per un documento in qualsiasi momento mi fa davvero inciampare e non sono sicuro di come modellarlo correttamente. Esiste un modo migliore? Devo sollevare il requisito di un singolo salvataggio automatico per documento?