Projeto construído em Node.js e Typescript.
- Sobre
- Iniciando
- Mecanismo: Esqueci minha senha
- Deploy
- Uso
- Construído utilizando
- Log das requisições
- Autor
API para registrar usuários e recomendar playlists de músicas se baseando na temperatura atual da cidade natal do usuário.
Criado se baseando nos seguintes requisitos:
[ x ] A api precisa registrar os seguintes campos do usuário: (Nome, E-mail, Senha, Notas Pessoais, Cidade Natal).
[ x ] Notas pessoais e senha não devem estar visíveis no banco de dados.
[ x ] A rota de autenticação deve funcionar com o método JWT.
[ x ] A api deve fornecer um mecanismo de redefinição e esquecimento de senha.
[ x ] Criar um log de todos os requests para uma futura auditoria.
[ x ] Com base na cidade natal e na temperatura atual, é necessário recomendar a lista de reprodução, como segue: i) se a temperatura (celcius) estiver acima de 30 graus, sugerir faixas para a festa (party); ii) caso a temperatura esteja entre 15 e 30 graus, sugira faixas de música pop; iii) Se estiver um pouco frio (entre 10 e 14 graus), sugira faixas de música rock. iv) Caso contrário, se estiver frio lá fora, sugere faixas de música clássica (classical).
Observação:
Este projeto se utiliza das apis externas Spotify para a sugestão das playlists e OpenWeather para pegar a temperatura atual da cidade natal.
-
POST /users
: Rota para cadastrar usuários. O corpo da requisição deve conter os seguintes campos: name; email; password; personal_notes; hometown. O response da requisição traz o cadastro realizado com todos os campos, incluindo o id gerado. -
POST /sessions
: Rota para criar a sessão do usuário. O corpo da requisição deve conter os seguintes campos: email; password. O response da requisição traz todos os dados do usuário e o token JWT que tem validade de 2 horas. -
GET /playlists
: Rota para sugerir as playlists de acordo com a temperatura da cidade natal do usuário. Essa requisição não precisa ter um corpo, porém, é necessário incluir uma autenticação do tipo Bearer (Token).Observação:
É através do token que a api sabe qual é a cidade natal do usuário (Token Payload). -
POST /password/forgot
: Rota com o mecanismo de 'esqueci minha senha'. O corpo da requisição deve conter o seguinte campo: email. A resposta da requisição traz um token que será usado no reset da senha. -
POST /password/reset
: Rota para resetar a senha do usuário. O corpo da requisição deve conter os seguintes campos: password (o novo password escolhido pelo usuário), token (esse token é obtido pelo mecanismo /password/forgot).
A solicitação é feita passando apenas o e-mail no corpo da requisição. Internamente, o sistema gera um token (UUID) e grava essa informação juntamente com o id do usuário em uma tabela dentro do banco de dados chamada user_tokens. Internamente, o sistema verifica se está em ambiente de desenvolvimento e envia um e-mail utilizando o serviço Ethereal (fake smtp service). É possível ver o resultado disso no console.
A ideia é implementar isso também em produção, porém, utilizando algum serviço real, como por exemplo: Amazon SES Smpt. (Entrará nos próximos passos).
Com isso, quem solicitou irá receber um e-mail com um link e o token para identificação.
Quando é realizado o reset passando o token (UUID), o sistema internamente verifica se está dentro do prazo de duas horas. É uma regra de negócio que implementei.
Você pode utilizar a API, está aqui: https://api-cnx.herokuapp.com
Observação:
É necessário utilizar algum sistema Rest Client, como por exemplo: Insomnia
Criar um fork do github
Executar na raiz do projeto o seguinte comando para instalar as dependências yarn install
ou npm install
Ter o Postgres instalado localmente ou uma imagem docker sendo executada.
Configurar os dados de acesso ao banco local no arquivo ormconfig.json
e criar o database postgres.
Configurar as variáveis de ambiente no arquivo .env.example
que está na raiz do projeto.
Observação:
Nesse arquivo será necessário você incluir suas informações pessoais que obtém junto ao Spotify e junto ao OpenWeather. Também será necessário definir uma chave para o token JWT.
Renomear o arquivo .env.example
para .env
yarn dev:server
Para logar todas as requisições da aplicação, estou utilizando duas ferramentas: Winston e Express Winston.
Porém a estratégia que adotei foi logar em arquivo, o que pode ser visto na raiz, em um arquivo chamado: requests.log.
Após a publicação no Heroku, notei que essa estratégia pode ser melhorada, de repente salvando no banco. (Entrará para uma próxima etapa).
Marcelo Silva
- Github: @marceloribeirosilva
- LinkedIn: @marcelors