Skip to content

Commit 6ccff2f

Browse files
[UPBE-600] added data factory integration into generate report api
1 parent 4ddbd30 commit 6ccff2f

File tree

5 files changed

+68
-19
lines changed

5 files changed

+68
-19
lines changed

src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
import reactor.core.publisher.Mono;
55

66
public interface DataFactoryService {
7-
Mono<String> generateReport(Report report);
7+
Mono<String> triggerTransactionReportPipeline(Report report);
88
}

src/main/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ public DataFactoryServiceImpl(DataFactoryManager dataFactoryManager,
3939
}
4040

4141
@Override
42-
public Mono<String> generateReport(Report report) {
42+
public Mono<String> triggerTransactionReportPipeline(Report report) {
4343
Mono<String> callMono = Mono.fromCallable(() -> {
44-
log.info("[CALLING_DATA_FACTORY] Running pipeline for report {}", report.getId());
44+
log.info("[CALLING_DATA_FACTORY] Starting pipeline execution for Report {}", report.getId());
4545
Response<CreateRunResponse> resp = dataFactoryManager.pipelines().createRunWithResponse(
4646
resourceGroup,
4747
factoryName,
@@ -62,7 +62,7 @@ public Mono<String> generateReport(Report report) {
6262
if (body == null) {
6363
throw new IllegalStateException("ADF createRun returned empty body");
6464
}
65-
log.info("[CALLING_DATA_FACTORY] Identification run pipeline {} for report {}", body.runId(), report.getId());
65+
log.info("[CALLING_DATA_FACTORY] Report {} generation request sent successfully. Run ID: {}", report.getId(), body.runId());
6666
return body.runId();
6767
})
6868
.subscribeOn(Schedulers.boundedElastic());

src/main/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImpl.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import it.gov.pagopa.idpay.transactions.enums.ReportStatus;
1212
import it.gov.pagopa.idpay.transactions.enums.ReportType;
1313
import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee;
14+
import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException;
1415
import it.gov.pagopa.idpay.transactions.model.Report;
1516
import it.gov.pagopa.idpay.transactions.repository.ReportRepository;
1617
import it.gov.pagopa.idpay.transactions.utils.Utilities;
@@ -26,7 +27,6 @@
2627
import java.time.LocalDateTime;
2728
import java.time.format.DateTimeFormatter;
2829
import java.util.List;
29-
import java.util.Locale;
3030

3131
import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionCode.*;
3232
import static it.gov.pagopa.idpay.transactions.utils.ExceptionConstants.ExceptionMessage.*;
@@ -163,6 +163,14 @@ public Mono<ReportDTO> generateMerchantTransactionsReport(String merchantId,
163163

164164
return reportRepository.save(reportEntity);
165165
})
166+
.flatMap(report ->
167+
triggerTransactionReportPipeline(report)
168+
.thenReturn(report)
169+
.onErrorResume(AzureConnectingErrorException.class, ex -> {
170+
report.setReportStatus(ReportStatus.FAILED);
171+
return reportRepository.save(report);
172+
})
173+
)
166174
.map(reportMapper::toDTO)
167175
.doOnSuccess(saved -> log.info("[GENERATE_REPORT] Saved report {} for merchant {}",
168176
saved.getFileName(), Utilities.sanitizeString(merchantId)));
@@ -203,13 +211,15 @@ public Mono<ReportDTO> patchReport(String initiativeId,
203211
public Mono<List<Report2RunDto>> forceGenerateReports(ReportGenerateForce reportGenerateForce) {
204212
log.info("[RUN_GENERATE_REPORT] Request generate report {}", reportGenerateForce.getReportsId());
205213
return reportRepository.findAllById(reportGenerateForce.getReportsId())
206-
.flatMap(report ->
207-
dataFactoryService.generateReport(report)
208-
.map(runId ->
209-
Report2RunDto.builder()
210-
.reportId(report.getId())
211-
.runId(runId).build()))
214+
.flatMap(this::triggerTransactionReportPipeline)
212215
.collectList();
213216
}
214217

218+
private Mono<Report2RunDto> triggerTransactionReportPipeline(Report report) {
219+
return dataFactoryService.triggerTransactionReportPipeline(report)
220+
.map(runId ->
221+
Report2RunDto.builder()
222+
.reportId(report.getId())
223+
.runId(runId).build());
224+
}
215225
}

src/test/java/it/gov/pagopa/idpay/transactions/data/factory/DataFactoryServiceImplTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ void setUp() {
4848
}
4949

5050
@Test
51-
void generateReport_success() {
51+
void triggerTransactionReport_Pipeline_success() {
5252

5353
LocalDateTime now = LocalDateTime.now();
5454
Report report = Report.builder()
@@ -59,7 +59,6 @@ void generateReport_success() {
5959
.endPeriod(now)
6060
.fileName("file.csv").build();
6161

62-
// mock Azure chain
6362
when(dataFactoryManager.pipelines()).thenReturn(pipelines);
6463
when(pipelines.createRunWithResponse(
6564
anyString(),
@@ -77,7 +76,7 @@ void generateReport_success() {
7776
when(response.getValue()).thenReturn(createRunResponse);
7877
when(createRunResponse.runId()).thenReturn("RUN_ID");
7978

80-
StepVerifier.create(service.generateReport(report))
79+
StepVerifier.create(service.triggerTransactionReportPipeline(report))
8180
.expectNext("RUN_ID")
8281
.verifyComplete();
8382

@@ -95,7 +94,7 @@ void generateReport_success() {
9594
}
9695

9796
@Test
98-
void generateReport_error_shouldThrowAzureConnectingError() {
97+
void triggerTransactionReport_Pipeline_error_shouldThrowAzureConnectingError() {
9998

10099
Report report = mock(Report.class);
101100
when(report.getId()).thenReturn("REPORT_ID");
@@ -114,7 +113,7 @@ void generateReport_error_shouldThrowAzureConnectingError() {
114113
any()
115114
)).thenThrow(new RuntimeException("Connection error"));
116115

117-
StepVerifier.create(service.generateReport(report))
116+
StepVerifier.create(service.triggerTransactionReportPipeline(report))
118117
.expectError(AzureConnectingErrorException.class)
119118
.verify();
120119
}

src/test/java/it/gov/pagopa/idpay/transactions/service/ReportServiceImplTest.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import it.gov.pagopa.idpay.transactions.enums.ReportStatus;
1414
import it.gov.pagopa.idpay.transactions.enums.ReportType;
1515
import it.gov.pagopa.idpay.transactions.enums.RewardBatchAssignee;
16+
import it.gov.pagopa.idpay.transactions.exception.AzureConnectingErrorException;
1617
import it.gov.pagopa.idpay.transactions.model.Report;
1718
import it.gov.pagopa.idpay.transactions.repository.ReportRepository;
1819
import org.junit.jupiter.api.BeforeEach;
@@ -285,6 +286,8 @@ void generateMerchantTransactionsReport_success() {
285286
when(reportRepository.save(any()))
286287
.thenReturn(Mono.just(savedReport));
287288

289+
when(dataFactoryServiceMock.triggerTransactionReportPipeline(savedReport)).thenReturn(Mono.just("RUN_ID"));
290+
288291
when(reportMapper.toDTO(savedReport))
289292
.thenReturn(mappedDto);
290293

@@ -371,6 +374,7 @@ void generateMerchantTransactionsReport_fileNameGeneratedCorrectly() {
371374
.build();
372375

373376
when(reportRepository.save(any())).thenReturn(Mono.just(saved));
377+
when(dataFactoryServiceMock.triggerTransactionReportPipeline(saved)).thenReturn(Mono.just("RUN_ID"));
374378
when(reportMapper.toDTO(saved)).thenReturn(ReportDTO.builder().id("R200").fileName(saved.getFileName()).build());
375379

376380
StepVerifier.create(service.generateMerchantTransactionsReport(MERCHANT_ID, ORGANIZATION_ROLE, INITIATIVE_ID, request))
@@ -381,6 +385,42 @@ void generateMerchantTransactionsReport_fileNameGeneratedCorrectly() {
381385
assertEquals("Report_01022026123045", captor.getValue().getFileName());
382386
}
383387
}
388+
@Test
389+
void generateMerchantTransactionsReport_TriggerPipelineError() {
390+
ReportRequest request = new ReportRequest();
391+
request.setStartPeriod(LocalDateTime.of(2026, 1, 1, 0, 0));
392+
request.setEndPeriod(LocalDateTime.of(2026, 1, 31, 23, 59));
393+
request.setReportType(ReportType.MERCHANT_TRANSACTIONS);
394+
395+
MerchantDetailDTO merchant = new MerchantDetailDTO();
396+
merchant.setBusinessName("Business");
397+
398+
LocalDateTime fixedNow = LocalDateTime.of(2026, 2, 1, 12, 30, 45);
399+
400+
try (MockedStatic<LocalDateTime> mocked = mockStatic(LocalDateTime.class, CALLS_REAL_METHODS)) {
401+
mocked.when(LocalDateTime::now).thenReturn(fixedNow);
402+
403+
when(merchantRestClient.getMerchantDetail(MERCHANT_ID, INITIATIVE_ID))
404+
.thenReturn(Mono.just(merchant));
405+
406+
Report saved = Report.builder()
407+
.id("R200")
408+
.fileName("Report_01022026123045")
409+
.build();
410+
411+
Report saved2 = Report.builder()
412+
.id("R200_2")
413+
.build();
414+
415+
when(reportRepository.save(any())).thenReturn(Mono.just(saved)).thenReturn(Mono.just(saved2));
416+
when(dataFactoryServiceMock.triggerTransactionReportPipeline(saved)).thenReturn(Mono.error(new AzureConnectingErrorException("DUMMY_ERROR", new RuntimeException())));
417+
when(reportMapper.toDTO(saved2)).thenReturn(ReportDTO.builder().id("R200_2").build());
418+
419+
StepVerifier.create(service.generateMerchantTransactionsReport(MERCHANT_ID, ORGANIZATION_ROLE, INITIATIVE_ID, request))
420+
.assertNext(dto -> assertEquals("R200_2", dto.getId()))
421+
.verifyComplete();
422+
}
423+
}
384424

385425
@Test
386426
void patchReport_success_updatesStatus() {
@@ -508,8 +548,8 @@ void forceGenerateReports() {
508548
when(reportRepository.findAllById(anyIterable()))
509549
.thenReturn(Flux.just(report1, report2));
510550

511-
when(dataFactoryServiceMock.generateReport(report1)).thenReturn(Mono.just("RUN1"));
512-
when(dataFactoryServiceMock.generateReport(report2)).thenReturn(Mono.just("RUN2"));
551+
when(dataFactoryServiceMock.triggerTransactionReportPipeline(report1)).thenReturn(Mono.just("RUN1"));
552+
when(dataFactoryServiceMock.triggerTransactionReportPipeline(report2)).thenReturn(Mono.just("RUN2"));
513553

514554
Mono<List<Report2RunDto>> resultMono = service.forceGenerateReports(request);
515555

@@ -524,6 +564,6 @@ void forceGenerateReports() {
524564
.verifyComplete();
525565

526566
verify(reportRepository, times(1)).findAllById(anyList());
527-
verify(dataFactoryServiceMock, times(2)).generateReport(any());
567+
verify(dataFactoryServiceMock, times(2)).triggerTransactionReportPipeline(any());
528568
}
529569
}

0 commit comments

Comments
 (0)