É hora de começar a quarta e a última tarefa deste curso.
Eu projetei esta tarefa para ser uma consolidação
de tudo o que você aprendeu neste curso.
Portanto, esta atribuição envolverá roteamento usando o roteador expresso.
Ele vai envolver o design de esquemas no modelo,
para o nosso MongoDB e Mongoose,
e, em seguida, ele também vai olhar brevemente para a autenticação do usuário.
O que exatamente fazemos nesta missão?
Esta tarefa é baseada em torno da capacidade de um usuário
salvar e recuperar uma lista de pratos como seus pratos favoritos no lado do servidor.
Se você tivesse feito os cursos anteriores desta especialização,
especificamente os cursos de desenvolvimento de aplicativos móveis híbridos,
seja de script iônico ou nativo,
você viu que nós projetamos os aplicativos para ter a capacidade de permitir que o usuário
salve pratos na lista de seus favoritos pratos
e também recuperar pratos dessa lista de seus pratos favoritos.
Quando implementamos isso nos cursos anteriores,
tínhamos implementado isso usando armazenamento local no dispositivo específico.
Nesta tarefa, você estará estendendo
o lado do servidor para ser capaz de suportar exatamente isso.
Desta forma, o usuário pode salvar sua lista de pratos favoritos no
lado do servidor e acessar esta lista a partir de
qualquer dispositivo a partir do qual ele fará login em seu servidor.
O que isso significa é que precisamos projetar uma nova rota para o nosso servidor,
que vamos chamar como a rota /favorites.
Nesta rota, teremos que projetar o roteador expresso para suportar as
operações get, post e delete nesta rota e
também projetar o esquema para armazenar os pratos favoritos
e o modelo Mangusto correspondente e
conectar os dois juntos para que as informações possam ser salvas e recuperado do MongoDB.
Também usaremos a população de Mangusto para extrair as informações do modelo de
usuário e do modelo de pratos quando
juntarmos essa lista de pratos favoritos para o nosso usuário.
As informações de pratos favoritos que você armazena não
conterão realmente as informações do usuário ou as informações do prato.
Em vez disso, ele vai conter ponteiros para os documentos para o documento prato e para
o documento do usuário e, em seguida, vamos publicar esta informação
quando estamos enviando de volta esta informação em resposta a um pedido get.
Vejamos como implementamos
esta tarefa final e também as várias tarefas nesta tarefa final.
Para ajudá-lo a entender o que é necessário na
tarefa final ou o que você estará implementando na tarefa final,
deixe-me demonstrar o que seu servidor deve fazer no final desta tarefa
e, em seguida, listarei as três tarefas que você precisa executar neste atribuição.
Para começar, precisamos de um conjunto de pratos já no
lado do servidor para que o usuário possa marcar alguns deles como seus pratos favoritos.
Eu fui em frente e adicionou em quatro pratos à minha lista de pratos no lado do servidor.
Você já sabe como fazer isso.
Você tem que fazer login como administrador e, em seguida, postar
esta informação prato para o lado do servidor, um por um.
Para permitir que você obtenha as informações para cada um desses pratos,
Eu já forneci o arquivo db.json que contém
os documentos JSON correspondentes a cada um desses pratos nos recursos de atribuição.
Você pode abrir isso, cortar e colar informações de lá e, em seguida,
criar uma lista de pratos no lado do seu servidor.
Aqui, você verá que eu já realizei a operação get no
localhost:3000/pratos e então você
vê que eu já obtive a lista de pratos aqui.
O que é importante para nós notar é que cada prato terá seu próprio ID prato aqui.
Quando você precisa marcar qualquer prato como seu favorito,
você precisa acessar o ID do prato para cada um desses pratos.
Você pode copiar estes quatro IDs prato e, em seguida, salvá-los para que quando você
executar as operações para adicionar esses pratos à lista de pratos,
então você será capaz de usar este ID prato.
Então eu vou copiar esses quatro IDs prato e, em seguida,
salvá-los em um documento de texto para que eu possa fazer uso deles.
Antes de poder adicionar pratos à minha lista de pratos,
obviamente preciso fazer login como usuário.
Deixe-me ir em frente e fazer login como um dos usuários.
Para fazer isso, deixe-me fazer uma postagem no localhost: 3000/usuários/login.
E no corpo da mensagem,
deixe-me digitar um dos usuários registrados.
Não quero fazer login como administrador, mas como um dos outros usuários normais.
Então deixe-me fazer este post para https://localhost:3443.
Agora, todas essas operações,
isso é melhor para fazê-lo no endpoint HTTPS em vez do endpoint HTTP.
Vamos fazer um post neste endpoint e fazer login em nosso serviço,
e em resposta, você deve ser capaz de obter o token da web JSON.
Então vamos fazer uma cópia deste token web JSON porque vamos precisar disso para
executar qualquer uma das operações para adicionar pratos à nossa lista de favoritos.
Deixe-me copiar este token e salvá-lo no meu documento de texto.
Agora, como faço para adicionar um prato à minha lista de favoritos?
Para fazer isso, o primeiro passo é que temos que
acessar o endpoint /favorites.
Se você quiser adicionar um prato específico à lista de favoritos,
basta dizer /favoritos e, em seguida, adicionar o ID do prato na URL aqui.
Deixe-me colar em um ID prato que eu quero adicionar à minha lista de favoritos.
Aqui, eu colei na minha ID prato para a lista de favoritos.
O corpo desta mensagem de host
não conterá nada porque tudo o que eu preciso já está na URL.
E para o cabeçalho,
eu preciso configurar o cabeçalho de autorização,
e no cabeçalho de autorização,
eu preciso do token.
Então deixe-me copiar o token aqui e, em seguida, no cabeçalho de autorização,
digamos portador, e colar no cabeçalho de autorização.
Você também pode fazer a mesma coisa para obter o token.
Você também pode fazer o login através do Facebook e, em seguida, obter o token da web JSON.
Ilustrei para obter o token da Web JSON usando
a autenticação local padrão usando o nome de usuário e senha,
mas não importa de que maneira você obteve o token da Web JSON.
Desde que você tenha o token da Web JSON,
você deve ser capaz de executar todas essas operações.
Deixe-me executar a operação post neste endpoint e lembre-se que este
é o ID do prato específico que eu quero adicionar à minha lista de favoritos.
Quando eu postar na lista de favoritos,
você verá que meu servidor responderá com este documento aqui no corpo da resposta.
Agora, vamos examinar este documento para ver o que exatamente ele contém.
Este documento, como você pode ver, contém um ID,
mas obviamente porque este é um documento JSON,
além disso ele contém um
campo aqui chamado usuário.
Agora, o que este campo de usuário armazena?
Este campo de usuário é o ID do objeto do usuário
correspondente a quem esta lista específica de favoritos é.
E olhe para os pratos.
Os pratos é uma matriz e é uma matriz de IDs prato.
E neste caso, acabei de adicionar o primeiro prato à minha lista de favoritos.
Então, é por isso que eu tenho apenas um prato na variedade de pratos na minha lista de favoritos.
Então, isso deve sugerir imediatamente a você como projetar o esquema para seus favoritos.
Então, pratos contém os IDs de objeto de cada um dos pratos,
e o usuário contém o ID de objeto correspondente ao usuário.
Você já viu como eu uso
a informação para fazer população da informação quando eu faço uma operação get.
Já o fizemos com comentários.
Então, isso deve dar-lhe uma grande dica sobre como você iria projetar o esquema que contém
o usuário ea variedade de pratos na minha lista de pratos aqui.
Agora, nós fizemos o post sobre isso.
Vamos pegar a lista de favoritos.
Então, para obter a lista de favoritos,
eu preciso executar uma operação get.
Agora, para a operação get,
eu obviamente preciso também ter as informações de autorização aqui porque
você quer que um usuário seja capaz de recuperar apenas sua lista de favoritos,
e nenhum outro usuário pode recuperar a lista de favoritos para um usuário diferente.
Então, isso é muito importante.
Então, isso sugere que você precisa
verificar a autenticidade do usuário mesmo para a operação get.
Agora, como a pós-operação
obtém automaticamente esse ID de objeto correspondente ao usuário?
Lembre-se de que quando você incluir o cabeçalho de autorização aqui,
a partir do cabeçalho de autorização,
pela forma como você executa a autorização do usuário,
direcione essas propriedades de usuário já carregadas no objeto de solicitação.
E então é aí que você terá acesso ao ID do objeto do usuário.
Então, mais uma dica sobre como você irá preencher essa informação.
Então, é por isso que notar que quando eu realizei o post,
eu nunca especifiquei o usuário porque
as informações do usuário devem ser automaticamente
derivadas do que nós fornecemos aqui no cabeçalho de autorização.
Então, mais uma dica sobre como você iria implementar isso.
Então, é por isso que eu disse que esta tarefa é uma consolidação
de todos os tópicos que você tem explorado neste curso.
Agora, Eu não apoio uma operação get em um ID prato específico.
Não faz sentido apoiar isso nos favoritos,
em um ID de prato específico.
Em vez disso, podemos executar uma operação get no host local 3443/favoritos.
E então realizamos a operação “get”.
Você deve notar imediatamente que o documento que é retornado a você contém
as informações do usuário já preenchidas pela operação get aqui.
Então, a informação do usuário.
Então, em vez do ID do
usuário lá, as informações do usuário já estão presentes lá.
Isso é feito através da população de Mongo.
Então, essa é outra grande dica sobre como você deve implementar a operação get.
Não só as informações do usuário são preenchidas.
Agora, por que eu gostaria que as informações do usuário fossem preenchidas?
Porque isso pode ser útil quando estou exibindo informações.
Isso pode não ser necessário,
mas eu estou fazendo isso apenas por uma questão de completude
porque se você está recuperando a lista de favoritos para um determinado usuário,
você automaticamente sabe quem é o usuário,
e esse usuário em particular está logando de qualquer maneira.
Mas no caso de você querer as informações do usuário,
você pode executar esta operação para obter informações desse usuário.
Então, só para ilustrar que a população de Mongo pode ser usada,
eu ilustrei não só que na lista de pratos aqui,
a informação sobre cada prato já está preenchida nesta matriz.
Então, se você tem um monte de pratos,
a informação de cada um desses pratos deve ser preenchida nesta matriz.
Então, este é outro uso da população de Mongo
que você está vendo para preencher as informações de pratos.
Apenas pela forma como você configurar o esquema para seus favoritos,
isso deve ser automaticamente possível para você usando
apenas o ponto preencher na lista de pratos aqui.
Então, essa é a segunda parte.
Agora que somos capazes de recuperar o método get pratos,
deixe-me mostrar-lhe como você pode executar uma pós-operação onde você pode
adicionar um monte de pratos em sua lista de favoritos.
Agora, voltando a este post,
se você precisa adicionar não apenas um, mas um conjunto de pratos à sua lista de favoritos,
agora por que você iria querer isso?
Talvez do lado do cliente você possa ter um botão que, quando
clicado, permitirá que você marque um conjunto de pratos da lista de pratos
e, em seguida, adicioná-los em um tiro em sua lista de favoritos.
Então, para apoiar esse tipo de operação,
você pode querer permitir que uma postagem seja realizada nos favoritos da barra aqui.
Agora, quando a postagem for executada nos favoritos de barra, novamente,
você ainda precisará do cabeçalho de autorização.
Mas no corpo da mensagem,
vamos armazenar a lista de pratos como uma matriz deste formato.
Então, este é um documento JSON aqui,
então deixe-me ter certeza de que no meu cabeçalho,
o tipo de conteúdo já está presente lá.
Agora, este documento
conterá uma variedade de pratos como este.
Então, cada prato será identificado
dizendo sublinhado ID cólon,
e então aqui eles terão o ID prato,
e então isso não seria nada além de uma variedade de pratos.
Então, deixe-me adicionar dois pratos à minha lista de favoritos aqui apenas para ilustrar o ponto.
Então, deixe-me colar as identificações de um par de pratos para isso.
Então, quando você executa uma postagem no host local 3443/favoritos,
é assim que você compor o corpo da mensagem de postagem aqui.
Então, cada prato que você deseja adicionar será incluído neste formato aqui.
Agora, quando você incluí-los neste formato
e, em seguida, postar no lado do servidor,
o servidor em troca enviará de volta a lista atualizada de favoritos para você.
Então, quando você receber a lista atualizada de favoritos do lado do servidor,
você verá que as informações do usuário já estão lá,
mas observe como os pratos favoritos são armazenados nesta matriz de IDs de objetos de prato.
Então, o primeiro que já tínhamos adicionado na operação anterior.
Então, os dois restantes,
acabamos de adicionar à lista de nossos favoritos.
Então, esses dois IDs de objetos também são adicionados à
minha matriz de pratos no meu documento favoritos aqui.
Então, lá vai você. Então, é assim que você deve executar
a postagem de favoritos no endpoint como este.
Agora, vamos novamente executar uma operação get nos
favoritos apenas para ver o que os recursos de operação get para nós.
Então, quando realizamos a operação GET,
você notará imediatamente que no documento de retorno favoritos,
você tem as informações do usuário lá,
e então abaixo aqui,
os pratos não são nada além de uma série de documentos Json aqui,
cada um correspondente a um prato.
Agora isso é automaticamente cuidado pelo
povoado mangusto que temos feito no lado do servidor.
Portanto, todas essas informações devem ser preenchidas automaticamente no lado do servidor.
Então é assim que suas operações de postagem nos dois endpoints funcionam.
Agora deixe-me mostrar como você executaria uma operação DELETE.
Agora, para excluir um prato específico.
Então deixe-me executar uma operação de exclusão em um endpoint específico.
Então vamos voltar para este ponto final,
e então deixe-me apenas copiar um desses,
e então eu vou excluir um dos pratos.
Então, para executar a operação de exclusão em um dos pratos,
é claro que como você vê,
nós não precisamos do corpo ainda,
e nós não precisamos do conteúdo aqui.
Tudo o que precisamos fazer é executar uma operação de exclusão neste endpoint.
Então aqui você vê que eu estou fazendo localhost: 3443/favorites/ e, em seguida, o ID do prato.
E então deixe-me postar isso.
Então, quando eu excluo um prato específico da minha lista de favoritos,
você percebe imediatamente que
minha lista atualizada de favoritos é enviada de volta para o lado do cliente pelo servidor.
Então você tem o usuário aqui,
mas note que na matriz de pratos eu só tenho dois pratos agora.
O que acabei de apagar desapareceu dessa lista de pratos.
Então, se você executar um GET agora,
sua matriz de pratos vai continuamente para pratos lá dentro.
Agora, suponha que eu execute um DELETE nos favoritos aqui.
Então, se eu executar DELETE no ponto final favoritos em si diretamente,
então o que ele vai fazer é excluir todos os meus favoritos e
também excluir meu documento favoritos completamente do lado do servidor.
Então deixe-me executar essa operação de exclusão no lado do servidor,
e então ele irá retornar o fato de que ele excluiu este documento em particular,
então ele apenas retorna este documento de qualquer maneira.
Mas agora se eu executar uma operação GET na minha lista de favoritos,
eu vou recuperar um nulo lá.
O que significa que não tenho este documento no lado do servidor.
Assim, o documento favoritos é completamente ido,
quando eu executar operação DELETE na coluna host local três de favoritos anteriormente barra.
Agora, novamente, quando eu adicionar um novo prato à
minha lista de favoritos, meu documento favorito será configurado novamente.
Isso é perfeitamente bom para nós operarmos.
Então, com esta demonstração, eu mostrei
todas as várias operações que você precisa para executar no lado do seu servidor.
Todas as várias operações nos vários pontos de extremidade de rota
que você precisa executar ou implementar no lado do servidor.
Agora que você viu
todas as várias operações que o lado do servidor deve suportar nos favoritos barra,
e os favoritos
barra, endpoints de identificação de prato barra,
deixe-me listar as três tarefas que você precisa concluir nesta atribuição.
A primeira tarefa, é claro, é implementar o esquema favorito e modelo.
Isso você implementará na pasta models em um arquivo chamado NodeJS favorito.
Lá você implementará o esquema favorito.
Lembre-se de que o esquema favorito armazenará
a referência ao ID do objeto de documento do usuário
e uma matriz de IDs de objeto de documento de pratos.
Essa é a grande dica sobre como você deve
projetar o esquema e o modelo para seus favoritos.
A segunda tarefa em sua atribuição é implementar as
operações GET, POST e DELETE no ponto final de favoritos de barra.
GET lhe dará toda a lista de favoritos,
preenchida automaticamente pelo povoado de Mongo,
o POST deve conter uma lista de pratos conforme especificado
no formato que acabei de demonstrar a você no corpo da mensagem POST.
E assim um monte de pratos será adicionado em sua lista de favoritos,
e operação DELETE no ponto de extremidade favoritos barra irá
excluir seu documento favoritos completamente do lado do servidor.
Agora, se você executar uma operação POST na barra favorito ID prato barra, em
seguida, o prato particular será adicionado em sua lista de favoritos.
Se o seu documento favorito não existir,
obviamente você precisa criar esse documento favorito.
Então, isso também faz parte dessa operação POST.
Então, se em algum momento você achar que o documento favorito não existe,
você precisa primeiro criar o documento favorito e
depois adicionar este prato no documento favorito.
Este é, portanto, um ponto importante a observar.
Quando você executa um POST no ponto de extremidade de favoritos de barra,
se o documento favorito não existir,
você precisará criar um documento favorito e, em seguida, adicionar os pratos ao seu documento favorito.
Se ele já existir,
você só atualiza esse documento favorito.
Então esta é mais uma dica sobre como você deve implementar as operações POST.
Se você executar uma operação DELETE na barra favoritos ID prato barra,
em seguida, esse prato específico será excluído da lista de favoritos.
Agora, ao executar o POST e as operações DELETE,
você deve garantir que você não irá adicionar duplicatas ao ID do prato.
Portanto, antes de adicionar um ID de objeto de prato à lista de pratos,
verifique sempre se o ID do prato já existe na lista de pratos.
Agora é aqui que você pode usar o método indexOf matriz para verificar
se um ID de documento já existe em uma matriz de documentos.
Então essa é outra grande dica sobre como você vai implementar essa parte.
E a terceira tarefa, é claro, é montar
o roteador favorito nos endpoints favoritos de barra atualizando o arquivo app.js.
O roteador favorito em si será implementado
na pasta rotas no arquivo favoriterouter.js.
Então, com isso eu descrevi o que você
deveria implementar na quarta e última missão.
E espero que esta atribuição irá ajudá-lo
a consolidar tudo o que você aprendeu no curso,
desde a concepção de roteador expresso,
até fazer o esquema e modelos MongoDB e também Mongo,
e também executar a autenticação de usuário apropriada.
E como mencionei novamente,
apenas um usuário autenticado terá acesso à sua lista de favoritos.
Mesmo a operação GET só pode ser executada por
um usuário autenticado no ponto de extremidade de favoritos de barra.
E você só buscaria os favoritos para esse usuário em particular.
Não é possível permitir que um usuário diferente acesse os favoritos de outro usuário.
Então, novamente, isso também informa como você deve executar
a autenticação nos diferentes pontos de extremidade de rota.
Com isso, concluo a descrição das tarefas na quarta tarefa.
Divirta-se completando esta tarefa.