/backend_todolist

Aplicação backend em NodeJs integrada com MongoDB

Primary LanguageJavaScript

Bem vindo(a) ao repositório do projeto To-do List Api.

Contexto

API (Application Programming Interface) desenvolvida em NodeJS com MongoDB e MongoDB Atlas. Utiliza arquitetura em camadas (MSC - Model Service Controllers) e constitui parte integrante de uma aplicação fullstack com o objetivo de fazer o gerenciamento de uma lista de tarefas a partir da criação, atualização e remoção de cada tarefa. Estas operações podem ser realizadas por usuários previamente cadastrados, através de uma tela de cadastro, tendo o acesso à tela de tarefas através de uma tela de login.


Veja a aplicação no ar por este link: https://frontend-todolist.vercel.app/register

Acesse a parte de front-end deste projeto em: https://github.com/cristianocsl/frontend_todolist


Rotas

Para as requisições a seguir deve ser utilizado este link: https://backend-todo-list-cristiano.herokuapp.com

Registro do usuário

Endpoint POST /register

  • o corpo da requisição deve ter o seguinte formato:
{
  "name": "Nome do Usuário",
  "email": "email@exemplo.com",
  "password": "senhasenha",
}
  • name deve ser uma string com três ou mais caracteres;

  • email deve ser uma string e ter formato compatível com email;

  • senha deve ser uma string com 6 ou mais caracteres;

Casos de falha na requisição para a rota /register:

Casos de falha na validação da requisição terão resposta com status 400 e uma mensagem de erro como os exemplos abaixo:

Campo name não preenchido:

{
  "message": "\"name\" is not allowed to be empty"
}

Campo email não preenchido:

{
  "message": "\"email\" is not allowed to be empty"
}

Campo password não preenchido:

{
  "message": "\"password\" is not allowed to be empty"
}

Campo name com menos de três caracteres:

{
  "message": "\"name\" length must be at least 3 characters long"
}

Campo password com menos de 6 carecteres:

{
  "message": "\"password\" length must be at least 6 characters long"
}

Campo email com formato inválido:

{
  "message": "\"email\" must be a valid email"
}

Campo email com email que já existe no banco de dados (status 409):

{
  "message": "User already registered"
}

Caso de sucesso na requisição para a rota /register:

Casos de sucesso na validação da requisição terão resposta com status 201, uma mensagem de sucesso acompanhada pelo nome do usuário e o token de acesso:

{
  "message": "User registered successfully!",
  "name": "my name",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MjI0MzkyZmNkYzVhODE4NGUxZDM0NmIiLCJuYW1lIjoiYXNkc2FkdyIsImVtYWlsIjoibGxsLWNjcmlzdGlhbm5vQGdtYWlsLmNvbSIsImlhdCI6MTY0NjU0MTEwNCwiZXhwIjoxNjQ3NzUwNzA0fQ.IJmBCQLwpqgMIczzYSO5t3FFqcNTVdmtN-k2WNar2ls"
}

Login do usuário

Endpoint POST /login

  • o corpo da requisição deve ter o seguinte formato:
{
  "email": "email@exemplo.com",
  "password": "senhasenha",
}
  • email deve ser uma string e ter formato compatível com email;

  • senha deve ser uma string com 6 ou mais caracteres;

Casos de falha na requisição para a rota /login:

Casos de falha na validação da requisição terão resposta com status 400 e uma mensagem de erro como os exemplos abaixo:

Campo email não preenchido:

{
  "message": "\"email\" is not allowed to be empty"
}

Campo password não preenchido:

{
  "message": "\"password\" is not allowed to be empty"
}

Campo email com formato inválido:

{
  "message": "\"email\" must be a valid email"
}

Campo password com menos de 6 carecteres:

{
  "message": "\"password\" length must be at least 6 characters long"
}

Campo email com um email que não existe no banco de dados:

{
  "message": "User does not exist or email is incorrect"
}

Campo senha com uma senha diferente da que existe no banco de dados:

{
  "message": "Incorrect passoword"
}

Caso de sucesso na requisição para a rota /login:

Casos de sucesso na validação da requisição terão resposta com status 200, uma mensagem de sucesso acompanhada pelo nome do usuário e o token de acesso:

{
  "message": "Login successfully!",
  "name": "my name",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MjI0MzkyZmNkYzVhODE4NGUxZDM0NmIiLCJuYW1lIjoiYXNkc2FkdyIsImVtYWlsIjoibGxsLWNjcmlzdGlhbm5vQGdtYWlsLmNvbSIsImlhdCI6MTY0NjU0MTEwNCwiZXhwIjoxNjQ3NzUwNzA0fQ.IJmBCQLwpqgMIczzYSO5t3FFqcNTVdmtN-k2WNar2ls"
}

Criando tarefas

Endpoint POST /task

  • o corpo da requisição deve ter o seguinte formato:
{
  "task": "Minha tarefa de hoje",
}

Casos de falha na requisição para a rota POST /task:

Casos de falha na validação da requisição terão resposta com status 400 e a seguinte mensagem de erro:

Campo task não preenchido:

{
  "message": "\"task\" is not allowed to be empty"
}

