/gobarber-backend-ts

:satellite: API Restful para agendamentos de barbearia e prestações de serviços.

Primary LanguageHTML

Sobre:

O GoBarber é uma plataforma WEB e MOBILE para agendamentos de serviços de barbearia.

A API do GoBarber serve a plataforma WEB e Mobile disponível para Android e iOS. 📱

Importar rotas da aplicação:

Todas as rotas foram testadas utilizando o o do Insomnia. Para importar as rotas testadas para o Insomnia clique no botão:

Run in Insomnia}

Recursos da API:

🔒 Recuperação de senha

  • Permite que um usuário consiga recuperar a senha informando o e-mail cadastrado;
  • A API envia para o usuário um e-mail con instruções de recuperação de senha;
  • A API envia um link com token por e-mail para resetar a senha e por segurança o token enviado expira em 2h;
  • Cadastro e autenticação de usuários com geração de JwToken;
  • Autenticação de usuários com JwToken;

👥 Atualização de perfil de usuário

  • Permite usuário cadastrar-se e atualizar seu perfil (incluindo imagem de avatar);
  • Validação de e-mails no cadastro, não é possível cadastrar dois usuários com mesmo e-mail;
  • Para atualizar a senha, o usuário deve informar a senha antiga e a nova senha;

💻 Painel do Prestador de serviços (Barbeiro)

  • Lista os agendamentos do prestador de serviços de um dia específico;
  • O prestador recebe uma notificação sempre que houver um novo agendamento;
  • O prestador pode visualizar as notificações não lidas;
  • A notificação possui estado de lida ou não-lida para que o prestador de serviços consiga gerenciar suas notificações;
  • Os agendamentos do prestador no dia também são armazenados em cache para acelerar o carregamento;
  • As notificações do prestador de serviço são armazenadas no MongoDB;
  • As notificações do prestador de serviço são enviadas em tempo real utilizando Socket.io;

📅 Agendamento de serviços

  • O usuário pode listar todos os prestadores de serviços cadastrado;
  • O usuário pode listar os dias de um mês com pelo meos um horário disponível de um prestador de serviço;
  • O usuário pode listar os horários disponíveis em um dia específico de um prestador;
  • O usuário deve poder realizar um novo agendamento com um prestador;
  • Por padrão, cada agendamento possui duração de 1h;
  • Os agendamentos estão disponíveis das 8h00 às 18h00 (Primeiro às 8h, último às 17h);
  • Os usuário não pode agendar um serviços em uma data ou horário que já passou;
  • O usuário não pode agendar serviços consigo mesmo;
  • A listagem de prestadores é armazenada em cache para acelerar o carregamento;

Banco de Dados e estratégias de armazenamento:

Para banco de dados, foi utilizado o Postgres para armazenar os dados que envolvem relacionamentos da regra de negócio da aplicação, MongoDB para armazenar as notificações e Redis para lidar com filas de processamentos em segundo plano.

Ferramentas, Técnicas e Bibliotecas da API:

  • Utilização dos Princípios do SOLID;
  • Aplicação da metodologia TDD (Test-driven development);
  • Utilização do Jest para automatização de testes no ambiente de desenvolvimento;
  • Utilização do tsyringe para automatizar a injeção de dependência.
  • Utilizado o mailtrap para testar o envio de e-mails em ambiente de testes;
  • Para envio de e-mail em produção será utilizado o Amazon SES;
  • O envio de e-mail acontece em segundo plano utilizando filas de processamento (background job);
  • Upload de imagens com Multer;
  • Utilização do MongoDD para armazenar notificações;
  • Utilização do Socket.io para envio de notificações em tempo real;
  • Utilizado do Ethereal que é um SMTP Fake para testar o envio de e-mails em ambiente de testes;
  • Utilizado do Handlebars para template de e-mail em HTML5;
  • Utilização do Celebrate para validação de dados;
  • Utilização da biblioteca dotEnv para organizar as variaveis de ambiente da API;
  • Utilização da biblioteca class-transformer para definir os campos que deverão ser excluídos (como senhas) ou configurados (como link do avatar) nas entidades;
  • Utilização do driver ioredis para utilizar o Redis como cache de dados;
  • Utilização do node-rate-limiter-flexible para blindar a API contra ataques brute force;
  • Utilização da Amazon S3 para upload de imagens;
  • Utilização da biblioteca Mime para pegar o MIME extensão do arquivo (Ex: 'application/json', 'image/jpeg');
Rodrigo Gonçalves Santana - 2020