Pular para conteúdo

API de Produtos

Construa uma API RESTful para uma loja online. A API é organizada em torno de dois recursos principais: product e order.

flowchart LR
    subgraph api [Camada confiável]
        gateway --> account
        gateway --> auth
        account --> db@{ shape: cyl, label: "Banco de dados" }
        auth --> account
        gateway e5@==> product:::red
        gateway e6@==> order
        product e2@==> db
        order e3@==> db
        order e4@==> product
    end
    internet e1@==>|requisição| gateway
    e1@{ animate: true }
    e2@{ animate: true }
    e3@{ animate: true }
    e4@{ animate: true }
    e5@{ animate: true }
    e6@{ animate: true }
    classDef red fill:#fcc
    click product "#product-api" "API de produtos"

Atenção

Para consumir a API, o usuário precisa estar autenticado.

API de produtos

A API de produtos deve expor os seguintes endpoints:

POST /products

Cria um novo produto.

1
2
3
4
5
{
    "name": "Tomato",
    "price": 10.12,
    "unit": "kg"
}

1
2
3
4
5
6
{
    "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
    "name": "Tomato",
    "price": 10.12,
    "unit": "kg"
}
Response code: 201 (created)

GET /products

Obtém todos os produtos.

[
    {
        "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
        "name": "Tomato",
        "price": 10.12,
        "unit": "kg"
    },
    {
        "id": "0195abfe-e416-7052-be3b-27cdaf12a984",
        "name": "Cheese",
        "price": 0.62,
        "unit": "slice"
    }
]
Response code: 200 (ok)

GET /products/{id}

Obtém um produto pelo seu ID.

1
2
3
4
5
6
{
    "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
    "name": "Tomato",
    "price": 10.12,
    "unit": "kg"
}
Response code: 200 (ok)

DELETE /products/{id}

Exclui um produto pelo seu ID.

Response code: 204 (no content)

Adicionais

Funcionalidades adicionais são bem-vindas, como:

  • Busca de produtos por nome (com "like");
  • Autorização por papel (admin, user):
    • Admin pode criar, atualizar e excluir produtos;
    • User pode apenas criar pedidos;
  • Validação das entradas;
  • Tratamento de erros.

Desejável

  • Observabilidade (métricas, logs), veja Prometheus e Grafana;
  • Banco de dados em memória (sugestão: microsserviço de produtos), veja Redis;
  • Documentação Swagger, veja SpringDoc.