Caso de falha na requisição devido a token terá como resposta o status 401 acompanhado da seguinte mensagem:

Caso de token inválido ou expirado:

{
  "message": "Expired or invalid token"
}

Caso de sucesso na requisição para a rota POST /task:

Casos de sucesso na validação da requisição terão resposta com status 201 e um objeto json com as seguintes chaves:

  • _id: identificador da tarefa criada;
  • task: tarefa inserida pelo usuário;
  • userId: identificador do usuário, criado no momento de seu cadastro no banco de dados;
  • createdAt: data de criação da tarefa, inserida automaticamente no momento de sua criação;
  • status: classificador do estado da tarefa criada, que, no momento da criação da tarefa, é automaticamente definido como "To do", podendo ser modificado pelo usuário após a criação da tarefa.
{
  "_id": "6224cc1d512edf339950f1f8",
  "task": "Minha tarefa de hoje",
  "userId": "6224392fcdc5a8184e1d346b",
  "createdAt": "06/03/2022 11:58:37",
  "status": "To do"
}

Visualizando tarefas criadas

Endpoint GET /task

Casos de falha na requisição para a rota GET /task:

Caso de falha na requisição devido a token terá como resposta o status 401 acompanhado da seguinte mensagem:

Caso de token inválido ou expirado:

{
  "message": "Expired or invalid token"
}

Caso de sucesso na requisição para a rota GET /task:

Casos de sucesso na validação da requisição terão resposta com status 200 com a seguinte estrutura:

[
  {
    "_id": "6224cc1d512edf339950f1f8",
    "task": "Minha tarefa número 1 de hoje",
    "userId": "6224392fcdc5a8184e1d346b",
    "createdAt": "06/03/2022 11:58:37",
    "status": "To do"
  },
  {
    "_id": "6224d588512edf339950f1f9",
    "task": "Minha tarefa número 2 de hoje",
    "userId": "6224392fcdc5a8184e1d346b",
    "createdAt": "06/03/2022 12:38:48",
    "status": "To do"
  }
]

Atualizando tarefas criadas

Endpoint PUT /task/:taskId

Casos de falha na requisição para a rota PUT /task/:taskId:

Casos de falha na validação da requisição terão resposta com status 400 e a seguinte mensagem de erro:

Campo task não preenchido:

{
  "message": "\"task\" is not allowed to be empty"
}

Caso de falha na requisição devido a um identificador incorreto da tarefa terá como resposta o status 404 acompanhado da seguinte mensagem:

Caso de identificador incorreto da tarefa:

{
  "message": "Task does not exist"
}

Caso de falha na requisição devido a um identificador da tarefa com tamanho incompatível com o do identificador do MongoDB terá como resposta o status 400 acompanhado da seguinte mensagem:

Caso de identificador com tamanho incompatível com o do mongodb:

{
  "message": "Mongodb id must be 24 characters"
}

Caso de sucesso na requisição para a rota PUT /task/:taskId:

Casos de sucesso na validação da requisição terão resposta com status 200 com a seguinte mensagem:

{
  "message": "Task updated successfully"
}

Removendo tarefas criadas

Endpoint DELETE /task/:taskId

Casos de falha na requisição para a rota DELETE /task/:taskId:

Caso de falha na requisição devido a um identificador incorreto da tarefa terá como resposta o status 404 acompanhado da seguinte mensagem:

Caso de identificador incorreto da tarefa:

{
  "message": "Task does not exist"
}

Caso de falha na requisição devido a um identificador da tarefa com tamanho incompatível com o do identificador do MongoDB terá como resposta o status 400 acompanhado da seguinte mensagem:

Caso de identificador com tamanho incompatível com o do mongodb:

{
  "message": "Mongodb id must be 24 characters"
}

Caso de sucesso na requisição para a rota DELETE /task/:taskId:

Caso de sucesso na validação da requisição terá resposta com status 204 e ausência de mensagem.

Ferramentas utilizadas

  • Javascript;
  • MongoDB Atlas: serviço de banco de dados de documentos em nuvem global para aplicações modernas;
  • Node.js;
  • Heroku: plataforma de hospedagem, configuração, testagem e publicação de projetos virtuais na nuvem.

Bibliotecas

  • body-parser: analise dos corpos de solicitação de entrada em um middleware antes de seus manipuladores;
  • cors: habilita requisições do front-end;
  • date-fns: conversão e opções de formato de datas;
  • dotenv: carrega variáveis de ambiente para deploy;
  • Express: criação e manipulação de rotas;
  • eslint: padrão de estilização de código;
  • http-status-codes: facilitar legibilidade dos códigos http;
  • joi: validação de requisições;
  • jsonwebtoken: realiza autenticação entre duas partes por meio de um token assinado que autentica uma requisição web;
  • bcrypt: criptografia;
  • mongodb: comunicação com bancos de dados;
  • nodemon: permite modo watch do servidor durante o desenvolvimento.

Implementações futuras

  • cobertura de testes;

Contatos


Autor

Cristiano Seabra de Lima
Desenvolvedor WEB FullStack em constante aprendizado e entusiasta por tecnologia e sua força transformadora no mundo!