Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…into feature/SELC-5264
  • Loading branch information
pierpaolo.didato@emeal.nttdata.com authored and pierpaolo.didato@emeal.nttdata.com committed Jul 18, 2024
2 parents a7f9368 + 523ed92 commit 9d30147
Show file tree
Hide file tree
Showing 26 changed files with 648 additions and 337 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -268,4 +268,17 @@ public String createDelegationForAggregation(@DurableActivityTrigger(name = "onb
context.getLogger().info(String.format(FORMAT_LOGGER_ONBOARDING_STRING, CREATE_USERS_ACTIVITY, onboardingString));
return completionService.createDelegation(readOnboardingValue(objectMapper, onboardingString));
}

/**
* This HTTP-triggered function retrieves onboarding given its identifier
* After that, It sends a message on topics through the event bus
*/
@FunctionName("TestSendEmail")
public HttpResponseMessage sendTestEmail(
@HttpTrigger(name = "req", methods = {HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION) HttpRequestMessage<Optional<String>> request,
final ExecutionContext context) {
context.getLogger().info("TestSendEmail trigger processed a request");
completionService.sendTestEmail(context);
return request.createResponseBuilder(HttpStatus.OK).build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package it.pagopa.selfcare.onboarding.service;

import com.microsoft.azure.functions.ExecutionContext;
import it.pagopa.selfcare.onboarding.dto.OnboardingAggregateOrchestratorInput;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflow;
Expand All @@ -23,4 +24,6 @@ public interface CompletionService {
String createDelegation(Onboarding onboarding);

String createAggregateOnboardingRequest(OnboardingAggregateOrchestratorInput onboardingAggregateOrchestratorInput);

void sendTestEmail(ExecutionContext context);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package it.pagopa.selfcare.onboarding.service;

import com.microsoft.azure.functions.ExecutionContext;
import it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType;
import it.pagopa.selfcare.onboarding.common.InstitutionType;
import it.pagopa.selfcare.onboarding.common.OnboardingStatus;
Expand Down Expand Up @@ -336,4 +337,9 @@ public String createAggregateOnboardingRequest(OnboardingAggregateOrchestratorIn
onboardingRepository.persistOrUpdate(onboardingToUpdate);
return onboardingToUpdate.getId();
}

@Override
public void sendTestEmail(ExecutionContext context) {
notificationService.sendTestEmail(context);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ public void send(ExecutionContext context, Onboarding onboarding, QueueEvent que
prepareAndSendNotification(context, product, consumerConfig, onboarding, token.orElse(null), institution, queueEvent);
}
} catch (Exception e) {
telemetryClient.trackEvent(EVENT_ONBOARDING_FN_NAME, onboardingEventMap(onboarding), Map.of(EVENT_ONBOARDING_INSTTITUTION_FN_FAILURE, 1D));
throw new NotificationException(String.format("Impossible to send notification for onboarding with ID %s", onboarding.getId()), e);
}
}
Expand Down Expand Up @@ -137,6 +138,12 @@ private void sendTestEnvProductsNotification(ExecutionContext context, Product p
}
}

public static Map<String, String> onboardingEventMap(Onboarding onboarding) {
Map<String, String> propertiesMap = new HashMap<>();
Optional.ofNullable(onboarding.getId()).ifPresent(value -> propertiesMap.put("id", value));
return propertiesMap;
}

public static Map<String, String> notificationEventMap(NotificationToSend notificationToSend) {
Map<String, String> propertiesMap = new HashMap<>();
Optional.ofNullable(notificationToSend.getId()).ifPresent(value -> propertiesMap.put("id", value));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package it.pagopa.selfcare.onboarding.service;


import com.microsoft.azure.functions.ExecutionContext;
import it.pagopa.selfcare.onboarding.common.InstitutionType;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflow;
import it.pagopa.selfcare.product.entity.Product;
Expand All @@ -27,4 +28,5 @@ public interface NotificationService {

void sendCompletedEmailAggregate(String institutionName, List<String> destinationMails);

void sendTestEmail(ExecutionContext context);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package it.pagopa.selfcare.onboarding.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.functions.ExecutionContext;
import io.quarkus.mailer.Mail;
import io.quarkus.mailer.Mailer;
import it.pagopa.selfcare.azurestorage.AzureBlobClient;
Expand Down Expand Up @@ -236,4 +237,20 @@ static class FileMailData {
String contentType;
}

@Override
public void sendTestEmail(ExecutionContext context) {
try {
context.getLogger().info("Sending Test email to " + senderMail);
String html = "TEST EMAIL";
Mail mail = Mail
.withHtml(senderMail, html, html)
.setFrom(senderMail);

mailer.send(mail);
context.getLogger().info("End of sending mail to {}, with subject " + senderMail + " with subject " + mail);
} catch (Exception e) {
context.getLogger().severe(String.format("%s: %s", ERROR_DURING_SEND_MAIL, e.getMessage()));
throw new GenericOnboardingException(ERROR_DURING_SEND_MAIL.getMessage());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
Expand Down Expand Up @@ -264,9 +265,8 @@ public List<NotificationCountResult> countNotifications(String productId, String
}


public NotificationCountResult countNotificationsByFilters(String productId, String from, String to, ExecutionContext context) {
Document queryAddEvent = createQuery(productId, List.of(OnboardingStatus.COMPLETED, OnboardingStatus.DELETED), from, to, ACTIVATED_AT_FIELD);
Document queryUpdateEvent = createQuery(productId, List.of(OnboardingStatus.DELETED), from, to, DELETED_AT_FIELD);
public NotificationCountResult countNotificationsByFilters(String productId, String from, String to, ExecutionContext context) {Document queryAddEvent = getQueryNotificationAdd(productId, from, to);
Document queryUpdateEvent = getQueryNotificationDelete(productId, from, to);

long countAddEvents = repository.find(queryAddEvent).count();
long countUpdateEvents= repository.find(queryUpdateEvent).count();
Expand All @@ -276,12 +276,23 @@ public NotificationCountResult countNotificationsByFilters(String productId, Str
return new NotificationCountResult(productId, total);
}

private Document createQuery(String productId, List<OnboardingStatus> status, String from, String to, String dateField) {
private Document getQueryNotificationDelete(String productId, String from, String to) {
return createQuery(productId, List.of(OnboardingStatus.DELETED), from, to, DELETED_AT_FIELD);
}

private Document getQueryNotificationAdd(String productId, String from, String to) {
return createQuery(productId, List.of(OnboardingStatus.COMPLETED, OnboardingStatus.DELETED), from, to, ACTIVATED_AT_FIELD);
}

private Document createQuery(String productId, List<OnboardingStatus> status, String from, String to, String dateField, boolean workflowTypeExist) {
Document query = new Document();
query.append("productId", productId);
query.append("status", new Document("$in", status.stream().map(OnboardingStatus::name).toList()));
query.append("workflowType", new Document("$in", ALLOWED_WORKFLOWS_FOR_INSTITUTION_NOTIFICATIONS.stream().map(Enum::name).toList()));

if (workflowTypeExist) {
query.append("workflowType", new Document("$in", ALLOWED_WORKFLOWS_FOR_INSTITUTION_NOTIFICATIONS.stream().map(Enum::name).toList()));
} else {
query.append("workflowType", new Document("$exists", false));
}
Document dateQuery = new Document();
Optional.ofNullable(from).ifPresent(value -> query.append(dateField, dateQuery.append("$gte", LocalDate.parse(from, DateTimeFormatter.ISO_LOCAL_DATE))));
Optional.ofNullable(to).ifPresent(value -> query.append(dateField, dateQuery.append("$lte", LocalDate.parse(to, DateTimeFormatter.ISO_LOCAL_DATE))));
Expand All @@ -291,6 +302,15 @@ private Document createQuery(String productId, List<OnboardingStatus> status, St
return query;
}

private Document createQuery(String productId, List<OnboardingStatus> status, String from, String to, String dateField) {
Document query = new Document();
List<Document> workflowCriteria = new ArrayList<>();
workflowCriteria.add(createQuery(productId, status, from, to, dateField, true));
workflowCriteria.add(createQuery(productId, status, from, to, dateField, false));
query.append("$or", workflowCriteria);
return query;
}

public List<Onboarding> getOnboardingsToResend(ResendNotificationsFilters filters, int page, int pageSize) {
return repository.find(createQueryByFilters(filters)).page(page, pageSize).list();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ default Optional<OnboardingStatus> onboardingCompletionUsersActivity(TaskOrchest
final String onboardingString = getOnboardingString(objectMapper(), onboardingWorkflow.getOnboarding());
final String onboardingWorkflowString = getOnboardingWorkflowString(objectMapper(), onboardingWorkflow);
ctx.callActivity(CREATE_USERS_ACTIVITY, onboardingString, optionsRetry(), String.class).await();
ctx.callActivity(STORE_ONBOARDING_ACTIVATEDAT, onboardingString, optionsRetry(), String.class).await();
ctx.callActivity(SEND_MAIL_COMPLETION_ACTIVITY, onboardingWorkflowString, optionsRetry(), String.class).await();
return Optional.of(OnboardingStatus.COMPLETED);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflow;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflowInstitution;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflowType;

import java.util.Optional;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,10 +473,11 @@ void onboardingsOrchestratorNewAdmin() {
function.onboardingsOrchestrator(orchestrationContext, executionContext);

ArgumentCaptor<String> captorActivity = ArgumentCaptor.forClass(String.class);
verify(orchestrationContext, times(2))
verify(orchestrationContext, times(3))
.callActivity(captorActivity.capture(), any(), any(),any());
assertEquals(CREATE_USERS_ACTIVITY, captorActivity.getAllValues().get(0));
assertEquals(SEND_MAIL_COMPLETION_ACTIVITY, captorActivity.getAllValues().get(1));
assertEquals(STORE_ONBOARDING_ACTIVATEDAT, captorActivity.getAllValues().get(1));
assertEquals(SEND_MAIL_COMPLETION_ACTIVITY, captorActivity.getAllValues().get(2));
verify(service, times(1))
.updateOnboardingStatus(onboarding.getId(), OnboardingStatus.COMPLETED);
}
Expand Down Expand Up @@ -766,4 +767,22 @@ void createDelegationForAggregation() {
verify(completionService, times(1))
.createDelegation(any());
}

@Test
void sendTestEmail() {
@SuppressWarnings("unchecked") final HttpRequestMessage<Optional<String>> req = mock(HttpRequestMessage.class);

doAnswer((Answer<HttpResponseMessage.Builder>) invocation -> {
HttpStatus status = (HttpStatus) invocation.getArguments()[0];
return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status);
}).when(req).createResponseBuilder(any(HttpStatus.class));

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(completionService).sendTestEmail(executionContext);

function.sendTestEmail(req, executionContext);

verify(completionService, times(1))
.sendTestEmail(executionContext);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.microsoft.azure.functions.ExecutionContext;
import io.quarkus.mongodb.panache.common.PanacheUpdate;
import io.quarkus.test.InjectMock;
import io.quarkus.test.junit.QuarkusTest;
Expand Down Expand Up @@ -39,6 +40,7 @@

import java.time.LocalDateTime;
import java.util.*;
import java.util.logging.Logger;

import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_FIELD_LIST;
import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -693,6 +695,18 @@ public static Onboarding createSampleOnboarding() {
return onboarding;
}

@Test
void sendTestEmail() {
ExecutionContext executionContext = mock(ExecutionContext.class);
when(executionContext.getLogger()).thenReturn(Logger.getGlobal());

doNothing().when(notificationService).sendTestEmail(executionContext);

completionServiceDefault.sendTestEmail(executionContext);

Mockito.verify(notificationService, times(1))
.sendTestEmail(executionContext);
}

}

Loading

0 comments on commit 9d30147

Please sign in to comment.