Store Manager

API RESTful desenvolvida com express e mysql2 no módulo de Backend da Trybe.

Sobre a Aplicação

Utilizando uma arquitetura em camadas (Model, Service e Controller) a aplicação realiza cadastro, consulta e edição de produtos e vendas. Abaixo um pequeno resumo de cada rota e endpoint desenvolvido nesse repositório

🐳 Rodando a aplicação com Docker

Clone o projeto, entre na raiz da aplicação e execute o comando

docker-compose up -d

e a aplicação estará ouvindo na porta local 3001 no container backend, e o banco de dados MySQL estará exposto na porta 3306.

O seu docker-compose precisa estar na versão 1.29 ou superior.

Rota Products

GET /products
Esse endpoint é responsável por retornar a lista de produtos cadastrados no serviço store_manager_db
  • cURL
    curl --request GET \
      --url 'http://localhost:3001/products'
  • RESPONSE:
    [
      {
        "id": 1,
        "name": "Martelo de Thor"
      },
      {
        "id": 2,
        "name": "Traje de encolhimento"
      },
      {
        "id": 3,
        "name": "Escudo do Capitão América"
      },
    ]
GET /products/search
Esse endpoint é responsável por retornar uma lista de produtos que incluam o termo de pesquisa passado como parâmetro "q" da requisição cadastrados no serviço store_manager_db
  • cURL

    curl --request GET \
      --url 'http://localhost:3001/products/search?q=Traje'
  • RESPONSE

    • Caso tenha algum match do termo com o campo name

      [
        {
          "id": 2,
          "name": "Traje de encolhimento"
        }
      ]
    • Caso não tenha algum match do termo com o campo name

      []
GET /products/search/:id
Esse endpoint é responsável por realizar uma pesquisa pelo id do produto no serviço store_manager_db
  • cURL

    curl --request GET \
      --url 'http://localhost:3001/products/1'
  • RESPONSE

    {
      "id": 1,
      "name": "Martelo de Thor"
    }
  • ERRORS

    {
      "message": "Product not found"
    }
POST /products
Esse endpoint é responsável por cadastrar um produto no store_manager_db
  • O Corpo da requisição deve conter a propriedade name com pelo menos 5 caracteres.

    {
      "name": "Rounded Shield"
    }
  • cURL

    curl --request POST \
      --url http://localhost:3001/products \
      --header 'Content-Type: application/json' \
      --data '{
      "name": "Rounded Shield"
        }'
  • RESPONSE

    {
      "id": 4,
      "name": "Rounded Shield"
    }
  • ERRORS

    • Caso a propriedade name não esteja presente no corpo da requisição
    {
      "message": "\"name\" is required"
    }
    • Caso name não possua pelo menos 5 caracteres
    {
      "message": "\"name\" length must be at least 5 characters long"
    }
PUT /products/:id
Esse endpoint é responsável por editar um produto já cadastrado no store_manager_db
  • O Corpo da requisição deve conter a propriedade name com pelo menos 5 caracteres.

    {
      "name": "Square Shield"
    }
  • cURL

    curl --request PUT \
      --url http://localhost:3001/products/3 \
      --header 'Content-Type: application/json' \
      --data '{
      "name": "Square Shield"
      }'
  • RESPONSE

    {
      "id": 3,
      "name": "Square Shield"
    }
  • ERRORS

    • Caso a propriedade name não esteja presente na requisição
    {
      "message": "\"name\" is required"
    }
    • Caso name não possua pelo menos 5 caracteres
    {
      "message": "\"name\" length must be at least 5 characters long"
    }
    • Caso o id do produto não seja encontrado no store_manager_db
    {
      "message": "Product not found"
    }
DELETE /products/:id
Esse endpoint é responsável por deletar um produto já cadastrado no store_manager_db
  • Este endpoint não retorna uma resposta, porém indica que a operação foi bem sucedida com status 204

  • cURL

curl --request DELETE \
  --url 'http://localhost:3001/products/3' 
  • ERRORS

    • Caso o id do produto não seja encontrado no store_manager_db
    {
      "message": "Product not found"
    }

