Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Clima.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,20 @@ public Clima() {
this.fechaActualizacion = LocalDateTime.now();
this.procesado = false;
}

public String descripcion() {
return 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
);
}
}
20 changes: 18 additions & 2 deletions src/main/java/ar/utn/ba/ddsi/mailing/models/entities/Email.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package ar.utn.ba.ddsi.mailing.models.entities;

import ar.utn.ba.ddsi.mailing.models.entities.notificacion.INotificationAdapter;
import java.sql.Timestamp;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

Expand All @@ -13,15 +16,28 @@ public class Email {
private String contenido;
private boolean enviado;

private Timestamp fechaEnviado;
private INotificationAdapter notificacionAdapter;

public Email(String destinatario, String remitente, String asunto, String contenido) {
this.destinatario = destinatario;
this.remitente = remitente;
this.asunto = asunto;
this.contenido = contenido;
this.notificacionAdapter = notificacionAdapter;
this.enviado = false;
}

public Email(String destinatario, String remitente, String asunto, String contenido, INotificationAdapter notificacionAdapter) {
this.destinatario = destinatario;
this.remitente = remitente;
this.asunto = asunto;
this.contenido = contenido;
this.notificacionAdapter = notificacionAdapter;
this.enviado = false;
}

public void enviar() {
//TODO: Implementación pendiente. Podríamos usar adapters
public void enviar(Email email) {
notificacionAdapter.enviar(email);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ar.utn.ba.ddsi.mailing.models.entities.condicionesAlerta;

import ar.utn.ba.ddsi.mailing.models.entities.Clima;
import java.sql.Timestamp;
import lombok.Getter;

public interface ICondicionAlerta {
public Boolean seCumpleAlerta(Clima clima);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ar.utn.ba.ddsi.mailing.models.entities.condicionesAlerta.impl;

import ar.utn.ba.ddsi.mailing.models.entities.Clima;
import ar.utn.ba.ddsi.mailing.models.entities.condicionesAlerta.ICondicionAlerta;
import org.springframework.stereotype.Component;

@Component
public class CondicionTempHum implements ICondicionAlerta {
private final Integer temperaturaLimiteEnCelsius;
private final Integer temperaturaLimiteEnFahrenheit;
private final Double humedadLimite;
public final String asunto;


public CondicionTempHum() {
temperaturaLimiteEnCelsius = 35;
temperaturaLimiteEnFahrenheit = 95;
humedadLimite = 0.6;
asunto = "Alerta de Clima - Condiciones Extremas";
}

@Override
public Boolean seCumpleAlerta(Clima clima) {
return
clima.getHumedad() >= humedadLimite &&
(clima.getTemperaturaCelsius() >= temperaturaLimiteEnCelsius ||
clima.getTemperaturaFahrenheit() >= temperaturaLimiteEnFahrenheit);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ar.utn.ba.ddsi.mailing.models.entities.notificacion;

import ar.utn.ba.ddsi.mailing.models.entities.Email;

public interface INotificationAdapter {
public void enviar(Email email);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ar.utn.ba.ddsi.mailing.models.entities.notificacion.impl;

import ar.utn.ba.ddsi.mailing.models.entities.Email;
import ar.utn.ba.ddsi.mailing.models.entities.notificacion.INotificationAdapter;

public class NotificationAdapter implements INotificationAdapter {
@Override
public void enviar(Email email){
// TODO
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

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.condicionesAlerta.ICondicionAlerta;
import ar.utn.ba.ddsi.mailing.models.repositories.IClimaRepository;
import ar.utn.ba.ddsi.mailing.services.IAlertasService;
import org.slf4j.Logger;
Expand All @@ -15,19 +16,20 @@
@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 condicionesAlerta; // no me queda claro como setearía las condiciones que deseamos
private final IClimaRepository climaRepository;
private final EmailService emailService;
private final String remitente;
private final List<String> destinatarios;

public AlertasService(
ICondicionAlerta condicionesAlerta,
IClimaRepository climaRepository,
EmailService emailService,
@Value("${email.alertas.remitente}") String remitente,
@Value("${email.alertas.destinatarios}") String destinatarios) {
this.condicionesAlerta = condicionesAlerta;
this.climaRepository = climaRepository;
this.emailService = emailService;
this.remitente = remitente;
Expand Down Expand Up @@ -62,26 +64,12 @@ public Mono<Void> generarAlertasYAvisar() {
}

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 condicionesAlerta.seCumpleAlerta(clima);
}

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()
);
String mensaje = clima.descripcion();

for (String destinatario : destinatarios) {
Email email = new Email(destinatario, remitente, asunto, mensaje);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public List<Email> obtenerEmails(Boolean pendiente) {
public void procesarPendientes() {
List<Email> pendientes = emailRepository.findByEnviado(false);
for (Email email : pendientes) {
email.enviar();
email.enviar(email);
email.setEnviado(true);
emailRepository.save(email);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ spring.application.name=climalert
cron.expression=0 * * * * *

# WeatherAPI Configuration
weather.api.key=API-KEY-EXAMPLE
weather.api.key=42ae1a3f270e4c07b3322320725020642ae1a3f270e4c07b33223207250206
weather.api.base-url=http://api.weatherapi.com/v1

# Email Configuration
Expand Down