From dc5935d4b2779b4fe7ed3223911a4a0cff1b937a Mon Sep 17 00:00:00 2001 From: Breixo Senra Date: Sat, 25 Oct 2025 01:47:17 +0200 Subject: [PATCH] Endpoints canVaccinate y create funcionando --- .../esei/xcs/rest/VaccinationResource.java | 67 ++++++++++++++++++ .../es/uvigo/esei/xcs/rest/VetResource.java | 6 +- .../esei/xcs/service/VaccinationService.java | 69 ++++++++++++++++++- 3 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 rest/src/main/java/es/uvigo/esei/xcs/rest/VaccinationResource.java diff --git a/rest/src/main/java/es/uvigo/esei/xcs/rest/VaccinationResource.java b/rest/src/main/java/es/uvigo/esei/xcs/rest/VaccinationResource.java new file mode 100644 index 0000000..1380454 --- /dev/null +++ b/rest/src/main/java/es/uvigo/esei/xcs/rest/VaccinationResource.java @@ -0,0 +1,67 @@ +package es.uvigo.esei.xcs.rest; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import javax.ejb.EJB; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import es.uvigo.esei.xcs.domain.entities.Vaccination; +import es.uvigo.esei.xcs.service.VaccinationService; + +@Path("vaccination") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public class VaccinationResource { + + @EJB + private VaccinationService vaccinationService; + + @GET + @Path("canVaccinate/{petId}/{vaccineId}") + public Response canVaccinate( + @PathParam("petId") Long petId, + @PathParam("vaccineId") Long vaccineId + ) { + Date now = new Date(); + Boolean result = vaccinationService.canVaccinate(petId, vaccineId, now); + return Response.ok(result).build(); + } + + + @POST + @Path("create/{petId}/{vaccineId}") + public Response createVaccination( + @PathParam("petId") Long petId, + @PathParam("vaccineId") Long vaccineId, + @QueryParam("date") String textDate // opcional, formato yyyy-MM-dd + ) { + Date date = new Date(); + if (textDate != null) { + try { + date = new SimpleDateFormat("yyyy-MM-dd").parse(textDate); + } catch (ParseException e) { + return Response.status(Response.Status.BAD_REQUEST) + .entity("Invalid date format, expected yyyy-MM-dd").build(); + } + } + + try { + Vaccination vaccination = vaccinationService.create(petId, vaccineId, date); + return Response.ok(vaccination).build(); + } catch (IllegalArgumentException e) { + return Response.status(Response.Status.BAD_REQUEST) + .entity(e.getMessage()).build(); + } + } + +} diff --git a/rest/src/main/java/es/uvigo/esei/xcs/rest/VetResource.java b/rest/src/main/java/es/uvigo/esei/xcs/rest/VetResource.java index 17a70c2..484a44b 100644 --- a/rest/src/main/java/es/uvigo/esei/xcs/rest/VetResource.java +++ b/rest/src/main/java/es/uvigo/esei/xcs/rest/VetResource.java @@ -178,12 +178,12 @@ public class VetResource { @Path("pets/{petIdentifierType}/{petIdentifierValue}/vaccination") @POST public Response registerVaccination( - @QueryParam("date") String date, + @QueryParam("date") Date date, VaccinationCreationData vaccinationData ) { Vaccination vaccination = this.vaccinationService.create( - vaccinationData.getPetId().intValue(), - vaccinationData.getVaccineId().intValue(), + vaccinationData.getPetId(), + vaccinationData.getVaccineId(), date ); diff --git a/service/src/main/java/es/uvigo/esei/xcs/service/VaccinationService.java b/service/src/main/java/es/uvigo/esei/xcs/service/VaccinationService.java index 6acba97..7d1c78c 100644 --- a/service/src/main/java/es/uvigo/esei/xcs/service/VaccinationService.java +++ b/service/src/main/java/es/uvigo/esei/xcs/service/VaccinationService.java @@ -7,15 +7,19 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; +import javax.annotation.security.PermitAll; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import es.uvigo.esei.xcs.domain.entities.MultidoseVaccine; +import es.uvigo.esei.xcs.domain.entities.PeriodicVaccine; import es.uvigo.esei.xcs.domain.entities.Pet; import es.uvigo.esei.xcs.domain.entities.Vaccination; import es.uvigo.esei.xcs.domain.entities.Vaccine; @Stateless +@PermitAll public class VaccinationService { @PersistenceContext EntityManager em; @@ -40,7 +44,7 @@ public class VaccinationService { } - public Vaccination create(int petId, int vaccineId, String textDate) { + /*public Vaccination create(int petId, int vaccineId, String textDate) { Pet pet = requireNonNull(em.find(Pet.class, petId), "Pet can't be null"); Vaccine vaccine = requireNonNull(em.find(Vaccine.class, vaccineId), "Vaccine can't be null"); Date date = new Date(); @@ -53,10 +57,24 @@ public class VaccinationService { } } + Vaccination vaccination = new Vaccination(pet, vaccine, date); + em.persist(vaccination); + return vaccination; + }*/ + + public Vaccination create(Long petId, Long vaccineId, Date date) { + Pet pet = requireNonNull(em.find(Pet.class, petId), "Pet can't be null"); + Vaccine vaccine = requireNonNull(em.find(Vaccine.class, vaccineId), "Vaccine can't be null"); + + if (!canVaccinate(petId, vaccineId, date)) { + throw new IllegalArgumentException("This vaccination cannot be created due to vaccine rules"); + } + Vaccination vaccination = new Vaccination(pet, vaccine, date); em.persist(vaccination); return vaccination; } + public Vaccination updateDate(int vaccinationId, Date date) { @@ -74,4 +92,53 @@ public class VaccinationService { } + public Boolean canVaccinate(Long petId, Long vaccineId, Date date) { + Pet pet = em.find(Pet.class, petId); + Vaccine vaccine = em.find(Vaccine.class, vaccineId); + if (pet == null || vaccine == null) return false; + + List prevVaccinations = em.createQuery( + "SELECT v FROM Vaccination v WHERE v.pet.id = :petId AND v.vaccine.id = :vaccineId ORDER BY v.date DESC", + Vaccination.class) + .setParameter("petId", petId) + .setParameter("vaccineId", vaccineId) + .getResultList(); + + if (vaccine instanceof MultidoseVaccine) { + MultidoseVaccine multi = (MultidoseVaccine) vaccine; + Integer doses = multi.getDoses(); + if (doses == null) return false; + return prevVaccinations.size() < doses; + + } else if (vaccine instanceof PeriodicVaccine) { + PeriodicVaccine periodic = (PeriodicVaccine) vaccine; + if (prevVaccinations.isEmpty()) return true; + Vaccination last = prevVaccinations.get(0); + if (last.getDate() == null || date == null) return false; + + long diffDays; + switch (periodic.getPeriodicType()) { + case YEARS: + diffDays = periodic.getPeriode() * 365L; + break; + case MONTHS: + diffDays = periodic.getPeriode() * 30L; + break; + case DAYS: + diffDays = periodic.getPeriode(); + break; + default: + return false; + } + + long diffMillis = date.getTime() - last.getDate().getTime(); + return diffMillis >= diffDays * 24L * 60L * 60L * 1000L; + + } else { // MONODOSE + return prevVaccinations.isEmpty(); + } + } + + + } -- 2.18.1