Loading repository data…
Loading repository data…
quasemago / repository
API REST construída em Java com Spring Boot para um E-commerce durante o estágio da CompassUOL
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
O projeto consiste no desenvolvimento de uma API REST para um e-commerce, utilizando as tecnologias e conhecimentos aprendidos até o momento durante essa jornada do programa de bolsas de estágio da Compass UOL | Back-end Journey (Spring Boot) - AWS Cloud Context.
O projeto foi desenvolvimento utilizando o Java JDK na versão 17 e separado em dois domínios: Produto (Product) e Pedido (Order). Cada domínio possui 5 (cinco) endpoints, e foram todos documentados utilizando o Swagger.
Para testes das implementações, foi utilizado inicialmente o aplicativo Postman, cobrindo assim os testes de requisições. Ademais, posteriormente para testes de únidades e integração, foi utilizado o JUnit 5 em conjunto com o Mockito.
A equipe CoffeeWithSpring, responsável pelo desenvolvimento do projeto desse desáfio é composta por:
| Usuário Github | |
|---|---|
| bruno.ronning.pb@compasso.com.br | quasemago |
| franciele.dalaros.pb@compasso.com.br | francieledalarosa |
| luisa.kroth.pb@compasso.com.br | luisafkroth |
| mayke.lellis.pb@compasso.com.br | maykeanselmo |
| pedro.koberstain.pb@compasso.com.br | pedrokoberstain |
Apesar do projeto ter sido separado em dois domínios, ambos possuem regras de negócio em comum, sendo elas:
O domínio possui a seguinte estrutura de banco de dados:
Observações importantes sobre alterações nos requisitos do domínio Produto:
products deveria ser nomeada de value, porém, devido a conflitos com o banco de dados H2 pois value é uma palavra-chave reservada do mesmo, a coluna foi renomeada para price.Observações importantes sobre alterações nos requisitos do domínio Pedido:
orders deveria ser nomeada de address, porem visando um melhor desenvolvimento seguindo um padrão de normalização, a coluna foi renomeada para address_id e foi criada uma nova tabela chamada addresses para armazenar os endereços de entrega dos pedidos por relacionamento do banco de dados.products na tabela orders que armazenaria a lista de produtos do pedido, mas a nossa abordagem de desenvolvimento foi criar uma tabela intermediaria chamada order_products para armazenar essa lista de produtos, contendo o id do pedido e o id do produto, para que possamos ter um relacionamento entre as tabelas orders e products.Com essas alterações, foi possível concluir o desenvolvimento do projeto de forma mais eficiente e simples.
O domínio Produto consiste em uma API REST que permite que os usuários criem, leiam, atualizem e excluam produtos.
O domínio Produto possui as seguintes regras de negócio:
A API disponibiliza endpoints REST para interação. Sendo:
POST /products: Cria um novo produto.GET /products: Recupera uma lista de todos os produtos cadastrados.GET /products/:id: Recupera as informações de um produto específico.PUT /products/:id: Atualiza as informações de um produto existente.DELETE /products/:id: Deleta um produto existente.Ademais, a API possui os seguintes payloads para interação:
ProductCreate: Payload utilizado para criação e atualização de um produto. Exemplo:
{
"name": "Product name",
"description": "Product description",
"value": 10.5
}
ProductResponse: Payload utilizado para retorno de informações de um produto. Exemplo:
{
"id": 1,
"name": "Product name",
"description": "Product description",
"value": 10.5
}
Para criar um novo produto:
POST /products
{
"name": "Nome do Produto",
"description": "Descrição do Produto",
"value": 29.99
}
{
"id": 1,
"name": "Nome do Produto",
"description": "Descrição do Produto",
"value": 29.99
}
Para recuperar uma lista de todos os produtos cadastrados:
GET /products
[
{
"id": 1,
"name": "Nome do Produto 1",
"description": "Descrição do Produto 1",
"value": 29.99
},
// Outros produtos...
]
Para recuperar informações de um produto específico:
GET /products/5
{
"id": 5,
"name": "Nome do Produto",
"description": "Descrição do Produto",
"value": 29.99
}
Para atualizar um produto existente:
PUT /products/15
{
"name": "Novo Nome",
"description": "Nova Descrição",
"value": 39.99
}
{
"id": 15,
"name": "Novo Nome",
"description": "Nova Descrição",
"value": 39.99
}
Para deletar um produto existente:
DELETE /products/15
O domínio Pedido consiste em uma API REST que permite que os usuários façam pedidos de produtos de um catálogo.
O domínio Pedido possui as seguintes regras de negócio:
CONFIRMED, SENT, CANCELEDCREDIT_CARD, BANK_TRANSFER, CRYPTOCURRENCY, GIFT_CARD, PIX, OTHER.number, complement e postal_code.Além disso, a opção de cancelamento de pedidos possui as seguintes regras de negócio:
SENT.CANCELED.A API disponibiliza endpoints REST para interação. Sendo:
POST /orders: Cria um novo pedido.GET /orders: Recupera uma lista ordenada por data de criação, do mais recente para o mais antigo, de todos os pedidos cadastrados. Além disso, é possível filtrar por status do pedido.
GET /orders?status=CONFIRMED.GET /orders/:id: Recupera as informações de um pedido específico.PUT /orders/:id: Atualiza as informações do status de um pedido existente.POST /orders/:id/cancel: Cancela um pedido existente.Ademais, a API possui os seguintes payloads para interação:
OrderCreate: Payload utilizado para criação de um pedido. Exemplo:
{
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 5
}
],
"address": {
"number": 10,
"complement": "Próximo a av. Pitanga",
"postalCode": "01001000"
},
"paymentMethod": "PIX"
}
OrderUpdate: Payload utilizado para atualização do status de um pedido. Exemplo:
{
"status": "SENT"
}
OrderCancel: Payload utilizado para cancelamento de um pedido. Exemplo:
{
"cancelReason": "Motivo do cancelamento do cliente"
}
OrderResponse: Payload utilizado para retorno de informações de um pedido. Exemplo:
{
"id": 1,
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 5
}
],
"address": {
"street": "Praça da Sé",
"number": 10,
"complement": "Próximo a av. Pitanga",
"city": "São Paulo",
"state": "SP",
"postalCode": "01001-000"
},
"paymentMethod": "PIX",
"subtotalValue": 100.00,
"discount": 0.5,
"totalValue": 95.00,
"createdDate": "2023-07-20T12:00:00Z",
"status": "CONFIRMED"
}
Para criar um novo pedido:
POST /orders
{
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 5
}
],
"address": {
"number": 10,
"complement": "Próximo a av. Pitanga",
"postalCode": "01001000"
},
"paymentMethod": "PIX"
}
{
"id": 1,
"products": [
{
"productId": 1,
"quantity": 2
},
{
"productId": 2,
"quantity": 5
}
],
"address": {
"street": "Praça da Sé",
"number": 10,
"complement": "Próximo a av. Pitanga",