Skip to content

Commit

Permalink
RHCLOUD-30967 Change email footer if preferences are ignored
Browse files Browse the repository at this point in the history
  • Loading branch information
gwenneg committed Mar 22, 2024
1 parent 4171b59 commit 2f20fd8
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.redhat.cloud.notifications.db.repositories.SubscriptionRepository;
import com.redhat.cloud.notifications.db.repositories.TemplateRepository;
import com.redhat.cloud.notifications.models.Endpoint;
import com.redhat.cloud.notifications.models.EndpointType;
import com.redhat.cloud.notifications.models.Event;
import com.redhat.cloud.notifications.models.InstantEmailTemplate;
import com.redhat.cloud.notifications.processors.ConnectorSender;
Expand All @@ -20,10 +19,15 @@

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

import static com.redhat.cloud.notifications.models.EndpointType.EMAIL_SUBSCRIPTION;
import static com.redhat.cloud.notifications.models.SubscriptionType.INSTANT;
import static java.util.Map.Entry;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toSet;

@ApplicationScoped
public class EmailProcessor extends SystemEndpointTypeProcessor {
Expand Down Expand Up @@ -96,25 +100,37 @@ public void process(final Event event, final List<Endpoint> endpoints) {
final TemplateInstance subjectTemplate = this.templateService.compileTemplate(subjectData, "subject");
final TemplateInstance bodyTemplate = this.templateService.compileTemplate(bodyData, "body");

final String subject = this.templateService.renderTemplate(event.getEventWrapper().getEvent(), subjectTemplate);
final String body = this.templateService.renderTemplate(event.getEventWrapper().getEvent(), bodyTemplate, emailActorsResolver.getPendoEmailMessage(event));
Map<Boolean, Set<RecipientSettings>> rsByIgnoreUserPreferences = recipientSettings.stream()
.collect(groupingBy(RecipientSettings::isIgnoreUserPreferences, toSet()));

// Prepare all the data to be sent to the connector.
final EmailNotification emailNotification = new EmailNotification(
body,
subject,
emailActorsResolver.getEmailSender(event),
event.getOrgId(),
recipientSettings,
subscribers,
unsubscribers,
event.getEventType().isSubscribedByDefault()
);
/*
* [VERY UNLIKELY] We may send two different emails if the incoming action or cloud event contains BOTH:
* - recipient settings with ignoreUserPreferences set to TRUE
* - recipient settings with ignoreUserPreferences set to FALSE
* 99.99% of the time, only one email notification should be sent from the code below.
*/
for (Entry<Boolean, Set<RecipientSettings>> entry : rsByIgnoreUserPreferences.entrySet()) {

final String subject = templateService.renderTemplate(event.getEventWrapper().getEvent(), subjectTemplate, entry.getKey());
final String body = templateService.renderTemplate(event.getEventWrapper().getEvent(), bodyTemplate, emailActorsResolver.getPendoEmailMessage(event), entry.getKey());

final JsonObject payload = JsonObject.mapFrom(emailNotification);
// Prepare all the data to be sent to the connector.
final EmailNotification emailNotification = new EmailNotification(
body,
subject,
emailActorsResolver.getEmailSender(event),
event.getOrgId(),
entry.getValue(),
subscribers,
unsubscribers,
event.getEventType().isSubscribedByDefault()
);

final Endpoint endpoint = endpointRepository.getOrCreateDefaultSystemSubscription(event.getAccountId(), event.getOrgId(), EndpointType.EMAIL_SUBSCRIPTION);
final JsonObject payload = JsonObject.mapFrom(emailNotification);

this.connectorSender.send(event, endpoint, payload);
final Endpoint endpoint = endpointRepository.getOrCreateDefaultSystemSubscription(event.getAccountId(), event.getOrgId(), EMAIL_SUBSCRIPTION);

connectorSender.send(event, endpoint, payload);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,24 @@ public TemplateInstance compileTemplate(String template, String name) {
}

public String renderTemplate(Object event, TemplateInstance templateInstance) {
return renderTemplate(event, templateInstance, null);
return renderTemplate(event, templateInstance, false);
}

public String renderTemplate(Object event, TemplateInstance templateInstance, boolean ignoreUserPreferences) {
return renderTemplate(event, templateInstance, null, ignoreUserPreferences);
}

public String renderTemplate(Object event, TemplateInstance templateInstance, EmailPendo pendoMessage) {
return renderTemplate(event, templateInstance, pendoMessage, false);
}

public String renderTemplate(Object event, TemplateInstance templateInstance, EmailPendo pendoMessage, boolean ignoreUserPreferences) {
return templateInstance
.data("action", event)
.data("event", event)
.data("environment", environment)
.data("pendo_message", pendoMessage)
.data("ignore_user_preferences", ignoreUserPreferences)
.render();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,11 @@ <h1>{#insert content-title}{/}</h1>
<table role="presentation" border="0" align="center" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td class="rh-footer__text">
{#if ignore_user_preferences??}
<p>
This email is critical or requires action. Therefore, you are receiving this message regardless of your email preferences.
</p>
{/if}
This email was sent by Red Hat Hybrid Cloud Console | <a href="{environment.url}/user-preferences/notifications/notifications?bundle={action.bundle.or("")}&app={action.application.or("")}" target="_blank">Manage email preferences</a>
</td>
</tr>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,11 @@ private String generateEmailSubject(String eventTypeStr, Object event) {
}

protected String generateEmailBody(String eventTypeStr, Action action) {
return generateEmailBody(eventTypeStr, (Object) action);
return generateEmailBody(eventTypeStr, action, false);
}

protected String generateEmailBody(String eventTypeStr, Action action, boolean ignoreUserPreferences) {
return generateEmailBody(eventTypeStr, (Object) action, ignoreUserPreferences);
}

protected String generateEmailBody(String eventTypeStr, Action action, EmailPendo pendo) {
Expand All @@ -125,13 +129,21 @@ protected String generateEmailBody(String eventTypeStr, NotificationsConsoleClou
}

private String generateEmailBody(String eventTypeStr, Object event, EmailPendo pendo) {
return generateEmailBody(eventTypeStr, event, pendo, false);
}

private String generateEmailBody(String eventTypeStr, Object event, EmailPendo pendo, boolean ignoreUserPreferences) {
InstantEmailTemplate emailTemplate = templateRepository.findInstantEmailTemplate(eventTypes.get(eventTypeStr)).get();
TemplateInstance bodyTemplate = templateService.compileTemplate(emailTemplate.getBodyTemplate().getData(), emailTemplate.getBodyTemplate().getName());
return generateEmail(bodyTemplate, event, pendo);
return generateEmail(bodyTemplate, event, pendo, ignoreUserPreferences);
}

private String generateEmailBody(String eventTypeStr, Object event) {
return generateEmailBody(eventTypeStr, event, null);
return generateEmailBody(eventTypeStr, event, false);
}

private String generateEmailBody(String eventTypeStr, Object event, boolean ignoreUserPreferences) {
return generateEmailBody(eventTypeStr, event, null, ignoreUserPreferences);
}

protected String generateAggregatedEmailSubject(Map<String, Object> context) {
Expand Down Expand Up @@ -163,8 +175,12 @@ protected String generateAggregatedEmailBody(Action action) {
}

protected String generateEmail(TemplateInstance template, Object actionOrEvent, EmailPendo pendo) {
return generateEmail(template, actionOrEvent, pendo, false);
}

protected String generateEmail(TemplateInstance template, Object actionOrEvent, EmailPendo pendo, boolean ignoreUserPreferences) {

String result = templateService.renderTemplate(actionOrEvent, template, pendo);
String result = templateService.renderTemplate(actionOrEvent, template, pendo, ignoreUserPreferences);
writeOrSendEmailTemplate(result, template.getTemplate().getId() + ".html");

return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.redhat.cloud.notifications.EmailTemplatesInDbHelper;
import com.redhat.cloud.notifications.TestHelpers;
import com.redhat.cloud.notifications.ingress.Action;
import com.redhat.cloud.notifications.ingress.Recipient;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -38,9 +39,18 @@ public void testInstantEmailTitle() {
}

@Test
public void testInstantEmailBody() {
public void testInstantEmailBodyWithoutPreferencesIgnored() {
testInstantEmailBody(false);
}

@Test
public void testInstantEmailBodyWithPreferencesIgnored() {
testInstantEmailBody(true);
}

private void testInstantEmailBody(boolean ignoreUserPreferences) {
Action action = TestHelpers.createPoliciesAction("", "", "", "FooMachine");
String result = generateEmailBody(EVENT_TYPE_NAME, action);
String result = generateEmailBody(EVENT_TYPE_NAME, action, ignoreUserPreferences);
assertTrue(result.contains(TestHelpers.policyId1), "Body should contain policy id" + TestHelpers.policyId1);
assertTrue(result.contains(TestHelpers.policyName1), "Body should contain policy name" + TestHelpers.policyName1);

Expand All @@ -50,6 +60,10 @@ public void testInstantEmailBody() {
// Display name
assertTrue(result.contains("FooMachine"), "Body should contain the display_name");
assertTrue(result.contains(TestHelpers.HCC_LOGO_TARGET));

if (ignoreUserPreferences) {
assertTrue(result.contains("This email is critical or requires action. Therefore, you are receiving this message regardless of your email preferences."));
}
}

@Test
Expand Down

0 comments on commit 2f20fd8

Please sign in to comment.