From fab5e15c87ebc93a6d61c4203ceb3955b0d266e3 Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 11:16:18 +0100 Subject: [PATCH 1/8] [UPBE-600] integration dataFactory --- pom.xml | 10 ++ .../controller/ReportController.java | 7 + .../controller/ReportControllerImpl.java | 9 ++ .../factory/DataFactoryManagerConfig.java | 20 +++ .../data/factory/DataFactoryService.java | 8 ++ .../data/factory/DataFactoryServiceImpl.java | 92 +++++++++++++ .../dto/report/Report2RunDto.java | 15 +++ .../dto/report/ReportGenerateForce.java | 14 ++ .../AzureConnectingErrorException.java | 8 ++ .../transactions/service/ReportService.java | 6 + .../service/ReportServiceImpl.java | 21 ++- src/main/resources/application.yml | 7 +- .../controller/ReportControllerImplTest.java | 34 +++++ .../factory/DataFactoryManagerConfigTest.java | 25 ++++ .../factory/DataFactoryServiceImplTest.java | 121 ++++++++++++++++++ .../service/ReportServiceImplTest.java | 40 +++++- 16 files changed, 434 insertions(+), 3 deletions(-) create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/dto/report/Report2RunDto.java create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/dto/report/ReportGenerateForce.java create mode 100644 src/main/java/it/gov/pagopa/idpay/transactions/exception/AzureConnectingErrorException.java create mode 100644 src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java create mode 100644 src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java diff --git a/pom.xml b/pom.xml index 51008d1a..79ea4639 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,16 @@ janino + + com.azure.resourcemanager + azure-resourcemanager-datafactory + 1.2.0 + + + com.azure + azure-identity + + org.springframework.boot diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportController.java b/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportController.java index b32c4c02..fda73e30 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportController.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportController.java @@ -4,12 +4,16 @@ import it.gov.pagopa.idpay.transactions.dto.ReportDTO; import it.gov.pagopa.idpay.transactions.dto.ReportListDTO; import it.gov.pagopa.idpay.transactions.dto.ReportRequest; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import jakarta.validation.Valid; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; +import java.util.List; + @RequestMapping("/idpay/merchant/portal") public interface ReportController { @@ -27,6 +31,9 @@ Mono generateReport(@RequestHeader("x-merchant-id") String merchantId @PathVariable("initiativeId") String initiativeId, @RequestBody @Valid ReportRequest request); + @PostMapping("/reports/transaction/force") + Mono> forceGenerateReports(@RequestBody ReportGenerateForce reportGenerateForce); + @PatchMapping("/initiatives/{initiativeId}/reports/{reportId}") Mono patchReport(@PathVariable("initiativeId") String initiativeId, diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImpl.java index fe6c6505..6bd717cf 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImpl.java @@ -4,6 +4,8 @@ import it.gov.pagopa.idpay.transactions.dto.ReportDTO; import it.gov.pagopa.idpay.transactions.dto.ReportListDTO; import it.gov.pagopa.idpay.transactions.dto.ReportRequest; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import it.gov.pagopa.idpay.transactions.service.ReportService; import it.gov.pagopa.idpay.transactions.dto.mapper.ReportMapper; import it.gov.pagopa.idpay.transactions.utils.Utilities; @@ -12,6 +14,8 @@ import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; +import java.util.List; + @RestController @Slf4j public class ReportControllerImpl implements ReportController { @@ -55,4 +59,9 @@ public Mono patchReport(String initiativeId, ) { return reportService.patchReport(initiativeId, reportId, request); } + + @Override + public Mono> forceGenerateReports(ReportGenerateForce reportGenerateForce) { + return reportService.forceGenerateReports(reportGenerateForce); + } } diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java new file mode 100644 index 00000000..d64bbaa9 --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java @@ -0,0 +1,20 @@ +package it.gov.pagopa.idpay.transactions.data.factory; + +import com.azure.core.management.AzureEnvironment; +import com.azure.core.management.profile.AzureProfile; +import com.azure.identity.DefaultAzureCredential; +import com.azure.identity.DefaultAzureCredentialBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.azure.resourcemanager.datafactory.DataFactoryManager; + + +@Configuration +public class DataFactoryManagerConfig { + @Bean + public DataFactoryManager dataFactoryManager () { + DefaultAzureCredential azureCredentials = new DefaultAzureCredentialBuilder().build(); + AzureProfile azureProfile = new AzureProfile(AzureEnvironment.AZURE); + return DataFactoryManager.authenticate(azureCredentials, azureProfile); + } +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java new file mode 100644 index 00000000..9c2b024a --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java @@ -0,0 +1,8 @@ +package it.gov.pagopa.idpay.transactions.data.factory; + +import it.gov.pagopa.idpay.transactions.model.Report; +import reactor.core.publisher.Mono; + +public interface DataFactoryService { + Mono generateReport(Report report); +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java new file mode 100644 index 00000000..13edc7fd --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java @@ -0,0 +1,92 @@ +package it.gov.pagopa.idpay.transactions.data.factory; + +import com.azure.core.http.rest.Response; +import com.azure.core.util.Context; +import com.azure.resourcemanager.datafactory.models.CreateRunResponse; +import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException; +import it.gov.pagopa.idpay.transactions.model.Report; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.azure.resourcemanager.datafactory.DataFactoryManager; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; +import reactor.util.retry.Retry; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class DataFactoryServiceImpl implements DataFactoryService{ + private final DataFactoryManager dataFactoryManager; + private final String resourceGroup; + private final String factoryName; + private final String pipelineName; + private final int maxRetries; + + public DataFactoryServiceImpl(DataFactoryManager dataFactoryManager, + @Value("${app.data-factory.resource-group}") String resourceGroup, + @Value("${app.data-factory.factory-name}") String factoryName, + @Value("${app.data-factory.pipeline-name}") String pipelineName, + @Value("${app.data-factory.max-retries}") int maxRetries) { + this.dataFactoryManager = dataFactoryManager; + this.resourceGroup = resourceGroup; + this.factoryName = factoryName; + this.pipelineName = pipelineName; + this.maxRetries = maxRetries; + } + + @Override + public Mono generateReport(Report report) { + Mono callMono = Mono.fromCallable(() -> { + log.info("[CALLING_DATA_FACTORY] Running pipeline for report {}", report.getId()); + Response resp = dataFactoryManager.pipelines().createRunWithResponse( + resourceGroup, + factoryName, + pipelineName, + null, + false, + null, + false, + createPipelineParameters(report), + Context.NONE); + + int status = resp.getStatusCode(); + if (status < 200 || status >= 300) { + throw new IllegalStateException("ADF createRun failed. HTTP status: " + status); + } + + CreateRunResponse body = resp.getValue(); + if (body == null) { + throw new IllegalStateException("ADF createRun returned empty body"); + } + log.info("[CALLING_DATA_FACTORY] Identification run pipeline {} for report {}", body.runId(), report.getId()); + return body.runId(); + }) + .subscribeOn(Schedulers.boundedElastic()); + + return callMono + .retryWhen(Retry.fixedDelay(maxRetries, Duration.ofSeconds(1)) + .onRetryExhaustedThrow((spec, signal) -> + new AzureConnectingErrorException( + "Failed to trigger ADF pipeline after " + (maxRetries + 1) + " attempts", + signal.failure() + ) + ) + ); + } + + private Map createPipelineParameters(Report report) { + HashMap parameters = new HashMap<>(); + parameters.put("reportId", report.getId()); + parameters.put("merchantId", report.getMerchantId()); + parameters.put("initiativeId", report.getInitiativeId()); + parameters.put("startDate", report.getStartPeriod()); + parameters.put("endDate", report.getEndPeriod()); + parameters.put("fileName", report.getFileName()); + + return parameters; + } +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/Report2RunDto.java b/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/Report2RunDto.java new file mode 100644 index 00000000..f1bb83de --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/Report2RunDto.java @@ -0,0 +1,15 @@ +package it.gov.pagopa.idpay.transactions.dto.report; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Report2RunDto { + String reportId; + String runId; +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/ReportGenerateForce.java b/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/ReportGenerateForce.java new file mode 100644 index 00000000..79e15298 --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/dto/report/ReportGenerateForce.java @@ -0,0 +1,14 @@ +package it.gov.pagopa.idpay.transactions.dto.report; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ReportGenerateForce { + List reportsId; +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/exception/AzureConnectingErrorException.java b/src/main/java/it/gov/pagopa/idpay/transactions/exception/AzureConnectingErrorException.java new file mode 100644 index 00000000..57d0cad6 --- /dev/null +++ b/src/main/java/it/gov/pagopa/idpay/transactions/exception/AzureConnectingErrorException.java @@ -0,0 +1,8 @@ +package it.gov.pagopa.idpay.transactions.exception; + +public class AzureConnectingErrorException extends RuntimeException{ + + public AzureConnectingErrorException(String message, Throwable failure) { + super(message, failure); + } +} diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportService.java b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportService.java index 5c789ffc..abe5575a 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportService.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportService.java @@ -3,11 +3,15 @@ import it.gov.pagopa.idpay.transactions.dto.PatchReportRequest; import it.gov.pagopa.idpay.transactions.dto.ReportDTO; import it.gov.pagopa.idpay.transactions.dto.ReportRequest; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import it.gov.pagopa.idpay.transactions.model.Report; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import reactor.core.publisher.Mono; +import java.util.List; + public interface ReportService { Mono> getTransactionsReports(String merchantId, String organizationRole, String initiativeId, Pageable pageable); @@ -19,4 +23,6 @@ Mono generateReport(String merchantId, Mono patchReport(String initiativeId, String reportId, PatchReportRequest request); + + Mono> forceGenerateReports(ReportGenerateForce reportGenerateForce); } diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java index 9eb8b625..e817198d 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java @@ -2,9 +2,12 @@ import it.gov.pagopa.common.web.exception.ClientExceptionWithBody; import it.gov.pagopa.idpay.transactions.dto.PatchReportRequest; +import it.gov.pagopa.idpay.transactions.data.factory.DataFactoryService; import it.gov.pagopa.idpay.transactions.dto.ReportDTO; import it.gov.pagopa.idpay.transactions.dto.ReportRequest; import it.gov.pagopa.idpay.transactions.dto.mapper.ReportMapper; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import it.gov.pagopa.idpay.transactions.enums.ReportStatus; import it.gov.pagopa.idpay.transactions.enums.ReportType; import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee; @@ -39,10 +42,13 @@ public class ReportServiceImpl implements ReportService { private final ReportMapper reportMapper; - public ReportServiceImpl(ReportRepository reportRepository, MerchantRestClient merchantRestClient, ReportMapper reportMapper) { + private final DataFactoryService dataFactoryService; + + public ReportServiceImpl(ReportRepository reportRepository, MerchantRestClient merchantRestClient, ReportMapper reportMapper, DataFactoryService dataFactoryService) { this.reportRepository = reportRepository; this.merchantRestClient = merchantRestClient; this.reportMapper = reportMapper; + this.dataFactoryService = dataFactoryService; } private static final List ALLOWED_ROLES = List.of( @@ -193,4 +199,17 @@ public Mono patchReport(String initiativeId, } + @Override + public Mono> forceGenerateReports(ReportGenerateForce reportGenerateForce) { + log.info("[RUN_GENERATE_REPORT] Request generate report {}", reportGenerateForce.getReportsId()); + return reportRepository.findAllById(reportGenerateForce.getReportsId()) + .flatMap(report -> + dataFactoryService.generateReport(report) + .map(runId -> + Report2RunDto.builder() + .reportId(report.getId()) + .runId(runId).build())) + .collectList(); + } + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a07599eb..622df6f3 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -227,4 +227,9 @@ app: delete: paginationSize: ${DELETE_PAGINATION_SIZE:45} delayTime: ${DELETE_DELAY_TIME:1000} - sampling: ${SAMPLING_HASH_SEED:15121984} \ No newline at end of file + sampling: ${SAMPLING_HASH_SEED:15121984} + data-factory: + resource-group: ${DATA_FACTORY_RESOURCE_GROUP:cstar-d-itn-platform-data-rg} + factory-name: ${DATA_FACTORY_NAME:cstar-d-itn-platform-adf} + pipeline-name: ${DATA_FACTORY_PIPELINE_NAME:idpay_transaction_report} + max-retries: ${DATA_FACTORY_RUN_PIPELINE_MAX_RETRIES:3} \ No newline at end of file diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java index 7fcb5bd9..9babe488 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java @@ -7,6 +7,8 @@ import it.gov.pagopa.idpay.transactions.dto.ReportRequest; import it.gov.pagopa.idpay.transactions.dto.mapper.ReportMapper; import it.gov.pagopa.idpay.transactions.enums.ReportType; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import it.gov.pagopa.idpay.transactions.model.Report; import it.gov.pagopa.idpay.transactions.enums.ReportStatus; import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee; @@ -14,6 +16,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -287,4 +290,35 @@ void patchReport_NotFound() { + + @Test + void postForceGenerateReports_Success() { + ReportGenerateForce request = new ReportGenerateForce(List.of("REPORT_ID")); + + Report2RunDto responseMock = Report2RunDto.builder() + .runId("RUN_ID") + .reportId("REPORT_ID") + .build(); + + when(reportService.forceGenerateReports(any())) + .thenReturn(Mono.just(List.of(responseMock))); + + webClient.post() + .uri("/idpay/merchant/portal/reports/transaction/force") + .bodyValue(request) // ✅ corretto + .exchange() + .expectStatus().isOk() + .expectBody(new ParameterizedTypeReference>() {}) + .value(response -> { + assertNotNull(response); + assertEquals(1, response.size()); + + Report2RunDto first = response.get(0); + assertEquals("RUN_ID", first.getRunId()); + assertEquals("REPORT_ID", first.getReportId()); + }); + + verify(reportService, times(1)) + .forceGenerateReports(any()); + } } diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java new file mode 100644 index 00000000..1d27ccd5 --- /dev/null +++ b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java @@ -0,0 +1,25 @@ +package it.gov.pagopa.idpay.transactions.data.factory; + +import com.azure.resourcemanager.datafactory.DataFactoryManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class DataFactoryManagerConfigTest { + + private DataFactoryManagerConfig config; + + @BeforeEach + void setUp() { + config = new DataFactoryManagerConfig(); + + } + + @Test + void shouldCreateDataFactoryManager() { + DataFactoryManager manager = config.dataFactoryManager(); + assertNotNull(manager); + } + +} \ No newline at end of file diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java new file mode 100644 index 00000000..373d484a --- /dev/null +++ b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java @@ -0,0 +1,121 @@ +package it.gov.pagopa.idpay.transactions.data.factory; + + +import com.azure.core.http.rest.Response; +import com.azure.core.util.Context; +import com.azure.resourcemanager.datafactory.DataFactoryManager; +import com.azure.resourcemanager.datafactory.models.CreateRunResponse; +import com.azure.resourcemanager.datafactory.models.Pipelines; +import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException; +import it.gov.pagopa.idpay.transactions.model.Report; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import reactor.test.StepVerifier; + +import java.time.LocalDateTime; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class DataFactoryServiceImplTest { + + @Mock + private DataFactoryManager dataFactoryManager; + + @Mock + private Pipelines pipelines; + + @Mock + private Response response; + + @Mock + private CreateRunResponse createRunResponse; + + private DataFactoryServiceImpl service; + + @BeforeEach + void setUp() { + service = new DataFactoryServiceImpl( + dataFactoryManager, + "resourceGroup", + "factoryName", + "pipelineName", + 0 + ); + } + + @Test + void generateReport_success() { + + LocalDateTime now = LocalDateTime.now(); + Report report = Report.builder() + .id("REPORT_ID") + .merchantId("MERCHANT") + .initiativeId("INIT") + .startPeriod(now) + .endPeriod(now) + .fileName("file.csv").build(); + + // mock Azure chain + when(dataFactoryManager.pipelines()).thenReturn(pipelines); + when(pipelines.createRunWithResponse( + anyString(), + anyString(), + anyString(), + isNull(), + eq(false), + isNull(), + eq(false), + anyMap(), + eq(Context.NONE) + )).thenReturn(response); + + when(response.getStatusCode()).thenReturn(200); + when(response.getValue()).thenReturn(createRunResponse); + when(createRunResponse.runId()).thenReturn("RUN_ID"); + + StepVerifier.create(service.generateReport(report)) + .expectNext("RUN_ID") + .verifyComplete(); + + verify(pipelines, times(1)).createRunWithResponse( + anyString(), + anyString(), + anyString(), + any(), + anyBoolean(), + any(), + anyBoolean(), + anyMap(), + any() + ); + } + + @Test + void generateReport_error_shouldThrowAzureConnectingError() { + + Report report = mock(Report.class); + when(report.getId()).thenReturn("REPORT_ID"); + + when(dataFactoryManager.pipelines()).thenReturn(pipelines); + + when(pipelines.createRunWithResponse( + anyString(), + anyString(), + anyString(), + any(), + anyBoolean(), + any(), + anyBoolean(), + anyMap(), + any() + )).thenThrow(new RuntimeException("Connection error")); + + StepVerifier.create(service.generateReport(report)) + .expectError(AzureConnectingErrorException.class) + .verify(); + } +} \ No newline at end of file diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java index 60ff66d7..e2a24f91 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java @@ -2,11 +2,14 @@ import it.gov.pagopa.common.web.exception.ClientExceptionWithBody; import it.gov.pagopa.idpay.transactions.connector.rest.MerchantRestClient; +import it.gov.pagopa.idpay.transactions.data.factory.DataFactoryService; import it.gov.pagopa.idpay.transactions.connector.rest.dto.MerchantDetailDTO; import it.gov.pagopa.idpay.transactions.dto.PatchReportRequest; import it.gov.pagopa.idpay.transactions.dto.ReportDTO; import it.gov.pagopa.idpay.transactions.dto.ReportRequest; import it.gov.pagopa.idpay.transactions.dto.mapper.ReportMapper; +import it.gov.pagopa.idpay.transactions.dto.report.Report2RunDto; +import it.gov.pagopa.idpay.transactions.dto.report.ReportGenerateForce; import it.gov.pagopa.idpay.transactions.enums.ReportStatus; import it.gov.pagopa.idpay.transactions.enums.ReportType; import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee; @@ -26,6 +29,7 @@ import reactor.test.StepVerifier; import java.time.LocalDateTime; +import java.util.List; import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionCode.REPORT_NOT_FOUND; import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionMessage.ERROR_MESSAGE_REPORT_NOT_FOUND; @@ -45,6 +49,9 @@ class ReportServiceImplTest { @Mock private ReportMapper reportMapper; + @Mock + private DataFactoryService dataFactoryServiceMock; + private ReportServiceImpl service; private static final String MERCHANT_ID = "M1"; @@ -53,7 +60,7 @@ class ReportServiceImplTest { @BeforeEach void setup() { - service = new ReportServiceImpl(reportRepository, merchantRestClient, reportMapper); + service = new ReportServiceImpl(reportRepository, merchantRestClient, reportMapper, dataFactoryServiceMock); } @Test @@ -488,4 +495,35 @@ void patchReport_notFound_throwsException() { verify(reportMapper, never()).toDTO(any()); } + + @Test + void forceGenerateReports() { + Report report1 = mock(Report.class); + when(report1.getId()).thenReturn("R1"); + Report report2 = mock(Report.class); + when(report2.getId()).thenReturn("R2"); + + ReportGenerateForce request = new ReportGenerateForce(List.of("R1", "R2")); + + when(reportRepository.findAllById(anyIterable())) + .thenReturn(Flux.just(report1, report2)); + + when(dataFactoryServiceMock.generateReport(report1)).thenReturn(Mono.just("RUN1")); + when(dataFactoryServiceMock.generateReport(report2)).thenReturn(Mono.just("RUN2")); + + Mono> resultMono = service.forceGenerateReports(request); + + StepVerifier.create(resultMono) + .assertNext(list -> { + assertNotNull(list); + assertEquals(2, list.size()); + + assertTrue(list.stream().anyMatch(d -> "R1".equals(d.getReportId()) && "RUN1".equals(d.getRunId()))); + assertTrue(list.stream().anyMatch(d -> "R2".equals(d.getReportId()) && "RUN2".equals(d.getRunId()))); + }) + .verifyComplete(); + + verify(reportRepository, times(1)).findAllById(anyList()); + verify(dataFactoryServiceMock, times(2)).generateReport(any()); + } } From 6d247e87a2427682b8dc4f69f1ee8fcc04c7649c Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 14:33:33 +0100 Subject: [PATCH 2/8] [UPBE-600] change tag for test and added variables env --- .../data/factory/DataFactoryManagerConfig.java | 12 +++++++++++- src/main/resources/application.yml | 4 +++- .../data/factory/DataFactoryManagerConfigTest.java | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java index d64bbaa9..9211a95d 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfig.java @@ -4,6 +4,7 @@ import com.azure.core.management.profile.AzureProfile; import com.azure.identity.DefaultAzureCredential; import com.azure.identity.DefaultAzureCredentialBuilder; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.azure.resourcemanager.datafactory.DataFactoryManager; @@ -11,10 +12,19 @@ @Configuration public class DataFactoryManagerConfig { + private final String tenantId; + private final String subscriptionId; + + public DataFactoryManagerConfig(@Value("${app.data-factory.tenant-id}") String tenantId, + @Value("${app.data-factory.subscription-id}") String subscriptionId) { + this.tenantId = tenantId; + this.subscriptionId = subscriptionId; + } + @Bean public DataFactoryManager dataFactoryManager () { DefaultAzureCredential azureCredentials = new DefaultAzureCredentialBuilder().build(); - AzureProfile azureProfile = new AzureProfile(AzureEnvironment.AZURE); + AzureProfile azureProfile = new AzureProfile(tenantId, subscriptionId, AzureEnvironment.AZURE); return DataFactoryManager.authenticate(azureCredentials, azureProfile); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 622df6f3..02d01af4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -232,4 +232,6 @@ app: resource-group: ${DATA_FACTORY_RESOURCE_GROUP:cstar-d-itn-platform-data-rg} factory-name: ${DATA_FACTORY_NAME:cstar-d-itn-platform-adf} pipeline-name: ${DATA_FACTORY_PIPELINE_NAME:idpay_transaction_report} - max-retries: ${DATA_FACTORY_RUN_PIPELINE_MAX_RETRIES:3} \ No newline at end of file + max-retries: ${DATA_FACTORY_RUN_PIPELINE_MAX_RETRIES:3} + tenant-id: ${DATA_FACTORY_TENANT_ID:} + subscription-id: ${DATA_FACTORY_SUBSCRIPTION_ID:} \ No newline at end of file diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java index 1d27ccd5..7576d4ee 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryManagerConfigTest.java @@ -12,7 +12,7 @@ class DataFactoryManagerConfigTest { @BeforeEach void setUp() { - config = new DataFactoryManagerConfig(); + config = new DataFactoryManagerConfig("", ""); } From 4ddbd3017a16510e695486751b97a5ba6135c787 Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 15:07:46 +0100 Subject: [PATCH 3/8] [UPBE-600] parameter pipeline --- .../idpay/transactions/data/factory/DataFactoryServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java index 13edc7fd..56e31c6e 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java @@ -85,7 +85,7 @@ private Map createPipelineParameters(Report report) { parameters.put("initiativeId", report.getInitiativeId()); parameters.put("startDate", report.getStartPeriod()); parameters.put("endDate", report.getEndPeriod()); - parameters.put("fileName", report.getFileName()); + parameters.put("reportName", report.getFileName()); return parameters; } From 6ccff2f5cbfc9138ee1d840a815c06097e79d187 Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 16:01:40 +0100 Subject: [PATCH 4/8] [UPBE-600] added data factory integration into generate report api --- .../data/factory/DataFactoryService.java | 2 +- .../data/factory/DataFactoryServiceImpl.java | 6 +-- .../service/ReportServiceImpl.java | 24 +++++++--- .../factory/DataFactoryServiceImplTest.java | 9 ++-- .../service/ReportServiceImplTest.java | 46 +++++++++++++++++-- 5 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java index 9c2b024a..17a8e6b2 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java @@ -4,5 +4,5 @@ import reactor.core.publisher.Mono; public interface DataFactoryService { - Mono generateReport(Report report); + Mono triggerTransactionReportPipeline(Report report); } diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java index 56e31c6e..be95e988 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java @@ -39,9 +39,9 @@ public DataFactoryServiceImpl(DataFactoryManager dataFactoryManager, } @Override - public Mono generateReport(Report report) { + public Mono triggerTransactionReportPipeline(Report report) { Mono callMono = Mono.fromCallable(() -> { - log.info("[CALLING_DATA_FACTORY] Running pipeline for report {}", report.getId()); + log.info("[CALLING_DATA_FACTORY] Starting pipeline execution for Report {}", report.getId()); Response resp = dataFactoryManager.pipelines().createRunWithResponse( resourceGroup, factoryName, @@ -62,7 +62,7 @@ public Mono generateReport(Report report) { if (body == null) { throw new IllegalStateException("ADF createRun returned empty body"); } - log.info("[CALLING_DATA_FACTORY] Identification run pipeline {} for report {}", body.runId(), report.getId()); + log.info("[CALLING_DATA_FACTORY] Report {} generation request sent successfully. Run ID: {}", report.getId(), body.runId()); return body.runId(); }) .subscribeOn(Schedulers.boundedElastic()); diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java index e817198d..db8e4131 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java @@ -11,6 +11,7 @@ import it.gov.pagopa.idpay.transactions.enums.ReportStatus; import it.gov.pagopa.idpay.transactions.enums.ReportType; import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee; +import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException; import it.gov.pagopa.idpay.transactions.model.Report; import it.gov.pagopa.idpay.transactions.repository.ReportRepository; import it.gov.pagopa.idpay.transactions.utils.Utilities; @@ -26,7 +27,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; -import java.util.Locale; import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionCode.*; import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionMessage.*; @@ -163,6 +163,14 @@ public Mono generateMerchantTransactionsReport(String merchantId, return reportRepository.save(reportEntity); }) + .flatMap(report -> + triggerTransactionReportPipeline(report) + .thenReturn(report) + .onErrorResume(AzureConnectingErrorException.class, ex -> { + report.setReportStatus(ReportStatus.FAILED); + return reportRepository.save(report); + }) + ) .map(reportMapper::toDTO) .doOnSuccess(saved -> log.info("[GENERATE_REPORT] Saved report {} for merchant {}", saved.getFileName(), Utilities.sanitizeString(merchantId))); @@ -203,13 +211,15 @@ public Mono patchReport(String initiativeId, public Mono> forceGenerateReports(ReportGenerateForce reportGenerateForce) { log.info("[RUN_GENERATE_REPORT] Request generate report {}", reportGenerateForce.getReportsId()); return reportRepository.findAllById(reportGenerateForce.getReportsId()) - .flatMap(report -> - dataFactoryService.generateReport(report) - .map(runId -> - Report2RunDto.builder() - .reportId(report.getId()) - .runId(runId).build())) + .flatMap(this::triggerTransactionReportPipeline) .collectList(); } + private Mono triggerTransactionReportPipeline(Report report) { + return dataFactoryService.triggerTransactionReportPipeline(report) + .map(runId -> + Report2RunDto.builder() + .reportId(report.getId()) + .runId(runId).build()); + } } diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java index 373d484a..48134b07 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java @@ -48,7 +48,7 @@ void setUp() { } @Test - void generateReport_success() { + void triggerTransactionReport_Pipeline_success() { LocalDateTime now = LocalDateTime.now(); Report report = Report.builder() @@ -59,7 +59,6 @@ void generateReport_success() { .endPeriod(now) .fileName("file.csv").build(); - // mock Azure chain when(dataFactoryManager.pipelines()).thenReturn(pipelines); when(pipelines.createRunWithResponse( anyString(), @@ -77,7 +76,7 @@ void generateReport_success() { when(response.getValue()).thenReturn(createRunResponse); when(createRunResponse.runId()).thenReturn("RUN_ID"); - StepVerifier.create(service.generateReport(report)) + StepVerifier.create(service.triggerTransactionReportPipeline(report)) .expectNext("RUN_ID") .verifyComplete(); @@ -95,7 +94,7 @@ void generateReport_success() { } @Test - void generateReport_error_shouldThrowAzureConnectingError() { + void triggerTransactionReport_Pipeline_error_shouldThrowAzureConnectingError() { Report report = mock(Report.class); when(report.getId()).thenReturn("REPORT_ID"); @@ -114,7 +113,7 @@ void generateReport_error_shouldThrowAzureConnectingError() { any() )).thenThrow(new RuntimeException("Connection error")); - StepVerifier.create(service.generateReport(report)) + StepVerifier.create(service.triggerTransactionReportPipeline(report)) .expectError(AzureConnectingErrorException.class) .verify(); } diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java index e2a24f91..043f6f81 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java @@ -13,6 +13,7 @@ import it.gov.pagopa.idpay.transactions.enums.ReportStatus; import it.gov.pagopa.idpay.transactions.enums.ReportType; import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee; +import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException; import it.gov.pagopa.idpay.transactions.model.Report; import it.gov.pagopa.idpay.transactions.repository.ReportRepository; import org.junit.jupiter.api.BeforeEach; @@ -285,6 +286,8 @@ void generateMerchantTransactionsReport_success() { when(reportRepository.save(any())) .thenReturn(Mono.just(savedReport)); + when(dataFactoryServiceMock.triggerTransactionReportPipeline(savedReport)).thenReturn(Mono.just("RUN_ID")); + when(reportMapper.toDTO(savedReport)) .thenReturn(mappedDto); @@ -371,6 +374,7 @@ void generateMerchantTransactionsReport_fileNameGeneratedCorrectly() { .build(); when(reportRepository.save(any())).thenReturn(Mono.just(saved)); + when(dataFactoryServiceMock.triggerTransactionReportPipeline(saved)).thenReturn(Mono.just("RUN_ID")); when(reportMapper.toDTO(saved)).thenReturn(ReportDTO.builder().id("R200").fileName(saved.getFileName()).build()); StepVerifier.create(service.generateMerchantTransactionsReport(MERCHANT_ID, ORGANIZATION_ROLE, INITIATIVE_ID, request)) @@ -381,6 +385,42 @@ void generateMerchantTransactionsReport_fileNameGeneratedCorrectly() { assertEquals("Report_01022026123045", captor.getValue().getFileName()); } } + @Test + void generateMerchantTransactionsReport_TriggerPipelineError() { + ReportRequest request = new ReportRequest(); + request.setStartPeriod(LocalDateTime.of(2026, 1, 1, 0, 0)); + request.setEndPeriod(LocalDateTime.of(2026, 1, 31, 23, 59)); + request.setReportType(ReportType.MERCHANT_TRANSACTIONS); + + MerchantDetailDTO merchant = new MerchantDetailDTO(); + merchant.setBusinessName("Business"); + + LocalDateTime fixedNow = LocalDateTime.of(2026, 2, 1, 12, 30, 45); + + try (MockedStatic mocked = mockStatic(LocalDateTime.class, CALLS_REAL_METHODS)) { + mocked.when(LocalDateTime::now).thenReturn(fixedNow); + + when(merchantRestClient.getMerchantDetail(MERCHANT_ID, INITIATIVE_ID)) + .thenReturn(Mono.just(merchant)); + + Report saved = Report.builder() + .id("R200") + .fileName("Report_01022026123045") + .build(); + + Report saved2 = Report.builder() + .id("R200_2") + .build(); + + when(reportRepository.save(any())).thenReturn(Mono.just(saved)).thenReturn(Mono.just(saved2)); + when(dataFactoryServiceMock.triggerTransactionReportPipeline(saved)).thenReturn(Mono.error(new AzureConnectingErrorException("DUMMY_ERROR", new RuntimeException()))); + when(reportMapper.toDTO(saved2)).thenReturn(ReportDTO.builder().id("R200_2").build()); + + StepVerifier.create(service.generateMerchantTransactionsReport(MERCHANT_ID, ORGANIZATION_ROLE, INITIATIVE_ID, request)) + .assertNext(dto -> assertEquals("R200_2", dto.getId())) + .verifyComplete(); + } + } @Test void patchReport_success_updatesStatus() { @@ -508,8 +548,8 @@ void forceGenerateReports() { when(reportRepository.findAllById(anyIterable())) .thenReturn(Flux.just(report1, report2)); - when(dataFactoryServiceMock.generateReport(report1)).thenReturn(Mono.just("RUN1")); - when(dataFactoryServiceMock.generateReport(report2)).thenReturn(Mono.just("RUN2")); + when(dataFactoryServiceMock.triggerTransactionReportPipeline(report1)).thenReturn(Mono.just("RUN1")); + when(dataFactoryServiceMock.triggerTransactionReportPipeline(report2)).thenReturn(Mono.just("RUN2")); Mono> resultMono = service.forceGenerateReports(request); @@ -524,6 +564,6 @@ void forceGenerateReports() { .verifyComplete(); verify(reportRepository, times(1)).findAllById(anyList()); - verify(dataFactoryServiceMock, times(2)).generateReport(any()); + verify(dataFactoryServiceMock, times(2)).triggerTransactionReportPipeline(any()); } } From 99261102bedfcf88342e17255f54bbbc7f486c7e Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 16:12:11 +0100 Subject: [PATCH 5/8] [UPBE-600] added data factory integration into generate report api --- .../idpay/transactions/controller/ReportControllerImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java b/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java index 9babe488..a4e22d25 100644 --- a/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java +++ b/src/test/java/it/gov/pagopa/idpay/transactions/controller/ReportControllerImplTest.java @@ -305,7 +305,7 @@ void postForceGenerateReports_Success() { webClient.post() .uri("/idpay/merchant/portal/reports/transaction/force") - .bodyValue(request) // ✅ corretto + .bodyValue(request) .exchange() .expectStatus().isOk() .expectBody(new ParameterizedTypeReference>() {}) From e5ce959c42bbec182e14b1b0245def946913cc88 Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 16:24:23 +0100 Subject: [PATCH 6/8] [UPBE-600] added data factory integration into generate report api --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 02d01af4..4529b747 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -229,8 +229,8 @@ app: delayTime: ${DELETE_DELAY_TIME:1000} sampling: ${SAMPLING_HASH_SEED:15121984} data-factory: - resource-group: ${DATA_FACTORY_RESOURCE_GROUP:cstar-d-itn-platform-data-rg} - factory-name: ${DATA_FACTORY_NAME:cstar-d-itn-platform-adf} + resource-group: ${DATA_FACTORY_RESOURCE_GROUP:} + factory-name: ${DATA_FACTORY_NAME:} pipeline-name: ${DATA_FACTORY_PIPELINE_NAME:idpay_transaction_report} max-retries: ${DATA_FACTORY_RUN_PIPELINE_MAX_RETRIES:3} tenant-id: ${DATA_FACTORY_TENANT_ID:} From 2b02e43ff7c63c68ce0bbf43ab9f301cfd91f911 Mon Sep 17 00:00:00 2001 From: GiovanaSolorzano Date: Fri, 13 Feb 2026 17:01:58 +0100 Subject: [PATCH 7/8] [UPBE-600] added data factory integration into generate report api --- .../pagopa/idpay/transactions/service/ReportServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java index db8e4131..af5e37a5 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java @@ -209,7 +209,7 @@ public Mono patchReport(String initiativeId, @Override public Mono> forceGenerateReports(ReportGenerateForce reportGenerateForce) { - log.info("[RUN_GENERATE_REPORT] Request generate report {}", reportGenerateForce.getReportsId()); + log.info("[RUN_GENERATE_REPORT] Request generate report {}", Utilities.sanitizeString(String.valueOf(reportGenerateForce.getReportsId()))); return reportRepository.findAllById(reportGenerateForce.getReportsId()) .flatMap(this::triggerTransactionReportPipeline) .collectList(); From 69baf1b41b378078c5724357f9facce1a9c48212 Mon Sep 17 00:00:00 2001 From: EMELIGMWW Date: Fri, 13 Feb 2026 17:12:26 +0100 Subject: [PATCH 8/8] log injection --- .../pagopa/idpay/transactions/service/ReportServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java index 9eb8b625..d33914b4 100644 --- a/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java +++ b/src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java @@ -186,6 +186,9 @@ public Mono patchReport(String initiativeId, if (request.getReportStatus() != null) { report.setReportStatus(request.getReportStatus()); } + if(ReportStatus.GENERATED.equals(request.getReportStatus())){ + report.setElaborationDate(LocalDateTime.now()); + } return reportRepository.save(report); })