Skip to content

Commit

Permalink
[SELC-5228] feat: Added env variable to send email in the function PE…
Browse files Browse the repository at this point in the history
…RSIST_USERS
  • Loading branch information
pierpaolodidato89 authored Jul 5, 2024
1 parent bdeab21 commit 10d7c16
Show file tree
Hide file tree
Showing 12 changed files with 39 additions and 104 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package it.pagopa.selfcare.onboarding.event.entity.util;

public enum InstitutionPaSubunitType {
AOO, UO
AOO, UO, EC
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ public interface UserMapper {
@Mapping(source = "institution.id", target = "institutionId")
@Mapping(source = "institution.description", target = "institutionDescription")
@Mapping(source = "institution.parentDescription", target = "institutionRootName")
@Mapping(target = "hasToSendEmail", constant = "false")
@Mapping(target = "product", source = ".")
AddUserRoleDto toUserRole(Onboarding onboarding);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,15 @@ public class CompletionServiceDefault implements CompletionService {
@Inject
OnboardingMapper onboardingMapper;

@ConfigProperty(name = "onboarding-functions.persist-users.active")
private boolean isUserMSActive;
@ConfigProperty(name = "onboarding-functions.persist-users.send-mail")
private boolean hasToSendEmail;

@ConfigProperty(name = "onboarding-function.force-institution-persist")
private boolean forceInstitutionCreation;

@Override
public String createInstitutionAndPersistInstitutionId(Onboarding onboarding) {
InstitutionResponse institutionResponse = null;
InstitutionResponse institutionResponse;
//When onboarding a pg institution this condition ensures that the institution's informations are persisted correctly
if(forceInstitutionCreation){
institutionResponse = createInstitution(onboarding.getInstitution());
Expand Down Expand Up @@ -224,17 +224,15 @@ public void sendCompletedEmail(OnboardingWorkflow onboardingWorkflow) {

@Override
public void persistUsers(Onboarding onboarding) {
if(isUserMSActive) {

for(User user: onboarding.getUsers()) {
AddUserRoleDto userRoleDto = userMapper.toUserRole(onboarding);
userRoleDto.setUserMailUuid(user.getUserMailUuid());
userRoleDto.setProduct(productMapper.toProduct(onboarding, user));
userRoleDto.getProduct().setTokenId(onboarding.getId());
try (Response response = userApi.usersUserIdPost(user.getId(), userRoleDto)) {
if (!SUCCESSFUL.equals(response.getStatusInfo().getFamily())) {
throw new RuntimeException("Impossible to create or update role for user with ID: " + user.getId());
}
for (User user: onboarding.getUsers()) {
AddUserRoleDto userRoleDto = userMapper.toUserRole(onboarding);
userRoleDto.hasToSendEmail(hasToSendEmail);
userRoleDto.setUserMailUuid(user.getUserMailUuid());
userRoleDto.setProduct(productMapper.toProduct(onboarding, user));
userRoleDto.getProduct().setTokenId(onboarding.getId());
try (Response response = userApi.usersUserIdPost(user.getId(), userRoleDto)) {
if (!SUCCESSFUL.equals(response.getStatusInfo().getFamily())) {
throw new RuntimeException("Impossible to create or update role for user with ID: " + user.getId());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
package it.pagopa.selfcare.onboarding.workflow;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.durabletask.Task;
import com.microsoft.durabletask.TaskOptions;
import com.microsoft.durabletask.TaskOrchestrationContext;
import it.pagopa.selfcare.onboarding.common.OnboardingStatus;
import it.pagopa.selfcare.onboarding.dto.OnboardingAggregateOrchestratorInput;
import it.pagopa.selfcare.onboarding.entity.AggregateInstitution;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflow;
import it.pagopa.selfcare.onboarding.entity.OnboardingWorkflowAggregator;
import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static it.pagopa.selfcare.onboarding.entity.OnboardingWorkflowType.AGGREGATOR;
import static it.pagopa.selfcare.onboarding.functions.utils.ActivityName.*;
import static it.pagopa.selfcare.onboarding.utils.Utils.*;
import static it.pagopa.selfcare.onboarding.utils.Utils.getOnboardingString;
import static it.pagopa.selfcare.onboarding.utils.Utils.getOnboardingWorkflowString;

public record WorkflowExecutorContractRegistrationAggregator(ObjectMapper objectMapper, TaskOptions optionsRetry, OnboardingMapper onboardingMapper) implements WorkflowExecutor {

Expand All @@ -39,21 +35,7 @@ public Optional<OnboardingStatus> executeToBeValidatedState(TaskOrchestrationCon

@Override
public Optional<OnboardingStatus> executePendingState(TaskOrchestrationContext ctx, OnboardingWorkflow onboardingWorkflow) {
String onboardingWithInstitutionIdString = createInstitutionAndOnboarding(ctx, onboardingWorkflow.getOnboarding());
Onboarding onboarding = readOnboardingValue(objectMapper(), onboardingWithInstitutionIdString);

List<Task<String>> parallelTasks = new ArrayList<>();

for (AggregateInstitution aggregate : onboarding.getAggregates()) {
OnboardingAggregateOrchestratorInput onboardingAggregate = onboardingMapper.mapToOnboardingAggregateOrchestratorInput(onboarding, aggregate);
final String onboardingAggregateString = getOnboardingAggregateString(objectMapper(), onboardingAggregate);
parallelTasks.add(ctx.callSubOrchestrator(ONBOARDINGS_AGGREGATE_ORCHESTRATOR, onboardingAggregateString, String.class));
}

ctx.allOf(parallelTasks).await();

ctx.callActivity(SEND_MAIL_COMPLETION_ACTIVITY, getOnboardingWorkflowString(objectMapper(), onboardingWorkflow), optionsRetry, String.class).await();
return Optional.of(OnboardingStatus.COMPLETED);
return onboardingCompletionActivity(ctx, onboardingWorkflow);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ onboarding-functions.purge.completed-to = 30
onboarding-functions.purge.all-from = 150
onboarding-functions.purge.all-to = 120
#property to invoke or not the user microservice
onboarding-functions.persist-users.active = ${USER_MS_ACTIVE:true}
onboarding-functions.persist-users.send-mail = ${USER_MS_SEND_MAIL:true}
#property to force the institution creation when a new onboarding to pnpg is performed only in pnpg environment
onboarding-function.force-institution-persist= ${FORCE_INSTITUTION_PERSIST:false}
## REST CLIENT #
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@
import it.pagopa.selfcare.onboarding.HttpResponseMessageMock;
import it.pagopa.selfcare.onboarding.common.OnboardingStatus;
import it.pagopa.selfcare.onboarding.common.WorkflowType;
import it.pagopa.selfcare.onboarding.entity.AggregateInstitution;
import it.pagopa.selfcare.onboarding.entity.Institution;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.exception.ResourceNotFoundException;
import it.pagopa.selfcare.onboarding.mapper.OnboardingMapper;
import it.pagopa.selfcare.onboarding.service.CompletionService;
import it.pagopa.selfcare.onboarding.service.NotificationEventService;
import it.pagopa.selfcare.onboarding.service.OnboardingService;
Expand Down Expand Up @@ -60,9 +58,6 @@ public class OnboardingFunctionsTest {
@InjectMock
NotificationEventService notificationEventService;

@Inject
OnboardingMapper onboardingMapper;

final String onboardinString = "{\"onboardingId\":\"onboardingId\"}";

final String onboardingWorkflowString = "{\"type\":\"INSTITUTION\",\"onboarding\":{\"id\":\"id\",\"productId\":null,\"testEnvProductIds\":null,\"workflowType\":null,\"institution\":null,\"users\":null,\"aggregates\":null,\"pricingPlan\":null,\"billing\":null,\"signContract\":null,\"expiringDate\":null,\"status\":null,\"userRequestUid\":null,\"workflowInstanceId\":null,\"createdAt\":null,\"updatedAt\":null,\"activatedAt\":null,\"deletedAt\":null,\"reasonForReject\":null,\"isAggregator\":null}}";
Expand Down Expand Up @@ -117,7 +112,7 @@ public void startAndWaitOrchestration_failedOrchestration() throws Exception {
void onboardingsOrchestrator_throwExceptionIfOnboardingNotPresent() {
final String onboardingId = "onboardingId";
TaskOrchestrationContext orchestrationContext = mock(TaskOrchestrationContext.class);

when(orchestrationContext.getInput(String.class)).thenReturn(onboardingId);
when(service.getOnboarding(onboardingId)).thenReturn(Optional.empty());
assertThrows(ResourceNotFoundException.class, () -> function.onboardingsOrchestrator(orchestrationContext, executionContext));
Expand Down Expand Up @@ -171,44 +166,6 @@ void onboardingOrchestratorContractRegistrationAggregator(){
function.onboardingsOrchestrator(orchestrationContext, executionContext);
}

@Test
void onboardingOrchestratorContractRegistrationAggregator_Pending(){
Onboarding onboarding = new Onboarding();
onboarding.setId("onboardingId");
onboarding.setStatus(OnboardingStatus.PENDING);
AggregateInstitution aggregate1 = new AggregateInstitution();
aggregate1.setTaxCode("code1");
AggregateInstitution aggregate2 = new AggregateInstitution();
aggregate1.setTaxCode("code2");
AggregateInstitution aggregate3 = new AggregateInstitution();
aggregate1.setTaxCode("code3");
onboarding.setAggregates(List.of(aggregate1, aggregate2, aggregate3));
Institution institution = new Institution();
institution.setId("id");
onboarding.setInstitution(institution);
onboarding.setWorkflowType(WorkflowType.CONTRACT_REGISTRATION_AGGREGATOR);

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);
function.onboardingsOrchestrator(orchestrationContext, executionContext);

ArgumentCaptor<String> captorActivity = ArgumentCaptor.forClass(String.class);
Mockito.verify(orchestrationContext, times(5))
.callActivity(captorActivity.capture(), any(), any(),any());
assertEquals(CREATE_INSTITUTION_ACTIVITY, captorActivity.getAllValues().get(0));
assertEquals(CREATE_ONBOARDING_ACTIVITY, captorActivity.getAllValues().get(1));
assertEquals(CREATE_USERS_ACTIVITY, captorActivity.getAllValues().get(2));
assertEquals(STORE_ONBOARDING_ACTIVATEDAT, captorActivity.getAllValues().get(3));
assertEquals(SEND_MAIL_COMPLETION_ACTIVITY, captorActivity.getAllValues().get(4));

Mockito.verify(orchestrationContext, times(3))
.callSubOrchestrator(eq(ONBOARDINGS_AGGREGATE_ORCHESTRATOR), any(), any());

Mockito.verify(service, times(1))
.updateOnboardingStatus(onboarding.getId(), OnboardingStatus.COMPLETED);

function.onboardingsOrchestrator(orchestrationContext, executionContext);
}

@Test
void onboardingsOrchestratorNewAdminRequest() {
Onboarding onboarding = new Onboarding();
Expand Down Expand Up @@ -239,7 +196,7 @@ void onboardingsOrchestratorForApprove() {
onboarding.setWorkflowType(WorkflowType.FOR_APPROVE);

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand All @@ -260,7 +217,7 @@ void onboardingsOrchestratorForApproveWhenToBeValidated() {
onboarding.setWorkflowType(WorkflowType.FOR_APPROVE);

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand All @@ -284,7 +241,7 @@ void onboardingsOrchestratorConfirmation() {
onboarding.setInstitution(new Institution());

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand Down Expand Up @@ -489,7 +446,7 @@ void onboardingsOrchestratorRegistrationRequestApprove() {
onboarding.setWorkflowType(WorkflowType.FOR_APPROVE_PT);

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand Down Expand Up @@ -535,7 +492,6 @@ TaskOrchestrationContext mockTaskOrchestrationContext(Onboarding onboarding) {

Task task = mock(Task.class);
when(orchestrationContext.callActivity(any(),any(),any(),any())).thenReturn(task);
when(orchestrationContext.callSubOrchestrator(any(),any())).thenReturn(task);
when(task.await()).thenReturn("example");
when(orchestrationContext.allOf(anyList())).thenReturn(task);
return orchestrationContext;
Expand All @@ -554,7 +510,7 @@ void buildContract() {

@Test
void saveToken() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).saveTokenWithContract(any());

Expand All @@ -566,7 +522,7 @@ void saveToken() {

@Test
void sendMailRegistrationWithContract() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).sendMailRegistrationForContract(any());

Expand All @@ -579,7 +535,7 @@ void sendMailRegistrationWithContract() {

@Test
void sendMailRegistration() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).sendMailRegistration(any());

Expand All @@ -591,7 +547,7 @@ void sendMailRegistration() {

@Test
void sendMailRegistrationApprove() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).sendMailRegistrationApprove(any());

Expand All @@ -603,7 +559,7 @@ void sendMailRegistrationApprove() {

@Test
void sendMailOnboardingApprove() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).sendMailOnboardingApprove(any());

Expand All @@ -615,7 +571,7 @@ void sendMailOnboardingApprove() {

@Test
void sendMailRegistrationWithContractWhenApprove() {

when(executionContext.getLogger()).thenReturn(Logger.getGlobal());
doNothing().when(service).sendMailRegistrationForContractWhenApprove(any());

Expand All @@ -635,7 +591,7 @@ void onboardingCompletionOrchestrator() {
onboarding.setInstitution(new Institution());

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand Down Expand Up @@ -665,7 +621,7 @@ void onboardingRejectedOrchestrator() {
onboarding.setInstitution(new Institution());

TaskOrchestrationContext orchestrationContext = mockTaskOrchestrationContext(onboarding);


function.onboardingsOrchestrator(orchestrationContext, executionContext);

Expand All @@ -692,7 +648,7 @@ void createInstitutionAndPersistInstitutionId() {

@Test
void sendCompletedEmail() {

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

Expand All @@ -704,7 +660,7 @@ void sendCompletedEmail() {

@Test
void sendMailRejection() {

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

Expand Down Expand Up @@ -766,4 +722,4 @@ void createDelegationForAggregation() {
verify(completionService, times(1))
.createDelegation(any());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ app_settings = {
"MS_PARTY_REGISTRY_URL" = "https://selc-d-pnpg-party-reg-proxy-ca.victoriousfield-e39534b8.westeurope.azurecontainerapps.io",
"PAGOPA_LOGO_ENABLE" = "false",
"STORAGE_CONTAINER_CONTRACT" = "$web",
"USER_MS_ACTIVE" = "true",
"USER_MS_SEND_MAIL" = "false",
"FORCE_INSTITUTION_PERSIST" = "true",
"EVENT_HUB_BASE_PATH" = "https://selc-d-eventhub-ns.servicebus.windows.net",
"STANDARD_SHARED_ACCESS_KEY_NAME" = "selfcare-wo"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ app_settings = {
"MS_CORE_URL" = "https://selc-d-ms-core-ca.politewater-9af33050.westeurope.azurecontainerapps.io",
"JWT_BEARER_TOKEN" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/jwt-bearer-token-functions/)",
"MS_PARTY_REGISTRY_URL" = "https://selc-d-party-reg-proxy-ca.politewater-9af33050.westeurope.azurecontainerapps.io",
"USER_MS_ACTIVE" = "true",
"USER_MS_SEND_MAIL" = "false",
"EVENT_HUB_BASE_PATH" = "https://selc-d-eventhub-ns.servicebus.windows.net",
"STANDARD_SHARED_ACCESS_KEY_NAME" = "selfcare-wo"
"EVENTHUB_SC_CONTRACTS_SELFCARE_WO_KEY_LC" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/eventhub-sc-contracts-selfcare-wo-key-lc/)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ app_settings = {
"MAIL_USER_CONFIRMATION_LINK" = "https://imprese.notifichedigitali.it/onboarding/confirm?jwt=%s#add-user=true",
"MAIL_ONBOARDING_REJECTION_LINK" = "https://imprese.notifichedigitali.it/onboarding/cancel?jwt=",
"MAIL_ONBOARDING_URL" = "https://imprese.notifichedigitali.it/onboarding/",
"USER_MS_ACTIVE" = "true"
"USER_MS_SEND_MAIL" = "true",
"FORCE_INSTITUTION_PERSIST" = "true"

}
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ app_settings = {
"JWT_BEARER_TOKEN" = "@Microsoft.KeyVault(SecretUri=https://selc-p-kv.vault.azure.net/secrets/jwt-bearer-token-functions/)",
"MS_USER_URL" = "https://selc-p-user-ms-ca.greensand-62fc96da.westeurope.azurecontainerapps.io",
"MS_PARTY_REGISTRY_URL" = "https://selc-p-party-reg-proxy-ca.greensand-62fc96da.westeurope.azurecontainerapps.io",
"USER_MS_ACTIVE" = "true",
"USER_MS_SEND_MAIL" = "true",
"EVENT_HUB_BASE_PATH" = "https://selc-p-eventhub-ns.servicebus.windows.net",
"STANDARD_SHARED_ACCESS_KEY_NAME" = "selfcare-wo"
"EVENTHUB_SC_CONTRACTS_SELFCARE_WO_KEY_LC" = "@Microsoft.KeyVault(SecretUri=https://selc-p-kv.vault.azure.net/secrets/eventhub-sc-contracts-selfcare-wo-key-lc/)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ app_settings = {
"MAIL_USER_CONFIRMATION_LINK" = "https://imprese.uat.notifichedigitali.it/onboarding/confirm?add-user=true&jwt=",
"MAIL_ONBOARDING_REJECTION_LINK" = "https://imprese.uat.notifichedigitali.it/onboarding/cancel?jwt=",
"MAIL_ONBOARDING_URL" = "https://imprese.uat.notifichedigitali.it/onboarding/",
"USER_MS_ACTIVE" = "true",
"USER_MS_SEND_MAIL" = "false",
"FORCE_INSTITUTION_PERSIST" = "true"

}
Loading

0 comments on commit 10d7c16

Please sign in to comment.