diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/controllers/EmailController.java b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/EmailController.java index fec8ee0..b1a45a2 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/controllers/EmailController.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/controllers/EmailController.java @@ -2,6 +2,8 @@ import ar.utn.ba.ddsi.mailing.models.entities.Email; import ar.utn.ba.ddsi.mailing.services.IEmailService; +import ar.utn.ba.ddsi.mailing.services.impl.EmailService; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -15,12 +17,12 @@ public EmailController(IEmailService emailService) { } @PostMapping - public Email crearEmail(@RequestBody Email email) { - return emailService.crearEmail(email); + public EmailDTO crearEmail(@RequestBody EmailDTO emailDTO) { + return emailService.crearEmail(emailDTO); } @GetMapping - public List obtenerEmails(@RequestParam(required = false) Boolean pendiente) { + public List obtenerEmails(@RequestParam(required = false) Boolean pendiente) { return emailService.obtenerEmails(pendiente); } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/dtoEmail/EmailDTO.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/dtoEmail/EmailDTO.java new file mode 100644 index 0000000..9dbc5e8 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/dtoEmail/EmailDTO.java @@ -0,0 +1,13 @@ +package ar.utn.ba.ddsi.mailing.models.dtoEmail; + +import lombok.Getter; +import lombok.AllArgsConstructor; + +@Getter +@AllArgsConstructor +public class EmailDTO { + private String destinatario; + private String remitente; + private String asunto; + private String mensaje; +} 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..6c27bd1 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java @@ -0,0 +1,44 @@ +package ar.utn.ba.ddsi.mailing.models.entities; +import java.time.LocalDateTime; + + + +public class Alerta { + private Long id; + private Clima clima; + private String descripcion; + private LocalDateTime fechaGeneracion; + private boolean enviada; + + public Alerta(Clima clima, String descripcion) { + this.clima = clima; + this.descripcion = descripcion; + this.fechaGeneracion = LocalDateTime.now(); + this.enviada = false; + } + + public Long getId() { + return id; + } + + public Clima getClima() { + return clima; + } + + public String getDescripcion() { + return descripcion; + } + + public LocalDateTime getFechaGeneracion() { + return fechaGeneracion; + } + + public boolean isEnviada() { + return enviada; + } + + public void marcarComoEnviada() { + this.enviada = true; + } +} + 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..23ca947 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 @@ -8,19 +8,27 @@ @Setter public class Clima { private Long id; + /* private String ciudad; private String region; - private String pais; + private String pais;*/ + private Ubicacion ubicacion; + /* private Double temperaturaCelsius; private Double temperaturaFahrenheit; private String condicion; private Double velocidadVientoKmh; private Integer humedad; + */ + private CondicionesClimaticas condiciones; private LocalDateTime fechaActualizacion; private boolean procesado; - public Clima() { + public Clima(Ubicacion ubicacion, CondicionesClimaticas condiciones) { + this.ubicacion = ubicacion; + this.condiciones = condiciones; 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/CondicionesClimaticas.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/CondicionesClimaticas.java new file mode 100644 index 0000000..1e247c9 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/CondicionesClimaticas.java @@ -0,0 +1,22 @@ +package ar.utn.ba.ddsi.mailing.models.entities; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CondicionesClimaticas { + private double temperaturaCelsius; + private double temperaturaFahrenheit; + private String condicion; + private double velocidadVientoKmh; + private int humedad; + + public CondicionesClimaticas(double temperaturaCelsius, double temperaturaFahrenheit, String condicion, double velocidadVientoKmh, int humedad) { + this.temperaturaCelsius = temperaturaCelsius; + this.temperaturaFahrenheit = temperaturaFahrenheit; + this.condicion = condicion; + this.velocidadVientoKmh = velocidadVientoKmh; + this.humedad = humedad; + } +} \ 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..bf32de5 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 @@ -1,5 +1,7 @@ package ar.utn.ba.ddsi.mailing.models.entities; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; +import ar.utn.ba.ddsi.mailing.services.email.EmailSenderAdapter; import lombok.Getter; import lombok.Setter; @@ -12,16 +14,21 @@ public class Email { private String asunto; private String contenido; private boolean enviado; + private final EmailSenderAdapter emailSenderAdapter; - public Email(String destinatario, String remitente, String asunto, String contenido) { + + public Email(String destinatario, String remitente, String asunto, String contenido, EmailSenderAdapter emailSenderAdapter) { this.destinatario = destinatario; this.remitente = remitente; this.asunto = asunto; this.contenido = contenido; this.enviado = false; + this.emailSenderAdapter = emailSenderAdapter; + } public void enviar() { - //TODO: Implementación pendiente. Podríamos usar adapters + emailSenderAdapter.enviarEmail(new EmailDTO(destinatario, remitente, asunto, contenido)); + this.enviado = true; } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Ubicacion.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Ubicacion.java new file mode 100644 index 0000000..917d047 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Ubicacion.java @@ -0,0 +1,18 @@ +package ar.utn.ba.ddsi.mailing.models.entities; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Ubicacion { + private String ciudad; + private String region; + private String pais; + + public Ubicacion(String ciudad, String region, String pais) { + this.ciudad = ciudad; + this.region = region; + this.pais = pais; + } +} \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/ClimaRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/ClimaRepository.java index 864349b..1d27088 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/ClimaRepository.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/ClimaRepository.java @@ -1,6 +1,7 @@ package ar.utn.ba.ddsi.mailing.models.repositories.impl; import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.entities.Ubicacion; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import org.springframework.stereotype.Repository; import java.util.*; @@ -9,7 +10,7 @@ @Repository public class ClimaRepository implements IClimaRepository { private final Map climas = new HashMap<>(); - private final Map ciudadToId = new HashMap<>(); + private final Map ciudadToId = new HashMap<>(); private final AtomicLong idGenerator = new AtomicLong(1); @Override @@ -17,11 +18,10 @@ public Clima save(Clima clima) { if (clima.getId() == null) { Long id = idGenerator.getAndIncrement(); clima.setId(id); - climas.put(id, clima); - ciudadToId.put(clima.getCiudad(), id); - } else { - climas.put(clima.getId(), clima); - ciudadToId.put(clima.getCiudad(), clima.getId()); + } + climas.put(clima.getId(), clima); + if (clima.getUbicacion() != null) { + ciudadToId.put(clima.getUbicacion(), clima.getId()); } return clima; } @@ -40,7 +40,7 @@ public Optional findById(Long id) { public Optional findByCiudad(String ciudad) { Long id = ciudadToId.get(ciudad); return id != null ? Optional.of(climas.get(id)) : Optional.empty(); - } + }//Revisar @Override public List findByProcesado(boolean procesado) { @@ -53,7 +53,7 @@ public List findByProcesado(boolean procesado) { public void delete(Clima clima) { if (clima.getId() != null) { climas.remove(clima.getId()); - ciudadToId.remove(clima.getCiudad()); + ciudadToId.remove(clima.getUbicacion()); } } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/IEmailService.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/IEmailService.java index 5be1682..a967560 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/services/IEmailService.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/IEmailService.java @@ -1,11 +1,12 @@ package ar.utn.ba.ddsi.mailing.services; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; import ar.utn.ba.ddsi.mailing.models.entities.Email; import java.util.List; public interface IEmailService { - Email crearEmail(Email email); - List obtenerEmails(Boolean pendiente); + EmailDTO crearEmail(EmailDTO emailDTO); + List obtenerEmails(Boolean pendiente); void procesarPendientes(); void loguearEmailsPendientes(); } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorHumedad.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorHumedad.java new file mode 100644 index 0000000..0c8bea3 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorHumedad.java @@ -0,0 +1,16 @@ +package ar.utn.ba.ddsi.mailing.services.alertas; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; + +public class AlertaPorHumedad implements TipoAlerta { + private int humedadLimite; + + public AlertaPorHumedad(int humedadLimite) { + this.humedadLimite = humedadLimite; + } + + @Override + public boolean esCumplidaPor(Clima clima) { + return clima.getCondiciones().getHumedad() > humedadLimite; + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorTemperatura.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorTemperatura.java new file mode 100644 index 0000000..5cec45b --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/AlertaPorTemperatura.java @@ -0,0 +1,16 @@ +package ar.utn.ba.ddsi.mailing.services.alertas; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; + +public class AlertaPorTemperatura implements TipoAlerta { + private double temperaturaLimite; + + public AlertaPorTemperatura(double temperaturaLimite) { + this.temperaturaLimite = temperaturaLimite; + } + + @Override + public boolean esCumplidaPor(Clima clima) { + return clima.getCondiciones().getTemperaturaCelsius() > temperaturaLimite; + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/EvaluadorAlertas.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/EvaluadorAlertas.java new file mode 100644 index 0000000..e221dbb --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/EvaluadorAlertas.java @@ -0,0 +1,16 @@ +package ar.utn.ba.ddsi.mailing.services.alertas; +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.services.alertas.TipoAlerta; +import java.util.List; + +public class EvaluadorAlertas { + private List condiciones; + + public EvaluadorAlertas(List condiciones) { + this.condiciones = condiciones; + } + + public boolean cumpleCondiciones(Clima clima) { + return condiciones.stream().allMatch(condicion -> condicion.esCumplidaPor(clima)); + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/TipoAlerta.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/TipoAlerta.java new file mode 100644 index 0000000..581c5dd --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/alertas/TipoAlerta.java @@ -0,0 +1,7 @@ +package ar.utn.ba.ddsi.mailing.services.alertas; +import ar.utn.ba.ddsi.mailing.models.entities.Clima; + + +public interface TipoAlerta { + boolean esCumplidaPor(Clima clima); +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/email/EmailSenderAdapter.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/email/EmailSenderAdapter.java new file mode 100644 index 0000000..9945d29 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/email/EmailSenderAdapter.java @@ -0,0 +1,6 @@ +package ar.utn.ba.ddsi.mailing.services.email; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; + +public interface EmailSenderAdapter { + void enviarEmail(EmailDTO emailDTO); +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/email/SimpleEmailSender.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/email/SimpleEmailSender.java new file mode 100644 index 0000000..d83f16d --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/email/SimpleEmailSender.java @@ -0,0 +1,17 @@ +package ar.utn.ba.ddsi.mailing.services.email; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class SimpleEmailSender implements EmailSenderAdapter { + private static final Logger logger = LoggerFactory.getLogger(SimpleEmailSender.class); + + @Override + public void enviarEmail(EmailDTO emailDTO) { + logger.info("Enviando email a de la manera tradicional'"); + } +} + + 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..dc9d211 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,13 @@ package ar.utn.ba.ddsi.mailing.services.impl; +import ar.utn.ba.ddsi.mailing.models.entities.Alerta; +import ar.utn.ba.ddsi.mailing.services.alertas.EvaluadorAlertas; +import ar.utn.ba.ddsi.mailing.services.alertas.AlertaPorTemperatura; +import ar.utn.ba.ddsi.mailing.services.alertas.AlertaPorHumedad; 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.dtoEmail.EmailDTO; +import ar.utn.ba.ddsi.mailing.services.impl.EmailService; +//import ar.utn.ba.ddsi.mailing.models.entities.Email; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import ar.utn.ba.ddsi.mailing.services.IAlertasService; import org.slf4j.Logger; @@ -15,21 +21,27 @@ @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; private final IClimaRepository climaRepository; private final EmailService emailService; + private final EvaluadorAlertas evaluadorAlertas; private final String remitente; private final List destinatarios; public AlertasService( - IClimaRepository climaRepository, + IClimaRepository climaRepository, EmailService emailService, @Value("${email.alertas.remitente}") String remitente, - @Value("${email.alertas.destinatarios}") String destinatarios) { + @Value("${email.alertas.destinatarios}") String destinatarios, + @Value("${alerta.temperatura.limite}") double temperaturaLimite, + @Value("${alerta.humedad.limite}") int humedadLimite){ + this.climaRepository = climaRepository; this.emailService = emailService; + this.evaluadorAlertas = new EvaluadorAlertas(List.of( + new AlertaPorTemperatura(temperaturaLimite), + new AlertaPorHumedad(humedadLimite) + )); this.remitente = remitente; this.destinatarios = Arrays.asList(destinatarios.split(",")); } @@ -43,7 +55,7 @@ public Mono generarAlertasYAvisar() { }) .flatMap(climas -> { climas.stream() - .filter(this::cumpleCondicionesAlerta) + .filter(evaluadorAlertas::cumpleCondiciones) .forEach(this::generarYEnviarEmail); // Marcar todos como procesados @@ -61,12 +73,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( @@ -76,19 +82,21 @@ private void generarYEnviarEmail(Clima clima) { "Condición: %s\n" + "Velocidad del viento: %.1f km/h\n\n" + "Se recomienda tomar precauciones.", - clima.getCiudad(), - clima.getTemperaturaCelsius(), - clima.getHumedad(), - clima.getCondicion(), - clima.getVelocidadVientoKmh() + clima.getUbicacion().getCiudad(), + clima.getCondiciones().getTemperaturaCelsius(), + clima.getCondiciones().getHumedad(), + clima.getCondiciones().getCondicion(), + clima.getCondiciones().getVelocidadVientoKmh() + ); for (String destinatario : destinatarios) { - Email email = new Email(destinatario, remitente, asunto, mensaje); - emailService.crearEmail(email); + EmailDTO emailDTO = new EmailDTO(destinatario, remitente, asunto, mensaje); + emailService.crearEmail(emailDTO); } - logger.info("Email de alerta generado para {} - Enviado a {} destinatarios", - clima.getCiudad(), destinatarios.size()); + logger.info("Email de alerta generado para {} - Enviado a {} destinatarios", + clima.getUbicacion().getCiudad(), destinatarios.size()); + } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/ClimaService.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/ClimaService.java index d2296b4..1767613 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/ClimaService.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/ClimaService.java @@ -1,6 +1,8 @@ package ar.utn.ba.ddsi.mailing.services.impl; import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.models.entities.Ubicacion; +import ar.utn.ba.ddsi.mailing.models.entities.CondicionesClimaticas; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import ar.utn.ba.ddsi.mailing.models.dto.external.weatherapi.WeatherResponse; import ar.utn.ba.ddsi.mailing.services.IClimaService; @@ -41,7 +43,7 @@ public Mono actualizarClimaCiudades() { .flatMap(this::obtenerClimaDeAPI) .flatMap(clima -> { climaRepository.save(clima); - logger.info("Clima actualizado para: {}", clima.getCiudad()); + logger.info("Clima actualizado para: {}", clima.getUbicacion().getCiudad()); return Mono.empty(); }) .onErrorResume(e -> { @@ -62,6 +64,7 @@ private Mono obtenerClimaDeAPI(String ciudad) { .retrieve() .bodyToMono(WeatherResponse.class) .map(response -> { + /* Clima clima = new Clima(); clima.setCiudad(ciudad); clima.setRegion(response.getLocation().getRegion()); @@ -72,6 +75,10 @@ private Mono obtenerClimaDeAPI(String ciudad) { clima.setVelocidadVientoKmh(response.getCurrent().getWind_kph()); clima.setHumedad(response.getCurrent().getHumidity()); return clima; + */ + Ubicacion ubicacion = new Ubicacion(ciudad,response.getLocation().getRegion(),response.getLocation().getCountry()); + CondicionesClimaticas condiciones = new CondicionesClimaticas(response.getCurrent().getTemp_c(),response.getCurrent().getTemp_f(),response.getCurrent().getCondition().getText(),response.getCurrent().getWind_kph(),response.getCurrent().getHumidity()); + return new Clima(ubicacion,condiciones); }); } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/EmailService.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/EmailService.java index e1ffb85..6b1baf8 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/EmailService.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/EmailService.java @@ -1,52 +1,58 @@ package ar.utn.ba.ddsi.mailing.services.impl; import ar.utn.ba.ddsi.mailing.models.entities.Email; +import ar.utn.ba.ddsi.mailing.models.dtoEmail.EmailDTO; import ar.utn.ba.ddsi.mailing.models.repositories.IEmailRepository; +import ar.utn.ba.ddsi.mailing.services.email.EmailSenderAdapter ; import ar.utn.ba.ddsi.mailing.services.IEmailService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service public class EmailService implements IEmailService { private static final Logger logger = LoggerFactory.getLogger(EmailService.class); private final IEmailRepository emailRepository; + private final EmailSenderAdapter emailSenderAdapter; - public EmailService(IEmailRepository emailRepository) { + public EmailService(IEmailRepository emailRepository, EmailSenderAdapter emailSenderAdapter) { this.emailRepository = emailRepository; + this.emailSenderAdapter = emailSenderAdapter; } @Override - public Email crearEmail(Email email) { - return emailRepository.save(email); + public EmailDTO crearEmail(EmailDTO emailDTO) { + Email email = new Email(emailDTO.getDestinatario(), emailDTO.getRemitente(), emailDTO.getAsunto(), emailDTO.getMensaje(), emailSenderAdapter); + email = emailRepository.save(email); + return new EmailDTO(email.getDestinatario(), email.getRemitente(), email.getAsunto(), email.getContenido()); } + + @Override - public List obtenerEmails(Boolean pendiente) { - if (pendiente != null) { - return emailRepository.findByEnviado(!pendiente); - } - return emailRepository.findAll(); + public List obtenerEmails(Boolean pendiente) { + return emailRepository.findByEnviado(!pendiente) + .stream() + .map(email -> new EmailDTO(email.getDestinatario(), email.getRemitente(), email.getAsunto(), email.getContenido())) + .collect(Collectors.toList()); } + @Override public void procesarPendientes() { List pendientes = emailRepository.findByEnviado(false); - for (Email email : pendientes) { - email.enviar(); - email.setEnviado(true); - emailRepository.save(email); - } + pendientes.forEach(Email::enviar); + pendientes.forEach(emailRepository::save); } @Override public void loguearEmailsPendientes() { - List pendientes = obtenerEmails(true); + List pendientes = obtenerEmails(true); logger.info("Emails pendientes de envío: {}", pendientes.size()); pendientes.forEach(email -> - logger.info("Email pendiente - ID: {}, Destinatario: {}, Asunto: {}", - email.getId(), + logger.info("Email pendiente - Destinatario: {}, Asunto: {}", email.getDestinatario(), email.getAsunto()) ); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6bcf441..9ba1a72 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,3 +10,7 @@ weather.api.base-url=http://api.weatherapi.com/v1 # Email Configuration email.alertas.remitente=alertas@clima.com email.alertas.destinatarios=admin@clima.com,emergencias@clima.com,meteorologia@clima.com + +# Valores de alerta configurables +alerta.temperatura.limite=35.0 +alerta.humedad.limite=60