Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/caioagiani/api-restful

API RESTful - NoSQL MongoDB, JWT & Jest
https://github.com/caioagiani/api-restful

api crud express mongodb restful-api

Last synced: 7 days ago
JSON representation

API RESTful - NoSQL MongoDB, JWT & Jest

Awesome Lists containing this project

README

        


API RESTful

API RESTful - NoSQL MongoDB



[![Status](https://img.shields.io/badge/status-active-success.svg)]()
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](/LICENSE)

## Apresentação:

Projeto BackEnd: API RESTful seguindo conceito **MVC** utilizando Stack **NodeJS**, padronizado o código com **Eslint** e **Prettier**.

Pacotes principais: **Express** responsável pela criação de rotas, Middleware **JWT** para persistência do token por 30minutos, mantendo a segurança e credêncial do usuário, ORM **Mongoose** para conexão com banco de dados NoSQL (**MongoDB**) e por fim, **Jest** para realização de tests.

Rotas mapeada do arquivo exportado Insominia: `Insomnia.json`

## Requisitos

#### Sign up

- [x] Este endpoint deverá receber um usuário com os seguintes campos: nome,
email, senha e uma lista de objetos telefone.

```java
{
"nome": "string",
"email": "string",
"senha": "senha",
"telefones": [
{
"numero": "123456789",
"ddd": "11"
}
]
}
```

- [x] Usar status codes de acordo
- [x] Em caso de sucesso irá retornar um usuário mais os campos:

* **id**: id do usuário (pode ser o próprio gerado pelo banco, porém seria interessante
se fosse um GUID
* **data_criacao**: data da criação do usuário
* **data_atualizacao**: data da última atualização do usuário
* **ultimo_login**: data do último login (no caso da criação, será a mesma que a
criação)
* **token**: token de acesso da API (pode ser um GUID ou um JWT)

- [x] Caso o e-mail já exista, deverá retornar erro com a mensagem "E-mail já
existente".
- [x] Token deverá ser persistido junto com o usuário

#### Sign in

- [x] Este endpoint irá receber um objeto com e-mail e senha.
- [x] Caso o e-mail exista e a senha seja a mesma que a senha persistida, retornar
igual ao endpoint de `sign_up`.
- [x] Caso o e-mail não exista, retornar erro com status apropriado mais a mensagem
"Usuário e/ou senha inválidos"
- [x] Caso o e-mail exista mas a senha não bata, retornar o status apropriado 401
mais a mensagem "Usuário e/ou senha inválidos"

#### Buscar usuário

- [x] Chamadas para este endpoint devem conter um header na requisição de
Authentication com o valor "Bearer {token}" onde {token} é o valor do token
passado na criação ou sign in de um usuário.
- [x] Caso o token não exista, retornar erro com status apropriado com a mensagem
"Não autorizado".
- [x] Caso o token exista, buscar o usuário pelo user_id passado no path e comparar
se o token no modelo é igual ao token passado no header.
- [x] Caso não seja o mesmo token, retornar erro com status apropriado e mensagem
"Não autorizado"
- [x] Caso seja o mesmo token, verificar se o último login foi a MENOS que 30
minutos atrás.
- [x] Caso não seja a MENOS que 30 minutos atrás, retornar erro com status
apropriado com mensagem "Sessão inválida".
- [x] Caso tudo esteja ok, retornar o usuário.

## Instação:

- Variável de ambiente `.env.example`:

```java
SECRET_JWT=XXX
MONGO_CONN=mongodb+srv://:@cluster0-okpdn.gcp.mongodb.net/api
```

- Instalar dependências: `yarn install` ou `npm install`
- Iniciar aplicação em modo de desenvolvimento: `yarn dev:start` ou `npm run dev:start`.
- Deploy da aplicação: `yarn start`
- Tests Jest: `yarn test`

## Rotas

**POST** `localhost:3333/user/create`

```java
{
"name": "Caio Agiani",
"email": "[email protected]",
"password": "123",
"telefones": [
{
"numero": "999865802",
"ddd": "11"
},
{
"numero": "999865802",
"ddd": "11"
}
]
}
```

**POST** `localhost:3333/login`

```java
{
"email": "[email protected]",
"password": "123"
}
```

**GET** `localhost:3333/user/:user_id`

Observação importante: rota `/user/:user_id` é necessário passsar no **header** o parâmetro **authentication** contendo o Token Bearer coletado na rota `login`

## Test

```javascript
caio-agiani in api-restful on  master [!] took 2s ❯ yarn test
yarn run v1.22.5
$ jest --setupFiles dotenv/config --detectOpenHandles --forceExit
PASS tests/api.test.js
Authentication
✓ should create session authentication (1233 ms)
Login
✓ should create user session (131 ms)
User
✓ should list user by id (9 ms)

Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 2.136 s
Ran all test suites.
Done in 2.58s.
```

## Contato

- [LinkedIn](https://www.linkedin.com/in/caioagiani/)
- [email protected]