A API é referente a uma aplicação de agenda digital, onde um cliente pode criar um perfil, cadastrar, atualizar ou deletar os seus contatos.
- bcryptjs: "^2.4.3",
- cors: "^2.8.5",
- dotenv: "^16.0.3"
- express: "^4.18.2"
- express-async-errors: "^3.1.1"
- jsonwebtoken: "^9.0.0"
- pdfkit: "^0.13.0"
- pg: "^8.11.0"
- pg-format: "^1.0.4"
- reflect-metadata: "^0.1.13">
- typeorm: "0.3.15"
- zod: "^3.21.4"
Visão geral do projeto, um pouco das tecnologias usadas.
A URL base da aplicação: http://localhost:3000
Diagrama DER da API definindo tabelas utilizadas e seus relacionamentos no banco de dados.
Clone o projeto em sua máquina e instale as dependências com o comando:
yarn
Em seguida, crie um arquivo .env, copiando o formato do arquivo .env.example:
cp .env.example .env
Configure suas variáveis de ambiente com suas credenciais do PostgresSQL e uma nova database da sua escolha.
Execute as migrations com o comando:
yarn typeorm migration:generate src/migrations/create<nome-da-class> -d src/data-source.ts
yarn typeorm migration:run -d src/data-source.ts
Na aplicação foi usada a biblioteca jsonwebtoken para criação de token e autenticação do cliente.
A tabela clients é definida como:
Campo | Tipo | Descrição |
---|---|---|
id | number | Identificador único do cliente |
name | string | O nome do cliente. |
string | O e-mail do cliente. | |
password | string | A senha de acesso do cliente |
phone | string | O telefone do cliente |
image | text | A imagem do cliente |
gender | string | enum com as opções: "male", "female", "no binary", "I prefer not to say" |
registerDate | timestamp | O registro do cadastro do cliente, contendo data e hora |
Método | Rota | Descrição |
---|---|---|
POST | /clients | Criação de um cliente. |
GET | /clients | Lista todos os clientes. |
GET | /clients/:id | Lista um cliente, usando seu ID como parâmetro |
PATCH | /clients/:id | Atualiza um cliente, usando seu ID como parâmetro |
DELETE | /clients/:id | Deleta um cliente, usando seu ID como parâmetro |
POST /clients
Host: http://localhost:3000
Authorization: None
Content-type: application/json
{
"name": "Alexandra",
"email": "alexandra@mail.com",
"password": "1234",
"phone": "2198215-2935",
"gender": "female"
}
{
"name": "Alexandra",
"email": "alexandra@mail.com",
"phone": "2198215-2935",
"image": null,
"gender": "female",
"id": 3,
"registerDate": "2023-05-25T20:18:18.418Z"
}
OBS: Não há retorno da senha na resposta da requisição.
GET /clients
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body.
[
{
"name": "Nathalia",
"email": "nath@mail.com",
"phone": "2198996-2345",
"image": null,
"gender": "female",
"id": 1,
"registerDate": "2023-05-25T15:48:28.349Z"
},
{
"name": "alexandra miranda",
"email": "alexandra@mail.com",
"phone": "21989524732",
"image": "https://media.licdn.com/dms/image/D4D35AQEVMxuoL3lcZQ/profile-framedphoto-shrink_200_200/0/1674832023995?e=1685797200&v=beta&t=i0NK_gXPxyzEMhvXsva448x31LWDz9LSGctSTTLT9bo",
"gender": "female",
"id": 6,
"registerDate": "2023-05-27T13:07:56.267Z"
},
{
"name": "Juliana Airana",
"email": "julis@mail.com",
"phone": "21989524732",
"image": "https://media.licdn.com/dms/image/D4D35AQHDH8qFcKr5Lg/profile-framedphoto-shrink_200_200/0/1674830745435?e=1685804400&v=beta&t=49POXym0IkqK7mprhTMLjVbQ7xIN7PIPcJfBcPKrdR4",
"gender": "female",
"id": 7,
"registerDate": "2023-05-27T14:49:18.597Z"
}
]
GET /clients/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body.
{
"client": {
"name": "alexandra miranda",
"email": "alexandra@mail.com",
"phone": "21989524732",
"image": "https://media.licdn.com/dms/image/D4D35AQEVMxuoL3lcZQ/profile-framedphoto-shrink_200_200/0/1674832023995?e=1685797200&v=beta&t=i0NK_gXPxyzEMhvXsva448x31LWDz9LSGctSTTLT9bo",
"gender": "female",
"id": 6,
"registerDate": "2023-05-27T13:07:56.267Z"
},
"contacts": [
{
"id": 5,
"fullName": "Junior",
"email": "junior@mail.com",
"phone": "21982150583",
"registerDate": "2023-05-29T01:15:59.044Z",
"gender": "male"
},
{
"id": 4,
"fullName": "Paulo Santos",
"email": "paulo@mail.com",
"phone": "21989964562",
"registerDate": "2023-05-28T23:19:37.833Z",
"gender": "male"
},
{
"id": 8,
"fullName": "Juliana Airana",
"email": "julis@mail.com",
"phone": "21989524733",
"registerDate": "2023-05-29T19:16:41.081Z",
"gender": "female"
}
]
}
OBS: Nesta rota há o array de contacts na resposta da requisição.
PATCH /clients/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
{
"email": "alexandra86@mail.com"
}
{
"name": "Alexandra",
"email": "alexandra86@mail.com",
"phone": "2198215-2935",
"image": null,
"gender": "female",
"id": 3,
"registerDate": "2023-05-25T20:18:18.418Z"
}
DELETE /clients/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body
Retorna apenas o status 204.
POST /login
Host: http://localhost:3000
Authorization: None
Content-type: application/json
{
"email": "alexandra@mail.com",
"password": "1234",
}
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImFsZXhhbmRyYUBtYWlsLmNvbSIsImlhdCI6MTY4NTQ3NjAwMywiZXhwIjoxNjg1NTYyNDAzLCJzdWIiOiI2In0.xa0amJ3kE3-Pjl8ifzwKhAxaQUN2Ngu1l2boKkD4iLM"
}
A tabela contacts é definida como:
Campo | Tipo | Descrição |
---|---|---|
id | number | Identificador único do contato |
fullName | string | O nome do contato. |
string | O e-mail do contato. | |
phone | string | O telefone do contato |
gender | string | enum com as opções: "male", "female", "Not binary", "Not informed" |
registerDate | timestamp | O registro do cadastro do contato, contendo data e hora |
Método | Rota | Descrição |
---|---|---|
POST | /contacts | Criação de um contato. |
GET | /contacts | Lista todos os contatos. |
GET | /contacts/:id | Lista um contato, usando seu ID como parâmetro |
PATCH | /contacts/:id | Atualiza um contato, usando seu ID como parâmetro |
DELETE | /contacts/:id | Deleta um contato, usando seu ID como parâmetro |
POST /contacts
Host: http://localhost:3000
Authorization: None
Content-type: application/json
{
"fullName": "Luciano Almeida",
"phone": "21985164220",
"gender": "male",
"email": "luciano@mail.com"
}
{
"fullName": "Luciano Almeida",
"email": "luciano@mail.com",
"phone": "21985164220",
"gender": "male",
"id": 7,
"registerDate": "2023-05-29T01:19:05.659Z"
}
GET /contacts
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body.
[
{
"fullName": "Felipe Santos",
"email": null,
"phone": "21989964562",
"gender": "male",
"id": 1,
"registerDate": "2023-05-25T15:49:11.754Z"
},
{
"fullName": "Paulo Santos",
"email": "paulo@mail.com",
"phone": "21989964562",
"gender": "male",
"id": 3,
"registerDate": "2023-05-25T19:56:16.157Z"
}
]
GET /contacts/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body.
{
"fullName": "Junior",
"email": "junior@mail.com",
"phone": "21982150583",
"gender": "male",
"id": 5,
"registerDate": "2023-05-29T01:15:59.044Z",
"client": {
"name": "alexandra miranda",
"email": "alexandra@mail.com",
"phone": "21989524732",
"image": "https://media.licdn.com/dms/image/D4D35AQEVMxuoL3lcZQ/profile-framedphoto-shrink_200_200/0/1674832023995?e=1685797200&v=beta&t=i0NK_gXPxyzEMhvXsva448x31LWDz9LSGctSTTLT9bo",
"gender": "female",
"id": 6,
"registerDate": "2023-05-27T13:07:56.267Z"
}
}
OBS: Nesta rota há o objeto client na resposta da requisição.
PATCH /contacts/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
{
"email": "paulo@mail.com"
}
{
"fullName": "Paulo Santos",
"email": "paulo@mail.com",
"phone": "21989964562",
"gender": "male",
"id": 3,
"registerDate": "2023-05-25T19:56:16.157Z"
}
DELETE /contacts/:id
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Não possui body
Retorna apenas o status 204.
Parâmetro | Tipo | Descrição |
---|---|---|
id | number | Identificador único do cliente (Client) |
Vazio
200 OK
{
"client": {
"name": "alexandra miranda",
"email": "alexandra@mail.com",
"phone": "21989524732",
"image": "https://media.licdn.com/dms/image/D4D35AQEVMxuoL3lcZQ/profile-framedphoto-shrink_200_200/0/1674832023995?e=1685797200&v=beta&t=i0NK_gXPxyzEMhvXsva448x31LWDz9LSGctSTTLT9bo",
"gender": "female",
"id": 6,
"registerDate": "2023-05-27T13:07:56.267Z"
},
"contacts": [
{
"id": 5,
"fullName": "Junior",
"email": "junior@mail.com",
"phone": "21982150583",
"registerDate": "2023-05-29T01:15:59.044Z",
"gender": "male"
},
{
"id": 4,
"fullName": "Paulo Santos",
"email": "paulo@mail.com",
"phone": "21989964562",
"registerDate": "2023-05-28T23:19:37.833Z",
"gender": "male"
},
{
"id": 8,
"fullName": "Juliana Airana",
"email": "julis@mail.com",
"phone": "21989524733",
"registerDate": "2023-05-29T19:16:41.081Z",
"gender": "female"
}
]
}
Código do Erro | Descrição |
---|---|
404 Not Found | "message": "Client not found!" |
GET /listContacts/
Host: http://localhost:3000
Authorization: esta rota necessita do token do cliente para acesso
Content-type: application/json
Vazio
200 OK
pdf
| 401 Unauthorized | You don`t have permissions or invalid token. |