‫Istruttore: In
‫questo video, creeremo una funzione di fabbrica del gestore
‫per eliminare i documenti di revisione, ma
‫anche i documenti di tutte le altre raccolte, il
‫tutto con una semplice funzione.
‫Quindi, come ho detto all'inizio di questa sezione, l'aggiunta
‫di gestori molto simili a tutti i nostri
‫controller creerà molti codici duplicati, giusto?
‫Perché tutti questi gestori di
‫aggiornamento, o tutti questi
‫gestori di eliminazione, o tutti
‫questi gestori di creazione, sembrano praticamente tutti uguali, giusto?
‫Inoltre, immagina di voler cambiare come
‫un codice di stato https o un messaggio di stato.
‫Quindi dovremmo entrare in ogni controller e quindi cambiare
‫tutti i gestori lì dentro.
‫E quindi, invece di scrivere manualmente tutti questi gestori, perché
‫non creare semplicemente una funzione di fabbrica che
‫restituirà questi gestori per noi?
‫Quindi, una funzione di fabbrica è esattamente questo.
‫È una funzione che restituisce un'altra funzione, e in questo
‫caso la nostra funzione di gestione.
‫Quindi, per l'eliminazione, per la creazione, per l'aggiornamento e
‫anche per la lettura delle risorse.
‫Ok e so che l'intero concetto può essere un po' complesso da avvolgere,
‫e questo è il
‫motivo per cui l'ho lasciato
‫per la parte successiva di questo corso.
‫Ma ora, credo che tu sia
‫davvero pronto per implementare questo genere di cose.
‫Quindi questo tipo di logica è ciò che
‫ogni sviluppatore JavaScript avanzato dovrebbe essere in grado di implementare,
‫e quindi ancora una volta credo che a questo punto del
‫corso tu sia davvero pronto per iniziare a utilizzare un concetto
‫avanzato come questo, va bene.
‫Ma basta parlare, ora lascia che ti mostri
‫come funziona effettivamente utilizzando il gestore di eliminazione come primo esempio.
‫E quindi in realtà ne abbiamo uno nel controller del tour, quindi
‫andiamo avanti e copiamo quello, quindi
‫cancelliamo il tour.
‫Ok, quindi l'ho copiato fondamentalmente come
‫modello da seguire.
‫Quindi creiamo un nuovo file e lo farò
‫nei controller.
‫Va
‫bene, quindi gestore...
‫fabbrica. js.
‫E sto facendo questa è la cartella dei
‫controller, beh perché le funzioni che scriveremo
‫qui fondamentalmente restituiranno i controller.
‫E quindi per me ha molto senso che
‫tu li metta qui.
‫Quindi copiamo questa parte
‫qui, solo per tenerla come riferimento.
‫Quindi, di nuovo, l'obiettivo qui è sostanzialmente creare una funzione,
‫che restituirà quindi
‫una funzione simile a questa qui.
‫Ma ovviamente non solo per il
‫tour, ma per ogni singolo modello che abbiamo nella nostra
‫applicazione e che potremmo avere in futuro.
‫Quindi questa funzione deve essere
‫preparata per questo, e quindi ciò significa che all'interno della
‫funzione di fabbrica, passeremo il modello, d'accordo.
‫Quindi chiamiamo questo deleteOne.
‫E si chiama così, di
‫nuovo, perché questa funzione non
‫funzionerà solo per eliminare i
‫tour, ma anche per eliminare recensioni e utenti e
‫in futuro anche altri documenti che
‫potremmo avere.
‫Quindi, come dicevo all'inizio,
‫passeremo il modello in questa funzione.
‫Quindi passiamo il modello e poi creiamo una nuova funzione, e quella funzione restituirà
‫immediatamente la nostra funzione asincrona,
‫quindi in pratica tutto questo o la funzione di
‫gestione asincrona.
‫Ok, quindi ora tutto ciò che dobbiamo fare è
‫passare effettivamente dal modello di strumento specifico al modello più generico.
‫Quindi qui cambieremo anche questo da tour a documento perché, ancora una
‫volta, non sapremo che tipo di documento è questo.
‫Quindi questa funzione non saprà realmente se si tratta di un tour, o se
‫si tratta di una recensione o di un utente.
‫E quindi dobbiamo fare il giro di tutto questo, e
‫questo è davvero tutto.
‫Quindi questa fondamentalmente la generalizzazione
‫di questa funzione specifica, che funzionava solo per i tour, e
‫ora questa nuova funziona per ogni modello.
‫Quello che dobbiamo fare anche qui è importare questo catchAsync e
‫anche questo AppError.
‫Quindi catchAsync...
‫e credo che sia nella cartella delle utilità.
‫E poi, non AppError ma catchAsync.
‫Quindi duplicalo
‫qui, AppError, e questo qui è maiuscolo.
‫Salvalo e ora siamo pronti per
‫testarlo effettivamente.
‫Quindi è così che funzionerà, prima
‫di tutto dobbiamo importare quella fabbrica di gestori.
‫E così
‫diciamo, e qui la chiamerò semplicemente fabbrica.
‫Quindi richiede, ed è nella stessa cartella, quindi fabbrica
‫del gestore.
‫Va bene, quindi commentiamo questo qui fuori, o in realtà non
‫tutto questo.
‫Sì o in realtà possiamo commentarlo, e
‫così le nuove esportazioni. elimina il tour sarà...
‫fabbrica. deleteOne e poi passa al modello,
‫che è tour.
‫E questo è tutto, è tutto ciò che dobbiamo fare.
‫Quindi, solo per ricapitolare molto rapidamente
‫qui, quindi chiamiamo questa funzione deleteOne, quindi
‫lì passiamo il modello e
‫quindi ciò che accadrà è che questa funzione
‫restituirà immediatamente questa funzione di gestione che
‫avevamo prima.
‫Semplicemente il modello specifico, che prima era il tour,
‫ora verrà sostituito con quello che
‫abbiamo passato alla funzione.
‫E dal modo in cui funziona a causa delle
‫chiusure JavaScript, che è solo un modo
‫elegante per dire che questa funzione interna qui avrà
‫accesso alle variabili della funzione
‫esterna anche dopo che l'esterno è già tornato.
‫Quindi chiamare questa funzione qui restituirà
‫un'altra funzione, che si
‫siederà qui e aspetterà fino a quando non verrà
‫finalmente chiamata non appena raggiungiamo il percorso corrispondente.
‫E quindi ora proviamo esattamente questo.
‫Quindi elimina tour,
‫ok, e scegliamo un tour di
‫cui non abbiamo davvero bisogno qui per ora.
‫Quindi diciamo...
‫ora diciamo qui The Snow
‫Adventurer perché non ha nemmeno recensioni.
‫Quindi mandiamolo, oh e ora
‫non abbiamo il permesso di eseguire l'azione, e
‫questo perché non abbiamo effettuato l'accesso come amministratore.
‫Quindi proviamolo, quindi
‫questo è l'amministratore di cui abbiamo bisogno per accedere.
‫Ok, quindi è fatta.
‫E quindi ora dovrebbe funzionare, e in effetti ha funzionato.
‫E quindi questa è la prova che la nostra funzione di fabbrica
‫sta davvero facendo il suo lavoro.
‫Ok, perché se ora torni qui, abbiamo
‫avuto 10 risultati e quindi ora dovremmo ottenerne solo nove, quindi
‫perfetto.
‫E ora l'obiettivo è poterlo utilizzare
‫in ogni singolo controller.
‫Quindi copiamo questo qui e
‫andiamo alle recensioni.
‫Oh, e ovviamente
‫ne abbiamo bisogno qui, proprio all'inizio, ora
‫giusto, e quindi ora esporta. deleteReview è uguale
‫a factory. deleteOne con
‫il modello di revisione.
‫E questo è tutto, è tutto
‫ciò che dobbiamo fare per implementare il gestore di eliminazione.
‫Ora, ovviamente, dobbiamo anche specificare il gestore del percorso.
‫Ora ovviamente dobbiamo specificare il percorso stesso,
‫quindi facciamolo anche qui.
‫Quindi router. route perché qui
‫abbiamo effettivamente bisogno del parametro ID.
‫E ora l'eliminazione è semplicemente reviewController. deleteReview, e non sto scherzando con
‫il permesso qui, né con l'autenticazione perché per
‫ora voglio solo farlo
‫funzionare e preoccuparmi di quella roba
‫un po' più avanti in questa sezione.
‫Ok, quindi chiudiamo questa roba qui.
‫Quindi prendi tutte
‫le
‫recensioni, va bene, salviamo questa e anche questa.
‫In modo che ora possiamo iniziare con un foglio
‫bianco qui e iniziamo semplicemente ottenendo tutte le
‫recensioni, in modo da poterne eliminare una.
‫E quindi eliminiamo, beh, solo questo.
‫Ok, ora abbiamo ovviamente bisogno anche
‫di questo, e poi del metodo delete http.
‫Non abbiamo bisogno di autorizzazione a questo
‫punto, quindi mandiamocela e basta.
‫E infatti nessun contenuto, quindi 204.
‫E se ora otteniamo tutte le
‫recensioni, allora dovremmo tornare ad averne solo tre.
‫Sì, funziona e quindi passiamo al prossimo.
‫Ok, quindi recensioni, recensioni.
‫Prendiamo questa riga di codice qui e ora aggiungiamola finalmente
‫anche al controller utente.
‫Va bene, e ovviamente tutto questo, capisco che sia un
‫po' confuso ora fare confusione con tutti questi
‫diversi file, ma dobbiamo
‫solo farlo una volta e poi abbiamo finito con
‫tutta quella confusione.
‫Quindi qui abbiamo già avuto l'esportazione. deleteUser, ora
‫tutto ciò che dobbiamo fare è chiamare la nostra funzione di
‫fabbrica, quindi deleteOne e poi l'utente.
‫Ora solo l'amministratore dovrebbe essere in grado
‫di eliminare effettivamente gli utenti in seguito perché ricorda
‫che quando l'utente si
‫elimina, in realtà non verranno eliminati ma solo
‫quelli attivi verranno impostati su false.
‫Ma l'amministratore, d'altra parte,
‫sarà davvero in grado di eliminare efficacemente l'utente
‫dal database.
‫Ma ancora una volta, ci
‫occuperemo un po' di quella roba sui permessi.
‫Per ora, controlliamo in userRoutes se la
‫route è effettivamente
‫implementata, e sì, è quaggiù.
‫E quindi poiché ora
‫l'abbiamo implementato, testiamolo anche qui di nuovo anche su Postman.
‫Quindi prima salviamo questo.
‫Così...
‫cancella recensione, e
‫ora copiamo semplicemente questo in un
‫altro percorso.
‫Quindi elimina e poi un utente,
‫ma in realtà non lo farò davvero ora.
‫Tutto ciò che voglio è ottenere un ID casuale.
‫O in realtà creiamo semplicemente un nuovo
‫utente, quindi in pratica iscriviti e poi cancellalo subito.
‫Quindi ciao, così.
‫Ottieni tutti gli utenti, e poi c'è questo tizio qui.
‫E quindi eliminiamolo subito, quindi inviamo,
‫non otteniamo alcun contenuto.
‫E, naturalmente, ora dovrebbe essere sparito.
‫Ora, se proviamo a vederla di
‫nuovo, quindi fondamentalmente cercando di eliminare un
‫utente che non c'è più, dovremmo ricevere un errore.
‫Quindi diamo un'occhiata, e in effetti nessun documento
‫trovato con quell'ID.
‫E quindi questo significa che nella nostra
‫funzione di fabbrica, quindi proprio qui, tutto questo AppError e catchAsync, tutto questo
‫è ancora intatto.
‫Quindi tutto funziona ancora come prima.
‫Ora, anche questo era importante da testare qui.
‫Salviamo rapidamente anche questo qui,
‫quindi ogni singolo endpoint che stiamo implementando, lo aggiungo
‫anche qui in Postman
‫perché un po' più tardi saremo effettivamente in
‫grado di creare effettivamente della documentazione
‫API basata su tutti questo che abbiamo salvato qui a Postman.
‫Quindi questa è un'altra caratteristica utile di questa applicazione.
‫Quindi abbiamo eliminato l'utente corrente,
‫e ancora una volta è diverso dall'eliminazione
‫dell'utente perché questo qui è per
‫l'amministrazione e questo è per l'utente attualmente connesso, quindi
‫molto diverso.
‫Ok, questa è stata la nostra prima funzione di fabbrica
‫solo per l'eliminazione e solo per farti capire
‫il concetto stesso.
‫Successivamente, implementeremo le funzioni di fabbrica
‫per l'aggiornamento e la creazione di documenti.