Skip to content

Repository files navigation

Orderfy API

Orderfy é uma simples API RESTful para gerenciamento de pedidos, desenvolvida em Node.js com Express e PostgreSQL.

Stack

Instalação e Requisitos

É necessário ter as seguintes ferramentas instaladas:

Depois de instalar as ferramentas, execute os seguintes comandos:

# Copiar o arquivo exemplo de variáveis de ambiente e renomear para .env
cp .env.example .env

# Instalar dependências
npm install

# Buildar a imagem Docker e o banco de dados PostgreSQL (Precisa do Docker Desktop)
npm run docker

# Ou buildar diretamente, caso prefira
docker compose up -d

# Iniciar o servidor
npm run dev

Após isso, a API estará disponível em http://localhost:3000.

OBS: Se já tiver o PostgreSQL instalado, basta criar o banco de dados 'orderfy' com as credenciais do arquivo .env e executar o npm run dev, criando as tabelas automaticamente.


Endpoints

Abaixo é possível ver todos os endpoints disponíveis na API.

Para poder testar sem copiar os curls manualmente, siga o passo a passo a seguir:

O repositório inclui uma collection do Postman pronta para uso. Baixe o arquivo (orderfy-api.postman_collection.json) e importe-o no Postman.

Para importar o arquivo:

  1. Abra o Postman
  2. Clique em Import
  3. Selecione o arquivo orderfy-api.postman_collection.json
  4. Acesse a collection importada, escolha o endpoint desejado e clique em Send

Com isso, você pode testar os endpoints diretamente no Postman de maneira simplificada.

Autenticação

A API utiliza uma autenticação via JWT (JSON Web Token). Todos os endpoints de pedidos exigem um token válido no header Authorization para evitar acesso não autorizado.

Para autenticar, siga o passo a passo a seguir:

  1. Registre um usuário em POST /auth/register
  2. Faça login em POST /auth/login

Ao usar a collection do Postman, o token é salvo automaticamente na variável {{token}} após o login e enviado em todas as requisições de pedidos sem nenhuma configuração adicional.

Caso esteja testando via curl, envie o token manualmente no header:

Authorization: Bearer <token>

OBS: O token tem uma validade de 24 horas.

POST /auth/register

Registrar usuário.

Request body:

{
  "username": "admin",
  "password": "admin123"
}

curl:

curl --location 'http://localhost:3000/auth/register' \
--request POST \
--header 'Content-Type: application/json' \
--data '{
  "username": "admin",
  "password": "admin123"
}'

Response 201 Created:

{
  "id": 1,
  "username": "admin"
}

POST /auth/login

Login.

Request body:

{
  "username": "admin",
  "password": "admin123"
}

curl:

curl --location 'http://localhost:3000/auth/login' \
--request POST \
--header 'Content-Type: application/json' \
--data '{
  "username": "admin",
  "password": "admin123"
}'

Response 200 OK:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

POST /order

Criar pedido.

Request body:

{
  "numeroPedido": "v10089015vdb-01",
  "valorTotal": 10000,
  "dataCriacao": "2023-07-19T12:24:11.5299601+00:00",
  "items": [
    {
      "idItem": "2434",
      "quantidadeItem": 1,
      "valorItem": 1000
    }
  ]
}

curl:

curl --location 'http://localhost:3000/order' \
--request POST \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <token>' \
--data '{
  "numeroPedido": "v10089015vdb-01",
  "valorTotal": 10000,
  "dataCriacao": "2023-07-19T12:24:11.5299601+00:00",
  "items": [
    {
      "idItem": "2434",
      "quantidadeItem": 1,
      "valorItem": 1000
    }
  ]
}'

Response 201 Created:

{
  "orderId": "v10089015vdb-01",
  "value": "10000.00",
  "creationDate": "2023-07-19T12:24:11.530Z",
  "items": [
    {
      "id": 1,
      "orderId": "v10089015vdb-01",
      "productId": 2434,
      "quantity": 1,
      "price": "1000.00"
    }
  ]
}

