Skip to content

Commit cecb128

Browse files
committed
Persist the fact that automated emails were sent so that they are not resent in the event of a server restart.
1 parent 28ede4f commit cecb128

File tree

5 files changed

+85
-12
lines changed

5 files changed

+85
-12
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.objectcomputing.checkins.services.email;
2+
3+
import io.micronaut.data.annotation.TypeDef;
4+
import io.micronaut.data.model.DataType;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import jakarta.persistence.Column;
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.Table;
10+
import jakarta.validation.constraints.NotNull;
11+
import lombok.AllArgsConstructor;
12+
import lombok.Getter;
13+
import lombok.Setter;
14+
15+
import java.util.Objects;
16+
17+
@Setter
18+
@Getter
19+
@Entity
20+
@AllArgsConstructor
21+
@Table(name = "automated_email_sent")
22+
public class AutomatedEmail {
23+
@Id
24+
@Column(name = "id")
25+
@TypeDef(type = DataType.STRING)
26+
@Schema(description = "id of the email")
27+
private String id;
28+
29+
@Override
30+
public boolean equals(Object o) {
31+
if (this == o) return true;
32+
if (o == null || getClass() != o.getClass()) return false;
33+
AutomatedEmail email = (AutomatedEmail) o;
34+
return id.equals(email.id);
35+
}
36+
37+
@Override
38+
public int hashCode() {
39+
return id.hashCode();
40+
}
41+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.objectcomputing.checkins.services.email;
2+
3+
import io.micronaut.data.jdbc.annotation.JdbcRepository;
4+
import io.micronaut.data.model.query.builder.sql.Dialect;
5+
import io.micronaut.data.repository.CrudRepository;
6+
import jakarta.validation.Valid;
7+
import jakarta.validation.constraints.NotNull;
8+
9+
@JdbcRepository(dialect = Dialect.POSTGRES)
10+
public interface AutomatedEmailRepository extends CrudRepository<AutomatedEmail, String> {
11+
12+
@Override
13+
<S extends AutomatedEmail> S save(@Valid @NotNull S entity);
14+
15+
}

server/src/main/java/com/objectcomputing/checkins/services/pulse/PulseServicesImpl.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
77
import com.objectcomputing.checkins.services.settings.SettingsServices;
88
import com.objectcomputing.checkins.services.settings.Setting;
9+
import com.objectcomputing.checkins.services.email.AutomatedEmail;
10+
import com.objectcomputing.checkins.services.email.AutomatedEmailRepository;
911
import com.objectcomputing.checkins.exceptions.NotFoundException;
1012

1113
import lombok.Getter;
@@ -20,6 +22,7 @@
2022

2123
import java.util.Map;
2224
import java.util.HashMap;
25+
import java.util.Optional;
2326
import java.time.LocalDate;
2427
import java.time.DayOfWeek;
2528
import java.time.temporal.ChronoUnit;
@@ -39,7 +42,7 @@ private class Frequency {
3942
private final CheckInsConfiguration checkInsConfiguration;
4043
private final MemberProfileServices memberProfileServices;
4144
private final SettingsServices settingsServices;
42-
private final Map<String, Boolean> sent = new HashMap<String, Boolean>();
45+
private final AutomatedEmailRepository automatedEmailRepository;
4346

4447
@Inject
4548
private PulseEmail email;
@@ -57,11 +60,13 @@ public PulseServicesImpl(
5760
@Named(MailJetFactory.MJML_FORMAT) EmailSender emailSender,
5861
CheckInsConfiguration checkInsConfiguration,
5962
MemberProfileServices memberProfileServices,
60-
SettingsServices settingsServices) {
63+
SettingsServices settingsServices,
64+
AutomatedEmailRepository automatedEmailRepository) {
6165
this.emailSender = emailSender;
6266
this.checkInsConfiguration = checkInsConfiguration;
6367
this.memberProfileServices = memberProfileServices;
6468
this.settingsServices = settingsServices;
69+
this.automatedEmailRepository = automatedEmailRepository;
6570
}
6671

6772
public void sendPendingEmail(LocalDate check) {
@@ -89,16 +94,18 @@ public void sendPendingEmail(LocalDate check) {
8994
do {
9095
if (start.getDayOfMonth() == check.getDayOfMonth()) {
9196
LOG.info("Check day of month matches frequency day");
92-
final String key = new StringBuilder(start.getMonth().toString())
97+
final String key = new StringBuilder("pulse")
98+
.append(start.getMonth().toString())
9399
.append("_")
94100
.append(String.valueOf(start.getDayOfMonth()))
95101
.toString();
96-
if (sent.containsKey(key)) {
97-
LOG.info("The Pulse Email has already been sent today");
98-
} else {
102+
Optional<AutomatedEmail> sent = automatedEmailRepository.findById(key);
103+
if (sent.isEmpty()) {
99104
LOG.info("Sending Pulse Email");
100105
email.send();
101-
sent.put(key, true);
106+
automatedEmailRepository.save(new AutomatedEmail(key));
107+
} else {
108+
LOG.info("The Pulse Email has already been sent today");
102109
}
103110
break;
104111
}

server/src/main/java/com/objectcomputing/checkins/services/reviews/ReviewPeriodServicesImpl.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.objectcomputing.checkins.services.feedback_request.FeedbackRequest;
1212
import com.objectcomputing.checkins.services.memberprofile.MemberProfileRepository;
1313
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
14+
import com.objectcomputing.checkins.services.email.AutomatedEmail;
15+
import com.objectcomputing.checkins.services.email.AutomatedEmailRepository;
1416
import io.micronaut.context.annotation.Value;
1517
import io.micronaut.context.env.Environment;
1618
import io.micronaut.core.io.Readable;
@@ -39,6 +41,7 @@ class ReviewPeriodServicesImpl implements ReviewPeriodServices {
3941

4042
private static final Logger LOG = LoggerFactory.getLogger(ReviewPeriodServicesImpl.class);
4143

44+
private final AutomatedEmailRepository automatedEmailRepository;
4245
private final ReviewPeriodRepository reviewPeriodRepository;
4346
private final ReviewAssignmentRepository reviewAssignmentRepository;
4447
private final MemberProfileRepository memberProfileRepository;
@@ -50,7 +53,6 @@ class ReviewPeriodServicesImpl implements ReviewPeriodServices {
5053
private final String webAddress;
5154

5255
private enum SelfReviewDate { LAUNCH, THREE_DAYS, ONE_DAY }
53-
private final Map<String, Boolean> sent = new HashMap<>();
5456

5557
@Value("classpath:mjml/supervisor_review_assignment.mjml")
5658
private Readable supervisorReviewAssignmentTemplate;
@@ -67,7 +69,8 @@ private enum SelfReviewDate { LAUNCH, THREE_DAYS, ONE_DAY }
6769
ReviewStatusTransitionValidator reviewStatusTransitionValidator,
6870
@Named(MailJetFactory.MJML_FORMAT) EmailSender emailSender,
6971
Environment environment,
70-
CheckInsConfiguration checkInsConfiguration) {
72+
CheckInsConfiguration checkInsConfiguration,
73+
AutomatedEmailRepository automatedEmailRepository) {
7174
this.reviewPeriodRepository = reviewPeriodRepository;
7275
this.reviewAssignmentRepository = reviewAssignmentRepository;
7376
this.memberProfileRepository = memberProfileRepository;
@@ -77,6 +80,7 @@ private enum SelfReviewDate { LAUNCH, THREE_DAYS, ONE_DAY }
7780
this.emailSender = emailSender;
7881
this.environment = environment;
7982
this.webAddress = checkInsConfiguration.getWebAddress();
83+
this.automatedEmailRepository = automatedEmailRepository;
8084
}
8185

8286
void setEmailSender(EmailSender emailSender) {
@@ -364,8 +368,10 @@ public void sendNotifications(LocalDate today) {
364368
reviewPeriodRepository.findByReviewStatus(ReviewStatus.OPEN);
365369
for(ReviewPeriod openPeriod : openPeriods) {
366370
for(SelfReviewDate date : SelfReviewDate.values()) {
367-
String key = openPeriod.getId().toString() + date.toString();
368-
if (!sent.containsKey(key)) {
371+
String key = "self_review_notification" +
372+
openPeriod.getId().toString() + date.toString();
373+
Optional<AutomatedEmail> sent = automatedEmailRepository.findById(key);
374+
if (sent.isEmpty()) {
369375
LocalDateTime check;
370376
switch(date) {
371377
case SelfReviewDate.LAUNCH:
@@ -389,7 +395,7 @@ public void sendNotifications(LocalDate today) {
389395
if (check != null) {
390396
if (today.isEqual(check.toLocalDate())) {
391397
sendSelfReviewEmail(openPeriod.getId(), date);
392-
sent.put(key, true);
398+
automatedEmailRepository.save(new AutomatedEmail(key));
393399
}
394400
}
395401
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
drop table if exists automated_email_sent;
2+
CREATE TABLE automated_email_sent(
3+
id varchar PRIMARY KEY
4+
);

0 commit comments

Comments
 (0)