From 9d21f7bcf9143bc6b09a8f25b8288765984380d1 Mon Sep 17 00:00:00 2001 From: Fabien Date: Wed, 20 Nov 2024 18:56:20 +0100 Subject: [PATCH 1/2] chore: workaround bo crash --- .../api/front/service/UserServiceImpl.java | 24 +++++++++---------- .../main/java/fr/gouv/bo/amqp/Producer.java | 1 - .../bo/configuration/WebSecurityConfig.java | 8 +++---- .../apartment_sharing/ApplicationModel.java | 4 ---- .../service/PartnerCallBackServiceImpl.java | 17 ++++++------- .../common/service/RequestServiceImpl.java | 1 - .../interfaces/PartnerCallBackService.java | 3 --- 7 files changed, 23 insertions(+), 35 deletions(-) diff --git a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/UserServiceImpl.java b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/UserServiceImpl.java index 8f27d09be..9f7dd1bab 100644 --- a/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/UserServiceImpl.java +++ b/dossierfacile-api-tenant/src/main/java/fr/dossierfacile/api/front/service/UserServiceImpl.java @@ -1,25 +1,25 @@ package fr.dossierfacile.api.front.service; -import fr.dossierfacile.common.dto.mail.TenantDto; import fr.dossierfacile.api.front.exception.PasswordRecoveryTokenNotFoundException; import fr.dossierfacile.api.front.exception.UserNotFoundException; import fr.dossierfacile.api.front.mapper.TenantMapper; -import fr.dossierfacile.common.mapper.mail.TenantMapperForMail; import fr.dossierfacile.api.front.model.tenant.TenantModel; import fr.dossierfacile.api.front.repository.PasswordRecoveryTokenRepository; import fr.dossierfacile.api.front.repository.UserRepository; import fr.dossierfacile.api.front.service.interfaces.*; -import fr.dossierfacile.common.model.apartment_sharing.ApplicationModel; -import fr.dossierfacile.common.utils.TransactionalUtil; +import fr.dossierfacile.common.dto.mail.TenantDto; import fr.dossierfacile.common.entity.*; import fr.dossierfacile.common.enums.ApplicationType; import fr.dossierfacile.common.enums.LogType; import fr.dossierfacile.common.enums.PartnerCallBackType; import fr.dossierfacile.common.enums.TenantType; +import fr.dossierfacile.common.mapper.mail.TenantMapperForMail; +import fr.dossierfacile.common.model.apartment_sharing.ApplicationModel; import fr.dossierfacile.common.repository.TenantCommonRepository; import fr.dossierfacile.common.service.interfaces.LogService; import fr.dossierfacile.common.service.interfaces.PartnerCallBackService; import fr.dossierfacile.common.service.interfaces.TenantCommonService; +import fr.dossierfacile.common.utils.TransactionalUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -96,12 +97,12 @@ private List groupingAllTenantUserApisInTheApartment(ApartmentSha @Override @Transactional public void deleteAccount(Tenant tenant) { - List webhookDTOList = new ArrayList<>(); ApartmentSharing apartmentSharing = tenant.getApartmentSharing(); - groupingAllTenantUserApisInTheApartment(apartmentSharing).forEach((tenantUserApi) -> { - UserApi userApi = tenantUserApi.getUserApi(); - webhookDTOList.add(partnerCallBackService.getWebhookDTO(tenant, userApi, PartnerCallBackType.DELETED_ACCOUNT)); - }); + Map webhookDTOMap = groupingAllTenantUserApisInTheApartment(apartmentSharing).stream() + .collect(Collectors.toMap( + tenantUserApi -> tenantUserApi, + tenantUserApi -> partnerCallBackService.getWebhookDTO(tenant, tenantUserApi.getUserApi(), PartnerCallBackType.DELETED_ACCOUNT) + )); logService.saveLogWithTenantData(LogType.ACCOUNT_DELETE, tenant); TenantDto tenantToDeleteDto = tenantMapperForMail.toDto(tenant); tenantCommonService.deleteTenantData(tenant); @@ -116,9 +117,8 @@ public void deleteAccount(Tenant tenant) { userRepository.delete(tenant); apartmentSharingService.removeTenant(tenant.getApartmentSharing(), tenant); } - for (ApplicationModel webhookDTO : webhookDTOList) { - partnerCallBackService.sendCallBack(tenant, webhookDTO.getUserApi(), webhookDTO); - } + webhookDTOMap.forEach((tenantUserApi, webhookDTO) -> partnerCallBackService.sendCallBack(tenant, tenantUserApi.getUserApi(), webhookDTO)); + TransactionalUtil.afterCommit(() -> { mailService.sendEmailAccountDeleted(tenantToDeleteDto); diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/amqp/Producer.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/amqp/Producer.java index 353507efb..b9859d766 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/amqp/Producer.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/amqp/Producer.java @@ -15,7 +15,6 @@ public class Producer { private final QueueMessageRepository queueMessageRepository; - @Async public void generatePdf(Long documentId) { log.debug("Sending document with ID [{}] for pdf generation", documentId); queueMessageRepository.save(QueueMessage.builder() diff --git a/dossierfacile-bo/src/main/java/fr/gouv/bo/configuration/WebSecurityConfig.java b/dossierfacile-bo/src/main/java/fr/gouv/bo/configuration/WebSecurityConfig.java index fce3fe415..6b2d4b182 100644 --- a/dossierfacile-bo/src/main/java/fr/gouv/bo/configuration/WebSecurityConfig.java +++ b/dossierfacile-bo/src/main/java/fr/gouv/bo/configuration/WebSecurityConfig.java @@ -89,10 +89,10 @@ private CsrfTokenRepository csrfTokenRepository() { @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setCorePoolSize(2); - executor.setMaxPoolSize(2); - executor.setQueueCapacity(500); - executor.setThreadNamePrefix("Mailer-"); + executor.setCorePoolSize(4); + executor.setMaxPoolSize(4); + executor.setQueueCapacity(200); + executor.setThreadNamePrefix("BOAsyncExecutor-"); executor.initialize(); return executor; } diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/apartment_sharing/ApplicationModel.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/apartment_sharing/ApplicationModel.java index 80ddb6dee..4cc3ffa31 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/apartment_sharing/ApplicationModel.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/model/apartment_sharing/ApplicationModel.java @@ -1,9 +1,7 @@ package fr.dossierfacile.common.model.apartment_sharing; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import fr.dossierfacile.common.entity.UserApi; import fr.dossierfacile.common.enums.ApplicationType; import fr.dossierfacile.common.enums.FileStatus; import fr.dossierfacile.common.enums.PartnerCallBackType; @@ -33,6 +31,4 @@ public class ApplicationModel { private List tenants; @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSSSSS") private LocalDateTime lastUpdateDate; - @JsonIgnore - private UserApi userApi = null; } diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/PartnerCallBackServiceImpl.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/PartnerCallBackServiceImpl.java index dc811fcfd..42e80f525 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/PartnerCallBackServiceImpl.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/PartnerCallBackServiceImpl.java @@ -19,14 +19,10 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -89,12 +85,15 @@ public void sendCallBack(Tenant tenant, PartnerCallBackType partnerCallBackType) if (apartmentSharing.isEmpty()) { return; } - List applicationModelList = findAllUserApi(tenant.getApartmentSharing()).stream() - .map(userApi -> getWebhookDTO(tenant, userApi, partnerCallBackType)).toList(); + Map applicationModelMap = findAllUserApi(tenant.getApartmentSharing()).stream() + .collect(Collectors.toMap( + userApi -> userApi, + userApi -> getWebhookDTO(tenant, userApi, partnerCallBackType) + )); TransactionalUtil.afterCommit(() -> { try { - applicationModelList.forEach(model -> sendCallBack(tenant, model.getUserApi(), model)); + applicationModelMap.forEach((userApi, applicationModel) -> sendCallBack(tenant, userApi, applicationModel)); } catch (Exception e) { log.error("CAUTION Unable to send notification to partner", e); } @@ -135,7 +134,6 @@ public void sendRevokedAccessCallback(Tenant tenant, UserApi userApi) { ApplicationModel applicationModel = new ApplicationModel(); applicationModel.setOnTenantId(tenant.getId()); applicationModel.setPartnerCallBackType(PartnerCallBackType.ACCESS_REVOKED); - applicationModel.setUserApi(userApi); sendCallBack(tenant, userApi, applicationModel); } @@ -144,7 +142,6 @@ public void sendRevokedAccessCallback(Tenant tenant, UserApi userApi) { public ApplicationModel getWebhookDTO(Tenant tenant, UserApi userApi, PartnerCallBackType partnerCallBackType) { ApartmentSharing apartmentSharing = tenant.getApartmentSharing(); ApplicationModel applicationModel = applicationFullMapper.toApplicationModel(apartmentSharing, userApi); - applicationModel.setUserApi(userApi); List tenantList = tenantRepository.findAllByApartmentSharing(apartmentSharing); for (Tenant t : tenantList) { diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/RequestServiceImpl.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/RequestServiceImpl.java index 4ad160502..e5709c624 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/RequestServiceImpl.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/RequestServiceImpl.java @@ -33,7 +33,6 @@ public class RequestServiceImpl implements RequestService { private static final String CALL_BACK_RESPONSE = "CallBack ResponseStatus: {}"; private final RestTemplate restTemplate; - @Transactional(propagation = Propagation.NOT_SUPPORTED) @Async public void send(ApplicationModel applicationModel, String urlCallback, String partnerApiKeyCallback) { HttpHeaders headers = new HttpHeaders(); diff --git a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/PartnerCallBackService.java b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/PartnerCallBackService.java index 7233b07fa..c293b2f1f 100644 --- a/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/PartnerCallBackService.java +++ b/dossierfacile-common-library/src/main/java/fr/dossierfacile/common/service/interfaces/PartnerCallBackService.java @@ -4,7 +4,6 @@ import fr.dossierfacile.common.entity.UserApi; import fr.dossierfacile.common.enums.PartnerCallBackType; import fr.dossierfacile.common.model.apartment_sharing.ApplicationModel; -import jakarta.annotation.Nullable; import java.util.List; @@ -15,7 +14,5 @@ public interface PartnerCallBackService { void sendCallBack(List tenantList, PartnerCallBackType partnerCallBackType); void sendCallBack(Tenant tenant, UserApi userApi, ApplicationModel applicationModel); void sendRevokedAccessCallback(Tenant tenant, UserApi userApi); - - @Nullable ApplicationModel getWebhookDTO(Tenant tenant, UserApi userApi, PartnerCallBackType partnerCallBackType); } From 85d15fd4ed9d8d7774e8745f6ab72977280e1856 Mon Sep 17 00:00:00 2001 From: Fabien Date: Fri, 22 Nov 2024 14:40:50 +0100 Subject: [PATCH 2/2] chore: temporary disabled test on ademe --- .../property/PropertyServiceImplTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dossierfacile-api-owner/src/test/java/fr/dossierfacile/api/dossierfacileapiowner/property/PropertyServiceImplTest.java b/dossierfacile-api-owner/src/test/java/fr/dossierfacile/api/dossierfacileapiowner/property/PropertyServiceImplTest.java index 1fe86932f..5f0529315 100644 --- a/dossierfacile-api-owner/src/test/java/fr/dossierfacile/api/dossierfacileapiowner/property/PropertyServiceImplTest.java +++ b/dossierfacile-api-owner/src/test/java/fr/dossierfacile/api/dossierfacileapiowner/property/PropertyServiceImplTest.java @@ -11,6 +11,7 @@ import fr.dossierfacile.common.repository.PropertyLogRepository; import fr.dossierfacile.common.service.interfaces.TenantCommonService; import org.apache.http.client.HttpResponseException; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.AdditionalAnswers; import org.springframework.security.oauth2.jwt.JwtDecoder; @@ -110,6 +111,8 @@ public void test_handle_null_values_for_optional_fields() throws InterruptedExce } @Test + @Disabled + // TODO HttpClient.newHttpClient() is used in PropertyServiceImpl.createOrUpdate -> should be mocked public void test_ademe_number_not_null() throws InterruptedException { // Arrange AuthenticationFacade authenticationFacade = mock(AuthenticationFacade.class);