GET /order/:orderId

Buscar pedido por ID.

curl:

curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request GET \
--header 'Authorization: Bearer <token>'

Response 200 OK:

{
  "orderId": "v10089015vdb-01",
  "value": "10000.00",
  "creationDate": "2023-07-19T12:24:11.530Z",
  "items": [
    {
      "id": 1,
      "orderId": "v10089015vdb-01",
      "productId": 2434,
      "quantity": 1,
      "price": "1000.00"
    }
  ]
}

GET /order/list

Listar todos os pedidos.

curl:

curl --location 'http://localhost:3000/order/list' \
--request GET \
--header 'Authorization: Bearer <token>'

Response 200 OK:

[
  {
    "orderId": "v10089015vdb-01",
    "value": "10000.00",
    "creationDate": "2023-07-19T12:24:11.530Z",
    "items": [
      {
        "id": 1,
        "orderId": "v10089015vdb-01",
        "productId": 2434,
        "quantity": 1,
        "price": "1000.00"
      }
    ]
  }
]

PUT /order/:orderId

Atualizar pedido.

curl:

curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request PUT \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <token>' \
--data '{
  "valorTotal": 20000,
  "dataCriacao": "2023-07-20T09:00:00.000+00:00",
  "items": [
    {
      "idItem": "2434",
      "quantidadeItem": 2,
      "valorItem": 10000
    }
  ]
}'

Response 200 OK:

{
  "orderId": "v10089015vdb-01",
  "value": "20000.00",
  "creationDate": "2023-07-20T09:00:00.000Z",
  "items": [
    {
      "id": 2,
      "orderId": "v10089015vdb-01",
      "productId": 2434,
      "quantity": 2,
      "price": "10000.00"
    }
  ]
}

DELETE /order/:orderId

Deletar pedido.

curl:

curl --location 'http://localhost:3000/order/v10089015vdb-01' \
--request DELETE \
--header 'Authorization: Bearer <token>'

Response 200 OK:

{
  "message": "Order 'v10089015vdb-01' deleted successfully."
}

Respostas de erro

Status Descrição
400 Bad Request Campos obrigatórios ausentes ou incorretos
401 Unauthorized Token ausente ou incorreto
404 Not Found Pedido não encontrado
409 Conflict Já existe um pedido ou usuário com esse ID
500 Internal Server Error Erro interno no servidor

Exemplo 401:

{
  "error": "Access denied. No token provided."
}

Exemplo 404:

{
  "error": "Order 'v10089015vdb-01' not found."
}

Estrutura do projeto

orderfy-api/
├── src/
│   ├── controllers/
│   │   ├── auth.controller.js    # Handlers de registro e login
│   │   └── order.controller.js   # Handlers e mapping dos campos
│   ├── database/
│   │   └── migrations.js         # Criação das tabelas no banco
│   ├── middleware/
│   │   └── auth.middleware.js    # Validação do token JWT
│   ├── models/
│   │   ├── user.model.js         # Queries SQL de usuários
│   │   └── order.model.js        # Queries SQL de pedidos
│   ├── routes/
│   │   ├── auth.routes.js        # Rotas de autenticação
│   │   └── order.routes.js       # Rotas de pedidos
│   └── db.js                     # Pool de conexão com o PostgreSQL
├── .env                          # Variáveis de ambiente
├── docker-compose.yml            # Imagem Docker do Projeto e do PostgreSQL
└── index.js                      # Arquivo principal da aplicação

Mapping dos campos

A API recebe os dados e faz o mapping necessário para salvar as informações no banco de dados, como no exemplo a baixo:

Recebido Salvo no banco
numeroPedido orderId
valorTotal value
dataCriacao creationDate
idItem productId
quantidadeItem quantity
valorItem price

Autor

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages