@@ Sobre @@
Agrix é um um sistema que ajuda na gestão e monitoramento de fazendas com o intuito de melhorar a eficiência no cultivo de plantações
@@ Habilidades trabalhadas @@
- Conhecimento do ecossistema Spring para criar rotas da API;
- injeção de dependência para conectar as camadas de controle, serviço e persistência;
- Spring Data JPA para implementar entidades e repositórios para a persistência em banco de dados, bem como implementar buscas customizadas;
- Gerenciamento de erros no Spring Web;
- Dockerfile para configurar a aplicação para execução no Docker;
- Utilizei campos de data nas rotas da API e no banco de dados;
- Testes unitários para garantir a qualidade e funcionamento correto da implementação, com cobertura de código adequada;
- Spring Security para adicionar autenticação ao projeto;
- Garanti que diferentes rotas atenda a regras específicas de autorização.
@@ Rotas @@
! Para conseguir acessar as rotas é necessário cria um usuário através da rota persons
! e logar através da rota auth/login para receber o Token.
POST /persons
:
🔍 Formato/exemplo de requisição e resposta
Exemplo de requisição na rota POST /persons
:
{
"username": "zerocool",
"password": "senhasecreta",
"role": "ADMIN"
}
Exemplo de resposta:
{
"id": 1,
"username": "zerocool",
"role": "ADMIN"
}
POST /auth/login
:
🔍 Formato/exemplo de requisição e resposta
Exemplo de requisição na rota POST /auth/login
(suppondo que os dados estejam corretos):
{
"username": "zerocool",
"password": "senhasecreta"
}
Exemplo de resposta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZ3JpeCIsInN1YiI6Im1ycm9ib3QiLCJleHAiOjE2ODk5ODY2NTN9.lyha4rMcMhFd_ij-farGCXuJy-1Tun1IpJd5Ot6z_5w"
}
POST /farms
:
🔍 Formato/exemplo de requisição e resposta
Exemplo de requisição:
{
"name": "Fazendinha",
"size": 5
}
Exemplo de resposta:
{
"id": 1,
"name": "Fazendinha",
"size": 5
}
GET /farms
:
! Acesso liberado apenas para usuários de role - USER, ADMIN OU MANAGER.
🔍 Formato/exemplo de resposta
Exemplo de resposta:
[
{
"id": 1,
"name": "Fazendinha",
"size": 5.0
},
{
"id": 2,
"name": "Fazenda do Júlio",
"size": 2.5
}
]
GET /farms/{id}
:
🔍 Formato/exemplo de resposta
Exemplo de resposta para a rota /farms/3
(supondo que exista uma fazenda com id = 3
):
{
"id": 3,
"name": "My Cabbages!",
"size": 3.49
}
POST /farms/{farmId}/crops
:
🔍 Formato/exemplo de requisição e resposta
Exemplo de requisição na rota /farms/1/crops
(supondo que exista uma fazenda com id = 1
):
{
"name": "Couve-flor",
"plantedArea": 5.43,
"plantedDate": "2022-12-05",
"harvestDate": "2023-06-08"
}
Exemplo de resposta:
{
"id": 1,
"name": "Couve-flor",
"plantedArea": 5.43,
"plantedDate": "2022-12-05",
"harvestDate": "2023-06-08",
"farmId": 1
}
Note que o id
da resposta se refere à plantação, e que o da fazenda está em farmId
.
GET /farms/{farmId}/crops
:
🔍 Formato/exemplo de resposta
Exemplo de resposta para a rota /farms/1/crops
(supondo que exista uma fazenda com id = 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
}
]
GET /crops
:
! Acesso liberado apenas para usuários de role - ADMIN OU MANAGER.
🔍 Formato/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
}
]
GET /crops/{id}
:
🔍 Formato/exemplo de resposta
Exemplo de resposta para a rota /crops/3
(supondo que exista uma plantação com id = 3
:
{
"id": 3,
"name": "Tomate",
"plantedArea": 1.9,
"plantedDate": "2023-05-22",
"harvestDate": "2024-01-10",
"farmId": 2
}
GET /crops/search
:
🔍 Formato/exemplo de resposta
- deve receber dois parâmetros por query string para busca: - `start`: data de início - `end`: data de fim
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
}
]
POST /fertilizers
:
🔍 Formato/exemplo de requisição e resposta
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"
}
GET /fertilizers
:
! Acesso liberado apenas para usuários de role ADMIN.
🔍 Formato/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"
}
]
GET /fertilizers/{id}
:
🔍 Formato/exemplo de resposta
Exemplo de resposta da rota /fertilizers/3
(supondo que exista um fertilizante com id = 3
):
{
"id": 3,
"name": "Adubo",
"brand": "Feito pelas vaquinhas",
"composition": "Esterco"
}
POST /crops/{cropId}/fertilizers/{fertilizerId}
:
🔍 Formato/exemplo de requisição e resposta
Rota para criar a associação entre uma plantação e um fertilizante.
Exemplo de resposta para a rota /crops/1/fertilizers/2
(supondo que exista uma plantação com id = 1
e um fertilizante com id = 2
):
Fertilizante e plantação associados com sucesso!
GET /crops/{cropId}/fertilizers
:
🔍 Formato/exemplo de resposta
Rota para listar os fertilizante associados a uma plantação. Exemplo de resposta para a rota `/crops/2/fertilizers` (supondo que exista uma plantação com `id = 2`):
[
{
"id": 2,
"name": "Húmus",
"brand": "Feito pelas minhocas",
"composition": "Muitos nutrientes"
},
{
"id": 3,
"name": "Adubo",
"brand": "Feito pelas vaquinhas",
"composition": "Esterco"
}
]
@@ Principais tecnológias @@
+ Java;
+ JUnit;
+ Docker;
+ Mysql;
+ JWT;
+ Spring