‫Narrador: Neste vídeo,
‫usaremos um truque simples para evitar que
‫os usuários escrevam várias revisões para os mesmos
‫passeios, evitando basicamente revisões duplicadas.
‫Então, no último vídeo, criamos todas essas
‫análises para calcular as médias.
‫E criamos vários comentários para um tour,
‫mas todos do mesmo usuário.
‫Mas, na prática, isso não faz muito sentido, certo?
‫Portanto, no mundo real, cada
‫usuário deve revisar cada tour apenas uma vez.
‫Basicamente, uma revisão duplicada ocorre quando há uma
‫revisão com o mesmo usuário e o
‫mesmo ID de tour.
‫E é isso que queremos evitar que aconteça.
‫E a solução óbvia
‫aqui é apenas usar um índice exclusivo, certo?
‫No entanto, não é suficiente
‫definir esses dois campos como exclusivos.
‫E, na verdade, isso seria realmente
‫muito errado, porque significaria que cada tour pode receber apenas uma revisão
‫e cada usuário pode escrever apenas uma revisão.
‫E obviamente não é isso que queremos.
‫Então, o que precisamos é que os dois juntos sejam
‫únicos, para que a combinação de usuário e tour seja sempre única.
‫Parece um pouco complicado, mas, felizmente para
‫nós, é muito fácil de conseguir com índices.
‫Já criamos um índice composto no tour antes, e agora
‫vamos fazer o mesmo aqui nas revisões.
‫Então, novamente, bem aqui após a definição do
‫esquema e, claro, ainda estamos no modelo de revisão, certo?
‫Portanto, revise, e isso não está correto,
‫revise o índice de pontos do esquema ...
‫Tour definido como um e, mais uma vez, não é realmente importante se for
‫um ou menos um neste caso.
‫E o usuário também definido como um, ok.
‫E, novamente, é semelhante ao que
‫fizemos antes, mas aqui vamos levá-lo para o
‫próximo nível e agora adicionar um objeto para opções.
‫E a opção aqui que vamos definir é
‫única (digitação) definida
‫como verdadeira.
‫E é isso mesmo.
‫Isso vai conseguir exatamente o que queremos.
‫Portanto, agora cada combinação de tour e usuário
‫deve ser sempre única.
‫Então, vamos salvá-lo aqui,
‫ou dois, e depois testá-lo de verdade.
‫Agora, quando eu testei isso
‫pela primeira vez, na verdade não funcionou imediatamente.
‫Na verdade, só começou a funcionar no dia seguinte, e
‫não tenho certeza do porquê, mas se isso acontecer com
‫você, não se preocupe com isso, ok.
‫E talvez possa até acontecer agora, enquanto
‫estou gravando este vídeo.
‫De qualquer forma, no momento, não deve haver nenhuma crítica sobre a
‫turnê em que estávamos trabalhando.
‫Então, só para ter certeza de que ainda temos zero
‫avaliações e também que as avaliações estão vazias.
‫E então vamos agora mais
‫uma vez criar uma nova revisão neste tour.
‫OK.
‫Portanto, esta é uma revisão, um usuário e uma revisão.
‫É claro que isso deve funcionar, mas se eu
‫enviar novamente e digamos que configurei para quatro e diga
‫ok, então isso não deveria funcionar, ok.
‫Lembre-se de que ainda pode funcionar
‫devido ao problema que eu estava lhe contando antes.
‫Então, às vezes, esse tipo de índice não é definido imediatamente.
‫Oh, mas na verdade, no meu caso aqui funcionou imediatamente.
‫Portanto, obtemos esse erro de chave duplicada neste índice aqui, e
‫esse é exatamente o índice que acabamos de criar.
‫Então, vamos dar uma olhada nisso também aqui no Compass.
‫Então aqui realmente não está,
‫então farei exatamente como fiz antes
‫e reconectarei basicamente.
‫Então, indo para os recentes, então conectando aqui.
‫Natours ...
‫Então...
‫Claro que os
‫passeios e nossos índices aqui agora são esses quatro.
‫E então esse é o
‫que acabamos de criar, ou na verdade não é (risos), certo.
‫Então, por algum motivo, não está aqui, então
‫é isso que eu estava dizendo
‫antes, mas não se importe porque na verdade está funcionando em nosso código.
‫Ok, então não foi possível criar dois
‫comentários vindos do mesmo usuário.
‫Mas se você agora logar
‫como outra pessoa, bem, então certamente poderemos postar este comentário.
‫Então, vamos ver qual usuário podemos usar agora.
‫Então vamos trazer todos os usuários aqui, o
‫que não posso porque não sou um administrador (risos), ok.
‫Então, esqueci essa
‫parte e vou simplesmente recuperá-la do Compass.
‫Às vezes isso é mais fácil.
‫Então isso é um guia,
‫um usuário (exclama), então vamos usar esse Eduardo aqui ou algo assim.
‫Então, vamos fazer login como essa pessoa, como esse usuário.
‫Sim, com sucesso, e agora devemos ter
‫permissão para criar uma revisão e, de fato, aqui está, ok.
‫E se
‫agora atualizarmos isso, teremos nossas duas classificações, ótimo.
‫Agora, apenas testando novamente, então se
‫enviarmos novamente, não vai funcionar porque, novamente,
‫temos um erro duplicado.
‫Impressionante.
‫Há apenas mais uma coisa que
‫gostaria de mostrar a vocês e, para isso, vou efetuar
‫login como outra pessoa, ok, para que então possa criar outra revisão.
‫Então, desta vez, vou ser esse Max Smith.
‫E então vamos fazer login.
‫(cliques do
‫mouse) Ok, agora sou oficialmente o Max
‫e poderei postar esse comentário.
‫Então, com
‫cinco, sou capaz de fazer
‫isso e agora quero dar uma olhada na média.
‫Ok, agora é este 4. 6666, o que
‫obviamente não parece bom.
‫E podemos consertar isso no front end.
‫Por exemplo, quando solicitamos esses dados da
‫API e depois os exibimos,
‫poderíamos no front end fazer esse arredondamento.
‫Mas, na verdade, quero fazer isso aqui no back-end
‫para que o usuário final já obtenha esse valor arredondado final,
‫que neste caso seria 4. 7, certo?
‫E para fazer isso, vou mostrar a você um pequeno
‫recurso novo no Mongoose que ainda não usamos.
‫Então, vamos para o nosso modelo de
‫tour, e para essa média,
‫bem aqui.
‫E agora, podemos usar uma função setter.
‫(digitando) Então configure e
‫esta função será executada cada vez que um
‫novo valor for configurado para este campo, ok.
‫E aqui, geralmente especificamos uma função de retorno de chamada, que
‫recebe o valor atual.
‫E nesse caso, ele retorna basicamente esse valor,
‫mas arredondado.
‫Portanto, usamos o arredondamento de ponto matemático para o valor atual, mas o problema
‫com o arredondamento de ponto matemático
‫é que ele arredonda os valores para inteiros.
‫Por exemplo, se tivéssemos algo
‫assim, seria então arredondado para cinco, certo.
‫E não é isso que queremos.
‫Queremos que seja arredondado para 4. 7
‫Então, vamos usar
‫um truque aqui, que é bastante comum, multiplicar isso por 10
‫e, com isso, teríamos 46. 666, e
‫esse arredondado seria 47.
‫E então, dividimos os resultados por 10 novamente, e isso
‫dá 4. 7
‫Tudo bem, e é isso mesmo.
‫Então, novamente, uma função setter aqui que será
‫executada toda vez que houver um novo valor para
‫o campo de média de classificações.
‫Então, apenas para testar isso, vamos simplesmente atualizar esta
‫última revisão que adicionamos, que tinha um
‫cinco, e vamos mantê-lo em cinco.
‫Basicamente, tudo o que queremos fazer é executar
‫novamente a função que cria essa média.
‫Então, se eu fizer isso agora e fizer meu tour,
‫devemos conseguir 4. 7 aqui como a média.
‫E sim, aqui vamos nós.
‫Ótimo, e na verdade já é isso para este vídeo.
‫Por isso, criamos essa função configuradora bacana
‫e esse índice composto exclusivo aqui para garantir
‫que um usuário não
‫possa escrever várias avaliações para o mesmo tour.