Construção de uma API REST feita com Java Spring Boot, PostgreSQL e Docker para processo de recrutamento para a empresa SupraSys.
A implementação do banco de dados foi feita da seguinte forma (arquivo postgres-init.sh
):
CREATE TABLE clients(
id SERIAL NOT NULL,
name VARCHAR(100) NOT NULL,
login VARCHAR(20) NOT NULL,
password VARCHAR(100) NOT NULL,
state INTEGER NOT NULL,
CONSTRAINT pk_users PRIMARY KEY(id)
);
CREATE TABLE products(
id SERIAL NOT NULL,
name VARCHAR(100) NOT NULL,
stock INTEGER NOT NULL,
value NUMERIC(10,2) NOT NULL,
discount NUMERIC(10,2) NOT NULL,
CONSTRAINT pk_products PRIMARY KEY(id)
);
CREATE TABLE sales(
id SERIAL NOT NULL,
date DATE NOT NULL,
value NUMERIC(10,2) NOT NULL,
discount NUMERIC(10,2) NOT NULL,
total NUMERIC(10,2) NOT NULL,
client_id INTEGER NOT NULL,
CONSTRAINT pk_sales PRIMARY KEY(id),
CONSTRAINT fk_sales_clients FOREIGN KEY(client_id) REFERENCES clients(id)
);
CREATE TABLE sales_products(
id SERIAL NOT NULL,
amount INTEGER NOT NULL,
value NUMERIC(10,2) NOT NULL,
discount NUMERIC(10,2) NOT NULL,
total NUMERIC(10,2) NOT NULL,
sale_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
CONSTRAINT pk_sales_products PRIMARY KEY(id),
CONSTRAINT fk_sp_sales FOREIGN KEY(sale_id) REFERENCES sales(id),
CONSTRAINT fk_sp_products FOREIGN KEY(product_id) REFERENCES products(id)
);
Rode o seguinte comando para criar o Banco de Dados (necessário ter o Docker e Docker Compose instalado):
docker-compose up -d
POST http://localhost:8080/api/v1/clients HTTP/1.1
// Request
{
"name": "Lemuel",
"login": "lemuel",
"password": "abc123",
"state": 1
}
GET http://localhost:8080/api/v1/clients HTTP/1.1
// Response
[
{
"id": 1,
"name": "Lemuel",
"login": "lemuel",
"state": 1
},
{
"id": 2,
"name": "João",
"login": "joao",
"state": 2
}
]
GET http://localhost:8080/api/v1/clients/{id} HTTP/1.1
// Response
{
"id": 1,
"name": "Lemuel",
"login": "lemuel",
"state": 1
}
PUT http://localhost:8080/api/v1/clients/{id} HTTP/1.1
// Request
{
"name": "Lemuel Coelho Zara",
"login": "lemuelczara",
"password": "hhjs293",
"state": 2
}
DELETE http://localhost:8080/api/v1/clients/{id} HTTP/1.1
POST http://localhost:8080/api/v1/products HTTP/1.1
// Request
{
"name": "Arroz",
"stock": 10,
"value": 17.80,
"discount": 1.20
}
GET http://localhost:8080/api/v1/products HTTP/1.1
// Response
[
{
"name": "Arroz",
"stock": 10,
"value": 17.80,
"discount": 1.20
},
{
"name": "Sabonete",
"stock": 13,
"value": 1.35,
"discount": 0
}
]
GET http://localhost:8080/api/v1/products/{id} HTTP/1.1
// Response
{
"name": "Arroz",
"stock": 10,
"value": 17.80,
"discount": 1.20
}
PUT http://localhost:8080/api/v1/products/{id} HTTP/1.1
// Request
{
"name": "Arroz",
"stock": 100,
"value": 19.20,
"discount": 1
}
DELETE http://localhost:8080/api/v1/products/{id} HTTP/1.1
POST http://localhost:8080/api/v1/sales HTTP/1.1
Obs: adicionar no Header da requisição a propriedade clientId
para vincular a venda a um cliente.
// Request
{
"date": "2021-09-17",
"value": 999,
"discount": 999,
"total": 999,
"itens": [
{
"amount": 5,
"value": 5,
"discount": 5,
"total": 5,
"product": {
"id": 1
}
},
{
"amount": 6,
"value": 6,
"discount": 6,
"total": 6,
"product": {
"id": 2
}
}
]
}
GET http://localhost:8080/api/v1/sales HTTP/1.1
// Response
[
{
"id": 1,
"date": "2021-09-17",
"value": 999.0,
"discount": 999.0,
"total": 999.0,
"itens": [
{
"id": 1,
"amount": 5,
"value": 5.0,
"discount": 5.0,
"total": 5.0,
"product": {
"id": 1,
"name": "Arroz",
"stock": 10,
"value": 5.5,
"discount": 0.0
}
},
{
"id": 2,
"amount": 6,
"value": 6.0,
"discount": 6.0,
"total": 6.0,
"product": {
"id": 2,
"name": "Sabonete",
"stock": 10,
"value": 5.5,
"discount": 0.0
}
}
]
}
]
GET http://localhost:8080/api/v1/sales/{id} HTTP/1.1
// Response
{
"id": 1,
"date": "2021-09-17",
"value": 999.0,
"discount": 999.0,
"total": 999.0,
"itens": [
{
"id": 1,
"amount": 5,
"value": 5.0,
"discount": 5.0,
"total": 5.0,
"product": {
"id": 1,
"name": "Arroz",
"stock": 10,
"value": 5.5,
"discount": 0.0
}
},
{
"id": 2,
"amount": 6,
"value": 6.0,
"discount": 6.0,
"total": 6.0,
"product": {
"id": 2,
"name": "Sabonete",
"stock": 10,
"value": 5.5,
"discount": 0.0
}
}
]
}
DELETE http://localhost:8080/api/v1/sales/{id} HTTP/1.1