Skip to content

Commit 4c36473

Browse files
author
estradaw
committed
issue#2678 added capability to send email directly to recipient
1 parent 9210c3b commit 4c36473

File tree

15 files changed

+164
-67
lines changed

15 files changed

+164
-67
lines changed

server/src/main/java/com/objectcomputing/checkins/notifications/email/EmailSender.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
public interface EmailSender {
44

5-
void sendEmail(String fromName, String fromAddress, String subject, String content, String... recipients);
5+
void sendEmailBlind(String fromName, String fromAddress, String subject, String content, String... recipients);
6+
7+
void sendEmailExposed(String fromName, String fromAddress, String subject, String content, String recipient);
68

79
boolean sendEmailReceivesStatus(String fromName, String fromAddress, String subject, String content, String... recipients);
810

server/src/main/java/com/objectcomputing/checkins/notifications/email/MailJetSender.java

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public MailJetSender(
4545
/**
4646
* Helper method to divide a list of recipients into smaller lists (batches) of recipients
4747
* Enables sending emails to more recipients than permitted by a single MailJet API call
48+
*
4849
* @param recipients List of recipient email addresses
4950
* @return list of {@link JSONArray}
5051
*/
@@ -74,18 +75,19 @@ public static List<JSONArray> getEmailBatches(String... recipients) {
7475

7576
/**
7677
* This call sends a message to the given recipient with attachment.
77-
* @param fromName {@link String} The name of the person sending the email
78+
*
79+
* @param fromName {@link String} The name of the person sending the email
7880
* @param fromAddress {@link String} The email address of the person sending the email
79-
* @param subject {@link String} Subject of email
80-
* @param content {@link String} Contents of email
81-
* @param recipients List of recipient email addresses
81+
* @param subject {@link String} Subject of email
82+
* @param content {@link String} Contents of email
83+
* @param recipients List of recipient email addresses
8284
*/
8385
@Override
84-
public void sendEmail(String fromName, String fromAddress, String subject, String content, String... recipients) {
85-
if(fromName == null) fromName = this.fromName;
86-
if(fromAddress == null) fromAddress = this.fromAddress;
86+
public void sendEmailBlind(String fromName, String fromAddress, String subject, String content, String... recipients) {
87+
if (fromName == null) fromName = this.fromName;
88+
if (fromAddress == null) fromAddress = this.fromAddress;
8789

88-
if(System.getenv("MJ_APIKEY_PUBLIC") == null || System.getenv("MJ_APIKEY_PRIVATE") == null) {
90+
if (System.getenv("MJ_APIKEY_PUBLIC") == null || System.getenv("MJ_APIKEY_PRIVATE") == null) {
8991
LOG.error("API key(s) are missing for MailJetSender");
9092
return;
9193
}
@@ -130,11 +132,62 @@ public void sendEmail(String fromName, String fromAddress, String subject, Strin
130132
}
131133
}
132134

135+
/**
136+
*
137+
* Sends email directly to recipient
138+
* @param fromName {@link String} The name of the person sending the email
139+
* @param fromAddress {@link String} The email address of the person sending the email
140+
* @param subject {@link String} Subject of email
141+
* @param content {@link String} Contents of email
142+
* @param recipient {@link String} recipient email addresses
143+
*/
144+
@Override
145+
public void sendEmailExposed(String fromName, String fromAddress, String subject, String content, String recipient) {
146+
if (fromName == null) fromName = this.fromName;
147+
if (fromAddress == null) fromAddress = this.fromAddress;
148+
149+
if (System.getenv("MJ_APIKEY_PUBLIC") == null || System.getenv("MJ_APIKEY_PRIVATE") == null) {
150+
LOG.error("API key(s) are missing for MailJetSender");
151+
return;
152+
}
153+
154+
JSONObject sender = new JSONObject()
155+
.put("Email", fromAddress)
156+
.put("Name", fromName);
157+
158+
String modifiedEmailFormat = emailFormat;
159+
if (modifiedEmailFormat.equals(MJMLPART)) {
160+
// Convert the MJML to HTML and update the local email format.
161+
var configuration = new Mjml4j.Configuration("en");
162+
content = Mjml4j.render(content, configuration);
163+
modifiedEmailFormat = Emailv31.Message.HTMLPART;
164+
}
165+
final String localEmailFormat = modifiedEmailFormat;
166+
final String localContent = content;
167+
168+
MailjetRequest request = new MailjetRequest(Emailv31.resource)
169+
.property(Emailv31.MESSAGES, new JSONArray()
170+
.put(new JSONObject()
171+
.put(Emailv31.Message.FROM, sender)
172+
.put(Emailv31.Message.TO, recipient)
173+
.put(Emailv31.Message.SUBJECT, subject)
174+
.put(localEmailFormat, localContent)));
175+
try {
176+
MailjetResponse response = client.post(request);
177+
LOG.info("Mailjet response status: {}", response.getStatus());
178+
LOG.info("Mailjet response data: {}", response.getData());
179+
} catch (MailjetException e) {
180+
LOG.error("An unexpected error occurred while sending the upload notification: {}", e.getLocalizedMessage(), e);
181+
}
182+
183+
184+
}
185+
133186
@Override
134187
public boolean sendEmailReceivesStatus(String fromName, String fromAddress, String subject, String content, String... recipients) {
135188
try {
136-
sendEmail(fromName, fromAddress, subject, content, recipients);
137-
} catch (Exception e){
189+
sendEmailBlind(fromName, fromAddress, subject, content, recipients);
190+
} catch (Exception e) {
138191
LOG.error("An unexpected exception occurred while sending the upload notification: {}", e.getLocalizedMessage(), e);
139192
return false;
140193
} catch (Error e) {
@@ -147,8 +200,8 @@ public boolean sendEmailReceivesStatus(String fromName, String fromAddress, Stri
147200
@Override
148201
public void setEmailFormat(String format) {
149202
if (format.equals(MJMLPART) ||
150-
format.equals(Emailv31.Message.HTMLPART) ||
151-
format.equals(Emailv31.Message.TEXTPART)) {
203+
format.equals(Emailv31.Message.HTMLPART) ||
204+
format.equals(Emailv31.Message.TEXTPART)) {
152205
this.emailFormat = format;
153206
} else {
154207
throw new BadArgException(String.format("Email format must be either HTMLPART, MJMLPART or TEXTPART, got %s", format));

server/src/main/java/com/objectcomputing/checkins/services/feedback_request/FeedbackRequestServicesImpl.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,26 @@
88
import com.objectcomputing.checkins.notifications.email.MailJetFactory;
99
import com.objectcomputing.checkins.services.email.Email;
1010
import com.objectcomputing.checkins.services.memberprofile.MemberProfile;
11-
import com.objectcomputing.checkins.services.memberprofile.MemberProfileUtils;
1211
import com.objectcomputing.checkins.services.memberprofile.MemberProfileServices;
12+
import com.objectcomputing.checkins.services.memberprofile.MemberProfileUtils;
1313
import com.objectcomputing.checkins.services.memberprofile.currentuser.CurrentUserServices;
1414
import com.objectcomputing.checkins.services.reviews.ReviewAssignment;
1515
import com.objectcomputing.checkins.services.reviews.ReviewAssignmentRepository;
1616
import com.objectcomputing.checkins.services.reviews.ReviewPeriod;
1717
import com.objectcomputing.checkins.services.reviews.ReviewPeriodRepository;
1818
import com.objectcomputing.checkins.util.Util;
1919
import io.micronaut.context.annotation.Value;
20-
import io.micronaut.core.io.Readable;
2120
import io.micronaut.core.io.IOUtils;
21+
import io.micronaut.core.io.Readable;
2222
import jakarta.inject.Named;
2323
import jakarta.inject.Singleton;
2424
import org.slf4j.Logger;
2525
import org.slf4j.LoggerFactory;
2626

2727
import java.io.BufferedReader;
28-
import java.time.format.DateTimeFormatter;
2928
import java.time.LocalDate;
29+
import java.time.format.DateTimeFormatter;
3030
import java.util.ArrayList;
31-
import java.util.HashSet;
3231
import java.util.List;
3332
import java.util.Objects;
3433
import java.util.Optional;
@@ -146,7 +145,7 @@ public void sendNewRequestEmail(FeedbackRequest storedRequest) {
146145
String.format("%s/feedback/submit?request=%s",
147146
webURL, storedRequest.getId().toString()));
148147

149-
emailSender.sendEmail(senderName, creator.getWorkEmail(),
148+
emailSender.sendEmailExposed(senderName, creator.getWorkEmail(),
150149
notificationSubject, newContent,
151150
reviewer.getWorkEmail());
152151
}
@@ -173,7 +172,7 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
173172
validateMembers(originalFeedback);
174173

175174
Set<ReviewAssignment> reviewAssignmentsSet = Set.of();
176-
if (feedbackRequest != null && feedbackRequest.getReviewPeriodId() != null && feedbackRequest.getRequesteeId() != null) {
175+
if (feedbackRequest.getReviewPeriodId() != null && feedbackRequest.getRequesteeId() != null) {
177176
reviewAssignmentsSet = reviewAssignmentRepository.findByReviewPeriodIdAndRevieweeId(feedbackRequest.getReviewPeriodId(), feedbackRequest.getRequesteeId());
178177
}
179178

@@ -229,7 +228,7 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
229228
String.format("%s/feedback/submit?request=%s",
230229
webURL, storedRequest.getId().toString()));
231230

232-
emailSender.sendEmail(senderName, creator.getWorkEmail(), notificationSubject, newContent, reviewer.getWorkEmail());
231+
emailSender.sendEmailExposed(senderName, creator.getWorkEmail(), notificationSubject, newContent, reviewer.getWorkEmail());
233232
}
234233

235234
// Send email if the feedback request has been reassigned
@@ -244,7 +243,7 @@ public FeedbackRequest update(FeedbackRequestUpdateDTO feedbackRequestUpdateDTO)
244243

245244
// Send email to reviewers. But, only when the requestee is the
246245
// recipient (i.e., a self-review).
247-
if (reviewAssignmentsSet != null && reviewAssignmentsSet.size() > 0 &&
246+
if (reviewAssignmentsSet != null && !reviewAssignmentsSet.isEmpty() &&
248247
feedbackRequest.getRequesteeId().equals(feedbackRequest.getRecipientId())) {
249248
sendSelfReviewCompletionEmailToReviewers(feedbackRequest, reviewAssignmentsSet);
250249
}
@@ -424,7 +423,7 @@ private void sendSelfReviewCompletionEmail(FeedbackRequest feedbackRequest,
424423

425424
// Send the email.
426425
try {
427-
emailSender.sendEmail(null, null, email.getSubject(),
426+
emailSender.sendEmailExposed(null, null, email.getSubject(),
428427
email.getContents(),
429428
reviewer.getWorkEmail());
430429
} catch (Exception e) {

server/src/main/java/com/objectcomputing/checkins/services/guild/GuildServicesImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ private void sendGuildMemberChangeNotification(List<MemberProfile> addedMembers,
304304

305305
String emailContent = constructEmailContent(addedMembers, removedMembers, guildName);
306306
String subject = "Membership Changes have been made to the " + guildName +" guild";
307-
emailSender.sendEmail(null, null, subject, emailContent, emailsOfGuildLeads.toArray(new String[0]));
307+
emailSender.sendEmailBlind(null, null, subject, emailContent, emailsOfGuildLeads.toArray(new String[0]));
308308

309309
}
310310

@@ -339,6 +339,6 @@ public void emailGuildLeaders(Set<String> guildLeadersEmails, Guild guild) {
339339
}
340340
String subject = "You have been assigned as a guild leader of " + guild.getName();
341341
String body = "Congratulations, you have been assigned as a guild leader of " + guild.getName();
342-
emailSender.sendEmail(null, null, subject, body, guildLeadersEmails.toArray(new String[0]));
342+
emailSender.sendEmailBlind(null, null, subject, body, guildLeadersEmails.toArray(new String[0]));
343343
}
344344
}

server/src/main/java/com/objectcomputing/checkins/services/guild/member/GuildMemberServicesImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ else if (!currentUserServices.isAdmin() && !guildMember.getMemberId().equals(cur
8686

8787
if (sendEmail) {
8888
emailSender
89-
.sendEmail(null, null, "Membership changes have been made to the " + guild.get().getName() + " guild",
89+
.sendEmailBlind(null, null, "Membership changes have been made to the " + guild.get().getName() + " guild",
9090
constructEmailContent(guildMember, true),
9191
getGuildLeadsEmails(guildLeads, guildMember).toArray(new String[0])
9292
);
@@ -170,7 +170,7 @@ public void delete(@NotNull UUID id, boolean sendEmail) {
170170

171171
if (sendEmail) {
172172
emailSender
173-
.sendEmail(null, null, "Membership Changes have been made to the " + guild.getName() + " guild",
173+
.sendEmailBlind(null, null, "Membership Changes have been made to the " + guild.getName() + " guild",
174174
constructEmailContent(guildMember, false),
175175
getGuildLeadsEmails(guildLeads, guildMember).toArray(new String[0])
176176
);

server/src/main/java/com/objectcomputing/checkins/services/kudos/KudosServicesImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,8 @@ private void sendNotification(Kudos kudos, NotificationType notificationType) {
356356
}
357357
break;
358358
}
359-
if (recipientAddresses.size() > 0) {
360-
emailSender.sendEmail(fromName, fromEmail, KUDOS_EMAIL_SUBJECT, content, recipientAddresses.toArray(new String[recipientAddresses.size()]));
359+
if (!recipientAddresses.isEmpty()) {
360+
emailSender.sendEmailBlind(fromName, fromEmail, KUDOS_EMAIL_SUBJECT, content, recipientAddresses.toArray(new String[0]));
361361
}
362362
}
363363
}

server/src/main/java/com/objectcomputing/checkins/services/kudos/kudos_recipient/KudosRecipientServicesImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ private void sendNotification(Kudos kudos, MemberProfile member) {
8787
String fromEmail = sender.getWorkEmail();
8888
String fromName = sender.getFirstName() + " " + sender.getLastName();
8989
String content = kudos.getMessage();
90-
emailSender.sendEmail(fromName, fromEmail, KUDOS_EMAIL_SUBJECT, content, member.getWorkEmail());
90+
emailSender.sendEmailBlind(fromName, fromEmail, KUDOS_EMAIL_SUBJECT, content, member.getWorkEmail());
9191
}
9292
}
9393
} catch(Exception ex) {

server/src/main/java/com/objectcomputing/checkins/services/memberprofile/MemberProfileServicesImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public void emailAssignment(MemberProfile member, boolean isPDL) {
136136
String subject = "You have been assigned as the " + role + " of " + member.getFirstName() + " " + member.getLastName();
137137
String body = member.getFirstName() + " " + member.getLastName() + " will now report to you as their " + role + ". Please engage with them: " + member.getWorkEmail();
138138

139-
emailSender.sendEmail(null, null, subject, body, roleProfile.getWorkEmail());
139+
emailSender.sendEmailBlind(null, null, subject, body, roleProfile.getWorkEmail());
140140
} else {
141141
LOG.warn("Unable to send email regarding {} {}'s {} update as the {} was unable to be pulled up correctly",
142142
member.getFirstName(), member.getLastName(), role, role);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private String getEmailContent() {
6060
public void send() {
6161
final List<String> recipients = getActiveTeamMembers();
6262
final String content = getEmailContent();
63-
emailSender.sendEmail(null, null, SUBJECT, content,
63+
emailSender.sendEmailBlind(null, null, SUBJECT, content,
6464
recipients.toArray(new String[recipients.size()]));
6565
}
6666
}

server/src/main/java/com/objectcomputing/checkins/services/pulseresponse/PulseResponseServicesImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public void sendPulseLowScoreEmail(PulseResponse pulseResponse) {
188188
}
189189

190190
if (!recipients.isEmpty()) {
191-
emailSender.sendEmail(null, null, subject, bodyBuilder.toString(), recipients.toArray(new String[0]));
191+
emailSender.sendEmailBlind(null, null, subject, bodyBuilder.toString(), recipients.toArray(new String[0]));
192192
}
193193
}
194194
}

0 commit comments

Comments
 (0)