From 3f483673a9298410101af09ed016324e125879d9 Mon Sep 17 00:00:00 2001 From: Luca Consalvi <117908483+lucaconsalvi@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:09:07 +0100 Subject: [PATCH] fix: Story srtp 184 problems solving (#55) --- openapi/send.openapi.yaml | 25 ++++++- .../controller/rtp/RtpDtoMapper.java | 2 +- .../controller/rtp/SendAPIControllerImpl.java | 4 +- .../pagopa/rtp/activator/domain/rtp/Rtp.java | 4 +- .../activator/repository/rtp/RtpMapper.java | 2 + .../service/rtp/SendRTPServiceImpl.java | 1 - .../ActivationAPIControllerImplTest.java | 3 - .../controller/rtp/RtpDtoMapperTest.java | 1 - .../rtp/SendAPIControllerImplTest.java | 3 +- .../service/rtp/SendRTPServiceTest.java | 9 +-- .../rtp/SepaRequestToPayMapperTest.java | 73 +++++++++++++------ 11 files changed, 85 insertions(+), 42 deletions(-) diff --git a/openapi/send.openapi.yaml b/openapi/send.openapi.yaml index 22fa124..9eb3340 100644 --- a/openapi/send.openapi.yaml +++ b/openapi/send.openapi.yaml @@ -16,6 +16,10 @@ paths: tags: - rtps operationId: "createRtp" + parameters: + - $ref: '#/components/parameters/Version' + security: + - oAuth2: [ admin_rtp_send, write_rtp_send ] summary: "Create and send a new RTP from a pagoPa notice" description: "Create and send a new RTP from a pagoPa notice" requestBody: @@ -167,7 +171,7 @@ components: - paymentNotice - payer - payee - + MalformedRequestErrorResponse: type: object properties: @@ -187,3 +191,22 @@ components: details: type: string example: "The debtor's fiscal code provided is not activated by thr subject making the request." + + Version: + description: Version of the required API. + type: string + pattern: "^[ -~]{1,64}$" + minLength: 1 + maxLength: 64 + example: "v1" + + + parameters: + + Version: + name: Version + in: header + description: Version of the required API. + required: false + schema: + $ref: '#/components/schemas/Version' \ No newline at end of file diff --git a/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapper.java b/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapper.java index c69ee47..9eb5241 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapper.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapper.java @@ -19,7 +19,7 @@ public Rtp toRtp(CreateRtpDto createRtpDto) { .savingDateTime(LocalDateTime.now()) .payerName(createRtpDto.getPayer().getName()) .payerId(createRtpDto.getPayer().getPayerId()).payeeName(createRtpDto.getPayee().getName()) - .payeeId(createRtpDto.getPayee().getPayeeId()).rtpSpId("rtpSpId").endToEndId("endToEndId").iban("iban") + .payeeId(createRtpDto.getPayee().getPayeeId()).rtpSpId("rtpSpId").iban("iban") .subject(createRtpDto.getPaymentNotice().getSubject()) .payTrxRef(createRtpDto.getPayee().getPayTrxRef()).flgConf("flgConf").build(); } diff --git a/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImpl.java b/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImpl.java index 6ee0c5f..ccd2e65 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImpl.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImpl.java @@ -27,10 +27,11 @@ public SendAPIControllerImpl(SendRTPService sendRTPService, RtpDtoMapper rtpDtoM this.rtpDtoMapper = rtpDtoMapper; } + @Override @PreAuthorize("hasRole('write_rtp_send')") public Mono> createRtp(Mono createRtpDto, - ServerWebExchange exchange) { + String version, ServerWebExchange exchange) { log.info("Received request to create RTP"); return createRtpDto .map(rtpDtoMapper::toRtp) @@ -39,4 +40,5 @@ public Mono> createRtp(Mono createRtpDto, .onErrorReturn(PayerNotActivatedException.class, ResponseEntity.unprocessableEntity().build()) .doOnError(a -> log.error("Error creating RTP {}", a.getMessage())); } + } diff --git a/src/main/java/it/gov/pagopa/rtp/activator/domain/rtp/Rtp.java b/src/main/java/it/gov/pagopa/rtp/activator/domain/rtp/Rtp.java index 5a4382d..884af9e 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/domain/rtp/Rtp.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/domain/rtp/Rtp.java @@ -8,13 +8,12 @@ @Builder public record Rtp(String noticeNumber, BigDecimal amount, String description, LocalDate expiryDate, String payerId, String payerName, String payeeName, String payeeId, ResourceID resourceID, - String subject, LocalDateTime savingDateTime, String rtpSpId, String endToEndId, String iban, + String subject, LocalDateTime savingDateTime, String rtpSpId, String iban, String payTrxRef, String flgConf, RtpStatus status) { public Rtp toRtpWithActivationInfo(String rtpSpId) { return Rtp.builder() .rtpSpId(rtpSpId) - .endToEndId(this.endToEndId()) .iban(this.iban()) .payTrxRef(this.payTrxRef()) .flgConf(this.flgConf()) @@ -36,7 +35,6 @@ public Rtp toRtpWithActivationInfo(String rtpSpId) { public Rtp toRtpSent(Rtp rtp) { return Rtp.builder() .rtpSpId(rtp.rtpSpId()) - .endToEndId(rtp.endToEndId()) .iban(rtp.iban()) .payTrxRef(rtp.payTrxRef()) .flgConf(rtp.flgConf()) diff --git a/src/main/java/it/gov/pagopa/rtp/activator/repository/rtp/RtpMapper.java b/src/main/java/it/gov/pagopa/rtp/activator/repository/rtp/RtpMapper.java index e9cc456..968c7a7 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/repository/rtp/RtpMapper.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/repository/rtp/RtpMapper.java @@ -26,6 +26,7 @@ public Rtp toDomain(RtpEntity rtpEntity) { .iban(rtpEntity.getIban()) .payTrxRef(rtpEntity.getPayTrxRef()) .flgConf(rtpEntity.getFlgConf()) + .subject(rtpEntity.getSubject()) .status(RtpStatus.valueOf(rtpEntity.getStatus())) .build(); } @@ -45,6 +46,7 @@ public RtpEntity toDbEntity(Rtp rtp) { .iban(rtp.iban()) .payTrxRef(rtp.payTrxRef()) .flgConf(rtp.flgConf()) + .subject(rtp.subject()) .status(rtp.status().name()) .build(); } diff --git a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java index 5e3112d..1fd26b9 100644 --- a/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java +++ b/src/main/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceImpl.java @@ -13,7 +13,6 @@ import it.gov.pagopa.rtp.activator.domain.errors.PayerNotActivatedException; import it.gov.pagopa.rtp.activator.domain.rtp.Rtp; import it.gov.pagopa.rtp.activator.domain.rtp.RtpRepository; -import it.gov.pagopa.rtp.activator.model.generated.activate.ErrorsDto; import it.gov.pagopa.rtp.activator.model.generated.epc.ActiveOrHistoricCurrencyAndAmountEPC25922V30DS02WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalOrganisationIdentification1CodeEPC25922V30DS022WrapperDto; import it.gov.pagopa.rtp.activator.model.generated.epc.ExternalPersonIdentification1CodeEPC25922V30DS02WrapperDto; diff --git a/src/test/java/it/gov/pagopa/rtp/activator/controller/activation/ActivationAPIControllerImplTest.java b/src/test/java/it/gov/pagopa/rtp/activator/controller/activation/ActivationAPIControllerImplTest.java index beb1905..58cb8a5 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/controller/activation/ActivationAPIControllerImplTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/controller/activation/ActivationAPIControllerImplTest.java @@ -59,9 +59,6 @@ class ActivationAPIControllerImplTest { @MockBean private ActivationDtoMapper activationDtoMapper; - @Autowired - private ActivationPropertiesConfig activationPropertiesConfig; - private WebTestClient webTestClient; @Autowired diff --git a/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapperTest.java b/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapperTest.java index 6e01e80..9b0b0b6 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapperTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/RtpDtoMapperTest.java @@ -54,7 +54,6 @@ void testToRtp() { assertThat(rtp.payeeName()).isEqualTo(createRtpDto.getPayee().getName()); assertThat(rtp.payeeId()).isEqualTo(createRtpDto.getPayee().getPayeeId()); assertThat(rtp.rtpSpId()).isEqualTo("rtpSpId"); - assertThat(rtp.endToEndId()).isEqualTo("endToEndId"); assertThat(rtp.iban()).isEqualTo("iban"); assertThat(rtp.payTrxRef()).isEqualTo(createRtpDto.getPayee().getPayTrxRef()); assertThat(rtp.flgConf()).isEqualTo("flgConf"); diff --git a/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImplTest.java b/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImplTest.java index 3d3ac1c..55b6311 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImplTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/controller/rtp/SendAPIControllerImplTest.java @@ -66,7 +66,6 @@ void setup() { String payerId = "payerId"; String payeeName = "Payee Name"; String payeeId = "payeeId"; - String endToEndId = "endToEndId"; String rtpSpId = "rtpSpId"; String iban = "IT60X0542811101000000123456"; String flgConf = "flgConf"; @@ -78,7 +77,7 @@ void setup() { .expiryDate(expiryDate) .payerId(payerId).payeeName(payeeName).payeeId(payeeId) .resourceID(ResourceID.createNew()) - .savingDateTime(LocalDateTime.now()).rtpSpId(rtpSpId).endToEndId(endToEndId) + .savingDateTime(LocalDateTime.now()).rtpSpId(rtpSpId) .payerName(payerName) .subject(subject) .iban(iban).payTrxRef(payTrxRef) diff --git a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java index a952881..117db6c 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SendRTPServiceTest.java @@ -5,7 +5,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; import it.gov.pagopa.rtp.activator.activateClient.api.ReadApi; import it.gov.pagopa.rtp.activator.activateClient.model.ActivationDto; import it.gov.pagopa.rtp.activator.activateClient.model.PayerDto; @@ -17,8 +16,6 @@ import it.gov.pagopa.rtp.activator.domain.rtp.RtpRepository; import it.gov.pagopa.rtp.activator.domain.rtp.RtpStatus; import it.gov.pagopa.rtp.activator.model.generated.epc.SepaRequestToPayRequestResourceDto; -import java.io.DataInput; -import java.io.IOException; import java.math.BigDecimal; import java.net.URI; import java.nio.charset.StandardCharsets; @@ -54,7 +51,6 @@ class SendRTPServiceTest { final String payerId = "payerId"; final String payeeName = "Payee Name"; final String payeeId = "payeeId"; - final String endToEndId = "endToEndId"; final String rtpSpId = "rtpSpId"; final String iban = "IT60X0542811101000000123456"; final String payTrxRef = "ABC/124"; @@ -70,7 +66,7 @@ void setUp() { .expiryDate(expiryDate) .payerId(payerId).payeeName(payeeName).payeeId(payeeId) .resourceID(ResourceID.createNew()) - .savingDateTime(LocalDateTime.now()).rtpSpId(rtpSpId).endToEndId(endToEndId) + .savingDateTime(LocalDateTime.now()).rtpSpId(rtpSpId) .iban(iban).payTrxRef(payTrxRef) .flgConf(flgConf).build(); } @@ -93,7 +89,7 @@ void testSend() { .expiryDate(expiryDate) .payerId(payerId).payeeName(payeeName).payeeId(payeeId) .resourceID(ResourceID.createNew()) - .savingDateTime(LocalDateTime.now()).rtpSpId(activationRtpSpId).endToEndId(endToEndId) + .savingDateTime(LocalDateTime.now()).rtpSpId(activationRtpSpId) .iban(iban).payTrxRef(payTrxRef) .status(RtpStatus.CREATED) .flgConf(flgConf) @@ -118,7 +114,6 @@ void testSend() { && rtp.payeeName().equals(expectedRtp.payeeName()) && rtp.payeeId().equals(expectedRtp.payeeId()) && rtp.rtpSpId().equals(expectedRtp.rtpSpId()) - && rtp.endToEndId().equals(expectedRtp.endToEndId()) && rtp.iban().equals(expectedRtp.iban()) && rtp.payTrxRef().equals(expectedRtp.payTrxRef()) && rtp.flgConf().equals(expectedRtp.flgConf()) diff --git a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java index f904dc5..d42a611 100644 --- a/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java +++ b/src/test/java/it/gov/pagopa/rtp/activator/service/rtp/SepaRequestToPayMapperTest.java @@ -1,7 +1,6 @@ package it.gov.pagopa.rtp.activator.service.rtp; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -17,9 +16,6 @@ class SepaRequestToPayMapperTest { - @Mock - private Rtp rtp; - @InjectMocks private SepaRequestToPayMapper sepaRequestToPayMapper; @@ -28,6 +24,7 @@ void setUp() { MockitoAnnotations.openMocks(this); } + @Test void testToRequestToPay() { ResourceID resourceId = ResourceID.createNew(); @@ -36,7 +33,6 @@ void testToRequestToPay() { String payeeName = "Mario Rossi"; String rtpSpId = "BIC123456"; String iban = "IT60X0542811101000000123456"; - String endToEndId = "endToEndId123"; BigDecimal amount = new BigDecimal("99999999999"); LocalDateTime savingDateTime = LocalDateTime.now(); LocalDate expiryDate = LocalDate.now().plusDays(5); @@ -44,29 +40,62 @@ void testToRequestToPay() { String noticeNumber = "123456"; String payTrxRef = "ABC/124"; String flgConf = "flgConf123"; + String payerName = "John Doe"; + String subject = "subject"; + + Rtp nRtp = Rtp.builder().resourceID(resourceId).payerId(payerId).payeeName(payerName).payeeId(payeeId) + .payeeName(payeeName).rtpSpId(rtpSpId).iban(iban).amount(amount) + .savingDateTime(savingDateTime).expiryDate(expiryDate).description(description).subject(subject) + .noticeNumber(noticeNumber).payTrxRef(payTrxRef).flgConf(flgConf).build(); - when(rtp.resourceID()).thenReturn(resourceId); - when(rtp.payerId()).thenReturn(payerId); - when(rtp.payeeId()).thenReturn(payeeId); - when(rtp.payeeName()).thenReturn(payeeName); - when(rtp.rtpSpId()).thenReturn(rtpSpId); - when(rtp.iban()).thenReturn(iban); - when(rtp.endToEndId()).thenReturn(endToEndId); - when(rtp.amount()).thenReturn(amount); - when(rtp.savingDateTime()).thenReturn(savingDateTime); - when(rtp.expiryDate()).thenReturn(expiryDate); - when(rtp.description()).thenReturn(description); - when(rtp.noticeNumber()).thenReturn(noticeNumber); - when(rtp.payTrxRef()).thenReturn(payTrxRef); - when(rtp.flgConf()).thenReturn(flgConf); - - SepaRequestToPayRequestResourceDto result = sepaRequestToPayMapper.toRequestToPay(rtp); + SepaRequestToPayRequestResourceDto result = sepaRequestToPayMapper.toRequestToPay(nRtp); assertNotNull(result); assertEquals(resourceId.getId().toString(), result.getResourceId()); assertEquals("http://spsrtp.api.cstar.pagopa.it", result.getCallbackUrl().toString()); assertEquals(resourceId.getId().toString(), result.getDocument().getCdtrPmtActvtnReq().getGrpHdr().getMsgId()); - assertTrue(result.getDocument().getCdtrPmtActvtnReq().getPmtInf().get(0).getCdtTrfTx().get(0).getRmtInf().getUstrd().get(1).contains(description)); + assertTrue(result.getDocument().getCdtrPmtActvtnReq().getPmtInf().get(0).getCdtTrfTx().get(0).getRmtInf() + .getUstrd().get(1).contains(description)); + + + + // Verify group header + var grpHdr = result.getDocument().getCdtrPmtActvtnReq().getGrpHdr(); + assertEquals(nRtp.resourceID().getId().toString(), grpHdr.getMsgId()); + assertEquals(nRtp.savingDateTime().toString(), grpHdr.getCreDtTm()); + + + // Verify payment information + var pmtInf = result.getDocument().getCdtrPmtActvtnReq().getPmtInf().get(0); + assertEquals(nRtp.noticeNumber(), pmtInf.getPmtInfId()); + assertTrue(pmtInf.getXpryDt().toString().contains(nRtp.expiryDate().toString())); + + // Verify debtor information + assertEquals(nRtp.payerName(), pmtInf.getDbtr().getNm()); + + // Verify credit transfer transaction + var cdtTrfTx = pmtInf.getCdtTrfTx().get(0); + assertEquals(nRtp.noticeNumber(), cdtTrfTx.getPmtId().getEndToEndId()); + + // Verify creditor information + assertEquals(nRtp.payeeName(), cdtTrfTx.getCdtr().getNm()); + assertTrue(cdtTrfTx.getCdtrAcct().getId().toString().contains(nRtp.iban())); + + // Verify remittance information + var rmtInf = cdtTrfTx.getRmtInf(); + assertTrue(rmtInf.getUstrd().get(0).contains(nRtp.subject())); + assertTrue(rmtInf.getUstrd().get(0).contains(nRtp.noticeNumber())); + assertTrue(rmtInf.getUstrd().get(1).contains(nRtp.description())); + + // Verify instruction for creditor agent + var instrForCdtrAgt = cdtTrfTx.getInstrForCdtrAgt(); + assertEquals("ATR113/" + nRtp.payTrxRef(), instrForCdtrAgt.get(0).getInstrInf()); + assertEquals(nRtp.flgConf(), instrForCdtrAgt.get(1).getInstrInf()); + + // Verify callback URL + assertEquals("http://spsrtp.api.cstar.pagopa.it", result.getCallbackUrl().toString()); + } } +