A presente API foi construída com o intuito de aplicar os conhecimentos em desenvolvimento de API REST com Java e Spring Boot.
A aplicação realiza as operações básicas de CRUD para o gerenciamento de ingredientes de uma confeitaria, com informações sobre tipo do produto e preço.
- Apache Maven
- Java
- Spring Boot
- Spring Data JPA
- MySQL
- Junit
- Heroku
✅ Implementação dos principais métodos REST HTTP, também conhecido como CRUD.
✅ Configuração de conexão com banco de dados local e in memory (H2).
✅ Deploy em nuvem no Heroku
- Implementação de testes unitários
Camada responsável por orquestrar o fluxo da aplicação ao fazer o mapeamento e o direcionamento dos requests para a camada de serviços.
Aqui, faz-se o uso da anotação "@Autowired" do Lombok para injetarmos o "IngredientesService" sem que seja necessário instanciá-lo.
Camada responsável por fazer o ORM (Object Relational Mapper) da tabela "tbl_ingredientes" para que se comporte como uma classe comum em Java. O uso da anotação "@Data" se encarregará de fazer todos os getters e setters em tempo de compilação.
Camada onde serão inseridas as regras de negócio, e onde injetamos o repository para que seja possível a chamada dos métodos que farão a persistência.
Nesta camada criamos uma interface que extende a interface JpaRepository do Spring Data JPA. É através dela que iremos usar a camada de persistência para gravar e recuperar dados, fazendo uma ponte com o banco de dados.
- O profile "prod" vai subir a aplicação com o banco de dados MySQL. Para tanto, é necessário que você tenha o mesmo instalado em sua máquina, com o database e a tabela criadas com os campos corretos. Mas não se preocupe, o código para a criação de tudo será fornecido logo abaixo!
☺️ - O profile "dev" vai subir a aplicação com o banco H2 in-memory. Dessa forma, é possível testar os métodos sem inteferir no banco de produção, além de não ser necessário nenhum software adicional instalado. Além do mais, a aplicação poderá ser testada através da plataforma em nuvem Heroku.
A forma de escolher qual o profile será o ativo na hora de rodar a aplicação é através do aquivo application.properties. Por padrão, o profile ativo será o dev. Caso queira rodar a aplicação com o MySQL, basta trocar o valor para prod.
spring.profiles.active=devClique para visualizar a configuração
Primeiramente é necessário a construção de uma tabela no MySQL. A partir dela poderá ser feito o mapeamento com o JPA.
Deve-se, portanto, criar uma database com o nome "db_vendasbolos", e dentro dela criar a tabela "tbl_ingredientes"
CREATE database db_vendasbolos;
CREATE TABLE IF NOT EXISTS tbl_ingredientes (
id_ingrediente INT AUTO_INCREMENT,
descricao varchar(50) not null,
preco int not null,
volume_peso int not null,
unidade_medida varchar(8) not null,
CONSTRAINT ingredientes_id_pk primary key(id_ingrediente),
CONSTRAINT ingredientes_descricao_UN UNIQUE(descricao),
CONSTRAINT ingredientes_unidade_medida CHECK(unidade_medida in ('kg', 'g', 'ml', 'l'))
);A seguir, podemos popular a tabela com alguns registros, com o código abaixo: (Clique para Expandir)
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Leite condensado', 4.5, 395, 'g');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Creme de Leite', 2.7, 200, 'g');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Leite', 3.2, 1, 'l');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Creme de avela', 27, 200, 'g');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Farinha de trigo', 4.6, 1, 'kg');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Cacau em pó', 20, 200, 'g');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Ovos', 0.4, 50, 'g');
INSERT INTO tbl_ingredientes (descricao, preco, volume_peso, unidade_medida) VALUES('Chantily', 11, 1, 'l');Uma vez criado a database, devemos configurá-lo no arquivo "application-prod.properties", tomando os devidos cuidados com os atributos de url, username e password, para que a conexão aconteça corretamente.
# MySQL Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/db_vendasbolos?useSSL=false
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5DialectClique aqui para visualizar a configuração
Subindo a aplicação com esse profile, basta acessar o arquivo application-dev.properties e certificar que os atributos estão como abaixo abaixo:
# in-memory H2 Configuration
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:mem:db_vendasbolos
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=updatehttp://localhost:8080https://controleingredientes.herokuapp.comNOTA: Os links das requisições neste capítulo estão todos configurados para serem executados localmente. Mas podem ser facilmente trocados, substituindo o link [1] pelo [2] nos exemplos abaixo.
http://localhost:8080/api/v1/ingrediente/allhttp://localhost:8080/api/v1/ingrediente/byId/2http://localhost:8080/api/v1/ingrediente/byDescription/Manteigahttp://localhost:8080/api/v1/ingrediente/addSingleUse o JSON abaixo como exemplo: (clique para expandir
{
"descricao": "Leite",
"preco": 4,
"volumePeso": 1,
"type": "l"
}http://localhost:8080/api/v1/ingrediente/addManyUse o JSON abaixo como exemplo: (clique para expandir
[
{
"descricao": "Manteiga",
"preco": 5,
"volumePeso": 500,
"type": "g"
},
{
"descricao": "Chocolate",
"preco": 40,
"volumePeso": 1,
"type": "kg"
}
]http://localhost:8080/api/v1/ingrediente/update/2Use o JSON abaixo como exemplo: (clique para expandir
{
"descricao": "Manteiga com sal",
"preco": 2,
"volumePeso": 250,
"type": "g"
}http://localhost:8080/api/v1/ingrediente/delete/2






