From c4766ea876989f97c2198f164c8be1ff3f3edf87 Mon Sep 17 00:00:00 2001 From: mirandadieguez <165207828+mirandadieguez@users.noreply.github.com> Date: Sun, 25 May 2025 14:40:25 -0300 Subject: [PATCH 1/5] agrego carpeta para el futuro --- src/main/java/ar/utn/ba/ddsi/mailing/Adapters/IAdapter.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/Adapters/IAdapter.java diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/Adapters/IAdapter.java b/src/main/java/ar/utn/ba/ddsi/mailing/Adapters/IAdapter.java new file mode 100644 index 0000000..4e76b8b --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/Adapters/IAdapter.java @@ -0,0 +1,4 @@ +package ar.utn.ba.ddsi.mailing.Adapters; + +public interface IAdapter { +} From 06a0a266f56b0afbf88fd1e6978d2b0f2f92b0dd Mon Sep 17 00:00:00 2001 From: mirandadieguez <165207828+mirandadieguez@users.noreply.github.com> Date: Sun, 25 May 2025 14:41:39 -0300 Subject: [PATCH 2/5] agrego controllers y token para probar el consumo de api, funciona --- .../controllers/AlertasController.java | 21 ++++++++++++++++ .../mailing/controllers/ClimaController.java | 25 +++++++++++++++++++ src/main/resources/application.properties | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/controllers/AlertasController.java create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/controllers/ClimaController.java diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/controllers/AlertasController.java b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/AlertasController.java new file mode 100644 index 0000000..6fff3c7 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/AlertasController.java @@ -0,0 +1,21 @@ +package ar.utn.ba.ddsi.mailing.controllers; + +import ar.utn.ba.ddsi.mailing.services.IAlertasService; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping("/api/alertas") +public class AlertasController { + + private final IAlertasService alertasService; + + public AlertasController(IAlertasService alertasService) { + this.alertasService = alertasService; + } + + @PostMapping("/procesar") + public Mono procesarAlertas() { + return alertasService.generarAlertasYAvisar(); + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/controllers/ClimaController.java b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/ClimaController.java new file mode 100644 index 0000000..5de8a1d --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/ClimaController.java @@ -0,0 +1,25 @@ +package ar.utn.ba.ddsi.mailing.controllers; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/climas") +public class ClimaController { + + private final IClimaRepository climaRepository; + + public ClimaController(IClimaRepository climaRepository) { + this.climaRepository = climaRepository; + } + + @PostMapping + public Clima guardarClima(@RequestBody Clima clima) { + return climaRepository.save(clima); + } +} + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6bcf441..4a0e5b7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=climalert cron.expression=0 * * * * * # WeatherAPI Configuration -weather.api.key=API-KEY-EXAMPLE +weather.api.key=dd7ce45856b54fe89f9164145252505 weather.api.base-url=http://api.weatherapi.com/v1 # Email Configuration From 09d1f5b1f5c9155888a742ecee8bd2fb3e53eab8 Mon Sep 17 00:00:00 2001 From: mirandadieguez <165207828+mirandadieguez@users.noreply.github.com> Date: Sun, 25 May 2025 14:42:26 -0300 Subject: [PATCH 3/5] agego entidad de dominio Alerta --- .../ddsi/mailing/models/entities/Alerta.java | 25 +++++++++++++++++++ .../mailing/services/impl/AlertasService.java | 18 ++++++------- 2 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java new file mode 100644 index 0000000..a1dc4fe --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java @@ -0,0 +1,25 @@ +package ar.utn.ba.ddsi.mailing.models.entities; + +import ar.utn.ba.ddsi.mailing.models.entities.condiciones.Condicion; +import ar.utn.ba.ddsi.mailing.models.entities.condiciones.CondicionTemperatura; +import lombok.Getter; +import lombok.Setter; +import java.util.List; + +@Getter +@Setter +public class Alerta { + +private List condiciones; + +public Alerta(List condiciones){ + this.condiciones = condiciones; +} + + public boolean cumpleCondiciones(Clima clima) { + return this.condiciones.stream().allMatch(condicion->condicion.seCumple(clima)); + } + + + +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/AlertasService.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/AlertasService.java index f5d52b6..5783981 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/AlertasService.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/AlertasService.java @@ -1,7 +1,11 @@ package ar.utn.ba.ddsi.mailing.services.impl; +import ar.utn.ba.ddsi.mailing.models.entities.Alerta; import ar.utn.ba.ddsi.mailing.models.entities.Clima; import ar.utn.ba.ddsi.mailing.models.entities.Email; +import ar.utn.ba.ddsi.mailing.models.entities.condiciones.CondicionHumedad; +import ar.utn.ba.ddsi.mailing.models.entities.condiciones.CondicionTemperatura; +import ar.utn.ba.ddsi.mailing.models.entities.enums.Operacion; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import ar.utn.ba.ddsi.mailing.services.IAlertasService; import org.slf4j.Logger; @@ -15,9 +19,11 @@ @Service public class AlertasService implements IAlertasService { private static final Logger logger = LoggerFactory.getLogger(AlertasService.class); - private static final double TEMPERATURA_ALERTA = 35.0; - private static final int HUMEDAD_ALERTA = 60; + Alerta alerta = new Alerta(List.of( + new CondicionTemperatura(Operacion.MAYOR,35.0), + new CondicionHumedad(Operacion.MAYOR, 60) + )); private final IClimaRepository climaRepository; private final EmailService emailService; private final String remitente; @@ -43,7 +49,7 @@ public Mono generarAlertasYAvisar() { }) .flatMap(climas -> { climas.stream() - .filter(this::cumpleCondicionesAlerta) + .filter(c-> alerta.cumpleCondiciones(c)) .forEach(this::generarYEnviarEmail); // Marcar todos como procesados @@ -61,12 +67,6 @@ public Mono generarAlertasYAvisar() { .then(); } - private boolean cumpleCondicionesAlerta(Clima clima) { - //TODO: podríamos refactorizar el diseño para que no sea un simple método, pues puede ser más complejo - return clima.getTemperaturaCelsius() > TEMPERATURA_ALERTA && - clima.getHumedad() > HUMEDAD_ALERTA; - } - private void generarYEnviarEmail(Clima clima) { String asunto = "Alerta de Clima - Condiciones Extremas"; String mensaje = String.format( From 76751fd7323ec418857caab5b01bdd2dc9f0f173 Mon Sep 17 00:00:00 2001 From: mirandadieguez <165207828+mirandadieguez@users.noreply.github.com> Date: Sun, 25 May 2025 14:44:02 -0300 Subject: [PATCH 4/5] agrego comentario para el futuro en email, en clima no hice cambios --- .../java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java | 1 + .../java/ar/utn/ba/ddsi/mailing/models/entities/Email.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java index 4eaa65b..b8dde62 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java @@ -23,4 +23,5 @@ public Clima() { this.fechaActualizacion = LocalDateTime.now(); this.procesado = false; } + } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Email.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Email.java index eb940be..3b6fdc1 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Email.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Email.java @@ -23,5 +23,6 @@ public Email(String destinatario, String remitente, String asunto, String conten public void enviar() { //TODO: Implementación pendiente. Podríamos usar adapters + //Tambien se me ocurre que lo correcto seria que este metodo estuviera en el service, no en una entidad de dominio, porque realiza cosas complejas y se conecta con el exterior, ya que se encarga de enviar mails fuera del sistema } -} \ No newline at end of file +} From 1ee99c0f993ea91a8d43303ef6ffa5fcd0a6fa69 Mon Sep 17 00:00:00 2001 From: mirandadieguez <165207828+mirandadieguez@users.noreply.github.com> Date: Sun, 25 May 2025 14:45:35 -0300 Subject: [PATCH 5/5] agrego entidad condicion para refactorizar el cumpleCondicion que estaba antes,que era mas simple y no permitia complejizaciones --- .../entities/condiciones/Condicion.java | 9 ++++++ .../condiciones/CondicionHumedad.java | 31 +++++++++++++++++++ .../condiciones/CondicionTemperatura.java | 31 +++++++++++++++++++ .../models/entities/enums/Operacion.java | 7 +++++ 4 files changed, 78 insertions(+) create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/Condicion.java create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionHumedad.java create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionTemperatura.java create mode 100644 src/main/java/ar/utn/ba/ddsi/mailing/models/entities/enums/Operacion.java diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/Condicion.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/Condicion.java new file mode 100644 index 0000000..decf9b7 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/Condicion.java @@ -0,0 +1,9 @@ +package ar.utn.ba.ddsi.mailing.models.entities.condiciones; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.entities.enums.Operacion; + +public interface Condicion { + public abstract boolean seCumple(Clima clima); + +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionHumedad.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionHumedad.java new file mode 100644 index 0000000..cce7ba4 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionHumedad.java @@ -0,0 +1,31 @@ +package ar.utn.ba.ddsi.mailing.models.entities.condiciones; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.entities.enums.Operacion; + +public class CondicionHumedad implements Condicion { + private Operacion operacion; + private Integer valorEsperado; + + public CondicionHumedad(Operacion operacion, Integer valorEsperado) { + this.operacion = operacion; + this.valorEsperado = valorEsperado; + } + + @Override + public boolean seCumple(Clima clima){ + switch (this.operacion){ + + case IGUAL -> { + return clima.getHumedad().equals(this.valorEsperado); + } + case MENOR -> { + return clima.getHumedad() < this.valorEsperado; + } + case MAYOR -> { + return clima.getHumedad() > this.valorEsperado; + } + default -> throw new IllegalStateException("Unexpected value: " + this.operacion); + } + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionTemperatura.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionTemperatura.java new file mode 100644 index 0000000..67cedb4 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/condiciones/CondicionTemperatura.java @@ -0,0 +1,31 @@ +package ar.utn.ba.ddsi.mailing.models.entities.condiciones; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.entities.enums.Operacion; + +public class CondicionTemperatura implements Condicion { + private Operacion operacion; + private Double valorEsperado; + + public CondicionTemperatura(Operacion operacion, Double valorEsperado) { + this.operacion = operacion; + this.valorEsperado = valorEsperado; + } + + @Override + public boolean seCumple(Clima clima){ + switch (this.operacion){ + + case IGUAL -> { + return clima.getTemperaturaCelsius().equals(this.valorEsperado); + } + case MENOR -> { + return clima.getTemperaturaCelsius() < this.valorEsperado; + } + case MAYOR -> { + return clima.getTemperaturaCelsius() > this.valorEsperado; + } + default -> throw new IllegalStateException("Unexpected value: " + this.operacion); + } + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/enums/Operacion.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/enums/Operacion.java new file mode 100644 index 0000000..dd6276c --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/enums/Operacion.java @@ -0,0 +1,7 @@ +package ar.utn.ba.ddsi.mailing.models.entities.enums; + +public enum Operacion { + MAYOR, + MENOR, + IGUAL +}