API GoBarber / NodeJS / Express / Typescript / SOLID
API GoBarber, aplicação que conecta prestadores de serviço (Barbeiros e Cabeleireiros) aos clientes em suas regiões. Aplicação montada durante o bootcamp GoStack aplicando todo o conhecimento adquirido durante a jornada. Neste projeto foi utilizada as melhores práticas na construção do projeto, com o uso das tecnologias TypeScript, Express, TypeORM em cima do Ambiente e execução de javascript, o NodeJS.
Faz parte do projeto GoBarber
:warning: Durante o desenvolvimento irei atualizando a lista de tecnologia
Uma API Rest, que retorna o conteúdo em JSON que vai ser consumida tanto por um Front-end em ReactJS quanto por uma aplicação Mobile Hibrido com React Native.
Requisitos funcionais:
[] 100% de cobertura de testes nos services da aplicação.
[] Tratamento de exceções global
Requisitos Não Funcionais:
- Framework da API - Express
- Linguagem de Programação - TypeScript
- Banco de dados utilizado na aplicação - Postgres
- ORM - TypeORM
- Lib de testes - Jest
- Utilizar Mailtrap para testar envios de email em ambiente de desenvolvimento
- Utilizar Amazon SES para envios de email em ambiente de Produção.
- Utilizar Eslint, Prettier e EditorConfig para padronizar o código em ambiente de desenvolvimento, com a style guide do AirBnb
Requisitos Funcionais:
[x] Criação de conta com (Nome, Email, Senha);
[] Envio de email confirmando criação de conta;
Requisitos Não Funcionais:
- Envio de email utilizando lib Nodemailer;
Regras de Negócio:
[] Não pode ser criado duas contas com o mesmo email;
[] O usuário deve confirmar a senha ao criar uma conta.
[] A senha deve ser Hasheada antes de ser gravada no banco de dados;
Requisitos Funcionais:
[] O usuário deve poder se Autenticar utilizando email e senha;
Requisitos Não Funcionais:
- A autenticação deve ser feita com Json Web Token (JWT);
Regras de Negócio:
[x] No payload do token deve ser armazenado o ID do usuário;
Requisitos Funcionais:
[x] O usuário deve poder recuperar sua senha informando o seu email;
[x] O usuário de receber um email com instruções de recuperação de senha;
[x] O usuário deve poder resetar sua senha ;
Requisitos Não Funcionais:
- Envio de email utilizando lib Nodemailer;
- O envio de email deve acontecer em segundo plano (background job);
Regras de Negócio:
[x] O link enviado por email para resetar a senha, deve expirar em 2h;
[x] O usuário precisa confirmar a nova senha ao resetar sua senha.
Requisitos Funcionais:
[] O usuário deve poder atualizar seu perfil (nome, email, senha, Avatar);
Regras de Negócio:
[x] O usuário não pode alterar seu email para um email ja em uso na aplicação
[x] Para atulizar sua senha, o usuário deve informar a senha antiga;
[x] Para atulizar sua senha, o usuário precisa confirmar a senha;
Requisitos Funcionais:
[] O prestador deve poder listar os seus agendamentos de um dia especifico;
[] O prestador deve poder receber uma notificação sempre que houver um novo agendamento;
[] O prestador deve poder visualizar as notificações não lidas;
Requisitos Não Funcionais:
- Os agendamentos devem ser armazenados em cache.
- As notificações do prestador devem ser armazenadas no MongoDB;
- As notificações do prestador devem ser enviadas em tempo-real utilizando Socket.io;
Regras de Negócio:
[] A notificação deve ter um status de lida ou não-lida para que o prestador possa controlar;
Requisitos Funcionais:
[] O usuário deve poder listar todos os prestadores de serviço cadastrados;
[] O usuário deve poder visualizar os dias de um mês com pelo menos um horário disponível de um prestador;
[] O usuário deve poder visualizar os horários disponíveis de um dia especifico de um prestador;
[] O usuário deve poder realizar um novo agendamento com um prestador;
[] O usuário deve poder listar os agendamentos já marcados;
[] O usuário deve poder cancelar um agendamento marcado.
Requisitos Não Funcionais:
- A listagem de prestadores devem ser armazenadas em cache.
Regras de Negócio:
[] Cada agendamento deve durar 1h exatamente;
[] Os agendamentos devem estar disponíveis entre 8h às 18h sendo o último agendamento iniciado as 17h;
[] O usuário não pode agendar em um horário já ocupado;
[] O usuário não pode agendar em um horário que já passou;
[] O usuário não pode agendar consigo mesmo;
Desafio realizado por Thiago Marinho de Oliveira.
Terminal: yarn typeorm migration:create -n CreateAppointments
yarn typeorm migration:run
yarn typeorm migration:revert
Ver quais migrations já foram executadas:
yarn typeorm migration:show