Contesto
Nel contesto di un'API GraphQL consideriamo questa query:
query {
blogPosts {
id
title
body
author {
id
name
}
viewerCanEdit
isLocked
}
}
e questa mutazione:
mutation {
editBlogPost(data: $input) {
id
title
body
}
}
La mia soluzione
Posso identificare i seguenti casi d'uso:
- Visualizza tutti i post del blog
- Modifica post del blog
- Ottieni utente / autore per ID
Ogni caso d'uso può essere suddiviso in 4 passaggi logici e ognuno risponde a una domanda specifica:
- Autorizzazione: il visualizzatore può eseguire questa operazione?
- [opzionale] Verifica dell'oggetto: l'operazione può essere eseguita sull'oggetto?
- Richiesta di convalida: gli input provenienti dall'utente sono validi?
- Esecuzione: come posso eseguire questa operazione?
I motivi della divisione sono i seguenti:
- 1) e 2) insieme determinano ad esempio
viewerCanEdit
autorizzazioni poiché non sono associate a una richiesta specifica - 2) potrebbe non esistere per operazioni specifiche (elenca tutti i post del blog, crea un nuovo post del blog)
- 1) e 2) lanciano due diversi tipi di errori che dovrebbero essere trattati in modo diverso
- 4) può essere eseguito solo se 3) è convalidato
- un altro caso d'uso può aver bisogno solo di 3) e / o 4) per riutilizzare l'effettiva logica di esecuzione / validazione
Esempio
Ad esempio la mutazione sarebbe implementata logicamente come segue:
- L'utente è autorizzato a modificare un post sul blog solo se si tratta di un editor e se il post del blog è il suo
- Un post del blog può essere modificato solo se non è bloccato
- Una modifica è valida solo se il titolo e il corpo non sono vuoti
- Modifica effettiva del post del blog
Domanda
Questa sembra essere una vista estesa sul Command Pattern in cui aggiungo semplicemente 3 metodi aggiuntivi a ciascun comando per dividere l'esecuzione.
Come dovrei raggruppare queste funzioni? Devo avere una classe e 4 metodi per classe / caso d'uso o dovrei creare 4 classi diverse?
C'è un modello simile che gestisce questi problemi?