‫-: Nesta aula, vamos permitir que o
‫usuário atualmente logado manipule seus dados de usuário.
‫E agora, ao implementar atualizações de
‫usuário, estamos realmente deixando o domínio de autenticação
‫e nos movendo mais para coisas reais relacionadas ao usuário, certo?
‫E então, em vez de usar o controlador de
‫autenticação agora, vamos implementar essa funcionalidade de
‫atualização direto no userController.
‫Ok, então
‫temos um monte de manipuladores, então,
‫de rotas, que não estão realmente implementados aqui, ok?
‫Mas vamos deixá-los de lado por
‫enquanto e criar nossa nova função de manipulador aqui.
‫E este vai se chamar updateMe.
‫E, novamente, é updateMe porque é para atualizar
‫o usuário autenticado no momento.
‫Posteriormente, implementaremos também esta função
‫updateUser aqui, mas isso serve para que um administrador
‫atualize todos os dados do usuário, enquanto o próprio usuário
‫só pode atualizar, pelo menos por enquanto, o nome e
‫o endereço de e-mail.
‫Então, solicitação, resposta e próximo.
‫(clacking do teclado) E na verdade estamos fazendo
‫isso, atualizando os dados do usuário, em uma
‫rota diferente da atualização da senha do usuário, bem
‫porque geralmente em uma aplicação web típica
‫é sempre assim.
‫Portanto, geralmente você tem
‫um local onde pode atualizar
‫sua senha e outro local onde pode
‫atualizar dados sobre o usuário ou a própria conta.
‫E aqui, basicamente estamos seguindo esse padrão.
‫Então, novamente, vamos começar definindo nossos passos.
‫E a primeira coisa que
‫queremos fazer aqui é basicamente criar
‫um erro se o usuário tentar atualizar a senha.
‫Portanto, crie um erro se o usuário
‫postar basicamente dados de senha.
‫Mas então, se não, simplesmente precisamos atualizar o documento do usuário.
‫Tão simples, e vamos começar com
‫o primeiro.
‫Claro que haverá um
‫corpo onde vamos passar os
‫dados, então se nesse corpo houver dados de senha, ou
‫uma senha de confirmação ...
‫(teclas batendo) Confirme.
‫Bem, nesse caso, queremos retornar imediatamente e
‫criar um novo Apperror.
‫Ah, e acho que ainda não o implementamos
‫aqui, ou realmente
‫exigimos, então vamos pegá-lo daqui.
‫Então AppError ...
‫Não está
‫aqui, então o userController ...
‫Então AppError, vamos lá.
‫Portanto, 'Esta rota não é para atualizações de senha.
‫'Por favor, use / updateMYPassword. 'Então, basicamente
‫a rota que especificamos antes.
‫Portanto, atualize minha senha.
‫E também, um código 400 para uma solicitação incorreta.
‫E vamos experimentar este agora mesmo.
‫E para isso apenas
‫duas coisas, primeiro precisamos enviar de
‫volta uma resposta, digamos res. status (200) para okay e, em
‫seguida, json,
‫adicione o status como sucesso.
‫E depois enviaremos também o usuário atualizado, mas vamos
‫deixar isso para depois.
‫Essa é a resposta e agora, é
‫claro, também precisamos adicionar essa rota ao nosso Roteador de usuário.
‫É claro que isso é semelhante a atualizar
‫minha senha, roteador e, claro, um patch, / updateMe,
‫então,
‫novamente, é uma rota protegida para
‫que apenas o usuário autenticado no momento possa atualizar os
‫dados do usuário atual.
‫E então tudo isso é muito seguro, mais uma
‫vez, porque o ID do usuário que será atualizado vem
‫de uma solicitação. usuário, que
‫foi definido por este middleware de proteção aqui, que por sua
‫vez tirou a ideia do json web token, e
‫como ninguém pode alterar o ID nesse json web
‫token sem saber o segredo, sabemos que
‫o ID é então seguro por causa disso.
‫E por isso, tudo aqui está seguro.
‫Então, userController. me atualize.
‫Agora tudo bem ...
‫Então, vamos testar isso agora.
‫Vá em frente e copie novamente.
‫E antes de tudo, vamos definir a autorização.
‫Novamente do Bearer Token e, claro, com
‫essa variável de ambiente.
‫Também precisa ser uma solicitação de patch
‫e precisamos especificar um corpo.
‫E eu quero começar testando-o, causando esse
‫erro, é claro, então vamos
‫especificar uma senha e, em
‫seguida, um nome.
‫Digamos que este seja o nome que desejamos atualizar,
‫então vamos salvá-lo aqui.
‫E, na verdade, está na pasta Usuários.
‫Dados do usuário.
‫E, na verdade, vamos criar uma
‫nova pasta aqui e colocar o material relacionado à autenticação
‫em sua própria pasta.
‫Então, aqui em cima,
‫criamos uma nova pasta e a chamamos de Autenticação.
‫Isso não é correto.
‫AH-THEN-TICATION.
‫(risos) Então é isso.
‫E assim a senha está
‫relacionada à autenticação, também redefinindo a senha, esquecendo a
‫senha, logando e desconectando.
‫Então, vamos fechar esses dois, e agora
‫fazer o login como, ou na verdade vamos
‫criar um novo usuário.
‫Então, vamos nos inscrever
‫aqui, como um usuário normal, para que possamos nos livrar desses dois aqui.
‫E agora estou simplesmente chamando de, bem, teste de novo, certo?
‫E vamos dar uma olhada nos usuários que temos atualmente
‫em nosso banco de dados.
‫Portanto, temos hello e
‫admin, e agora vamos usar test.
‫E estou sempre de novo, usando a mesma senha
‫para tornar tudo realmente fácil.
‫Tudo bem, precisamos fornecer o nome também, vamos chamá-lo
‫de J aqui.
‫E agora, de fato, recebemos nosso token, e
‫já estamos logados, e
‫agora, quando atualizamos o usuário, deve
‫ser para este usuário que acabou de efetuar login.
‫Portanto, não estou tentando atualizar
‫e, claro, nenhuma atualização foi implementada e isso não vai funcionar.
‫Só quero ver o erro que
‫deve acontecer porque especifiquei essa propriedade de senha aqui no corpo.
‫Então, vamos experimentar.
‫E aqui temos esse tipo de erro de aparência estranha,
‫mas acho que é simplesmente porque não atualizamos
‫a rota aqui,
‫então lembre-se de que apenas copiei uma rota, então a
‫URL, e apenas colei aqui.
‫Mas é claro, ele precisa ser updateME.
‫Então, vamos tentar de novo.
‫E agora realmente obtemos o erro que especificamos.
‫"Esta rota não é para atualizações de senha.
‫"Use / updateMyPassowrd. "Tão bom,
‫essa parte está funcionando, e
‫também está funcionando que precisamos ser autenticados.
‫Porque vamos dizer que não temos autenticação, então
‫vamos dizer que: No Auth.
‫E então vamos tentar de novo agora.
‫E então, de fato, "Você não está logado!
‫"Faça login para obter acesso. "Então, apenas
‫para provar que nossa autenticação também
‫está fazendo seu trabalho aqui.
‫Mas é claro, queremos nosso Símbolo
‫de Portador, e agora recebemos aquele outro erro.
‫Ótimo, então agora vamos implementar
‫o resto da funcionalidade para o manipulador updateMe.
‫Atualizando o documento do usuário, podemos tentar fazer
‫isso com o usuário. seguro.
‫Assim como antes, basicamente fazer com que o
‫usuário atualize as propriedades e, no final,
‫salve o documento.
‫Mas o problema com isso é que
‫existem alguns campos obrigatórios que não estamos atualizando
‫e, por causa
‫disso, cometeremos algum erro.
‫E então, apenas para demonstrar rapidamente a você,
‫deixe-me realmente fazer isso.
‫Ok, muito rapidamente, trazendo o usuário aqui.
‫Então, findbyId, então solicite. usuário como já sabemos,. Eu iria.
‫E então, digamos, usuário. nome = 'Jonas' e aguarde o
‫usuário. Salve .
‫Mas, novamente, você verá que isso nos dará um erro.
‫Mas, por enquanto, vamos declará-la também
‫como uma função assíncrona.
‫E tudo bem.
‫Portanto, vamos testá-lo
‫agora, mas devemos esperar um erro agora.
‫Então, é claro, vamos nos livrar
‫deste, e de fato obteremos: "Por favor, confirme sua senha".
‫E isso é porque passwordConfirm é um campo obrigatório, mas
‫é claro que não o especificamos.
‫Portanto, o método seguro não é realmente a
‫opção correta neste caso.
‫Em vez disso, o que
‫podemos fazer agora é realmente usar findById e atualizar.
‫Portanto, não podíamos usar isso antes por todos os motivos
‫que já expliquei a vocês várias vezes.
‫Mas agora, como não estamos
‫lidando com senhas, mas apenas com dados não confidenciais,
‫como nome ou e-mail, podemos usar findById e atualizar.
‫Então, vamos nos livrar disso.
‫Também vamos chamá-lo aqui de updatedUser.
‫E aqui, precisamos passar não apenas o ID, mas
‫também os dados que devem ser atualizados e,
‫em seguida, algumas opções.
‫Então, os dados, por enquanto, vamos chamá-los de x aqui, e
‫estou dizendo o porquê
‫em um segundo, e então as opções que queremos passar.
‫E isso é exatamente como antes,
‫a nova opção definida como verdadeira, para que ela
‫retorne o novo objeto,
‫então basicamente o objeto atualizado em vez do antigo.
‫E o runValidators também definido como true.
‫Porque realmente queremos que os modelos validem nosso documento.
‫Por exemplo, se colocarmos um endereço de e-mail inválido, ele deve
‫ser detectado pelo Validador e retornar um erro.
‫Agora, por que estou colocando x aqui, e não simplesmente pedido. corpo?
‫Bem, isso é porque na verdade não
‫queremos atualizar tudo que está no corpo,
‫porque digamos que o usuário coloque, no corpo, a
‫função, por exemplo.
‫Nós poderíamos ter corpo. função definida como admin, por
‫exemplo, e então isso permitiria a qualquer
‫usuário alterar a função, por exemplo, para administrador.
‫E é claro que isso não pode ser permitido.
‫Ou o usuário também pode alterar seu token de
‫redefinição, ou quando esse token de redefinição
‫expirar, e tudo isso não deve ser permitido, é claro.
‫Portanto, fazer algo assim seria
‫um grande erro.
‫E então precisamos ter certeza de
‫que o objeto que passamos
‫aqui, novamente aquele objeto que conterá os dados que
‫serão atualizados, contém
‫apenas o nome e o e-mail, porque por
‫enquanto esses são os únicos campos que
‫queremos permitir a atualização .
‫Basicamente, queremos filtrar o corpo para que,
‫no final, ele contenha apenas o nome e o e-mail
‫e nada mais.
‫Portanto, se o usuário tentar alterar a função,
‫ela será filtrada para
‫que nunca encontre seu caminho para nosso banco de dados.
‫Então, o que queremos fazer é basicamente criar uma variável
‫e, digamos, filterBody,
‫e então vamos criar a função em um segundo, mas vamos
‫já usá-la aqui, só para você
‫ver como vai funcionar.
‫E então aqui
‫passamos os dados, então o objeto
‫que queremos filtrar, então req. corpo, porque é onde estão
‫todos os dados, e então passamos alguns argumentos.
‫Um para cada um dos campos que queremos manter
‫no objeto.
‫Portanto, queremos manter o campo denominado nome
‫e o campo denominado email.
‫E novamente, um pouco mais tarde, podemos adicionar mais campos aqui,
‫por exemplo, mais tarde podemos permitir que
‫o usuário carregue uma imagem.
‫E é claro que também precisamos atualizar o
‫banco de dados.
‫Mas, por enquanto, tudo o que
‫queremos manter no corpo é o nome e o e-mail e filtrar todo o resto.
‫E aqui, vamos usar filterBody, em vez
‫de x, é claro.
‫E agora o que precisamos fazer é
‫realmente implementar esta função que cuidará de filtrar o objeto.
‫Então, vamos fazer isso aqui.
‫FilterObj,
‫que pegará um objeto e então
‫os parâmetros restantes para todos os campos permitidos.
‫E isso criará basicamente
‫um array contendo todos os argumentos que passamos.
‫Então, basicamente, isso foi passado após este primeiro.
‫Nesse caso, é um array contendo nome e e-mail.
‫Então o que precisamos
‫fazer agora é basicamente percorrer o objeto e para cada elemento
‫verificar se é um dos
‫campos permitidos e, se for, simplesmente adicioná-lo a um novo
‫objeto, que iremos retornar no final .
‫E provavelmente existem maneiras mais eficientes de implementar
‫isso, mas vamos
‫fazer isso muito rápido aqui.
‫Então, vamos fazer um
‫loop no objeto dizendo Object. chaves do objeto que passamos.
‫Portanto, essa é uma das maneiras fáceis de
‫percorrer um objeto em JavaScript.
‫Então, isso aqui basicamente retorna um array contendo todos os
‫nomes de chave, então os
‫nomes dos campos deste objeto, e então
‫podemos fazer um loop através deles.
‫Então, nossa função de retorno de chamada.
‫E para cada elemento, isso é o que faremos.
‫Portanto, se a matriz de campo permitida inclui
‫o elemento atual, ou seja, o nome do campo atual, queremos
‫adicioná-lo a um novo objeto.
‫Então, vamos criar esse aqui
‫rapidamente, então const newObj que está vazio
‫por enquanto e,
‫no final, é o que vamos devolver.
‫Tão novoObj.
‫Portanto, se o campo atual for um dos campos
‫permitidos, então newObj com o nome do campo do campo atual, deve ser igual
‫a tudo o que está no objeto no elemento atual,
‫portanto, o nome do campo atual.
‫Portanto, não faça isso se parecer
‫um pouco confuso, novamente é apenas JavaScript
‫padrão, não tem nada a ver com JS ou eXpress ou
‫qualquer coisa assim.
‫Então, novamente, tudo o que fazemos aqui é basicamente percorrer
‫todos os campos que estão no objeto e, em
‫seguida, para cada campo,
‫verificamos se é um dos campos permitidos.
‫E se for, então criamos um novo campo no novo objeto,
‫é claro com
‫o mesmo nome, então ainda nomeia o elemento, com exatamente
‫o mesmo valor que tem no objeto original.
‫E então, no final, é claro, nós devolvemos aquele.
‫E agora tudo isso deve estar funcionando aqui.
‫Então, tudo o que precisamos fazer
‫no final é enviar esse usuário atualizado para o cliente.
‫Então, usuário.
‫Agora, é claro, precisamos colocar o udatedUser aqui,
‫salvá-lo novamente e agora deve funcionar.
‫Veja realmente o que fizemos aqui foi ..
‫atualizamos o usuário por
‫último e, antes de fazermos isso, filtramos os nomes
‫de campo indesejados que não podem ser atualizados.
‫Então, vamos tentar isso agora.
‫E este usuário aqui é um usuário normal, então acabamos de
‫criá-lo, lembre-se com
‫o nome de J.
‫Então, vamos dar uma olhada rápida no Compass.
‫Portanto, é um usuário normal, com o nome J.
‫E agora vamos atualizar
‫o nome e também tentar atualizar a função,
‫o que novamente não é permitido.
‫Mas para ver se nosso código está funcionando, vamos tentar.
‫Então, já existe o nome, e digamos que
‫sejamos um usuário
‫mal-intencionado tentando mudar nossa função para administrador.
‫Então, tudo está correto eu acho,
‫então vamos enviar isso
‫agora, e de fato aqui está nosso objeto atualizado.
‫Então, temos nosso novo nome, que é Jonas Schmedtmann,
‫e a função, que ainda é usuário.
‫Não atualizou a função de administrador.
‫Perfeito. Isso é exatamente o que queríamos.
‫Então, salve isso e vamos voltar e, na
‫verdade, acabamos de terminar este vídeo.
‫Em seguida, implementaremos uma funcionalidade de
‫exclusão do usuário atual.
‫Então trabalhamos na atualização, em seguida queremos permitir que um
‫usuário basicamente se exclua quando não quiser mais
‫fazer parte de nosso aplicativo.