diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java index 59e4b5b39..958d58267 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/CompletionServiceDefault.java @@ -1,5 +1,7 @@ package it.pagopa.selfcare.onboarding.service; +import com.microsoft.applicationinsights.TelemetryClient; +import com.microsoft.applicationinsights.TelemetryConfiguration; import com.microsoft.azure.functions.ExecutionContext; import it.pagopa.selfcare.onboarding.common.InstitutionPaSubunitType; import it.pagopa.selfcare.onboarding.common.InstitutionType; @@ -19,6 +21,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -33,14 +36,12 @@ import java.time.LocalDateTime; import java.time.ZoneId; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER; import static it.pagopa.selfcare.onboarding.common.WorkflowType.CONFIRMATION_AGGREGATE; +import static it.pagopa.selfcare.onboarding.service.NotificationEventServiceDefault.*; import static it.pagopa.selfcare.onboarding.service.OnboardingService.USERS_FIELD_LIST; import static jakarta.ws.rs.core.Response.Status.Family.SUCCESSFUL; @@ -69,34 +70,49 @@ public class CompletionServiceDefault implements CompletionService { @Inject org.openapi.quarkus.party_registry_proxy_json.api.InstitutionApi institutionRegistryProxyApi; - @Inject - InstitutionMapper institutionMapper; - - @Inject - OnboardingRepository onboardingRepository; - - @Inject - TokenRepository tokenRepository; - - @Inject - UserMapper userMapper; - - @Inject - ProductMapper productMapper; - - @Inject - NotificationService notificationService; - @Inject - ProductService productService; - - @Inject - OnboardingMapper onboardingMapper; - - @ConfigProperty(name = "onboarding-functions.persist-users.send-mail") - private boolean hasToSendEmail; - - @ConfigProperty(name = "onboarding-functions.force-institution-persist") - private boolean forceInstitutionCreation; + private static final String EVENT_SEND_COMPLETION_FN_FAILURE = "EventsSendCompletionEmail_failures"; + + private final InstitutionMapper institutionMapper; + private final OnboardingRepository onboardingRepository; + private final TokenRepository tokenRepository; + private final UserMapper userMapper; + private final ProductMapper productMapper; + private final NotificationService notificationService; + private final ProductService productService; + private final OnboardingMapper onboardingMapper; + private final TelemetryClient telemetryClient; + private final boolean hasToSendEmail; + private final boolean isEmailServiceAvailable; + private final boolean forceInstitutionCreation; + + public CompletionServiceDefault(ProductService productService, + NotificationService notificationService, + OnboardingMapper onboardingMapper, + UserMapper userMapper, + ProductMapper productMapper, + InstitutionMapper institutionMapper, + OnboardingRepository onboardingRepository, + TokenRepository tokenRepository, + @ConfigProperty(name = "onboarding-functions.email.service.available") boolean isEmailServiceAvailable, + @ConfigProperty(name = "onboarding-functions.persist-users.send-mail") boolean hasToSendEmail, + @ConfigProperty(name = "onboarding-functions.force-institution-persist")boolean forceInstitutionCreation, + @Context @ConfigProperty(name = "onboarding-functions.appinsights.connection-string") String appInsightsConnectionString) { + this.institutionMapper = institutionMapper; + this.onboardingRepository = onboardingRepository; + this.tokenRepository = tokenRepository; + TelemetryConfiguration telemetryConfiguration = TelemetryConfiguration.createDefault(); + telemetryConfiguration.setConnectionString(appInsightsConnectionString); + this.productService = productService; + this.notificationService = notificationService; + this.onboardingMapper = onboardingMapper; + this.userMapper = userMapper; + this.productMapper = productMapper; + this.isEmailServiceAvailable = isEmailServiceAvailable; + this.hasToSendEmail = hasToSendEmail; + this.forceInstitutionCreation = forceInstitutionCreation; + this.telemetryClient = new TelemetryClient(telemetryConfiguration); + this.telemetryClient.getContext().getOperation().setName(OPERATION_NAME); + } @Override public String createInstitutionAndPersistInstitutionId(Onboarding onboarding) { @@ -139,7 +155,7 @@ private InstitutionsResponse getInstitutions(Institution institution) { /** * Function that creates institution based on institution type and Origin, * Origin indicates which is the indexes where data come from, for ex. IPA comes from index of Pubbliche Amministrazioni - * Look at https://pagopa.atlassian.net/wiki/spaces/SCP/pages/708804909/Glossario for more information about institution type and indexes + * Look at ... for more information about institution type and indexes */ private InstitutionResponse createInstitution(Institution institution) { @@ -218,9 +234,13 @@ public void sendCompletedEmail(OnboardingWorkflow onboardingWorkflow) { Product product = productService.getProductIsValid(onboarding.getProductId()); - notificationService.sendCompletedEmail(onboarding.getInstitution().getDescription(), - destinationMails, product, onboarding.getInstitution().getInstitutionType(), - onboardingWorkflow); + if (isEmailServiceAvailable) { + notificationService.sendCompletedEmail(onboarding.getInstitution().getDescription(), + destinationMails, product, onboarding.getInstitution().getInstitutionType(), + onboardingWorkflow); + } else { + telemetryClient.trackEvent(EVENT_ONBOARDING_FN_NAME, onboardingEventMap(onboarding), Map.of(EVENT_SEND_COMPLETION_FN_FAILURE, 1D)); + } } @Override diff --git a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/NotificationEventServiceDefault.java b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/NotificationEventServiceDefault.java index 7eb42313b..9d15309c0 100644 --- a/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/NotificationEventServiceDefault.java +++ b/apps/onboarding-functions/src/main/java/it/pagopa/selfcare/onboarding/service/NotificationEventServiceDefault.java @@ -38,7 +38,7 @@ public class NotificationEventServiceDefault implements NotificationEventService public static final String EVENT_ONBOARDING_FN_NAME = "ONBOARDING-FN"; public static final String EVENT_ONBOARDING_INSTTITUTION_FN_FAILURE = "EventsOnboardingInstitution_failures"; public static final String EVENT_ONBOARDING_INSTTITUTION_FN_SUCCESS = "EventsOnboardingInstitution_success"; - private static final String OPERATION_NAME = "ONBOARDING-FN"; + public static final String OPERATION_NAME = "ONBOARDING-FN"; private final TelemetryClient telemetryClient; @RestClient @Inject diff --git a/apps/onboarding-functions/src/main/resources/application.properties b/apps/onboarding-functions/src/main/resources/application.properties index 7f2a1df6b..be555064e 100644 --- a/apps/onboarding-functions/src/main/resources/application.properties +++ b/apps/onboarding-functions/src/main/resources/application.properties @@ -32,7 +32,8 @@ onboarding-functions.purge.all-to = 120 #property to invoke or not the user microservice onboarding-functions.persist-users.send-mail = ${USER_MS_SEND_MAIL:true} onboarding-functions.appinsights.connection-string=${APPLICATIONINSIGHTS_CONNECTION_STRING:InstrumentationKey=00000000-0000-0000-0000-000000000000} - +#property to define the availability of external email service +onboarding-functions.email.service.available = ${EMAIL_SERVICE_AVAILABLE:true} #property to force the institution creation when a new onboarding to pnpg is performed only in pnpg environment onboarding-functions.force-institution-persist= ${FORCE_INSTITUTION_PERSIST:false} diff --git a/infra/functions/onboarding-functions/env/dev-pnpg/terraform.tfvars b/infra/functions/onboarding-functions/env/dev-pnpg/terraform.tfvars index f34259c14..85a9dfa7c 100644 --- a/infra/functions/onboarding-functions/env/dev-pnpg/terraform.tfvars +++ b/infra/functions/onboarding-functions/env/dev-pnpg/terraform.tfvars @@ -97,6 +97,7 @@ app_settings = { "SAP_ALLOWED_INSTITUTION_TYPE" = "PA,GSP,SA,AS,SCP" "SAP_ALLOWED_ORIGINS" = "IPA,SELC" "MINUTES_THRESHOLD_FOR_UPDATE_NOTIFICATION" = "5" + "EMAIL_SERVICE_AVAILABLE" = "FALSE" "JWT_TOKEN_ISSUER" = "SPID" "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-d-pnpg-kv.vault.azure.net/secrets/jwt-private-key/)" "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-d-pnpg-kv.vault.azure.net/secrets/jwt-kid/)" diff --git a/infra/functions/onboarding-functions/env/dev/terraform.tfvars b/infra/functions/onboarding-functions/env/dev/terraform.tfvars index 4d59e9c06..af15a7bac 100644 --- a/infra/functions/onboarding-functions/env/dev/terraform.tfvars +++ b/infra/functions/onboarding-functions/env/dev/terraform.tfvars @@ -98,6 +98,7 @@ app_settings = { "FD_TOKEN_GRANT_TYPE" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/prod-fd-grant-type/)" "FD_TOKEN_CLIENT_ID" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/prod-fd-client-id/)" "FD_TOKEN_CLIENT_SECRET" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/prod-fd-client-secret/)" + "EMAIL_SERVICE_AVAILABLE" = "true" "JWT_TOKEN_ISSUER" = "SPID" "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/jwt-private-key/)" "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-d-kv.vault.azure.net/secrets/jwt-kid/)" diff --git a/infra/functions/onboarding-functions/env/prod-pnpg/terraform.tfvars b/infra/functions/onboarding-functions/env/prod-pnpg/terraform.tfvars index 0729b4052..0f5142dd5 100644 --- a/infra/functions/onboarding-functions/env/prod-pnpg/terraform.tfvars +++ b/infra/functions/onboarding-functions/env/prod-pnpg/terraform.tfvars @@ -106,9 +106,8 @@ app_settings = { "MAIL_ONBOARDING_URL" = "https://imprese.notifichedigitali.it/onboarding/", "USER_MS_SEND_MAIL" = "false", "FORCE_INSTITUTION_PERSIST" = "true", + "EMAIL_SERVICE_AVAILABLE" = "true" "JWT_TOKEN_ISSUER" = "SPID" "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-p-pnpg-kv.vault.azure.net/secrets/jwt-private-key/)" "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-p-pnpg-kv.vault.azure.net/secrets/jwt-kid/)" - - } \ No newline at end of file diff --git a/infra/functions/onboarding-functions/env/prod/terraform.tfvars b/infra/functions/onboarding-functions/env/prod/terraform.tfvars index 83ed45506..cd7913c50 100644 --- a/infra/functions/onboarding-functions/env/prod/terraform.tfvars +++ b/infra/functions/onboarding-functions/env/prod/terraform.tfvars @@ -111,8 +111,8 @@ app_settings = { "ARUBA_SIGN_SERVICE_BASE_URL" = "https://asbr-pagopa.arubapec.it/ArubaSignService/ArubaSignService" "ARUBA_SIGN_SERVICE_REQUEST_TIMEOUT_MS" = "60000" "ARUBA_SIGN_SERVICE_CONNECT_TIMEOUT_MS" = "60000" + "EMAIL_SERVICE_AVAILABLE" = "true" "JWT_TOKEN_ISSUER" = "SPID" "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-p-kv.vault.azure.net/secrets/jwt-private-key/)" "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-p-kv.vault.azure.net/secrets/jwt-kid/)" - } \ No newline at end of file diff --git a/infra/functions/onboarding-functions/env/uat/terraform.tfvars b/infra/functions/onboarding-functions/env/uat/terraform.tfvars index 5e46563b7..5184b99c1 100644 --- a/infra/functions/onboarding-functions/env/uat/terraform.tfvars +++ b/infra/functions/onboarding-functions/env/uat/terraform.tfvars @@ -100,18 +100,18 @@ app_settings = { ##ARUBA SIGNATURE - "PAGOPA_SIGNATURE_SOURCE" = "disabled", - "ARUBA_SIGN_SERVICE_IDENTITY_TYPE_OTP_AUTH" = "faPagoPa", - "ARUBA_SIGN_SERVICE_IDENTITY_OTP_PWD" = "dsign", - "ARUBA_SIGN_SERVICE_IDENTITY_USER" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-user/)", - "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_USER" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-delegated-user/)", - "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_PASSWORD" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-delegated-psw/)", - "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_DOMAIN" = "faPagoPa", - "ARUBA_SIGN_SERVICE_BASE_URL" = "https://asbr-pagopa.arubapec.it/ArubaSignService/ArubaSignService" - "ARUBA_SIGN_SERVICE_REQUEST_TIMEOUT_MS" = "60000" - "ARUBA_SIGN_SERVICE_CONNECT_TIMEOUT_MS" = "60000" - "JWT_TOKEN_ISSUER" = "SPID" - "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/jwt-private-key/)" - "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/jwt-kid/)" - + "PAGOPA_SIGNATURE_SOURCE" = "disabled", + "ARUBA_SIGN_SERVICE_IDENTITY_TYPE_OTP_AUTH" = "faPagoPa", + "ARUBA_SIGN_SERVICE_IDENTITY_OTP_PWD" = "dsign", + "ARUBA_SIGN_SERVICE_IDENTITY_USER" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-user/)", + "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_USER" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-delegated-user/)", + "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_PASSWORD" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/aruba-sign-service-delegated-psw/)", + "ARUBA_SIGN_SERVICE_IDENTITY_DELEGATED_DOMAIN" = "faPagoPa", + "ARUBA_SIGN_SERVICE_BASE_URL" = "https://asbr-pagopa.arubapec.it/ArubaSignService/ArubaSignService" + "ARUBA_SIGN_SERVICE_REQUEST_TIMEOUT_MS" = "60000" + "ARUBA_SIGN_SERVICE_CONNECT_TIMEOUT_MS" = "60000", + "EMAIL_SERVICE_AVAILABLE" = "true", + "JWT_TOKEN_ISSUER" = "SPID" + "JWT_TOKEN_PRIVATE_KEY" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/jwt-private-key/)" + "JWT_TOKEN_KID" = "@Microsoft.KeyVault(SecretUri=https://selc-u-kv.vault.azure.net/secrets/jwt-kid/)" } \ No newline at end of file