Skip to content

Order API

With the Product API in place, the next step is to implement the Order API. Orders are tied to authenticated users and reference existing products.

flowchart LR
    subgraph api [Trusted Layer]
        direction TB
        gateway --> account
        gateway --> auth
        account --> db@{ shape: cyl, label: "Database" }
        auth --> account
        gateway e5@==> product
        gateway e6@==> order:::red
        product e2@==> db
        order e3@==> db
        order e4@==> product
    end
    internet e1@==>|request| gateway
    e1@{ animate: true }
    e2@{ animate: true }
    e3@{ animate: true }
    e4@{ animate: true }
    e5@{ animate: true }
    e6@{ animate: true }
    classDef red fill:#fcc
    click order "#order-api" "Order API"

Attention

To consume the API, the user must be authenticated.

Order API

POST /order

Create a new order for the current user.

{
    "items": [
        {
            "idProduct": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
            "quantity": 2
        },
        {
            "idProduct": "0195abfe-e416-7052-be3b-27cdaf12a984",
            "quantity": 1
        }
    ]
}

{
    "id": "0195ac33-73e5-7cb3-90ca-7b5e7e549569",
    "date": "2025-09-01T12:30:00",
    "items": [
        {
            "id": "01961b9a-bca2-78c4-9be1-7092b261f217",
            "product": {
                "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8"
            },
            "quantity": 2,
            "total": 20.24
        },
        {
            "id": "01961b9b-08fd-76a5-8508-cdb6cd5c27ab",
            "product": {
                "id": "0195abfe-e416-7052-be3b-27cdaf12a984"
            },
            "quantity": 10,
            "total": 6.2
        }
    ],
    "total": 26.44
}
Response code: 201 (created)
Response code: 400 (bad request), if the product does not exist.

GET /order

Get all orders for the current user.

[
    {
        "id": "0195ac33-73e5-7cb3-90ca-7b5e7e549569",
        "date": "2025-09-01T12:30:00",
        "total": 26.44
    },
    {
        "id": "0195ac33-cbbd-7a6e-a15b-b85402cf143f",
        "date": "2025-10-09T03:21:57",
        "total": 18.6
    }

]
Response code: 200 (ok)

GET /order/{id}

Get the order details by its ID. The order must belong to the current user., otherwise, return a 404.

An optional query parameter currency allows the totals to be returned in a different currency. When omitted, values are returned in USD (the database storage currency).

Currency storage

All monetary values are stored in the database in US Dollars (USD). When a currency parameter is provided, the service must call the Exchange API to convert the totals before returning the response.

{
    "id": "0195ac33-73e5-7cb3-90ca-7b5e7e549569",
    "date": "2025-09-01T12:30:00",
    "currency": "USD",
    "items": [
        {
            "id": "01961b9a-bca2-78c4-9be1-7092b261f217",
            "product": {
                "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
            },
            "quantity": 2,
            "total": 20.24
        },
        {
            "id": "01961b9b-08fd-76a5-8508-cdb6cd5c27ab",
            "product": {
                "id": "0195abfe-e416-7052-be3b-27cdaf12a984",
            },
            "quantity": 10,
            "total": 6.2
        }
    ],
    "total": 26.44
}
Response code: 200 (ok)
Response code: 404 (not found), if the order does not belong to the current user.

{
    "id": "0195ac33-73e5-7cb3-90ca-7b5e7e549569",
    "date": "2025-09-01T12:30:00",
    "currency": "BRL",
    "items": [
        {
            "id": "01961b9a-bca2-78c4-9be1-7092b261f217",
            "product": {
                "id": "0195abfb-7074-73a9-9d26-b4b9fbaab0a8",
            },
            "quantity": 2,
            "total": 121.44
        },
        {
            "id": "01961b9b-08fd-76a5-8508-cdb6cd5c27ab",
            "product": {
                "id": "0195abfe-e416-7052-be3b-27cdaf12a984",
            },
            "quantity": 10,
            "total": 37.20
        }
    ],
    "total": 158.64
}
Response code: 200 (ok)
Response code: 404 (not found), if the order does not belong to the current user.
Response code: 422 (unprocessable entity), if the currency code is not supported.

Additionals

Additional features are welcome, such as:

  • Search products by "like" name;
  • Authorization by role (admin, user):
    • Admin can create, update, and delete products;
    • User can only create orders;
  • Input validations;
  • Error handling.

Nice to have

  • Observability (metrics, logs), see Prometheus and Grafana;
  • Database In-Memory (suggestion: Product microservice), see Redis;
  • Swagger documentation, see SpringDoc.

Entrega

Individualmente, cada aluno deve criar um repositório no GitHub, com a documentação em MkDocs dos exercícios realizados e também com o projeto e entrega o link via BlabkBoard. Na documentação publicada deve constar:

  • Nome do aluno e grupo;
  • Documentação das atividades realizadas;
  • Código fonte das atividades realizadas;
  • Documentação do projeto;
  • Código fonte do projeto;
  • Link para todos os repositórios utilizados;
  • Destaques para os bottlenecks implementados (ao menos 2 por indivíduo);
  • Apresentação do projeto;
  • Vídeo de apresentação do projeto (2-3 minutos);

Um template de documentação pode ser encontrado em Template de Documentação.