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..9308456 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 @@ -1,6 +1,7 @@ package ar.utn.ba.ddsi.mailing.controllers; -import ar.utn.ba.ddsi.mailing.models.entities.Email; +import ar.utn.ba.ddsi.mailing.models.dto.inputs.EmailInput; +import ar.utn.ba.ddsi.mailing.models.dto.outputs.EmailOutput; import ar.utn.ba.ddsi.mailing.services.IEmailService; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -15,12 +16,12 @@ public EmailController(IEmailService emailService) { } @PostMapping - public Email crearEmail(@RequestBody Email email) { - return emailService.crearEmail(email); + public EmailOutput crearEmail(@RequestBody EmailInput emailInput) { + return emailService.crearEmail(emailInput); } @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 +} \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/ClimaInput.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/ClimaInput.java new file mode 100644 index 0000000..c1cb3f7 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/ClimaInput.java @@ -0,0 +1,39 @@ +package ar.utn.ba.ddsi.mailing.models.dto.inputs; + +import java.time.LocalDateTime; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ClimaInput { + private String ciudad; + private String region; + private String pais; + private Double temperaturaCelsius; + private Double temperaturaFahrenheit; + private String condicion; + private Double velocidadVientoKmh; + private Integer humedad; + private LocalDateTime fechaActualizacion; + + public static ClimaInput of(String ciudad, String region, String pais, Double temperaturaCelsius, Double temperaturaFahrenheit, String coindicion, Double velocidadVientoKmh, Integer humedad) { + return ClimaInput + .builder() + .ciudad(ciudad) + .region(region) + .pais(pais) + .temperaturaCelsius(temperaturaCelsius) + .temperaturaFahrenheit(temperaturaFahrenheit) + .condicion(coindicion) + .velocidadVientoKmh(velocidadVientoKmh) + .humedad(humedad) + .fechaActualizacion(LocalDateTime.now()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/EmailInput.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/EmailInput.java new file mode 100644 index 0000000..b494c3a --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/inputs/EmailInput.java @@ -0,0 +1,22 @@ +package ar.utn.ba.ddsi.mailing.models.dto.inputs; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EmailInput { + private String destinatario; + private String remitente; + private String asunto; + private String contenido; + + public static EmailInput of(String destinatario, String remitente, String asunto, String contenido) { + return EmailInput.builder().destinatario(destinatario).remitente(remitente).asunto(asunto).contenido(contenido).build(); + } +} \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/outputs/EmailOutput.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/outputs/EmailOutput.java new file mode 100644 index 0000000..a980761 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/dto/outputs/EmailOutput.java @@ -0,0 +1,22 @@ +package ar.utn.ba.ddsi.mailing.models.dto.outputs; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EmailOutput { + private Long id; + private String destinatario; + private String remitente; + private String asunto; + private String contenido; + + public static EmailOutput of(Long id, String destinatario, String remitente, String asunto, String contenido) { + return EmailOutput.builder().id(id).destinatario(destinatario).remitente(remitente).asunto(asunto).contenido(contenido).build(); + } +} 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..c73e204 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Alerta.java @@ -0,0 +1,43 @@ +package ar.utn.ba.ddsi.mailing.models.entities; + +import lombok.*; + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Getter +@Setter +public class Alerta { + private Long id; + private String asunto = "Alerta de Clima - Condiciones Extremas"; + private String ciudad; + private Double temperaturaCelsius; + private Integer humedad; + private String condicion; + private Double velocidadVientoKmh; + + private String mensaje = String.format( + "ALERTA: Condiciones climáticas extremas detectadas en %s\n\n" + + "Temperatura: %.1f°C\n" + + "Humedad: %d%%\n" + + "Condición: %s\n" + + "Velocidad del viento: %.1f km/h\n\n" + + "Se recomienda tomar precauciones.", + this.ciudad, + this.temperaturaCelsius, + this.humedad, + this.condicion, + this.velocidadVientoKmh + ); + + public static Alerta of(String asunto, String ciudad, Double temperaturaCelsius, Integer humedad, String condicion, Double velocidadVientoKmh) { + return Alerta.builder() + .asunto(asunto) + .ciudad(ciudad) + .temperaturaCelsius(temperaturaCelsius) + .humedad(humedad) + .condicion(condicion) + .velocidadVientoKmh(velocidadVientoKmh) + .build(); + } +} 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..3459adc 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 @@ -1,11 +1,14 @@ package ar.utn.ba.ddsi.mailing.models.entities; -import lombok.Getter; -import lombok.Setter; +import lombok.*; + import java.time.LocalDateTime; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder public class Clima { private Long id; private String ciudad; @@ -19,8 +22,19 @@ public class Clima { private LocalDateTime fechaActualizacion; private boolean procesado; - public Clima() { - this.fechaActualizacion = LocalDateTime.now(); - this.procesado = false; + public static Clima of(String ciudad, String region, String pais, Double temperaturaCelsius, Double temperaturaFahrenheit, String coindicion, Double velocidadVientoKmh, Integer humedad, LocalDateTime fechaActualizacion) { + return Clima + .builder() + .ciudad(ciudad) + .region(region) + .pais(pais) + .temperaturaCelsius(temperaturaCelsius) + .temperaturaFahrenheit(temperaturaFahrenheit) + .condicion(coindicion) + .velocidadVientoKmh(velocidadVientoKmh) + .humedad(humedad) + .fechaActualizacion(fechaActualizacion) + .procesado(false) + .build(); } -} \ No newline at end of file +} \ 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..909ead3 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,8 +1,10 @@ package ar.utn.ba.ddsi.mailing.models.entities; -import lombok.Getter; -import lombok.Setter; +import lombok.*; +@AllArgsConstructor +@NoArgsConstructor +@Builder @Setter @Getter public class Email { @@ -13,12 +15,8 @@ public class Email { private String contenido; private boolean enviado; - public Email(String destinatario, String remitente, String asunto, String contenido) { - this.destinatario = destinatario; - this.remitente = remitente; - this.asunto = asunto; - this.contenido = contenido; - this.enviado = false; + public static Email of(String destinatario, String remitente, String asunto, String contenido){ + return Email.builder().destinatario(destinatario).remitente(remitente).asunto(asunto).contenido(contenido).enviado(false).build(); } public void enviar() { diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/exceptions/EmailNoEnviadoException.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/exceptions/EmailNoEnviadoException.java new file mode 100644 index 0000000..e392939 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/exceptions/EmailNoEnviadoException.java @@ -0,0 +1,7 @@ +package ar.utn.ba.ddsi.mailing.models.exceptions; + +public class EmailNoEnviadoException { + public EmailNoEnviadoException(String message) { + super(message); + } +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IAlertaRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IAlertaRepository.java new file mode 100644 index 0000000..888676b --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IAlertaRepository.java @@ -0,0 +1,12 @@ +package ar.utn.ba.ddsi.mailing.models.repositories; + +import ar.utn.ba.ddsi.mailing.models.entities.Alerta; + +import java.util.List; + +public interface IAlertaRepository { + void save(Alerta alerta); + List findall(); + Alerta findById(Long id); + void delete(Alerta alerta); +} diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IClimaRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IClimaRepository.java index 8e7dfb4..94a0248 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IClimaRepository.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IClimaRepository.java @@ -5,7 +5,7 @@ import java.util.Optional; public interface IClimaRepository { - Clima save(Clima clima); + void save(Clima clima); List findAll(); Optional findById(Long id); Optional findByCiudad(String ciudad); diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IEmailRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IEmailRepository.java index ad96d89..c94f89b 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IEmailRepository.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/IEmailRepository.java @@ -5,7 +5,7 @@ import java.util.Optional; public interface IEmailRepository { - Email save(Email email); + void save(Email email); List findAll(); List findByEnviado(boolean enviado); Optional findById(Long id); diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/AlertaRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/AlertaRepository.java new file mode 100644 index 0000000..8441eb9 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/AlertaRepository.java @@ -0,0 +1,41 @@ +package ar.utn.ba.ddsi.mailing.models.repositories.impl; + +import ar.utn.ba.ddsi.mailing.models.entities.Alerta; +import ar.utn.ba.ddsi.mailing.models.repositories.IAlertaRepository; +import org.springframework.stereotype.Repository; + +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; + +@Repository +public class AlertaRepository implements IAlertaRepository { + private final Map alertas = new HashMap<>(); + private final AtomicLong idGenerator = new AtomicLong(1); + + @Override + public void save(Alerta alerta){ + if(alerta.getId() == null){ + Long id = idGenerator.getAndIncrement(); + alerta.setId(id); + alertas.put(id, alerta); + }else{ + alertas.put(alerta.getId(), alerta); + } + } + + @Override + public List findall(){return new ArrayList<>(alertas.values());} + + @Override + public Alerta findById(Long id){ + return alertas.values().stream() + .filter(a -> Objects.equals(a.getId(), id)) + .findFirst().orElse(null); + } + + @Override + public void delete(Alerta alerta){ + if (alerta.getId() != null) { + alertas.remove(alerta.getId()); + }} +} \ 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..4476529 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 @@ -13,7 +13,7 @@ public class ClimaRepository implements IClimaRepository { private final AtomicLong idGenerator = new AtomicLong(1); @Override - public Clima save(Clima clima) { + public void save(Clima clima) { if (clima.getId() == null) { Long id = idGenerator.getAndIncrement(); clima.setId(id); @@ -23,7 +23,6 @@ public Clima save(Clima clima) { climas.put(clima.getId(), clima); ciudadToId.put(clima.getCiudad(), clima.getId()); } - return clima; } @Override @@ -45,8 +44,8 @@ public Optional findByCiudad(String ciudad) { @Override public List findByProcesado(boolean procesado) { return climas.values().stream() - .filter(c -> c.isProcesado() == procesado) - .toList(); + .filter(c -> c.isProcesado() == procesado) + .toList(); } @Override diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/EmailRepository.java b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/EmailRepository.java index 2920146..624dea4 100644 --- a/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/EmailRepository.java +++ b/src/main/java/ar/utn/ba/ddsi/mailing/models/repositories/impl/EmailRepository.java @@ -12,7 +12,7 @@ public class EmailRepository implements IEmailRepository { private final AtomicLong idGenerator = new AtomicLong(1); @Override - public Email save(Email email) { + public void save(Email email) { if (email.getId() == null) { // Es un nuevo email Long id = idGenerator.getAndIncrement(); @@ -22,7 +22,6 @@ public Email save(Email email) { // Es una actualización emails.put(email.getId(), email); } - return email; } @Override diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/ICondicionAlerta.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/ICondicionAlerta.java new file mode 100644 index 0000000..7e62976 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/ICondicionAlerta.java @@ -0,0 +1,7 @@ +package ar.utn.ba.ddsi.mailing.services; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; + +public interface ICondicionAlerta { + public boolean cumpleCondicionAlerta(Clima clima); +} 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..1f8e941 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.entities.Email; +import ar.utn.ba.ddsi.mailing.models.dto.inputs.EmailInput; +import ar.utn.ba.ddsi.mailing.models.dto.outputs.EmailOutput; import java.util.List; public interface IEmailService { - Email crearEmail(Email email); - List obtenerEmails(Boolean pendiente); + EmailOutput crearEmail(EmailInput emailInput); + 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/impl/AlertasService.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/AlertasService.java index f5d52b6..2f118db 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,9 +1,12 @@ package ar.utn.ba.ddsi.mailing.services.impl; +import ar.utn.ba.ddsi.mailing.models.dto.inputs.EmailInput; +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.repositories.IAlertaRepository; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import ar.utn.ba.ddsi.mailing.services.IAlertasService; +import ar.utn.ba.ddsi.mailing.services.ICondicionAlerta; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -15,80 +18,69 @@ @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 ICondicionAlerta condicionAlerta; + private final IAlertaRepository alertaRepository; private final IClimaRepository climaRepository; private final EmailService emailService; private final String remitente; private final List destinatarios; public AlertasService( - IClimaRepository climaRepository, + IAlertaRepository alertaRepository, + IClimaRepository climaRepository, EmailService emailService, + ICondicionAlerta condicionAlerta, @Value("${email.alertas.remitente}") String remitente, @Value("${email.alertas.destinatarios}") String destinatarios) { + this.alertaRepository = alertaRepository; this.climaRepository = climaRepository; this.emailService = emailService; this.remitente = remitente; + this.condicionAlerta = condicionAlerta; this.destinatarios = Arrays.asList(destinatarios.split(",")); } @Override public Mono generarAlertasYAvisar() { return Mono.fromCallable(() -> climaRepository.findByProcesado(false)) - .flatMap(climas -> { - logger.info("Procesando {} registros de clima no procesados", climas.size()); - return Mono.just(climas); - }) - .flatMap(climas -> { - climas.stream() - .filter(this::cumpleCondicionesAlerta) - .forEach(this::generarYEnviarEmail); - - // Marcar todos como procesados - climas.forEach(clima -> { - clima.setProcesado(true); - climaRepository.save(clima); - }); - - return Mono.empty(); - }) - .onErrorResume(e -> { - logger.error("Error al procesar alertas: {}", e.getMessage()); - return Mono.empty(); - }) - .then(); - } + .flatMap(climas -> { + logger.info("Procesando {} registros de clima no procesados", climas.size()); + return Mono.just(climas); + }) + .flatMap(climas -> { + climas.stream() + .filter(condicionAlerta::cumpleCondicionAlerta) + .map(this::generarAlerta) + .forEach(this::enviarEmail); + + // Marcar todos como procesados + climas.forEach(clima -> { + clima.setProcesado(true); + climaRepository.save(clima); + }); - 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; + return Mono.empty(); + }) + .onErrorResume(e -> { + logger.error("Error al procesar alertas: {}", e.getMessage()); + return Mono.empty(); + }) + .then(); } - private void generarYEnviarEmail(Clima clima) { - String asunto = "Alerta de Clima - Condiciones Extremas"; - String mensaje = String.format( - "ALERTA: Condiciones climáticas extremas detectadas en %s\n\n" + - "Temperatura: %.1f°C\n" + - "Humedad: %d%%\n" + - "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() - ); + private Alerta generarAlerta(Clima clima) { + Alerta alerta = Alerta.of("Alerta de Clima - Condiciones Extremas", clima.getCiudad(), clima.getTemperaturaCelsius(), clima.getHumedad(), clima.getCondicion(), clima.getVelocidadVientoKmh()); + alertaRepository.save(alerta); + return alerta; + } + private void enviarEmail(Alerta alerta) { for (String destinatario : destinatarios) { - Email email = new Email(destinatario, remitente, asunto, mensaje); - emailService.crearEmail(email); + EmailInput emailInput = EmailInput.of(destinatario,remitente,alerta.getAsunto(),alerta.getMensaje()); + emailService.crearEmail(emailInput); } - - logger.info("Email de alerta generado para {} - Enviado a {} destinatarios", - clima.getCiudad(), destinatarios.size()); + + logger.info("Email de alerta generado para {} - Enviado a {} destinatarios", + alerta.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..b32e80c 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,5 +1,6 @@ package ar.utn.ba.ddsi.mailing.services.impl; +import ar.utn.ba.ddsi.mailing.models.dto.inputs.ClimaInput; import ar.utn.ba.ddsi.mailing.models.entities.Clima; import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository; import ar.utn.ba.ddsi.mailing.models.dto.external.weatherapi.WeatherResponse; @@ -16,8 +17,8 @@ public class ClimaService implements IClimaService { private static final Logger logger = LoggerFactory.getLogger(ClimaService.class); private static final String[] CIUDADES_ARGENTINA = { - "Buenos Aires", "Cordoba", "Rosario", "Mendoza", "Tucuman", - "La Plata", "Mar del Plata", "Salta", "Santa Fe", "San Juan" + "Buenos Aires", "Cordoba", "Rosario", "Mendoza", "Tucuman", + "La Plata", "Mar del Plata", "Salta", "Santa Fe", "San Juan" }; private final IClimaRepository climaRepository; @@ -31,47 +32,55 @@ public ClimaService( this.climaRepository = climaRepository; this.apiKey = apiKey; this.webClient = WebClient.builder() - .baseUrl(baseUrl) - .build(); + .baseUrl(baseUrl) + .build(); } @Override public Mono actualizarClimaCiudades() { return Flux.fromArray(CIUDADES_ARGENTINA) - .flatMap(this::obtenerClimaDeAPI) - .flatMap(clima -> { - climaRepository.save(clima); - logger.info("Clima actualizado para: {}", clima.getCiudad()); - return Mono.empty(); - }) - .onErrorResume(e -> { - logger.error("Error al actualizar el clima: {}", e.getMessage()); - return Mono.empty(); - }) - .then(); + .flatMap(this::obtenerClimaDeAPI) + .flatMap(climaInput -> { + Clima clima = Clima.of( + climaInput.getCiudad(), + climaInput.getRegion(), + climaInput.getPais(), + climaInput.getTemperaturaCelsius(), + climaInput.getTemperaturaFahrenheit(), + climaInput.getCondicion(), + climaInput.getVelocidadVientoKmh(), + climaInput.getHumedad(), + climaInput.getFechaActualizacion()); + climaRepository.save(clima); + logger.info("Clima actualizado para: {}", clima.getCiudad()); + return Mono.empty(); + }) + .onErrorResume(e -> { + logger.error("Error al actualizar el clima: {}", e.getMessage()); + return Mono.empty(); + }) + .then(); } - private Mono obtenerClimaDeAPI(String ciudad) { + private Mono obtenerClimaDeAPI(String ciudad) { return webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/current.json") - .queryParam("key", apiKey) - .queryParam("q", ciudad) - .queryParam("aqi", "no") - .build()) - .retrieve() - .bodyToMono(WeatherResponse.class) - .map(response -> { - Clima clima = new Clima(); - clima.setCiudad(ciudad); - clima.setRegion(response.getLocation().getRegion()); - clima.setPais(response.getLocation().getCountry()); - clima.setTemperaturaCelsius(response.getCurrent().getTemp_c()); - clima.setTemperaturaFahrenheit(response.getCurrent().getTemp_f()); - clima.setCondicion(response.getCurrent().getCondition().getText()); - clima.setVelocidadVientoKmh(response.getCurrent().getWind_kph()); - clima.setHumedad(response.getCurrent().getHumidity()); - return clima; - }); + .uri(uriBuilder -> uriBuilder + .path("/current.json") + .queryParam("key", apiKey) + .queryParam("q", ciudad) + .queryParam("aqi", "no") + .build()) + .retrieve() + .bodyToMono(WeatherResponse.class) + .map(response -> { + return ClimaInput.of(ciudad, + response.getLocation().getRegion(), + response.getLocation().getCountry(), + response.getCurrent().getTemp_c(), + response.getCurrent().getTemp_f(), + response.getCurrent().getCondition().getText(), + response.getCurrent().getWind_kph(), + response.getCurrent().getHumidity()); + }); } } \ No newline at end of file diff --git a/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/CondicionAlertaTempYHumedad.java b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/CondicionAlertaTempYHumedad.java new file mode 100644 index 0000000..07ce9a9 --- /dev/null +++ b/src/main/java/ar/utn/ba/ddsi/mailing/services/impl/CondicionAlertaTempYHumedad.java @@ -0,0 +1,17 @@ +package ar.utn.ba.ddsi.mailing.services.impl; + +import ar.utn.ba.ddsi.mailing.models.entities.Clima; +import ar.utn.ba.ddsi.mailing.services.ICondicionAlerta; +import org.springframework.stereotype.Component; + +@Component +public class CondicionAlertaTempYHumedad implements ICondicionAlerta { + private static final double TEMPERATURA_MAXIMA = 35.0; + private static final int HUMEDAD_MAXIMA = 60; + + @Override + public boolean cumpleCondicionAlerta(Clima clima){ + return clima.getTemperaturaCelsius() > TEMPERATURA_MAXIMA && + clima.getHumedad() > HUMEDAD_MAXIMA; + } +} 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..03a3d21 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,12 +1,18 @@ package ar.utn.ba.ddsi.mailing.services.impl; +import ar.utn.ba.ddsi.mailing.models.dto.inputs.EmailInput; +import ar.utn.ba.ddsi.mailing.models.dto.outputs.EmailOutput; import ar.utn.ba.ddsi.mailing.models.entities.Email; +//import ar.utn.ba.ddsi.mailing.models.exceptions.EmailNoEnviadoException; +//no se porque no me reconoce a EmailNoEnviadoException, tipo lo importa bien y aún así no lo reconoce import ar.utn.ba.ddsi.mailing.models.repositories.IEmailRepository; 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 { @@ -18,37 +24,51 @@ public EmailService(IEmailRepository emailRepository) { } @Override - public Email crearEmail(Email email) { - return emailRepository.save(email); + public EmailOutput crearEmail(EmailInput emailInput) { + Email email = Email.of(emailInput.getDestinatario(), emailInput.getRemitente(),emailInput.getAsunto(),emailInput.getContenido()); + emailRepository.save(email); + return EmailOutput.of(email.getId(),email.getDestinatario(),email.getRemitente(),email.getAsunto(),email.getContenido()); } @Override - public List obtenerEmails(Boolean pendiente) { + public List obtenerEmails(Boolean pendiente) { + List listaDeEmails; if (pendiente != null) { - return emailRepository.findByEnviado(!pendiente); + listaDeEmails = emailRepository.findByEnviado(!pendiente); + + }else{ + listaDeEmails = emailRepository.findAll(); } - return emailRepository.findAll(); + return listaDeEmails.stream() + .map(e -> EmailOutput.of(e.getId(),e.getDestinatario(),e.getRemitente(),e.getAsunto(),e.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); + try { + email.enviar(); + email.setEnviado(true); + emailRepository.save(email); + } catch (Exception e) { + //throw new EmailNoEnviadoException("El email con el id " + email.getId() + "no pudo ser enviado."); + //no se porque no me reconoce a EmailNoEnviadoException, tipo lo importa bien y aún así no lo reconoce + throw new RuntimeException("El email con el id " + email.getId() + "no pudo ser enviado."); + } } } @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(), - email.getDestinatario(), - email.getAsunto()) + pendientes.forEach(email -> + logger.info("Email pendiente - ID: {}, Destinatario: {}, Asunto: {}", + email.getId(), + email.getDestinatario(), + email.getAsunto()) ); } -} \ No newline at end of file +} \ No newline at end of file