Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SELC-5423] merge main from hotfix #456

Merged
merged 18 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 io.quarkus.runtime.util.ExceptionUtil;
import it.pagopa.selfcare.onboarding.dto.ResendNotificationsFilters;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import jakarta.enterprise.context.ApplicationScoped;
Expand Down Expand Up @@ -31,7 +32,11 @@ public ResendNotificationsFilters resendNotifications(ResendNotificationsFilters
List<Onboarding> onboardingsToResend = onboardingService.getOnboardingsToResend(filters, page, pageSize);
context.getLogger().info(() -> String.format("Found: %s onboardings to send for page: %s ", onboardingsToResend.size(), page));
for (Onboarding onboarding : onboardingsToResend) {
notificationEventService.send(context, onboarding, null, filters.getNotificationEventTraceId());
try {
notificationEventService.send(context, onboarding, null, filters.getNotificationEventTraceId());
} catch (Exception e) {
context.getLogger().severe(() -> String.format("ERROR: Sending onboarding %s error: %s ", onboarding.getId(), ExceptionUtil.generateStackTrace(e)));
}
}

if(onboardingsToResend.isEmpty() || onboardingsToResend.size() < pageSize) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,34 +87,29 @@ public void send(ExecutionContext context, Onboarding onboarding, QueueEvent que
return;
}

try {
context.getLogger().info(() -> String.format("Getting product info for onboarding with ID %s and productId %s", onboarding.getId(), onboarding.getProductId()));
Product product = productService.getProduct(onboarding.getProductId());
if (product.getConsumers() == null || product.getConsumers().isEmpty()) {
context.getLogger().warning(() -> String.format("Node consumers is null or empty for product with ID %s", onboarding.getProductId()));
return;
}
context.getLogger().info(() -> String.format("Getting product info for onboarding with ID %s and productId %s", onboarding.getId(), onboarding.getProductId()));
Product product = productService.getProduct(onboarding.getProductId());
if (product.getConsumers() == null || product.getConsumers().isEmpty()) {
context.getLogger().warning(() -> String.format("Node consumers is null or empty for product with ID %s", onboarding.getProductId()));
return;
}

if(Objects.isNull(queueEvent)) {
queueEvent = queueEventExaminer.determineEventType(onboarding);
}
if(Objects.isNull(queueEvent)) {
queueEvent = queueEventExaminer.determineEventType(onboarding);
}

context.getLogger().info(() -> String.format("Retrieving institution having ID %s", onboarding.getInstitution().getId()));
InstitutionResponse institution = institutionApi.retrieveInstitutionByIdUsingGET(onboarding.getInstitution().getId());
context.getLogger().info(() -> String.format("Retrieving institution having ID %s", onboarding.getInstitution().getId()));
InstitutionResponse institution = institutionApi.retrieveInstitutionByIdUsingGET(onboarding.getInstitution().getId());

Token token = tokenRepository.findByOnboardingId(onboarding.getId()).orElse(null);
NotificationsResources notificationsResources = new NotificationsResources(onboarding, institution, token, queueEvent);
for (String consumer : product.getConsumers()) {
NotificationConfig.Consumer consumerConfig = notificationConfig.consumers().get(consumer.toLowerCase());
prepareAndSendNotification(context, product, consumerConfig, notificationsResources, notificationEventTraceId);
}
} catch (Exception e) {
context.getLogger().severe(String.format("Error sending notification for onboarding with ID %s %s", onboarding.getId(), Arrays.toString(e.getStackTrace())));
telemetryClient.trackEvent(EVENT_ONBOARDING_FN_NAME, onboardingEventFailureMap(onboarding, e, notificationEventTraceId), Map.of(EVENT_ONBOARDING_INSTTITUTION_FN_FAILURE, 1D));
Token token = tokenRepository.findByOnboardingId(onboarding.getId()).orElse(null);
NotificationsResources notificationsResources = new NotificationsResources(onboarding, institution, token, queueEvent);
for (String consumer : product.getConsumers()) {
NotificationConfig.Consumer consumerConfig = notificationConfig.consumers().get(consumer.toLowerCase());
prepareAndSendNotification(context, product, consumerConfig, notificationsResources, notificationEventTraceId);
}
}

private void prepareAndSendNotification(ExecutionContext context, Product product, NotificationConfig.Consumer consumer, NotificationsResources notificationsResources, String notificationEventTraceId) throws JsonProcessingException {
private void prepareAndSendNotification(ExecutionContext context, Product product, NotificationConfig.Consumer consumer, NotificationsResources notificationsResources, String notificationEventTraceId) {
NotificationBuilder notificationBuilder = notificationBuilderFactory.create(consumer);
if (notificationBuilder.shouldSendNotification(notificationsResources.getOnboarding(), notificationsResources.getInstitution())) {
NotificationToSend notificationToSend = notificationBuilder.buildNotificationToSend(notificationsResources.getOnboarding(), notificationsResources.getToken(), notificationsResources.getInstitution(), notificationsResources.getQueueEvent());
Expand All @@ -125,19 +120,22 @@ private void prepareAndSendNotification(ExecutionContext context, Product produc
}
}

private void sendNotification(ExecutionContext context, String topic, NotificationToSend notificationToSend, String notificationEventTraceId) throws JsonProcessingException {
String message = mapper.writeValueAsString(notificationToSend);
context.getLogger().info(() -> String.format("Sending notification on topic: %s with message: %s", topic, message));

private void sendNotification(ExecutionContext context, String topic, NotificationToSend notificationToSend, String notificationEventTraceId) {
String message = null;
try {
eventHubRestClient.sendMessage(topic, message);
telemetryClient.trackEvent(EVENT_ONBOARDING_FN_NAME, notificationEventMap(notificationToSend, topic, notificationEventTraceId), Map.of(EVENT_ONBOARDING_INSTTITUTION_FN_SUCCESS, 1D));
} catch (Exception e) {
throw new NotificationException(e.getMessage());
message = mapper.writeValueAsString(notificationToSend);
} catch (JsonProcessingException e) {
throw new NotificationException("Notification cannot be serialized");
} finally {
String finalMessage = message;
context.getLogger().info(() -> String.format("Sending notification on topic: %s with message: %s", topic, finalMessage));
}

eventHubRestClient.sendMessage(topic, message);
telemetryClient.trackEvent(EVENT_ONBOARDING_FN_NAME, notificationEventMap(notificationToSend, topic, notificationEventTraceId), Map.of(EVENT_ONBOARDING_INSTTITUTION_FN_SUCCESS, 1D));
}

private void sendTestEnvProductsNotification(ExecutionContext context, Product product, String topic, NotificationToSend notificationToSend, String notificationEventTraceId) throws JsonProcessingException {
private void sendTestEnvProductsNotification(ExecutionContext context, Product product, String topic, NotificationToSend notificationToSend, String notificationEventTraceId) {
context.getLogger().info(() -> String.format("Starting sendTestEnvProductsNotification with testEnv %s", product.getTestEnvProductIds()));
if (product.getTestEnvProductIds() != null) {
for (String testEnvProductId : product.getTestEnvProductIds()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public InstitutionToNotify retrieveInstitution(InstitutionResponse institution)
if (Objects.nonNull(institution.getRootParent())) {
rootParent.setId(institution.getRootParent().getId());
rootParent.setDescription(institution.getRootParent().getDescription());
InstitutionResponse parentInstitution = coreInstitutionApi.retrieveInstitutionByIdUsingGET(institution.getId());
InstitutionResponse parentInstitution = coreInstitutionApi.retrieveInstitutionByIdUsingGET(rootParent.getId());
rootParent.setOriginId(Objects.nonNull(parentInstitution) ? parentInstitution.getOriginId() : null);
toNotify.setRootParent(rootParent);
}
Expand Down Expand Up @@ -153,18 +153,13 @@ private PaymentServiceProvider toSetPaymentServiceProvider(PaymentServiceProvide

@Override
public void retrieveAndSetGeographicData(InstitutionToNotify institution) {
try {
InstitutionResource institutionProxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institution.getTaxCode(), null, null);
institution.setIstatCode(institutionProxyInfo.getIstatCode());
institution.setCategory(institutionProxyInfo.getCategory());
GeographicTaxonomyResource geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(institutionProxyInfo.getIstatCode());
institution.setCounty(geographicTaxonomies.getProvinceAbbreviation());
institution.setCountry(geographicTaxonomies.getCountryAbbreviation());
institution.setCity(geographicTaxonomies.getDesc().replace(DESCRIPTION_TO_REPLACE_REGEX, ""));
} catch (Exception e) {
log.warn("Error while searching institution {} on IPA, {} ", institution.getTaxCode(), e.getMessage());
institution.setIstatCode(null);
}
InstitutionResource institutionProxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institution.getTaxCode(), null, null);
institution.setIstatCode(institutionProxyInfo.getIstatCode());
institution.setCategory(institutionProxyInfo.getCategory());
GeographicTaxonomyResource geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(institutionProxyInfo.getIstatCode());
institution.setCounty(geographicTaxonomies.getProvinceAbbreviation());
institution.setCountry(geographicTaxonomies.getCountryAbbreviation());
institution.setCity(geographicTaxonomies.getDesc().replace(DESCRIPTION_TO_REPLACE_REGEX, ""));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,40 +80,35 @@ public InstitutionToNotify retrieveInstitution(InstitutionResponse institution)
}
@Override
public void retrieveAndSetGeographicData(InstitutionToNotify institutionToNotify) {
try {
GeographicTaxonomyResource geographicTaxonomies;
if (institutionToNotify.getSubUnitType() != null) {
switch (Objects.requireNonNull(institutionToNotify.getSubUnitType())) {
case "UO" -> {
UOResource organizationUnit = proxyRegistryUoApi.findByUnicodeUsingGET1(institutionToNotify.getSubUnitCode(), null);
institutionToNotify.setIstatCode(organizationUnit.getCodiceComuneISTAT());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(organizationUnit.getCodiceComuneISTAT());
}
case "AOO" -> {
AOOResource homogeneousOrganizationalArea = proxyRegistryAooApi.findByUnicodeUsingGET(institutionToNotify.getSubUnitCode(), null);
institutionToNotify.setIstatCode(homogeneousOrganizationalArea.getCodiceComuneISTAT());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(homogeneousOrganizationalArea.getCodiceComuneISTAT());
}
default -> {
InstitutionResource proxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institutionToNotify.getTaxCode(), null, null);
institutionToNotify.setIstatCode(proxyInfo.getIstatCode());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(proxyInfo.getIstatCode());
}
GeographicTaxonomyResource geographicTaxonomies;
if (institutionToNotify.getSubUnitType() != null) {
switch (Objects.requireNonNull(institutionToNotify.getSubUnitType())) {
case "UO" -> {
UOResource organizationUnit = proxyRegistryUoApi.findByUnicodeUsingGET1(institutionToNotify.getSubUnitCode(), null);
institutionToNotify.setIstatCode(organizationUnit.getCodiceComuneISTAT());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(organizationUnit.getCodiceComuneISTAT());
}
case "AOO" -> {
AOOResource homogeneousOrganizationalArea = proxyRegistryAooApi.findByUnicodeUsingGET(institutionToNotify.getSubUnitCode(), null);
institutionToNotify.setIstatCode(homogeneousOrganizationalArea.getCodiceComuneISTAT());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(homogeneousOrganizationalArea.getCodiceComuneISTAT());
}
default -> {
InstitutionResource proxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institutionToNotify.getTaxCode(), null, null);
institutionToNotify.setIstatCode(proxyInfo.getIstatCode());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(proxyInfo.getIstatCode());
}
} else {
InstitutionResource proxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institutionToNotify.getTaxCode(), null, null);
institutionToNotify.setIstatCode(proxyInfo.getIstatCode());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(proxyInfo.getIstatCode());
}
} else {
InstitutionResource proxyInfo = proxyRegistryInstitutionApi.findInstitutionUsingGET(institutionToNotify.getTaxCode(), null, null);
institutionToNotify.setIstatCode(proxyInfo.getIstatCode());
geographicTaxonomies = geographicTaxonomiesApi.retrieveGeoTaxonomiesByCodeUsingGET(proxyInfo.getIstatCode());
}

if (geographicTaxonomies != null) {
institutionToNotify.setCounty(geographicTaxonomies.getProvinceAbbreviation());
institutionToNotify.setCountry(geographicTaxonomies.getCountryAbbreviation());
institutionToNotify.setCity(geographicTaxonomies.getDesc().replace(DESCRIPTION_TO_REPLACE_REGEX, ""));
}
} catch (Exception e) {
log.warn("Error while searching institution {} on IPA, {} ", institutionToNotify.getDescription(), e.getMessage());
institutionToNotify.setIstatCode(null);
if (geographicTaxonomies != null) {
institutionToNotify.setCounty(geographicTaxonomies.getProvinceAbbreviation());
institutionToNotify.setCountry(geographicTaxonomies.getCountryAbbreviation());
institutionToNotify.setCity(geographicTaxonomies.getDesc().replace(DESCRIPTION_TO_REPLACE_REGEX, ""));
}
}
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,22 +39,29 @@ onboarding-functions.force-institution-persist= ${FORCE_INSTITUTION_PERSIST:fals


## REST CLIENT #
quarkus.rest-client.logging.scope=request-response
quarkus.rest-client.logging.body-limit=50

quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=INFO

quarkus.openapi-generator.user_registry_json.auth.api_key.api-key = ${USER_REGISTRY_API_KEY:example-api-key}
quarkus.rest-client."org.openapi.quarkus.user_registry_json.api.UserApi".url=${USER_REGISTRY_URL:http://localhost:8080}
quarkus.rest-client."org.openapi.quarkus.user_registry_json.api.UserApi".read-timeout=5000
quarkus.rest-client."org.openapi.quarkus.user_registry_json.api.UserApi".read-timeout=10000
quarkus.rest-client."org.openapi.quarkus.user_registry_json.api.UserApi".connection-pool-size=1024

quarkus.openapi-generator.codegen.spec.core_json.enable-security-generation=false
quarkus.openapi-generator.codegen.spec.core_json.additional-api-type-annotations=@org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders(it.pagopa.selfcare.onboarding.client.auth.AuthenticationPropagationHeadersFactory.class)
quarkus.rest-client."org.openapi.quarkus.core_json.api.InstitutionApi".url=${MS_CORE_URL:http://localhost:8080}
quarkus.rest-client."org.openapi.quarkus.core_json.api.InstitutionApi".read-timeout=60000
quarkus.rest-client."org.openapi.quarkus.core_json.api.InstitutionApi".connection-pool-size=1024
quarkus.rest-client."org.openapi.quarkus.core_json.api.DelegationApi".url=${MS_CORE_URL:http://localhost:8080}
quarkus.rest-client."org.openapi.quarkus.core_json.api.DelegationApi".read-timeout=60000

quarkus.openapi-generator.codegen.spec.user_json.enable-security-generation=false
quarkus.openapi-generator.codegen.spec.user_json.additional-api-type-annotations=@org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders(it.pagopa.selfcare.onboarding.client.auth.AuthenticationPropagationHeadersFactory.class)
quarkus.rest-client."org.openapi.quarkus.user_json.api.UserApi".url=${MS_USER_URL:http://localhost:8081}
quarkus.rest-client."org.openapi.quarkus.user_json.api.UserApi".read-timeout=60000
quarkus.rest-client."org.openapi.quarkus.user_json.api.UserApi".connection-pool-size=1024

quarkus.openapi-generator.codegen.spec.party_registry_proxy_json.enable-security-generation=false
quarkus.openapi-generator.codegen.spec.party_registry_proxy_json.additional-api-type-annotations=@org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders(it.pagopa.selfcare.onboarding.client.auth.AuthenticationPropagationHeadersFactory.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import io.quarkus.test.junit.QuarkusTest;
import it.pagopa.selfcare.onboarding.dto.ResendNotificationsFilters;
import it.pagopa.selfcare.onboarding.entity.Onboarding;
import it.pagopa.selfcare.onboarding.exception.NotificationException;
import jakarta.inject.Inject;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import static it.pagopa.selfcare.onboarding.TestUtils.getMockedContext;
import static org.junit.jupiter.api.Assertions.*;
Expand Down Expand Up @@ -64,6 +66,25 @@ void resendNotificationsEndsIncrementingPageIfIsWorkingOnIntermediatePage() {
assertEquals(1, resendNotificationsFilters.getPage());
}

@Test
void resendNotificationsActivityException() {
ExecutionContext context = mock(ExecutionContext.class);
doReturn(Logger.getGlobal()).when(context).getLogger();

doThrow(new NotificationException("Error")).when(notificationEventService).send(any(), any(), any(), any());

List<Onboarding> onboardings = new ArrayList<>();
onboardings.add(new Onboarding());
when(onboardingService.getOnboardingsToResend(any(), anyInt(), anyInt())).thenReturn(onboardings);

ResendNotificationsFilters resendNotificationsFilters = new ResendNotificationsFilters();
resendNotificationsFilters.setProductId("prod-pagopa");

ResendNotificationsFilters nextFilter = notificationEventResenderServiceDefault.resendNotifications(resendNotificationsFilters, context);

assertNull(nextFilter);
}

private List<Onboarding> mockOnboardingList(int size) {
List<Onboarding> onboardings = new ArrayList<>();
for (int i = 0; i < size; i++) {
Expand Down
Loading
Loading