From b7d2f8bb2e6fedd64913ea2275213cb54c651592 Mon Sep 17 00:00:00 2001 From: MarcoandreDev Date: Sat, 11 Oct 2025 11:45:52 -0300 Subject: [PATCH 1/2] Marco atts --- .../entity/culture/CultureController.java | 20 ++- .../entity/culture/CultureFilter.java | 12 ++ .../entity/culture/CultureService.java | 4 + .../entity/culture/dto/CultureDto.java | 5 + .../culture/impl/CultureServiceImpl.java | 23 ++++ .../ForageDisponibility.java | 48 +++---- .../ForageDisponibilityController.java | 52 +++++-- .../ForageDisponibilityRepository.java | 13 +- .../ForageDisponibilityService.java | 7 +- .../dto/ForageCreateDto.java | 28 ++++ .../dto/ForageDisponibilityDto.java | 18 +-- .../dto/ForageUpdateDto.java | 15 ++ .../impl/ForageDisponibilityServiceImpl.java | 129 ++++++++++++++++-- 13 files changed, 310 insertions(+), 64 deletions(-) create mode 100644 src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureFilter.java create mode 100644 src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java create mode 100644 src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java index 41d723f..7666125 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java @@ -3,11 +3,10 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudController; import br.edu.utfpr.ProjetoIDRAPI.entity.culture.dto.CultureDto; import org.modelmapper.ModelMapper; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudService; @@ -32,7 +31,7 @@ protected CrudService getService() { protected ModelMapper getModelMapper() { return this.modelMapper; } - + @GetMapping("/findName/{name}") public ResponseEntity findByName(@PathVariable String name){ Culture entity = cultureService.findByName(name); @@ -43,4 +42,15 @@ public ResponseEntity findByName(@PathVariable String name){ return ResponseEntity.noContent().build(); } } + + @PostMapping("/advanced-search") + public ResponseEntity> search( + @RequestBody CultureFilter filters, + Pageable pageable + ) { + Page page = cultureService.search(filters, pageable); + return ResponseEntity.ok(page.map(this::convertToDto)); + } + + } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureFilter.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureFilter.java new file mode 100644 index 0000000..ec834f7 --- /dev/null +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureFilter.java @@ -0,0 +1,12 @@ +package br.edu.utfpr.ProjetoIDRAPI.entity.culture; + +import br.edu.utfpr.ProjetoIDRAPI.enums.CultureType; +import lombok.Data; + + +@Data +public class CultureFilter { + private String cultureName; // filtro por nome + private CultureType cultureType; // filtro por tipo + +} diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureService.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureService.java index 6a64a96..0db6dbd 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureService.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureService.java @@ -2,7 +2,11 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudService; import br.edu.utfpr.ProjetoIDRAPI.entity.culture.Culture; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; public interface CultureService extends CrudService { Culture findByName(String name); + Page search(CultureFilter filter, Pageable pageable); + } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/dto/CultureDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/dto/CultureDto.java index 9b7a8d6..d5a8ccd 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/dto/CultureDto.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/dto/CultureDto.java @@ -2,6 +2,9 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.culture.Culture; import br.edu.utfpr.ProjetoIDRAPI.enums.CultureType; +import jakarta.persistence.Column; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import lombok.Data; @Data @@ -18,6 +21,8 @@ public Culture toCulture() { return cult; } + @Column(name = "culture_type") + @Enumerated(EnumType.STRING) private CultureType cultureType; private float ms; diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/impl/CultureServiceImpl.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/impl/CultureServiceImpl.java index f701d1e..bc7c51e 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/impl/CultureServiceImpl.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/impl/CultureServiceImpl.java @@ -2,8 +2,12 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.crud.impl.CrudServiceImpl; import br.edu.utfpr.ProjetoIDRAPI.entity.culture.Culture; +import br.edu.utfpr.ProjetoIDRAPI.entity.culture.CultureFilter; import br.edu.utfpr.ProjetoIDRAPI.entity.culture.CultureRepository; import br.edu.utfpr.ProjetoIDRAPI.entity.culture.CultureService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.stereotype.Service; @@ -21,6 +25,25 @@ public Culture findByName(String name) { return cultureRepository.findByCultureName(name); } + @Override + public Page search(CultureFilter filter, Pageable pageable) { + Specification spec = Specification.where(null); + + if (filter.getCultureName() != null && !filter.getCultureName().isEmpty()) { + spec = spec.and((root, query, cb) -> + cb.like(cb.lower(root.get("cultureName")), "%" + filter.getCultureName().toLowerCase() + "%") + ); + } + + if (filter.getCultureType() != null) { + spec = spec.and((root, query, cb) -> + cb.equal(root.get("cultureType"), filter.getCultureType()) + ); + } + + return cultureRepository.findAll(spec, pageable); + } + @Override protected JpaRepository getRepository() { return this.cultureRepository; diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java index 19249f0..ed02804 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java @@ -1,7 +1,7 @@ package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility; -import java.math.BigInteger; import java.time.LocalDate; +import java.math.BigDecimal; import br.edu.utfpr.ProjetoIDRAPI.entity.property.Property; import jakarta.persistence.*; @@ -18,32 +18,32 @@ @AllArgsConstructor public class ForageDisponibility { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private long id; - - private LocalDate date; - - private String forage; - - private Float entry; - - private Float residue; - - private Float kg; - - private Float picketArea; - - private Float efficiency; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + private LocalDate date; + + private String forage; + private Float averageCost; + private Long usefulLife; + private String growthCycle; + private String observation; + private String ownershipType; + private Float entry; + private Float residue; + private Float kg; + private Float picketArea; + private Float efficiency; @Column(precision = 20, scale = 0) - private java.math.BigDecimal numCows; + private BigDecimal numCows; private Float kgCows; - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "property_id") - private Property property; + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "property_id") + private Property property; -} +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java index 9ac765f..f224290 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java @@ -2,13 +2,14 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudController; import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudService; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageCreateDto; import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageDisponibilityDto; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageUpdateDto; +import jakarta.validation.Valid; import org.modelmapper.ModelMapper; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -36,16 +37,47 @@ protected ModelMapper getModelMapper() { return this.modelMapper; } - /** - * Endpoint para buscar todas as ForageDisponibility de uma propriedade - * @param propertyId ID da propriedade - * @return Lista de ForageDisponibilityDto compatível com o frontend - */ + @Override + @RequestMapping(method = RequestMethod.POST, value = "/_ignored_") + @Deprecated + public ResponseEntity create(ForageDisponibilityDto dto){ + throw new UnsupportedOperationException("O endpoint de criação de foragem usa o método customizado 'createForageForProperty'."); + } @GetMapping public ResponseEntity> getByProperty(@PathVariable Long propertyId) { List dtos = forageService.findByPropertyId(propertyId); return ResponseEntity.ok(dtos); } + @PostMapping // Endpoint: POST /properties/{propertyId}/forages + public ResponseEntity createForageForProperty( + @PathVariable Long propertyId, + @RequestBody @Valid ForageCreateDto createDto) { + try { + ForageDisponibility createdForage = forageService.createForage(propertyId, createDto); + ForageDisponibilityDto responseDto = modelMapper.map(createdForage, ForageDisponibilityDto.class); + return new ResponseEntity<>(responseDto, HttpStatus.CREATED); + } catch (Exception e) { + System.err.println("Erro na criação da Foragem: " + e.getMessage()); + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); + } + } + + @PatchMapping("/{forageId}") + public ResponseEntity updateForage( + @PathVariable Long propertyId, + @PathVariable Long forageId, + @RequestBody @Valid ForageUpdateDto updateDto) { + forageService.updateForage(propertyId, forageId, updateDto); + return ResponseEntity.noContent().build(); // status 204 + } + + + @GetMapping("/{id}/details") + public ResponseEntity findById(@PathVariable Long id) { + ForageDisponibilityDto forageDto = forageService.findDtoById(id); + return ResponseEntity.ok(forageDto); + } -} +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityRepository.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityRepository.java index 3fb193c..171ab55 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityRepository.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityRepository.java @@ -1,14 +1,14 @@ package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility; -import org.springframework.data.domain.Limit; -import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.data.jpa.repository.QueryHints; // Import necessário +import jakarta.persistence.QueryHint; // Import necessário -import java.util.Collection; import java.util.List; +import java.util.Optional; public interface ForageDisponibilityRepository extends JpaRepository, @@ -19,4 +19,9 @@ public interface ForageDisponibilityRepository extends List findByProperty_Id(Long propertyId); -} + Optional findByIdAndPropertyId(Long id, Long propertyId); + + @Query("SELECT f FROM ForageDisponibility f WHERE f.id = :id") + @QueryHints({@QueryHint(name = "org.hibernate.cacheable", value = "false")}) + Optional findByIdNoCache(@Param("id") Long id); +} \ No newline at end of file diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityService.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityService.java index d031616..6687ed4 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityService.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityService.java @@ -1,12 +1,15 @@ package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility; import br.edu.utfpr.ProjetoIDRAPI.entity.crud.CrudService; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageCreateDto; import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageDisponibilityDto; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageUpdateDto; import java.util.List; public interface ForageDisponibilityService extends CrudService { List findByPropertyId(Long propertyId); - - + ForageDisponibility createForage(Long propertyId, ForageCreateDto createDto); + void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateDto); + ForageDisponibilityDto findDtoById(Long id); } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java new file mode 100644 index 0000000..946945a --- /dev/null +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java @@ -0,0 +1,28 @@ +package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ForageCreateDto { + @NotNull + private Float area; + @NotNull + private Float averageCost; + @NotNull + private Long usefulLife; + @NotNull + private String formation; + @NotNull + private String growthCycle; + private String observation; + @NotNull + private String ownershipType; + private String cultivation; + private Float entry; + private Float residue; + private Float kg; + private Float efficiency; + private Long numCows; + private Float kgCows; +} diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java index 9cecd52..dc3e1c0 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java @@ -8,20 +8,20 @@ public class ForageDisponibilityDto { private Long id; private String cultivation; // antes era forage - private String area; // caso precise, converta de picketArea ou outra propriedade - private String averageCost; // mapear se tiver campo equivalente no backend - private String usefulLife; // mapear se tiver campo equivalente - private String formation; // antes era date (converta para string YYYY-MM-DD) - private String ownershipType; // antes era propriedade do tipo PropertyDto ou enum - private String growthCycle; // antes era propriedade do tipo enum - private String observation; // opcional, mapear se tiver campo + private String area; + private String averageCost; + private String usefulLife; + private String formation; // antes era date + private String ownershipType; + private String growthCycle; + private String observation; // opcional private Float entry; private Float residue; private Float kg; private Float picketArea; private Float efficiency; - private Long numCows; // converter BigInteger para Long + private Long numCows; private Float kgCows; - private PropertyDto property; // se quiser manter o PropertyDto, ok + private PropertyDto property; } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java new file mode 100644 index 0000000..afbdd7e --- /dev/null +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java @@ -0,0 +1,15 @@ +package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto; + +import lombok.Data; +import jakarta.validation.constraints.NotNull; + +@Data +public class ForageUpdateDto { + + private String cultivation; + private String area; + private String averageCost; + private String usefulLife; + private String formation; + private String growthCycle; +} diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java index ca6458e..a8c384f 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java @@ -1,16 +1,22 @@ package br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.impl; import br.edu.utfpr.ProjetoIDRAPI.entity.crud.impl.CrudServiceImpl; -import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.ForageDisponibility; -import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.ForageDisponibilityRepository; -import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.ForageDisponibilityService; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.*; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageCreateDto; import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageDisponibilityDto; -import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageSearchRequest; +import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageUpdateDto; +import br.edu.utfpr.ProjetoIDRAPI.entity.property.Property; +import br.edu.utfpr.ProjetoIDRAPI.entity.property.PropertyRepository; +import jakarta.persistence.EntityManager; import jakarta.transaction.Transactional; import org.modelmapper.ModelMapper; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.http.HttpStatus; +import java.math.BigDecimal; +import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; @@ -20,11 +26,19 @@ public class ForageDisponibilityServiceImpl extends CrudServiceImpl getRepository() { return this.forageRepository; } + @Override + public ForageDisponibility createForage(Long propertyId, ForageCreateDto createDto) { + Property property = propertyRepository.findById(propertyId) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Propriedade não encontrada com ID: " + propertyId)); + ForageDisponibility forage = modelMapper.map(createDto, ForageDisponibility.class); + + forage.setForage(createDto.getCultivation()); + + forage.setPicketArea(createDto.getArea()); + + try { + LocalDate date = LocalDate.parse(createDto.getFormation().substring(0, 10), DateTimeFormatter.ISO_LOCAL_DATE); + forage.setDate(date); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Formato de data inválido para 'formation'. Use YYYY-MM-DD."); + } + if (createDto.getNumCows() != null) { + forage.setNumCows(BigDecimal.valueOf(createDto.getNumCows())); + } + forage.setProperty(property); + return forageRepository.save(forage); + } + @Override public List findByPropertyId(Long propertyId) { List list = forageRepository.findByPropertyIdWithProperty(propertyId); @@ -41,20 +79,16 @@ public List findByPropertyId(Long propertyId) { .map(f -> { ForageDisponibilityDto dto = modelMapper.map(f, ForageDisponibilityDto.class); - // Converter date para String if (f.getDate() != null) { dto.setFormation(f.getDate().format(formatter)); } - // Converter BigInteger para Long if (f.getNumCows() != null) { dto.setNumCows(f.getNumCows().longValue()); } - // Mapear forage para cultivation dto.setCultivation(f.getForage()); - // Mapear picketArea para area, se fizer sentido dto.setArea(f.getPicketArea() != null ? f.getPicketArea().toString() : null); return dto; @@ -62,5 +96,80 @@ public List findByPropertyId(Long propertyId) { .toList(); } + @Override + public void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateDto) { + ForageDisponibility forage = forageRepository.findByIdAndPropertyId(forageId, propertyId) + .orElseThrow(() -> new ResponseStatusException( + HttpStatus.NOT_FOUND, + "Forrageira não encontrada para esta propriedade" + )); + + if (updateDto.getCultivation() != null) { + forage.setForage(updateDto.getCultivation()); + } + + if (updateDto.getArea() != null) { + try { + forage.setPicketArea(Float.valueOf(updateDto.getArea())); + } catch (NumberFormatException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Área inválida"); + } + } + + if (updateDto.getAverageCost() != null) { + try { + forage.setAverageCost(Float.valueOf(updateDto.getAverageCost())); + } catch (NumberFormatException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Custo médio inválido"); + } + } + + if (updateDto.getUsefulLife() != null) { + try { + forage.setUsefulLife(Long.valueOf(updateDto.getUsefulLife())); + } catch (NumberFormatException e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Vida útil inválida"); + } + } + + if (updateDto.getFormation() != null) { + try { + LocalDate date = LocalDate.parse(updateDto.getFormation(), DateTimeFormatter.ISO_LOCAL_DATE); + forage.setDate(date); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Data inválida (use YYYY-MM-DD)"); + } + } + + if (updateDto.getGrowthCycle() != null) { + forage.setGrowthCycle(updateDto.getGrowthCycle()); + } -} + forageRepository.save(forage); + } + + @Override + public ForageDisponibilityDto findDtoById(Long id) { + ForageDisponibility forageEntity = forageRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Registro não encontrado com ID: " + id)); + + this.entityManager.refresh(forageEntity); + + ForageDisponibilityDto dto = modelMapper.map(forageEntity, ForageDisponibilityDto.class); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + dto.setCultivation(forageEntity.getForage()); + + if (forageEntity.getDate() != null) { + dto.setFormation(forageEntity.getDate().format(formatter)); + } + + dto.setArea(forageEntity.getPicketArea() != null ? forageEntity.getPicketArea().toString() : null); + if (forageEntity.getNumCows() != null) { + dto.setNumCows(forageEntity.getNumCows().longValue()); + } + + return dto; + } +} \ No newline at end of file From 71b3ae63dd4161f7b8a0e484476bb3dacc011c00 Mon Sep 17 00:00:00 2001 From: MarcoandreDev Date: Thu, 13 Nov 2025 11:06:38 -0300 Subject: [PATCH 2/2] atts marco --- .../entity/culture/CultureController.java | 10 ---- .../ForageDisponibility.java | 14 +++--- .../ForageDisponibilityController.java | 14 +++--- .../dto/ForageCreateDto.java | 18 +++---- .../dto/ForageDisponibilityDto.java | 18 ++++--- .../dto/ForageUpdateDto.java | 4 +- .../impl/ForageDisponibilityServiceImpl.java | 48 +++---------------- src/main/resources/application.properties | 22 ++++----- 8 files changed, 57 insertions(+), 91 deletions(-) diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java index 7666125..03bc807 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/culture/CultureController.java @@ -43,14 +43,4 @@ public ResponseEntity findByName(@PathVariable String name){ } } - @PostMapping("/advanced-search") - public ResponseEntity> search( - @RequestBody CultureFilter filters, - Pageable pageable - ) { - Page page = cultureService.search(filters, pageable); - return ResponseEntity.ok(page.map(this::convertToDto)); - } - - } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java index ed02804..fbc6fe6 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibility.java @@ -25,21 +25,21 @@ public class ForageDisponibility { private LocalDate date; private String forage; - private Float averageCost; + private Double averageCost; private Long usefulLife; private String growthCycle; private String observation; private String ownershipType; - private Float entry; - private Float residue; - private Float kg; - private Float picketArea; - private Float efficiency; + private Double entry; + private Double residue; + private Double kg; + private Double picketArea; + private Double efficiency; @Column(precision = 20, scale = 0) private BigDecimal numCows; - private Float kgCows; + private Double kgCows; @NotNull @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java index f224290..e0c99a4 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/ForageDisponibilityController.java @@ -7,6 +7,8 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.foragedisponibility.dto.ForageUpdateDto; import jakarta.validation.Valid; import org.modelmapper.ModelMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,6 +20,8 @@ public class ForageDisponibilityController extends CrudController { + private static final Logger log = LoggerFactory.getLogger(ForageDisponibilityController.class); + private final ForageDisponibilityService forageService; private final ModelMapper modelMapper; @@ -40,9 +44,10 @@ protected ModelMapper getModelMapper() { @Override @RequestMapping(method = RequestMethod.POST, value = "/_ignored_") @Deprecated - public ResponseEntity create(ForageDisponibilityDto dto){ + public ResponseEntity create(ForageDisponibilityDto dto) { throw new UnsupportedOperationException("O endpoint de criação de foragem usa o método customizado 'createForageForProperty'."); } + @GetMapping public ResponseEntity> getByProperty(@PathVariable Long propertyId) { List dtos = forageService.findByPropertyId(propertyId); @@ -58,8 +63,7 @@ public ResponseEntity createForageForProperty( ForageDisponibilityDto responseDto = modelMapper.map(createdForage, ForageDisponibilityDto.class); return new ResponseEntity<>(responseDto, HttpStatus.CREATED); } catch (Exception e) { - System.err.println("Erro na criação da Foragem: " + e.getMessage()); - e.printStackTrace(); + log.error("Erro na criação da Foragem: {}", e.getMessage(), e); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); } } @@ -73,11 +77,9 @@ public ResponseEntity updateForage( return ResponseEntity.noContent().build(); // status 204 } - @GetMapping("/{id}/details") public ResponseEntity findById(@PathVariable Long id) { ForageDisponibilityDto forageDto = forageService.findDtoById(id); return ResponseEntity.ok(forageDto); } - -} \ No newline at end of file +} diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java index 946945a..39e5ac5 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageCreateDto.java @@ -3,26 +3,28 @@ import jakarta.validation.constraints.NotNull; import lombok.Data; +import java.time.LocalDate; + @Data public class ForageCreateDto { @NotNull - private Float area; + private Double area; @NotNull - private Float averageCost; + private Double averageCost; @NotNull private Long usefulLife; @NotNull - private String formation; + private LocalDate formation; @NotNull private String growthCycle; private String observation; @NotNull private String ownershipType; private String cultivation; - private Float entry; - private Float residue; - private Float kg; - private Float efficiency; + private Double entry; + private Double residue; + private Double kg; + private Double efficiency; private Long numCows; - private Float kgCows; + private Double kgCows; } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java index dc3e1c0..3766e25 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageDisponibilityDto.java @@ -3,6 +3,8 @@ import br.edu.utfpr.ProjetoIDRAPI.entity.property.dto.PropertyDto; import lombok.Data; +import java.time.LocalDate; + @Data public class ForageDisponibilityDto { @@ -11,17 +13,19 @@ public class ForageDisponibilityDto { private String area; private String averageCost; private String usefulLife; - private String formation; // antes era date + private LocalDate formation; // antes era date private String ownershipType; private String growthCycle; private String observation; // opcional - private Float entry; - private Float residue; - private Float kg; - private Float picketArea; - private Float efficiency; + private Double entry; + private Double residue; + private Double kg; + private Double picketArea; + private Double efficiency; private Long numCows; - private Float kgCows; + private Double kgCows; private PropertyDto property; + + } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java index afbdd7e..2f63db7 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/dto/ForageUpdateDto.java @@ -3,6 +3,8 @@ import lombok.Data; import jakarta.validation.constraints.NotNull; +import java.time.LocalDate; + @Data public class ForageUpdateDto { @@ -10,6 +12,6 @@ public class ForageUpdateDto { private String area; private String averageCost; private String usefulLife; - private String formation; + private LocalDate formation; private String growthCycle; } diff --git a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java index a8c384f..534fc02 100644 --- a/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java +++ b/src/main/java/br/edu/utfpr/ProjetoIDRAPI/entity/foragedisponibility/impl/ForageDisponibilityServiceImpl.java @@ -17,7 +17,6 @@ import java.math.BigDecimal; import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.List; @Service @@ -29,8 +28,6 @@ public class ForageDisponibilityServiceImpl extends CrudServiceImpl new ResponseStatusException(HttpStatus.NOT_FOUND, "Propriedade não encontrada com ID: " + propertyId)); ForageDisponibility forage = modelMapper.map(createDto, ForageDisponibility.class); - forage.setForage(createDto.getCultivation()); - forage.setPicketArea(createDto.getArea()); - - try { - LocalDate date = LocalDate.parse(createDto.getFormation().substring(0, 10), DateTimeFormatter.ISO_LOCAL_DATE); - forage.setDate(date); - } catch (Exception e) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Formato de data inválido para 'formation'. Use YYYY-MM-DD."); - } + forage.setDate(createDto.getFormation()); if (createDto.getNumCows() != null) { forage.setNumCows(BigDecimal.valueOf(createDto.getNumCows())); } forage.setProperty(property); return forageRepository.save(forage); } - @Override public List findByPropertyId(Long propertyId) { List list = forageRepository.findByPropertyIdWithProperty(propertyId); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + // REMOVIDO: DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return list.stream() .map(f -> { ForageDisponibilityDto dto = modelMapper.map(f, ForageDisponibilityDto.class); - if (f.getDate() != null) { - dto.setFormation(f.getDate().format(formatter)); + dto.setFormation(f.getDate()); } if (f.getNumCows() != null) { @@ -95,7 +82,6 @@ public List findByPropertyId(Long propertyId) { }) .toList(); } - @Override public void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateDto) { ForageDisponibility forage = forageRepository.findByIdAndPropertyId(forageId, propertyId) @@ -103,27 +89,23 @@ public void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateD HttpStatus.NOT_FOUND, "Forrageira não encontrada para esta propriedade" )); - if (updateDto.getCultivation() != null) { forage.setForage(updateDto.getCultivation()); } - if (updateDto.getArea() != null) { try { - forage.setPicketArea(Float.valueOf(updateDto.getArea())); + forage.setPicketArea(Double.valueOf(updateDto.getArea())); } catch (NumberFormatException e) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Área inválida"); } } - if (updateDto.getAverageCost() != null) { try { - forage.setAverageCost(Float.valueOf(updateDto.getAverageCost())); + forage.setAverageCost(Double.valueOf(updateDto.getAverageCost())); } catch (NumberFormatException e) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Custo médio inválido"); } } - if (updateDto.getUsefulLife() != null) { try { forage.setUsefulLife(Long.valueOf(updateDto.getUsefulLife())); @@ -131,20 +113,12 @@ public void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateD throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Vida útil inválida"); } } - if (updateDto.getFormation() != null) { - try { - LocalDate date = LocalDate.parse(updateDto.getFormation(), DateTimeFormatter.ISO_LOCAL_DATE); - forage.setDate(date); - } catch (Exception e) { - throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Data inválida (use YYYY-MM-DD)"); - } + forage.setDate(updateDto.getFormation()); } - if (updateDto.getGrowthCycle() != null) { forage.setGrowthCycle(updateDto.getGrowthCycle()); } - forageRepository.save(forage); } @@ -152,24 +126,16 @@ public void updateForage(Long propertyId, Long forageId, ForageUpdateDto updateD public ForageDisponibilityDto findDtoById(Long id) { ForageDisponibility forageEntity = forageRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Registro não encontrado com ID: " + id)); - this.entityManager.refresh(forageEntity); - ForageDisponibilityDto dto = modelMapper.map(forageEntity, ForageDisponibilityDto.class); - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - dto.setCultivation(forageEntity.getForage()); - if (forageEntity.getDate() != null) { - dto.setFormation(forageEntity.getDate().format(formatter)); + dto.setFormation(forageEntity.getDate()); } - dto.setArea(forageEntity.getPicketArea() != null ? forageEntity.getPicketArea().toString() : null); if (forageEntity.getNumCows() != null) { dto.setNumCows(forageEntity.getNumCows().longValue()); } - return dto; } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 458e279..8386075 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,25 +1,25 @@ server.port=${SERVER_PORT:8080} spring.config.name=Projeto_IDR_API -# Database Config +# Configurações do banco de dados spring.datasource.driver-class-name=org.postgresql.Driver -spring.datasource.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/idr} -spring.datasource.username=${DATABASE_USERNAME:postgres} -spring.datasource.password=${DATABASE_PASSWORD:postgres} +spring.datasource.url=jdbc:postgresql://localhost:5432/IDR-API +spring.datasource.username=postgres +spring.datasource.password=1234 -# Hibernate and JPA config +# Configuração do Hibernate e JPA spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect spring.jpa.show-sql=true -# Email config -spring.mail.host=${MAIL_SMTP:smtp.gmail.com} -spring.mail.port=${MAIL_PORT:587} -spring.mail.username=${MAIL_USERNAME:mail@gmail.com} -spring.mail.password=${MAIL_PASSWORD:P4ssword} +# Configurações de e-mail +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=danieli.marialefchak@gmail.com +spring.mail.password=senhaGerada spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 -spring.datasource.hikari.idle-timeout=30000 \ No newline at end of file +spring.datasource.hikari.idle-timeout=30000