use of com.redhat.cloud.notifications.models.EmailSubscriptionType in project notifications-backend by RedHatInsights.
the class EmailAggregator method getAggregated.
public Map<User, Map<String, Object>> getAggregated(EmailAggregationKey aggregationKey, EmailSubscriptionType emailSubscriptionType, LocalDateTime start, LocalDateTime end) {
Map<User, AbstractEmailPayloadAggregator> aggregated = new HashMap<>();
Set<String> subscribers = getEmailSubscribers(aggregationKey, emailSubscriptionType);
// First, we retrieve all aggregations that match the given key.
List<EmailAggregation> aggregations = emailAggregationRepository.getEmailAggregation(aggregationKey, start, end);
// For each aggregation...
for (EmailAggregation aggregation : aggregations) {
// We need its event type to determine the target endpoints.
String eventType = getEventType(aggregation);
// Let's retrieve these targets.
Set<Endpoint> endpoints = Set.copyOf(endpointRepository.getTargetEmailSubscriptionEndpoints(aggregationKey.getAccountId(), aggregationKey.getBundle(), aggregationKey.getApplication(), eventType));
// Now we want to determine who will actually receive the aggregation email.
// All users who subscribed to the current application and subscription type combination are recipients candidates.
/*
* The actual recipients list may differ from the candidates depending on the endpoint properties and the action settings.
* The target endpoints properties will determine whether or not each candidate will actually receive an email.
*/
Set<User> users = recipientResolver.recipientUsers(aggregationKey.getAccountId(), aggregationKey.getOrgId(), Stream.concat(endpoints.stream().map(EndpointRecipientSettings::new), getActionRecipient(aggregation).stream()).collect(Collectors.toSet()), subscribers);
/*
* We now have the final recipients list.
* Let's populate the Map that will be returned by the method.
*/
users.forEach(user -> {
// It's aggregation time!
fillUsers(aggregationKey, user, aggregated, aggregation);
});
}
return aggregated.entrySet().stream().peek(entry -> {
// TODO These fields could be passed to EmailPayloadAggregatorFactory.by since we know them from the beginning.
entry.getValue().setStartTime(start);
entry.getValue().setEndTimeKey(end);
}).collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getContext()));
}
use of com.redhat.cloud.notifications.models.EmailSubscriptionType in project notifications-backend by RedHatInsights.
the class EmailSubscriptionTypeProcessor method sendEmail.
private List<NotificationHistory> sendEmail(Event event, Set<Endpoint> endpoints, EmailTemplate emailTemplate) {
EmailSubscriptionType emailSubscriptionType = EmailSubscriptionType.INSTANT;
processedEmailCount.increment();
Action action = event.getAction();
TemplateInstance subject;
TemplateInstance body;
if (useTemplatesFromDb) {
Optional<InstantEmailTemplate> instantEmailTemplate = templateRepository.findInstantEmailTemplate(event.getEventType().getId());
if (instantEmailTemplate.isEmpty()) {
return Collections.emptyList();
} else {
String subjectData = instantEmailTemplate.get().getSubjectTemplate().getData();
subject = templateService.compileTemplate(subjectData, "subject");
String bodyData = instantEmailTemplate.get().getBodyTemplate().getData();
body = templateService.compileTemplate(bodyData, "body");
}
} else {
if (!emailTemplate.isSupported(action.getEventType(), emailSubscriptionType)) {
return Collections.emptyList();
}
subject = emailTemplate.getTitle(action.getEventType(), emailSubscriptionType);
body = emailTemplate.getBody(action.getEventType(), emailSubscriptionType);
}
if (subject == null || body == null) {
return Collections.emptyList();
}
Set<RecipientSettings> requests = Stream.concat(endpoints.stream().map(EndpointRecipientSettings::new), ActionRecipientSettings.fromAction(action).stream()).collect(Collectors.toSet());
Set<String> subscribers = Set.copyOf(emailSubscriptionRepository.getEmailSubscribersUserId(action.getAccountId(), action.getBundle(), action.getApplication(), emailSubscriptionType));
LOG.info("sending email for event: " + event);
return recipientResolver.recipientUsers(action.getAccountId(), action.getOrgId(), requests, subscribers).stream().map(user -> emailSender.sendEmail(user, event, subject, body)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
}
use of com.redhat.cloud.notifications.models.EmailSubscriptionType in project notifications-backend by RedHatInsights.
the class UserConfigResourceTest method testSettings.
@Test
void testSettings() {
String tenant = "empty";
String orgId = "empty";
String username = "user";
String identityHeaderValue = TestHelpers.encodeRHIdentityInfo(tenant, orgId, username);
Header identityHeader = TestHelpers.createRHIdentityHeader(identityHeaderValue);
MockServerConfig.addMockRbacAccess(identityHeaderValue, MockServerConfig.RbacAccess.FULL_ACCESS);
String bundle = "rhel";
String application = "policies";
when(templateEngineClient.isSubscriptionTypeSupported(bundle, application, INSTANT)).thenReturn(TRUE);
when(templateEngineClient.isSubscriptionTypeSupported(bundle, application, DAILY)).thenReturn(TRUE);
SettingsValueJsonForm jsonForm = given().header(identityHeader).queryParam("bundleName", bundle).when().get("/user-config/notification-preference").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
Field rhelPolicy = rhelPolicyForm(jsonForm);
assertNotNull(rhelPolicy, "RHEL policies not found");
SettingsValues settingsValues = createSettingsValue(bundle, application, false, false);
given().header(identityHeader).when().contentType(JSON).body(Json.encode(settingsValues)).post("/user-config/notification-preference").then().statusCode(200).contentType(TEXT);
jsonForm = given().header(identityHeader).when().get("/user-config/notification-preference?bundleName=rhel").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
rhelPolicy = rhelPolicyForm(jsonForm);
assertNotNull(rhelPolicy, "RHEL policies not found");
Map<EmailSubscriptionType, Boolean> initialValues = extractNotificationValues(rhelPolicy, bundle, application);
assertEquals(initialValues, settingsValues.bundles.get(bundle).applications.get(application).notifications);
UserConfigPreferences preferences = given().header(identityHeader).when().get(String.format("/user-config/notification-preference/%s/%s", bundle, application)).then().statusCode(200).contentType(JSON).extract().body().as(UserConfigPreferences.class);
assertEquals(false, preferences.getDailyEmail());
assertEquals(false, preferences.getInstantEmail());
// Daily to true
settingsValues = createSettingsValue(bundle, application, true, false);
given().header(identityHeader).when().contentType(JSON).body(Json.encode(settingsValues)).post("/user-config/notification-preference").then().statusCode(200).contentType(TEXT);
jsonForm = given().header(identityHeader).when().get("/user-config/notification-preference?bundleName=rhel").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
rhelPolicy = rhelPolicyForm(jsonForm);
assertNotNull(rhelPolicy, "RHEL policies not found");
initialValues = extractNotificationValues(rhelPolicy, bundle, application);
assertEquals(initialValues, settingsValues.bundles.get(bundle).applications.get(application).notifications);
preferences = given().header(identityHeader).when().get(String.format("/user-config/notification-preference/%s/%s", bundle, application)).then().statusCode(200).contentType(JSON).extract().body().as(UserConfigPreferences.class);
assertEquals(true, preferences.getDailyEmail());
assertEquals(false, preferences.getInstantEmail());
// Instant to true
settingsValues = createSettingsValue(bundle, application, false, true);
given().header(identityHeader).when().contentType(JSON).body(Json.encode(settingsValues)).post("/user-config/notification-preference").then().statusCode(200).contentType(TEXT);
jsonForm = given().header(identityHeader).when().get("/user-config/notification-preference?bundleName=rhel").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
rhelPolicy = rhelPolicyForm(jsonForm);
assertNotNull(rhelPolicy, "RHEL policies not found");
initialValues = extractNotificationValues(rhelPolicy, bundle, application);
assertEquals(initialValues, settingsValues.bundles.get(bundle).applications.get(application).notifications);
preferences = given().header(identityHeader).when().get(String.format("/user-config/notification-preference/%s/%s", bundle, application)).then().statusCode(200).contentType(JSON).extract().body().as(UserConfigPreferences.class);
assertEquals(false, preferences.getDailyEmail());
assertEquals(true, preferences.getInstantEmail());
// Both to true
settingsValues = createSettingsValue(bundle, application, true, true);
given().header(identityHeader).when().contentType(JSON).body(Json.encode(settingsValues)).post("/user-config/notification-preference").then().statusCode(200).contentType(TEXT);
jsonForm = given().header(identityHeader).when().get("/user-config/notification-preference?bundleName=rhel").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
rhelPolicy = rhelPolicyForm(jsonForm);
assertNotNull(rhelPolicy, "RHEL policies not found");
initialValues = extractNotificationValues(rhelPolicy, bundle, application);
assertEquals(initialValues, settingsValues.bundles.get(bundle).applications.get(application).notifications);
preferences = given().header(identityHeader).when().get(String.format("/user-config/notification-preference/%s/%s", bundle, application)).then().statusCode(200).contentType(JSON).extract().body().as(UserConfigPreferences.class);
assertEquals(true, preferences.getDailyEmail());
assertEquals(true, preferences.getInstantEmail());
// does not fail if we have unknown apps in our bundle's settings
emailSubscriptionRepository.subscribe(tenant, username, bundle, "not-found-app", DAILY);
given().header(identityHeader).when().queryParam("bundleName", bundle).get("/user-config/notification-preference").then().statusCode(200).contentType(JSON);
emailSubscriptionRepository.unsubscribe(tenant, username, "not-found-bundle", "not-found-app", DAILY);
// Fails if we don't specify the bundleName
given().header(identityHeader).when().get("/user-config/notification-preference").then().statusCode(400).contentType(JSON);
// does not add if we try to create unknown bundle/apps
SettingsValues settingsValue = createSettingsValue("not-found-bundle-2", "not-found-app-2", true, true);
given().header(identityHeader).when().contentType(JSON).body(Json.encode(settingsValue)).post("/user-config/notification-preference").then().statusCode(200).contentType(TEXT);
assertNull(emailSubscriptionRepository.getEmailSubscription(tenant, username, "not-found-bundle-2", "not-found-app-2", DAILY));
assertNull(emailSubscriptionRepository.getEmailSubscription(tenant, username, "not-found-bundle", "not-found-app", INSTANT));
// Does not add event type if is not supported by the templates
when(templateEngineClient.isSubscriptionTypeSupported(bundle, application, DAILY)).thenReturn(FALSE);
SettingsValueJsonForm settingsValueJsonForm = given().header(identityHeader).when().get("/user-config/notification-preference?bundleName=rhel").then().statusCode(200).contentType(JSON).extract().body().as(SettingsValueJsonForm.class);
Field rhelPolicy2 = rhelPolicyForm(settingsValueJsonForm);
assertNotNull(rhelPolicy2, "RHEL policies not found");
assertEquals(1, rhelPolicy2.fields.get(0).fields.size());
assertEquals("bundles[rhel].applications[policies].notifications[INSTANT]", rhelPolicy2.fields.get(0).fields.get(0).name);
}
use of com.redhat.cloud.notifications.models.EmailSubscriptionType in project notifications-backend by RedHatInsights.
the class UserConfigResource method saveSettings.
@POST
@Path("/notification-preference")
@Consumes(APPLICATION_JSON)
@Produces(TEXT_PLAIN)
@Operation(hidden = true)
@Transactional
public Response saveSettings(@Context SecurityContext sec, @Valid SettingsValues values) {
final RhIdPrincipal principal = (RhIdPrincipal) sec.getUserPrincipal();
final String account = principal.getAccount();
final String name = principal.getName();
final List<Boolean> subscriptionRequests = new ArrayList<>();
values.bundles.forEach((bundleName, bundleSettingsValue) -> bundleSettingsValue.applications.forEach((applicationName, applicationSettingsValue) -> {
Application app = applicationRepository.getApplication(bundleName, applicationName);
applicationSettingsValue.notifications.forEach((emailSubscriptionType, subscribed) -> {
if (subscribed) {
if (app != null) {
subscriptionRequests.add(emailSubscriptionRepository.subscribe(account, name, bundleName, applicationName, emailSubscriptionType));
}
} else {
subscriptionRequests.add(emailSubscriptionRepository.unsubscribe(account, name, bundleName, applicationName, emailSubscriptionType));
}
});
}));
boolean allisSuccess = subscriptionRequests.stream().allMatch(Boolean.TRUE::equals);
Response.ResponseBuilder builder;
if (allisSuccess) {
builder = Response.ok();
} else {
// Prevent from saving
builder = Response.serverError().entity("Storing of settings Failed.");
builder.type("text/plain");
}
return builder.build();
}
use of com.redhat.cloud.notifications.models.EmailSubscriptionType in project notifications-backend by RedHatInsights.
the class UserConfigResource method getSettingsValueForUser.
/**
* Pulls the user settings values of an user across all the know applications of a bundle
*/
private SettingsValues getSettingsValueForUser(String account, String username, String bundleName) {
if (bundleName == null || bundleName.equals("")) {
throw new BadRequestException("bundleName must have a value");
}
SettingsValues settingsValues = new SettingsValues();
Bundle bundle = bundleRepository.getBundle(bundleName);
if (bundle == null) {
throw new BadRequestException("Unknown bundleName: " + bundleName);
} else {
BundleSettingsValue bundleSettingsValue = new BundleSettingsValue();
bundleSettingsValue.displayName = bundle.getDisplayName();
settingsValues.bundles.put(bundle.getName(), bundleSettingsValue);
for (Application application : applicationRepository.getApplications(bundle.getName())) {
ApplicationSettingsValue applicationSettingsValue = new ApplicationSettingsValue();
applicationSettingsValue.displayName = application.getDisplayName();
settingsValues.bundles.get(bundle.getName()).applications.put(application.getName(), applicationSettingsValue);
for (EmailSubscriptionType emailSubscriptionType : EmailSubscriptionType.values()) {
// TODO NOTIF-450 How do we deal with a failure here? What kind of response should be sent to the UI when the engine is down?
boolean supported = templateEngineClient.isSubscriptionTypeSupported(bundle.getName(), application.getName(), emailSubscriptionType);
if (supported) {
settingsValues.bundles.get(bundle.getName()).applications.get(application.getName()).notifications.put(emailSubscriptionType, false);
}
}
}
List<EmailSubscription> emailSubscriptions = emailSubscriptionRepository.getEmailSubscriptionsForUser(account, username);
for (EmailSubscription emailSubscription : emailSubscriptions) {
if (settingsValues.bundles.containsKey(emailSubscription.getApplication().getBundle().getName())) {
BundleSettingsValue bundleSettings = settingsValues.bundles.get(emailSubscription.getApplication().getBundle().getName());
if (bundleSettings.applications.containsKey(emailSubscription.getApplication().getName())) {
ApplicationSettingsValue applicationSettingsValue = bundleSettings.applications.get(emailSubscription.getApplication().getName());
if (applicationSettingsValue.notifications.containsKey(emailSubscription.getType())) {
bundleSettings.applications.get(emailSubscription.getApplication().getName()).notifications.put(emailSubscription.getType(), true);
}
}
}
}
return settingsValues;
}
}
Aggregations