Rota Sales

GET /sales
Esse endpoint é responsável por retornar a lista de pedidos cadastrados no serviço store_manager_db
  • cURL

    curl --request GET \
      --url 'http://localhost:3001/sales'
  • RESPONSE

    [
      {
        "saleId": 1,
        "productId": 1,
        "quantity": 5,
        "date": "2023-07-26T18:17:27.000Z"
      },
      {
        "saleId": 1,
        "productId": 2,
        "quantity": 10,
        "date": "2023-07-26T18:17:27.000Z"
      }
    ]
GET /sales/:id
Esse endpoint é responsável por buscar um pedido por id no serviço store_manager_db
  • cURL

    curl --request GET \
      --url 'http://localhost:3001/sales/1'
  • RESPONSE

    [
      {
        "productId": 1,
        "quantity": 5,
        "date": "2023-07-26T18:17:27.000Z"
      },
      {
        "productId": 2,
        "quantity": 10,
        "date": "2023-07-26T18:17:27.000Z"
      }
    ]
POST sales/
Esse endpoint é responsável por cadastrar um pedido por id no serviço store_manager_db, registrando a relação de produto e quantidade com o id do pedido
  • Exemplo do corpo da requisição

    [
      {
        "productId": 1,
        "quantity": 1
      },
      {
        "productId": 2,
        "quantity": 5
      }
    ]
  • cURL

    curl --request POST \
      --url http://localhost:3001/sales \
      --header 'Content-Type: application/json' \
      --data '[
      {
        "productId": 1,
        "quantity": 1
      },
      {
        "productId": 2,
        "quantity": 5
      }
    ]'
  • RESPONSE

    {
      "id": 3,
      "itemsSold": [
        {
          "productId": 1,
          "quantity": 1
        },
        {
          "productId": 2,
          "quantity": 5
        }
      ]
    }
  • ERRORS

    • Caso algum produto não possua a chave obrigatória como productId, ou quantity
    {"message": "\"quantity\" is required"}
    {"message": "\"productId\" is required"}
    • Caso algum productId não esteja registrado no store_manager_db
    {"message": "Product not found"}
    • Caso quantity seja um número igual ou menor a zero
    {"message": "\"quantity\" must be greater than or equal to 1"}
PUT sales/:saleId/products/:productId/quantity
Esse endpoint é responsável por alterar a quantidade de um produto em um pedido já registrado
  • Exemplo do corpo da requisição

    {
      "quantity": 20
    }
  • cURL

    curl --request PUT \
      --url http://localhost:3001/sales/1/products/1/quantity \
      --header 'Content-Type: application/json' \
      --data '{
      "quantity": 20
      }'
  • RESPONSE

    {
      "productId": 1,
      "quantity": 2,
      "date": "2023-07-26T18:17:27.000Z",
      "saleId": 1
    }
  • ERRORS

    • Caso algum produto não possua a chave obrigatória quantity
    {"message": "\"quantity\" is required"}
    • Caso quantity seja um número igual ou menor a zero
    {"message": "\"quantity\" must be greater than or equal to 1"}
    • Caso algum productId não esteja registrado no store_manager_db
    {"message": "Product not found"}
DELETE /sales/:id
Esse endpoint é responsável por deletar um pedido já cadastrado no store_manager_db
  • RESPONSE: Este endpoint não retorna uma resposta, porém indica que a operação foi bem sucedida com status 204

  • cURL

curl --request DELETE \
  --url 'http://localhost:3001/sales/7'
  • ERRORS

    • Caso o id do pedido não seja encontrado no store_manager_db
    {
      "message": "Product not found"
    }

Desenvolvido com

javascript logo nodejs logo express logo mysql logo

Importante! Os arquivos de minha autoria estão nos diretórios ./backend/src e ./backend/tests outros arquivos, como os responsáveis pela migrations e seeders do serviço store_manager_db que estão no diretório ./sql são de autoria da Trybe