Repositório possuí projeto desenvolvido abordando conceitos
de testes com Spring Data
, data e hora
, buscas customizadas
e auditoria
.
- Primeiro projeto usando
testes com Spring Data
,data e hora
,buscas customizadas
eauditoria
;
O primeiro produto da nossa empresa AgroTech, empresa fictícia, foi um sucesso! Fiquei responsável por expandir a aplicação e incluir algumas funcionalidades extra. Inclusive, recebi uma base de código pronta que adquiri de outra empresa, e que precisará ser testado.
- Utilizar campos de data nas rotas da API e no banco de dados
- Aplicar o conhecimento do ecossistema Spring para criar rotas da API.
- Aplicar a injeção de dependência para conectar as camadas de controle, serviço e persistência.
- Criar testes unitários para garantir a qualidade e funcionamento correto da implementação, com cobertura de código adequada.
- Utilizar o Spring Data JPA para implementar entidades e repositórios para a persistência em banco de dados, bem como implementar buscas customizadas.
-
Clone o repositório (recomendado usar em SSH) e entre na pasta:
git clone git@github.com:ludson96/agrix-fase-b.git cd agrix-fase-b
-
Instale as dependências:
mvn install
-
Caso não tenha jdk ou maven instalados, basta executar o
Docker
com o comando abaixo:#Comando para gerar imagem. docker build . -t multi-stage-image #Comando para executar o container usando a imagem gerada anteriormente. Irá executar o servidor Spring automaticamente e podendo ignorar o passo abaixo. docker run -p 8080:8080 --name multi-stage-container multi-stage-image
-
Para executar o servidor spring:
mvn clean package java -jar target/agrix-1.0-SNAPSHOT.jar
Farm
Cria uma nova fazenda
Funciona da seguinte forma:
/farms
(POST
)- deve receber via corpo do POST os dados de uma fazenda.
- Exemplo de requisição:
{ "name": "Fazendinha", "size": 5 }
- Exemplo de requisição:
- em caso de sucesso:
-
retornar o status HTTP 201 (CREATED)
-
retornar os dados da fazenda criada. O
id
da fazenda esta incluso na resposta.- Exemplo de resposta:
{ "id": 1, "name": "Fazendinha", "size": 5 }
-
- deve receber via corpo do POST os dados de uma fazenda.
Retorna todas as fazendas cadastradas
Funciona da seguinte forma:
/farms
(GET
)- retorna uma lista de todas as fazendas. O
id
da fazenda esta incluso na resposta.-
Exemplo de resposta:
[ { "id": 1, "name": "Fazendinha", "size": 5.0 }, { "id": 2, "name": "Fazenda do Júlio", "size": 2.5 } ]
-
- retorna uma lista de todas as fazendas. O
Retorna informações de uma fazenda especifica
Funciona da seguinte forma:
/farms/{id}
(GET
):- recebe um
id
pelo caminho da rota e retorna a fazenda com esseid
. Oid
da fazenda esta incluso na resposta.-
Exemplo de resposta para a rota
/farms/3
(supondo que exista uma fazenda comid = 3
):{ "id": 3, "name": "My Cabbages!", "size": 3.49 }
-
- caso não exista uma fazenda com esse
id
, a rota retorna o status HTTP 404 com a mensagemFazenda não encontrada!
no corpo da resposta.
- recebe um
Cria uma nova plantação
Funciona da seguinte forma:
/farms/{farmId}/crops
(POST
)- recebe o
id
da fazenda pelo caminho da rota (representado aqui porfarmId
apenas para diferenciar da plantação)- recebe via corpo do POST os dados da plantação e salva a nova plantação a partir dos dados recebidos, associada à fazenda com o ID
-
Exemplo de requisição na rota
/farms/1/crops
(supondo que exista uma fazenda comid = 1
):{ "name": "Couve-flor", "plantedArea": 5.43, "plantedDate": "2022-12-05", "harvestDate": "2023-06-08" }
-
- recebe via corpo do POST os dados da plantação e salva a nova plantação a partir dos dados recebidos, associada à fazenda com o ID
- em caso de sucesso:
- retorna o status HTTP 201 (CREATED)
- retorna os dados da plantação criada. A resposta inclui o
id
da plantação e oid
da fazenda.-
caso não exista uma fazenda com o
id
passado, retorna o status HTTP 404 com a mensagemFazenda não encontrada!
no corpo da resposta. -
Exemplo de resposta:
{ "id": 1, "name": "Couve-flor", "plantedArea": 5.43, "plantedDate": "2022-12-05", "harvestDate": "2023-06-08", "farmId": 1 }
-
- recebe o
Lista as plantações de uma fazenda específica
Funciona da seguinte forma:
/farms/{farmId}/crops
(GET
):-
recebe o
id
de uma fazenda pelo caminho -
retorna uma lista com todas as plantações associadas à fazenda
- Exemplo de resposta para a rota
/farms/1/crops
(supondo que exista uma fazenda comid = 1
):
[ { "id": 1, "name": "Couve-flor", "plantedArea": 5.43, "plantedDate": "2022-12-05", "harvestDate": "2023-06-08", "farmId": 1 }, { "id": 2, "name": "Alface", "plantedArea": 21.3, "plantedDate": "2022-02-15", "harvestDate": "2023-02-20", "farmId": 1 } ]
- Exemplo de resposta para a rota
-
caso não exista uma fazenda com esse
id
, retorna o status HTTP 404 com a mensagemFazenda não encontrada!
no corpo da resposta.
-
Lista todas as plantações cadastradas
Funciona da seguinte forma:
/crops
(GET
)- retorna uma lista de todas as plantações cadastradas. A resposta inclui o
id
de cada plantação e oid
da fazenda associada.-
Exemplo de resposta:
[ { "id": 1, "name": "Couve-flor", "plantedArea": 5.43, "plantedDate": "2022-02-15", "harvestDate": "2023-02-20", "farmId": 1 }, { "id": 2, "name": "Alface", "plantedArea": 21.3, "plantedDate": "2022-02-15", "harvestDate": "2023-02-20", "farmId": 1 }, { "id": 3, "name": "Tomate", "plantedArea": 1.9, "plantedDate": "2023-05-22", "harvestDate": "2024-01-10", "farmId": 2 } ]
-
- retorna uma lista de todas as plantações cadastradas. A resposta inclui o
Retorna as informações de plantações de uma fazenda especifica
Funciona da seguinte forma:
/crops/{id}
(GET
):-
recebe o
id
de uma plantação pelo caminho da rota -
caso exista a plantação com o
id
recebido, retorna os dados da plantação. A resposta inclui oid
de cada plantação e oid
da fazenda associada.- Exemplo de resposta para a rota
/crops/3
(supondo que exista uma plantação comid = 3
:
{ "id": 3, "name": "Tomate", "plantedArea": 1.9, "plantedDate": "2023-05-22", "harvestDate": "2024-01-10", "farmId": 2 }
- Exemplo de resposta para a rota
-
caso não exista uma plantação com o
id
passado, retorna o status HTTP 404 com a mensagemPlantação não encontrada!
no corpo da resposta.
-
Busca plantações a partir da data de colheita
Funciona da seguinte forma:
/crops/search
(GET
)- recebe dois parâmetros por query string para busca:
start
: data de inícioend
: data de fim
- retorna uma lista com as plantações nas quais o campo
harvestDate
esteja entre as data de início e de fim.- a comparação das datas são inclusiva (ou seja, deve incluir datas que sejam iguais à de início ou à de fim)
- a resposta inclui o
id
de cada plantação e oid
da fazenda associada, mas inclui os dados da fazenda.-
Exemplo de resposta para a rota
/crops/search?start=2023-01-07&end=2024-01-10
:[ { "id": 1, "name": "Couve-flor", "plantedArea": 5.43, "plantedDate": "2022-02-15", "harvestDate": "2023-02-20", "farmId": 1 }, { "id": 3, "name": "Tomate", "plantedArea": 1.9, "plantedDate": "2023-05-22", "harvestDate": "2024-01-10", "farmId": 2 } ]
-
- recebe dois parâmetros por query string para busca:
Cria um novo fertilizante
A rota a ser criada é:
/fertilizers
(POST
)- recebe via corpo do POST os dados de um fertilizante
- salva um novo fertilizante a partir dos dados recebidos
- em caso de sucesso:
-
retorna o status HTTP 201 (CREATED)
-
retorna os dados do fertilizante criado, incluindo seu
id
-
Exemplo de requisição:
{ "name": "Compostagem", "brand": "Feita em casa", "composition": "Restos de alimentos" }
-
Exemplo de resposta:
{ "id": 1, "name": "Compostagem", "brand": "Feita em casa", "composition": "Restos de alimentos" }
-
- em caso de sucesso:
Lista todos os fertilizantes cadastrados
A rota a ser criada é:
/fertilizers
(GET
):-
retorna uma lista de todos os fertilizantes cadastrados, incluindo o
id
de cada. -
Exemplo de resposta:
[ { "id": 1, "name": "Compostagem", "brand": "Feita em casa", "composition": "Restos de alimentos" }, { "id": 2, "name": "Húmus", "brand": "Feito pelas minhocas", "composition": "Muitos nutrientes" }, { "id": 3, "name": "Adubo", "brand": "Feito pelas vaquinhas", "composition": "Esterco" } ]
-
Retorna informações de um fertilizante
A rota a ser criada é:
/fertilizers/{fertilizerId}
(GET
):-
recebe o
id
de um fertilizante pelo caminho da rota -
caso exista o fertilizante com o
id
recebido, retorna seus dados, incluindo seuid
-
caso não exista um fertilizante com o
id
passado, a rota retorna o status HTTP 404 com a mensagemFertilizante não encontrado!
no corpo da resposta. -
Exemplo de resposta da rota
/fertilizers/3
(supondo que exista um fertilizante comid = 3
):{ "id": 3, "name": "Adubo", "brand": "Feito pelas vaquinhas", "composition": "Esterco" }
-
Associa uma plantação a um fertilizante
A rota a ser criada é:
/crops/{cropId}/fertilizers/{fertilizerId}
(POST
)- recebe tanto o
id
da plantação quanto oid
do fertilizante pelo caminho da rota - o corpo da requisição será vazio
- faz a associação entre o fertilizante e a plantação
- em caso de sucesso, retorna o status HTTP 201 (CREATED) com a mensagem
Fertilizante e plantação associados com sucesso!
no corpo da resposta - caso não exista uma plantação com o
id
recebido, a rota retorna o status HTTP 404 com a mensagemPlantação não encontrada!
no corpo da resposta. - caso não exista um fertilizante com o
id
recebido, a rota retorna o status HTTP 404 com a mensagemFertilizante não encontrado!
no corpo da resposta.-
Exemplo de resposta para a rota
/crops/1/fertilizers/2
(supondo que exista uma plantação comid = 1
e um fertilizante comid = 2
):Fertilizante e plantação associados com sucesso!
-
- recebe tanto o
Lista os fertilizante associados a uma plantação
A rota a ser criada é:
/crops/{cropId}/fertilizers
(GET
):- recebe o
id
de uma plantação pelo caminho - retorna uma lista com todas os fertilizantes associados à plantação
- caso não exista uma plantação com o
id
recebido, a rota retorna o status HTTP 404 com a mensagemPlantação não encontrada!
no corpo da resposta.-
Exemplo de resposta para a rota
/crops/2/fertilizers
(supondo que exista uma plantação comid = 2
):[ { "id": 2, "name": "Húmus", "brand": "Feito pelas minhocas", "composition": "Muitos nutrientes" }, { "id": 3, "name": "Adubo", "brand": "Feito pelas vaquinhas", "composition": "Esterco" } ]
-
- recebe o