From e86196a5b286871f8121299cc996b80a5e1c6ae1 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 17 Oct 2024 11:35:13 +0200 Subject: [PATCH 01/47] [PAGOPA-2282] chore: Update ingress timeout --- helm/values-uat.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 04fa45b8..119bb668 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -94,11 +94,11 @@ microservice-chart: create: true host: "weuuat.fdr.internal.uat.platform.pagopa.it" path: /pagopa-fdr-service(/|$)(.*) - # currently set ingress timeout to 5m, until async handling will be introduced + # currently set ingress timeout to 50m, until async handling will be introduced annotations: - nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" - nginx.ingress.kubernetes.io/send_timeout: "300" + nginx.ingress.kubernetes.io/proxy-connect-timeout: "3000" + nginx.ingress.kubernetes.io/proxy-read-timeout: "3000" + nginx.ingress.kubernetes.io/proxy-send-timeout: "3000" + nginx.ingress.kubernetes.io/send_timeout: "3000" canaryDelivery: create: false From ded78ff411ad0fb64f6cdcb3cb40b246a5abb445 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 17 Oct 2024 12:46:30 +0200 Subject: [PATCH 02/47] [PAGOPA-2282] chore: Add log --- src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 345806d9..bc9863f9 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -319,7 +319,10 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrPublishEntity.setStatus(FdrStatusEnumEntity.PUBLISHED); List fdrPaymentPublishEntities = mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); + + log.info("Starting persistent storage on Mongo of FDR payment entities"); FdrPaymentPublishEntity.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); + log.info("End of persistent storage on Mongo of FDR payment entities"); // salva su storage dello storico HistoryBlobBody body = historyService.saveJsonFile(fdrPublishEntity, fdrPaymentPublishEntities); From e3285ce56773200eba6963ba5a6bc69d43ed289c Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 17 Oct 2024 13:02:31 +0200 Subject: [PATCH 03/47] [PAGOPA-2282] chore: Add LOG_LEVEL env --- helm/values-dev.yaml | 1 + helm/values-uat.yaml | 1 + src/main/resources/application.properties | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index e6c0d4bc..5b7ddf53 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -24,6 +24,7 @@ microservice-chart: APP_ENVIRONMENT: "dev" TZ: "Europe/Rome" OTEL_ENDPOINT: "http://otel-collector.elastic-system.svc.cluster.local:4317" + LOG_LEVEL: "INFO" ADAPTER_API_CONFIG_CACHE_URL: "https://api.dev.platform.pagopa.it/api-config-cache/p/v1" ADAPTER_API_CONFIG_CACHE_CRON: "0 */1 * * * ?" QUEUE_CONVERSION_NAME: "flowidsendqueue" diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 119bb668..78e816f7 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -24,6 +24,7 @@ microservice-chart: APP_ENVIRONMENT: "uat" TZ: "Europe/Rome" OTEL_ENDPOINT: "http://otel-collector.elastic-system.svc.cluster.local:4317" + LOG_LEVEL: "INFO" ADAPTER_API_CONFIG_CACHE_URL: "https://api.uat.platform.pagopa.it/api-config-cache/p/v1" ADAPTER_API_CONFIG_CACHE_CRON: "0 */1 * * * ?" QUEUE_CONVERSION_NAME: "flowidsendqueue" diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d4fcca20..83107936 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,7 +17,7 @@ quarkus.locales=it-IT ################### quarkus.log.file.json=false quarkus.log.level=INFO -quarkus.log.category."it.gov.pagopa.fdr".level=DEBUG +quarkus.log.category."it.gov.pagopa.fdr".level=${LOG_LEVEL:INFO} %dev.quarkus.log.console.json=false %test.quarkus.log.console.json=false From 4828a8f375d416db38885e5587adf0b540d8149e Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 17 Oct 2024 15:36:40 +0200 Subject: [PATCH 04/47] [PAGOPA-2282] chore: Add info log --- .../java/it/gov/pagopa/fdr/service/psps/PspsService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index bc9863f9..68d5aa84 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -325,11 +325,16 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern log.info("End of persistent storage on Mongo of FDR payment entities"); // salva su storage dello storico + log.info("Starting saveJsonFile storage on BlobStorage of FDR payment entities"); HistoryBlobBody body = historyService.saveJsonFile(fdrPublishEntity, fdrPaymentPublishEntities); + log.info("End of saveJsonFile storage on BlobStorage of FDR payment entities"); + fdrPublishEntity.setRefJson(body); fdrPublishEntity.persistEntity(); + log.info("Starting saveOnStorage storage on BlobStorage of FDR payment entities"); historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); + log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); log.debug("Delete FdrInsertEntity"); fdrEntity.delete(); From a5bcc35e2102fc25a041dfc42e374f19c3990abc Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 24 Oct 2024 16:32:40 +0200 Subject: [PATCH 05/47] [PAGOPA-2282] chore: Config vert.x event-loop-execute-time --- src/main/resources/application.properties | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 83107936..ca678d81 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -69,6 +69,11 @@ quarkus.mongodb.connection-string=${MONGODB_CONNECTION_STRING:${mockserver.mongo %dev.quarkus.mongodb.connection-string=mongodb://root:example@localhost:27017/ quarkus.mongodb.database=fdr +################### +## Vert.x +################### +quarkus.vertx.max-event-loop-execute-time=60s + ################### ## ADAPTER API CONFIG CACHE ################### From 8349e18a68fb5f402f637220865975ab41f4dacb Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 24 Oct 2024 17:11:58 +0200 Subject: [PATCH 06/47] [PAGOPA-2282] ci: Update release action --- .github/workflows/04_release_and_deploy.yml | 57 +++++++++++++++------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/.github/workflows/04_release_and_deploy.yml b/.github/workflows/04_release_and_deploy.yml index f9432be9..5b16879d 100644 --- a/.github/workflows/04_release_and_deploy.yml +++ b/.github/workflows/04_release_and_deploy.yml @@ -18,15 +18,13 @@ on: - dev - uat - prod - semver: + version: required: false type: choice description: Select the version options: - '' - - skip - - promote - - patch + - skip_or_promote - new_release - breaking_change beta: @@ -40,10 +38,6 @@ on: environment: required: true type: string - semver: - required: true - type: string - default: skip permissions: packages: write @@ -59,14 +53,47 @@ jobs: name: Setup runs-on: ubuntu-latest outputs: - semver: ${{ steps.semver_setup.outputs.semver }} - environment: ${{ steps.semver_setup.outputs.environment }} + semver: ${{ steps.get_semver.outputs.semver }} + environment: ${{ steps.get_env.outputs.environment }} steps: - - name: Semver setup - id: semver_setup - uses: pagopa/github-actions-template/nodo5-semver-setup@ce252c8501c9242bd6045f7cdd650736b2f38777 - with: - semver: ${{ inputs.semver }} + - name: pull request rejected + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged != true + run: | + echo "❌ PR was closed without a merge" + exit 1 + + # Set Semvar + - run: echo "SEMVER=patch" >> $GITHUB_ENV + + - if: ${{ (github.event.pull_request.merged && contains(github.event.pull_request.labels.*.name, 'breaking-change')) }} + run: echo "SEMVER=major" >> $GITHUB_ENV + + # force semver if dev, !=main or skip release + - if: ${{ inputs.version == 'new_release' }} + run: echo "SEMVER=minor" >> $GITHUB_ENV + + - if: ${{ inputs.version == 'breaking_change' }} + run: echo "SEMVER=major" >> $GITHUB_ENV + + - if: ${{ github.ref_name != 'main' }} + run: echo "SEMVER=buildNumber" >> $GITHUB_ENV + + - if: ${{ inputs.version == 'skip_or_promote' }} + run: echo "SEMVER=skip" >> $GITHUB_ENV + + - id: get_semver + name: Set Output + run: echo "semver=${{env.SEMVER}}" >> $GITHUB_OUTPUT + + # Set Environment + - run: echo "ENVIRNOMENT=${{ inputs.environment}}" >> $GITHUB_ENV + + - if: ${{ inputs.environment == null }} + run: echo "ENVIRNOMENT=dev" >> $GITHUB_ENV + + - id: get_env + name: Set Output + run: echo "environment=${{env.ENVIRNOMENT}}" >> $GITHUB_OUTPUT release: needs: [setup] From 237b6a01b2dd34a8e754a03fbd9d4ce4781429b7 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Thu, 24 Oct 2024 15:13:22 +0000 Subject: [PATCH 07/47] Bump to version 1.0.21-1-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index cfbe48b9..0d4d2e95 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.28.0" -appVersion: "1.0.21" +version: "1.29.0" +appVersion: "1.0.21-1-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 5b7ddf53..bca220de 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21 + tag: 1.0.21-1-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 78e816f7..bcc0e0e8 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21 + tag: 1.0.21-1-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 45a5a1a2..9c682261 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21" + "version": "1.0.21-1-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index ff2b3bdd..83892a48 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21" + "version": "1.0.21-1-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 7d98681b..0435736c 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21" + "version": "1.0.21-1-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index afffd592..dc794d77 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21 + 1.0.21-1-PAGOPA-2282 3.11.0 1.18.26 From 1c38b5f656c319a72cb51e356be303db9d0eafcf Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Thu, 24 Oct 2024 18:27:12 +0200 Subject: [PATCH 08/47] [PAGOPA-2282] chore: vert.x --- .../fdr/FdrPaymentPublishEntity.java | 37 ++++++++++--------- src/main/resources/application.properties | 2 +- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java index b1493f1d..02f2f899 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java @@ -6,6 +6,7 @@ import io.quarkus.mongodb.panache.common.MongoEntity; import io.quarkus.panache.common.Parameters; import io.quarkus.panache.common.Sort; +import io.vertx.core.Vertx; import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; import java.time.Instant; import java.util.List; @@ -99,22 +100,24 @@ public static PanacheQuery findByPspAndIuvIur( return find(query, sort, params); } - // public static PanacheQuery findByFdrAndPspId( - // String fdr, String pspId, Sort sort) { - // return find( - // "ref_fdr = :fdr and ref_fdr_sender_psp_id = :pspId", - // sort, - // Parameters.with("fdr", fdr).and("pspId", pspId).map()); - // } - // - // public static long deleteByFdrAndPspId(String fdr, String pspId) { - // return delete( - // "ref_fdr = :fdr and ref_fdr_sender_psp_id = :pspId", - // Parameters.with("fdr", fdr).and("pspId", pspId).map()); - // } - // - public static void persistFdrPaymentPublishEntities( - List fdrPaymentPublishEntities) { - persist(fdrPaymentPublishEntities); + // persists a list of FdrPaymentPublishEntity to mongo using non-blocking vert.x + public static void persistFdrPaymentPublishEntities(List entities) { + Vertx vertx = Vertx.vertx(); + vertx.executeBlocking( + promise -> { + try { + persist(entities); + promise.complete(); + } catch (Exception e) { + promise.fail(e); + } + }, + res -> { + if (res.succeeded()) { + // Handle success if needed + } else { + // Handle failure if needed + } + }); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ca678d81..da9a9a02 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -72,7 +72,7 @@ quarkus.mongodb.database=fdr ################### ## Vert.x ################### -quarkus.vertx.max-event-loop-execute-time=60s +# quarkus.vertx.max-event-loop-execute-time=2s ################### ## ADAPTER API CONFIG CACHE From 5728adc5e004f07e947bd6314ce7f85c1322530b Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Thu, 24 Oct 2024 16:28:44 +0000 Subject: [PATCH 09/47] Bump to version 1.0.21-2-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 0d4d2e95..fb2a3d7c 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.29.0" -appVersion: "1.0.21-1-PAGOPA-2282" +version: "1.30.0" +appVersion: "1.0.21-2-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index bca220de..5ef06174 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-1-PAGOPA-2282 + tag: 1.0.21-2-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index bcc0e0e8..b6a108de 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-1-PAGOPA-2282 + tag: 1.0.21-2-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 9c682261..21b9bd1d 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-1-PAGOPA-2282" + "version": "1.0.21-2-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 83892a48..9dcd8262 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-1-PAGOPA-2282" + "version": "1.0.21-2-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 0435736c..ca9fc8cd 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-1-PAGOPA-2282" + "version": "1.0.21-2-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index dc794d77..c7caa6cf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-1-PAGOPA-2282 + 1.0.21-2-PAGOPA-2282 3.11.0 1.18.26 From ace4a0ba969a3d5637a6b61843b53925e3e75529 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 12:26:35 +0200 Subject: [PATCH 10/47] [PAGOPA-2282] chore: Add reactive entity --- .../fdr/FdrPaymentPublishEntity.java | 22 ------------------- .../fdr/FdrPaymentPublishEntityReactive.java | 20 +++++++++++++++++ .../pagopa/fdr/service/psps/PspsService.java | 7 ++---- 3 files changed, 22 insertions(+), 27 deletions(-) create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java index 02f2f899..26e5026e 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java @@ -6,7 +6,6 @@ import io.quarkus.mongodb.panache.common.MongoEntity; import io.quarkus.panache.common.Parameters; import io.quarkus.panache.common.Sort; -import io.vertx.core.Vertx; import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; import java.time.Instant; import java.util.List; @@ -99,25 +98,4 @@ public static PanacheQuery findByPspAndIuvIur( } return find(query, sort, params); } - - // persists a list of FdrPaymentPublishEntity to mongo using non-blocking vert.x - public static void persistFdrPaymentPublishEntities(List entities) { - Vertx vertx = Vertx.vertx(); - vertx.executeBlocking( - promise -> { - try { - persist(entities); - promise.complete(); - } catch (Exception e) { - promise.fail(e); - } - }, - res -> { - if (res.succeeded()) { - // Handle success if needed - } else { - // Handle failure if needed - } - }); - } } diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java new file mode 100644 index 00000000..b6bde95a --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java @@ -0,0 +1,20 @@ +package it.gov.pagopa.fdr.repository.fdr; + +import io.quarkus.mongodb.panache.common.MongoEntity; +import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity; +import io.smallrye.mutiny.Uni; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@MongoEntity(collection = "fdr_payment_publish") +public class FdrPaymentPublishEntityReactive extends ReactivePanacheMongoEntity { + + // Reactive persistence method for FdrPaymentPublishEntity objects + public static Uni persistFdrPaymentPublishEntities(List entities) { + return persist(entities); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 68d5aa84..32992514 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -10,10 +10,7 @@ import io.quarkus.panache.common.Sort; import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.repository.fdr.FdrInsertEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentInsertEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; +import it.gov.pagopa.fdr.repository.fdr.*; import it.gov.pagopa.fdr.repository.fdr.model.FdrStatusEnumEntity; import it.gov.pagopa.fdr.repository.fdr.projection.FdrInsertProjection; import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishByPspProjection; @@ -321,7 +318,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); log.info("Starting persistent storage on Mongo of FDR payment entities"); - FdrPaymentPublishEntity.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); + FdrPaymentPublishEntityReactive.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); log.info("End of persistent storage on Mongo of FDR payment entities"); // salva su storage dello storico From f9cc033a2566e298c68f17a4a9bb715b152be5a4 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 10:28:42 +0000 Subject: [PATCH 11/47] Bump to version 1.0.21-3-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index fb2a3d7c..9d6c5072 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.30.0" -appVersion: "1.0.21-2-PAGOPA-2282" +version: "1.31.0" +appVersion: "1.0.21-3-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 5ef06174..0c0bdee2 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-2-PAGOPA-2282 + tag: 1.0.21-3-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index b6a108de..d7b11f07 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-2-PAGOPA-2282 + tag: 1.0.21-3-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 21b9bd1d..5e1db142 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-2-PAGOPA-2282" + "version": "1.0.21-3-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 9dcd8262..4644429a 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-2-PAGOPA-2282" + "version": "1.0.21-3-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index ca9fc8cd..ce1544ef 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-2-PAGOPA-2282" + "version": "1.0.21-3-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index c7caa6cf..fc5f9b9d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-2-PAGOPA-2282 + 1.0.21-3-PAGOPA-2282 3.11.0 1.18.26 From 537883fe01db5fd4b5cc0bd7e3f2a0330de9acb4 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 14:54:10 +0200 Subject: [PATCH 12/47] [PAGOPA-2282] refactoring: Add async saveOnStorage --- .../pagopa/fdr/service/history/HistoryService.java | 14 ++++++++++++++ .../gov/pagopa/fdr/service/psps/PspsService.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java index 941086a3..b462e379 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java @@ -33,6 +33,7 @@ import java.io.IOException; import java.time.Instant; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -107,6 +108,19 @@ public void saveOnStorage( } } + public void asyncSaveOnStorage(FdrPublishEntity fdrEntity, List paymentsList) { + CompletableFuture executeSaveOnStorage = CompletableFuture.supplyAsync(() -> { + this.saveOnStorage(fdrEntity, paymentsList); + return true; + }); + executeSaveOnStorage + .thenAccept(value -> logger.debugf("Async saveOnStorage successful executed")) + .exceptionally(e -> { + logger.error("Exception during async saveOnStorage: ", e); + return null; + }); + } + public HistoryBlobBody saveJsonFile( FdrPublishEntity fdrEntity, List paymentsList) { if (blobContainerClient != null) { diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 32992514..6f7f3042 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -330,7 +330,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrPublishEntity.persistEntity(); log.info("Starting saveOnStorage storage on BlobStorage of FDR payment entities"); - historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); + historyService.asyncSaveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); log.debug("Delete FdrInsertEntity"); From 66149185a68e85b1213c1ac9f38e9a5e76f4a449 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 12:55:40 +0000 Subject: [PATCH 13/47] Bump to version 1.0.21-4-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 9d6c5072..48dc791f 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.31.0" -appVersion: "1.0.21-3-PAGOPA-2282" +version: "1.32.0" +appVersion: "1.0.21-4-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 0c0bdee2..56281b3c 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-3-PAGOPA-2282 + tag: 1.0.21-4-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index d7b11f07..46299d0e 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-3-PAGOPA-2282 + tag: 1.0.21-4-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 5e1db142..cd3b5bbe 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-3-PAGOPA-2282" + "version": "1.0.21-4-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 4644429a..98129de0 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-3-PAGOPA-2282" + "version": "1.0.21-4-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index ce1544ef..ac4ff934 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-3-PAGOPA-2282" + "version": "1.0.21-4-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index fc5f9b9d..61af6f4c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-3-PAGOPA-2282 + 1.0.21-4-PAGOPA-2282 3.11.0 1.18.26 From 2c50825099e15e4537b3cd964c7ab17249231c55 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 16:14:56 +0200 Subject: [PATCH 14/47] [PAGOPA-2282] refactoring --- .../it/gov/pagopa/fdr/service/psps/PspsService.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 6f7f3042..a8a7bc16 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -333,17 +333,18 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern historyService.asyncSaveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - log.debug("Delete FdrInsertEntity"); + log.info("Starting delete FdrInsertEntity"); fdrEntity.delete(); - log.debugf( + log.infof( "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); + log.info("End delete deleteByFdrAndPspId"); // add to conversion queue if (internalPublish) { - log.debug("NOT Add FdrInsertEntity in queue fdr message"); + log.info("NOT Add FdrInsertEntity in queue fdr message"); } else { - log.debug("Add FdrInsertEntity in queue fdr message"); + log.info("Starting add FdrInsertEntity in queue fdr message"); conversionQueue.addQueueFlowMessage( FdrMessage.builder() .fdr(fdrEntity.getFdr()) @@ -352,6 +353,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern .retry(0L) .revision(fdrEntity.getRevision()) .build()); + log.info("End add FdrInsertEntity in queue fdr message"); } String sessionId = (String) MDC.get(TRX_ID); From 2ca8902c06af6aae7a0be47fc053ced9254dc3b8 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 14:16:15 +0000 Subject: [PATCH 15/47] Bump to version 1.0.21-5-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 48dc791f..9fa24736 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.32.0" -appVersion: "1.0.21-4-PAGOPA-2282" +version: "1.33.0" +appVersion: "1.0.21-5-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 56281b3c..7f8663b2 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-4-PAGOPA-2282 + tag: 1.0.21-5-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 46299d0e..46b67a03 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-4-PAGOPA-2282 + tag: 1.0.21-5-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index cd3b5bbe..a9a70119 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-4-PAGOPA-2282" + "version": "1.0.21-5-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 98129de0..d3e8faef 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-4-PAGOPA-2282" + "version": "1.0.21-5-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index ac4ff934..8efebec7 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-4-PAGOPA-2282" + "version": "1.0.21-5-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 61af6f4c..f1860b72 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-4-PAGOPA-2282 + 1.0.21-5-PAGOPA-2282 3.11.0 1.18.26 From 556daf056e202989ad510cabc3c46c392424d987 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 16:35:52 +0200 Subject: [PATCH 16/47] [PAGOPA-2282] refactoring --- .../pagopa/fdr/service/psps/PspsService.java | 81 ++++++++++++------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index a8a7bc16..7d637e6a 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -32,6 +32,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.jboss.logging.Logger; import org.jboss.logging.MDC; @@ -330,50 +331,72 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrPublishEntity.persistEntity(); log.info("Starting saveOnStorage storage on BlobStorage of FDR payment entities"); - historyService.asyncSaveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); - log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - - log.info("Starting delete FdrInsertEntity"); - fdrEntity.delete(); - log.infof( - "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); - FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); - log.info("End delete deleteByFdrAndPspId"); + CompletableFuture executeSaveOnStorage = CompletableFuture.supplyAsync(() -> { + historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); + log.info("Async saveOnStorage successful executed"); + return true; + }); + executeSaveOnStorage + .thenAccept(value -> { + log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); + + log.info("Starting delete FdrInsertEntity"); + fdrEntity.delete(); + log.infof( + "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); + FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); + log.info("End delete deleteByFdrAndPspId"); + log.info("Starting conversion to queue"); + this.addToConversionQueue(internalPublish, fdrEntity); + log.info("End of conversion to queue"); + log.info("Starting write to re"); + this.rePublish(fdr, pspId, fdrPublishEntity); + log.info("End of write to re"); + }) + .exceptionally(e -> { + log.error("Exception during async saveOnStorage: ", e); + return null; + }); + } + private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { // add to conversion queue if (internalPublish) { log.info("NOT Add FdrInsertEntity in queue fdr message"); } else { log.info("Starting add FdrInsertEntity in queue fdr message"); conversionQueue.addQueueFlowMessage( - FdrMessage.builder() - .fdr(fdrEntity.getFdr()) - .pspId(fdrEntity.getSender().getPspId()) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .retry(0L) - .revision(fdrEntity.getRevision()) - .build()); + FdrMessage.builder() + .fdr(fdrEntity.getFdr()) + .pspId(fdrEntity.getSender().getPspId()) + .organizationId(fdrEntity.getReceiver().getOrganizationId()) + .retry(0L) + .revision(fdrEntity.getRevision()) + .build()); log.info("End add FdrInsertEntity in queue fdr message"); } + } + private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEntity) { String sessionId = (String) MDC.get(TRX_ID); MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus(FdrStatusEnum.PUBLISHED) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrPublishEntity.getReceiver().getOrganizationId()) - .revision(fdrPublishEntity.getRevision()) - .fdrAction(FdrActionEnum.PUBLISH) - .build()); + ReInternal.builder() + .serviceIdentifier(AppVersionEnum.FDR003) + .created(Instant.now()) + .sessionId(sessionId) + .eventType(EventTypeEnum.INTERNAL) + .fdrPhysicalDelete(false) + .fdrStatus(FdrStatusEnum.PUBLISHED) + .fdr(fdr) + .pspId(pspId) + .organizationId(fdrPublishEntity.getReceiver().getOrganizationId()) + .revision(fdrPublishEntity.getRevision()) + .fdrAction(FdrActionEnum.PUBLISH) + .build()); } + @WithSpan(kind = SERVER) public void deleteByFdr(String action, String pspId, String fdr) { log.infof(AppMessageUtil.logExecute(action)); From e883d33c510ed67afe510b54836ea91b0cd709a5 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 14:37:19 +0000 Subject: [PATCH 17/47] Bump to version 1.0.21-6-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 9fa24736..631ef125 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.33.0" -appVersion: "1.0.21-5-PAGOPA-2282" +version: "1.34.0" +appVersion: "1.0.21-6-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 7f8663b2..b8afbd93 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-5-PAGOPA-2282 + tag: 1.0.21-6-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 46b67a03..5c0405b5 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-5-PAGOPA-2282 + tag: 1.0.21-6-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index a9a70119..70020a5c 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-5-PAGOPA-2282" + "version": "1.0.21-6-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index d3e8faef..e564d0ec 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-5-PAGOPA-2282" + "version": "1.0.21-6-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 8efebec7..90a1e82e 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-5-PAGOPA-2282" + "version": "1.0.21-6-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index f1860b72..032e85ba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-5-PAGOPA-2282 + 1.0.21-6-PAGOPA-2282 3.11.0 1.18.26 From b7b15ea9befbb4d8bed8567573a84bb5dd090016 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 17:18:23 +0200 Subject: [PATCH 18/47] [PAGOPA-2282] refactoring: Remove log --- .../it/gov/pagopa/fdr/service/psps/PspsService.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 7d637e6a..7cfc452e 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -323,9 +323,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern log.info("End of persistent storage on Mongo of FDR payment entities"); // salva su storage dello storico - log.info("Starting saveJsonFile storage on BlobStorage of FDR payment entities"); HistoryBlobBody body = historyService.saveJsonFile(fdrPublishEntity, fdrPaymentPublishEntities); - log.info("End of saveJsonFile storage on BlobStorage of FDR payment entities"); fdrPublishEntity.setRefJson(body); fdrPublishEntity.persistEntity(); @@ -339,19 +337,13 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern executeSaveOnStorage .thenAccept(value -> { log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - - log.info("Starting delete FdrInsertEntity"); fdrEntity.delete(); log.infof( "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); log.info("End delete deleteByFdrAndPspId"); - log.info("Starting conversion to queue"); this.addToConversionQueue(internalPublish, fdrEntity); - log.info("End of conversion to queue"); - log.info("Starting write to re"); this.rePublish(fdr, pspId, fdrPublishEntity); - log.info("End of write to re"); }) .exceptionally(e -> { log.error("Exception during async saveOnStorage: ", e); @@ -378,6 +370,7 @@ private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEn } private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEntity) { + log.info("Starting write to re"); String sessionId = (String) MDC.get(TRX_ID); MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); reService.sendEvent( @@ -394,6 +387,7 @@ private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEnti .revision(fdrPublishEntity.getRevision()) .fdrAction(FdrActionEnum.PUBLISH) .build()); + log.info("End write to re"); } From 36ead2cd540f2df90ead8ca035768e1ce39e94db Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 15:19:56 +0000 Subject: [PATCH 19/47] Bump to version 1.0.21-7-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 631ef125..bba6cc82 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.34.0" -appVersion: "1.0.21-6-PAGOPA-2282" +version: "1.35.0" +appVersion: "1.0.21-7-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index b8afbd93..0510ca3a 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-6-PAGOPA-2282 + tag: 1.0.21-7-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 5c0405b5..f654a67f 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-6-PAGOPA-2282 + tag: 1.0.21-7-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 70020a5c..29fef0e3 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-6-PAGOPA-2282" + "version": "1.0.21-7-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index e564d0ec..726eb450 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-6-PAGOPA-2282" + "version": "1.0.21-7-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 90a1e82e..ebed5329 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-6-PAGOPA-2282" + "version": "1.0.21-7-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 032e85ba..94c80a2a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-6-PAGOPA-2282 + 1.0.21-7-PAGOPA-2282 3.11.0 1.18.26 From fd599f3e0f3551cd0bd0e7997fac57473e1db0f2 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:23:12 +0200 Subject: [PATCH 20/47] Fix code scanning alert no. 717: Log Injection Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 7cfc452e..f1b0bb37 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -338,8 +338,9 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern .thenAccept(value -> { log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); fdrEntity.delete(); + String sanitizedFdr = fdr.replace("\n", "").replace("\r", ""); log.infof( - "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); + "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), sanitizedFdr, pspId); FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); log.info("End delete deleteByFdrAndPspId"); this.addToConversionQueue(internalPublish, fdrEntity); From f596fc524f66d5b80fa993ef134255f955f78910 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 15:36:03 +0000 Subject: [PATCH 21/47] Bump to version 1.0.21-8-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index bba6cc82..96b4810a 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.35.0" -appVersion: "1.0.21-7-PAGOPA-2282" +version: "1.36.0" +appVersion: "1.0.21-8-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 0510ca3a..61f9c9ef 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-7-PAGOPA-2282 + tag: 1.0.21-8-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index f654a67f..e6a8a4c4 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-7-PAGOPA-2282 + tag: 1.0.21-8-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 29fef0e3..a95a3811 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-7-PAGOPA-2282" + "version": "1.0.21-8-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 726eb450..d99849c0 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-7-PAGOPA-2282" + "version": "1.0.21-8-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index ebed5329..690660e5 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-7-PAGOPA-2282" + "version": "1.0.21-8-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 94c80a2a..f865e046 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-7-PAGOPA-2282 + 1.0.21-8-PAGOPA-2282 3.11.0 1.18.26 From af70948feb882b3c7db274edf1fd3dc6de06d6a3 Mon Sep 17 00:00:00 2001 From: AngeloCaporaso Date: Fri, 25 Oct 2024 18:10:12 +0200 Subject: [PATCH 22/47] [PAGOPA-2282] refactoring --- .../fdr/service/history/HistoryService.java | 13 ------------- .../gov/pagopa/fdr/service/psps/PspsService.java | 15 +++++++++------ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java index b462e379..ce245eb9 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java @@ -108,19 +108,6 @@ public void saveOnStorage( } } - public void asyncSaveOnStorage(FdrPublishEntity fdrEntity, List paymentsList) { - CompletableFuture executeSaveOnStorage = CompletableFuture.supplyAsync(() -> { - this.saveOnStorage(fdrEntity, paymentsList); - return true; - }); - executeSaveOnStorage - .thenAccept(value -> logger.debugf("Async saveOnStorage successful executed")) - .exceptionally(e -> { - logger.error("Exception during async saveOnStorage: ", e); - return null; - }); - } - public HistoryBlobBody saveJsonFile( FdrPublishEntity fdrEntity, List paymentsList) { if (blobContainerClient != null) { diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index f1b0bb37..97a2b420 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -337,13 +337,16 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern executeSaveOnStorage .thenAccept(value -> { log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - fdrEntity.delete(); - String sanitizedFdr = fdr.replace("\n", "").replace("\r", ""); - log.infof( - "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), sanitizedFdr, pspId); - FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); - log.info("End delete deleteByFdrAndPspId"); + this.addToConversionQueue(internalPublish, fdrEntity); + + // todo: handles deletes, check insert overwrites + // fdrEntity.delete(); +// log.infof( +// "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); + // FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); +// log.info("End delete deleteByFdrAndPspId"); + this.rePublish(fdr, pspId, fdrPublishEntity); }) .exceptionally(e -> { From f643956d8fe72ef7c4060f12cd7b9810062c4565 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 25 Oct 2024 16:11:40 +0000 Subject: [PATCH 23/47] Bump to version 1.0.21-9-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 96b4810a..ad937777 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.36.0" -appVersion: "1.0.21-8-PAGOPA-2282" +version: "1.37.0" +appVersion: "1.0.21-9-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 61f9c9ef..98b4bd5f 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-8-PAGOPA-2282 + tag: 1.0.21-9-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index e6a8a4c4..ec5714dc 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-8-PAGOPA-2282 + tag: 1.0.21-9-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index a95a3811..b41e27de 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-8-PAGOPA-2282" + "version": "1.0.21-9-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index d99849c0..b6c5149d 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-8-PAGOPA-2282" + "version": "1.0.21-9-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 690660e5..e706f269 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-8-PAGOPA-2282" + "version": "1.0.21-9-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index f865e046..1fdb24b4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-8-PAGOPA-2282 + 1.0.21-9-PAGOPA-2282 3.11.0 1.18.26 From 816f8be8d070ce2af1be251a4aa9ef9cdc8ab25d Mon Sep 17 00:00:00 2001 From: Francesco Cesareo Date: Fri, 25 Oct 2024 20:00:30 +0200 Subject: [PATCH 24/47] draft of delete batch --- .../fdr/FdrPaymentPublishEntityReactive.java | 11 +- .../fdr/service/history/HistoryService.java | 1 - .../pagopa/fdr/service/psps/PspsService.java | 109 +++++++++++------- 3 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java index b6bde95a..ddf17536 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java @@ -3,18 +3,17 @@ import io.quarkus.mongodb.panache.common.MongoEntity; import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity; import io.smallrye.mutiny.Uni; +import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; -import java.util.List; - @Data @EqualsAndHashCode(callSuper = true) @MongoEntity(collection = "fdr_payment_publish") public class FdrPaymentPublishEntityReactive extends ReactivePanacheMongoEntity { - // Reactive persistence method for FdrPaymentPublishEntity objects - public static Uni persistFdrPaymentPublishEntities(List entities) { - return persist(entities); - } + // Reactive persistence method for FdrPaymentPublishEntity objects + public static Uni persistFdrPaymentPublishEntities(List entities) { + return persist(entities); + } } diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java index ce245eb9..941086a3 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java @@ -33,7 +33,6 @@ import java.io.IOException; import java.time.Instant; import java.util.*; -import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 97a2b420..7f103a6f 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -34,6 +34,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; +import java.util.stream.IntStream; import org.jboss.logging.Logger; import org.jboss.logging.MDC; @@ -329,30 +330,51 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrPublishEntity.persistEntity(); log.info("Starting saveOnStorage storage on BlobStorage of FDR payment entities"); - CompletableFuture executeSaveOnStorage = CompletableFuture.supplyAsync(() -> { - historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); - log.info("Async saveOnStorage successful executed"); - return true; - }); + CompletableFuture executeSaveOnStorage = + CompletableFuture.supplyAsync( + () -> { + historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); + log.info("Async saveOnStorage successful executed"); + return true; + }); executeSaveOnStorage - .thenAccept(value -> { - log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - - this.addToConversionQueue(internalPublish, fdrEntity); - - // todo: handles deletes, check insert overwrites - // fdrEntity.delete(); -// log.infof( -// "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); - // FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); -// log.info("End delete deleteByFdrAndPspId"); - - this.rePublish(fdr, pspId, fdrPublishEntity); - }) - .exceptionally(e -> { - log.error("Exception during async saveOnStorage: ", e); - return null; - }); + .thenAccept( + value -> { + log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); + + this.addToConversionQueue(internalPublish, fdrEntity); + + // todo: handles deletes, check insert overwrites + fdrEntity.delete(); + log.infof( + "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", + fdrEntity.getRevision(), fdr, pspId); + int batchSize = 1000; + List> batches = + IntStream.range(0, (paymentInsertEntities.size() + batchSize - 1) / batchSize) + .mapToObj( + i -> + paymentInsertEntities.subList( + i * batchSize, + Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) + .toList(); + batches.parallelStream().forEach(batch -> deleteAllInBatch(fdr, batch)); + + // FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); + log.info("End delete deleteByFdrAndPspId"); + + this.rePublish(fdr, pspId, fdrPublishEntity); + }) + .exceptionally( + e -> { + log.error("Exception during async saveOnStorage: ", e); + return null; + }); + } + + private void deleteAllInBatch(String fdr, List items) { + List indexes = items.stream().map(FdrPaymentInsertEntity::getIndex).toList(); + FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); } private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { @@ -362,13 +384,13 @@ private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEn } else { log.info("Starting add FdrInsertEntity in queue fdr message"); conversionQueue.addQueueFlowMessage( - FdrMessage.builder() - .fdr(fdrEntity.getFdr()) - .pspId(fdrEntity.getSender().getPspId()) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .retry(0L) - .revision(fdrEntity.getRevision()) - .build()); + FdrMessage.builder() + .fdr(fdrEntity.getFdr()) + .pspId(fdrEntity.getSender().getPspId()) + .organizationId(fdrEntity.getReceiver().getOrganizationId()) + .retry(0L) + .revision(fdrEntity.getRevision()) + .build()); log.info("End add FdrInsertEntity in queue fdr message"); } } @@ -378,23 +400,22 @@ private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEnti String sessionId = (String) MDC.get(TRX_ID); MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus(FdrStatusEnum.PUBLISHED) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrPublishEntity.getReceiver().getOrganizationId()) - .revision(fdrPublishEntity.getRevision()) - .fdrAction(FdrActionEnum.PUBLISH) - .build()); + ReInternal.builder() + .serviceIdentifier(AppVersionEnum.FDR003) + .created(Instant.now()) + .sessionId(sessionId) + .eventType(EventTypeEnum.INTERNAL) + .fdrPhysicalDelete(false) + .fdrStatus(FdrStatusEnum.PUBLISHED) + .fdr(fdr) + .pspId(pspId) + .organizationId(fdrPublishEntity.getReceiver().getOrganizationId()) + .revision(fdrPublishEntity.getRevision()) + .fdrAction(FdrActionEnum.PUBLISH) + .build()); log.info("End write to re"); } - @WithSpan(kind = SERVER) public void deleteByFdr(String action, String pspId, String fdr) { log.infof(AppMessageUtil.logExecute(action)); From 24b31bab7029b690e7bcd0191d9c0fe5506fc314 Mon Sep 17 00:00:00 2001 From: "angelo.caporaso" Date: Mon, 28 Oct 2024 10:38:49 +0100 Subject: [PATCH 25/47] [PAGOPA-2282] refactoring: Batch operations --- .../fdr/FdrPaymentPublishEntity.java | 5 +++ .../pagopa/fdr/service/psps/PspsService.java | 34 +++++++++++-------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java index 26e5026e..1c3558b5 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java @@ -6,6 +6,7 @@ import io.quarkus.mongodb.panache.common.MongoEntity; import io.quarkus.panache.common.Parameters; import io.quarkus.panache.common.Sort; +import io.smallrye.mutiny.Uni; import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; import java.time.Instant; import java.util.List; @@ -98,4 +99,8 @@ public static PanacheQuery findByPspAndIuvIur( } return find(query, sort, params); } + + public static void persistFdrPaymentPublishEntities(List fdrPaymentPublishEntities) { + persist(fdrPaymentPublishEntities); + } } diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 7f103a6f..68f61a55 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -320,7 +320,13 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); log.info("Starting persistent storage on Mongo of FDR payment entities"); - FdrPaymentPublishEntityReactive.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); + // FdrPaymentPublishEntityReactive.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); + int batchSizePub = 1000; + List> batchesPublish = IntStream + .range(0, (fdrPaymentPublishEntities.size() + batchSizePub - 1) / batchSizePub) + .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSizePub, Math.min((i + 1) * batchSizePub, fdrPaymentPublishEntities.size()))) + .toList(); + batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); log.info("End of persistent storage on Mongo of FDR payment entities"); // salva su storage dello storico @@ -349,17 +355,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern log.infof( "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdrEntity.getRevision(), fdr, pspId); - int batchSize = 1000; - List> batches = - IntStream.range(0, (paymentInsertEntities.size() + batchSize - 1) / batchSize) - .mapToObj( - i -> - paymentInsertEntities.subList( - i * batchSize, - Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) - .toList(); - batches.parallelStream().forEach(batch -> deleteAllInBatch(fdr, batch)); - + deleteAllInBatch(fdr, paymentInsertEntities); // FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); log.info("End delete deleteByFdrAndPspId"); @@ -372,9 +368,17 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern }); } - private void deleteAllInBatch(String fdr, List items) { - List indexes = items.stream().map(FdrPaymentInsertEntity::getIndex).toList(); - FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); + private void deleteAllInBatch(String fdr, List paymentInsertEntities) { + int batchSize = 1000; + List> batches = IntStream + .range(0, (paymentInsertEntities.size() + batchSize - 1) / batchSize) + .mapToObj(i -> paymentInsertEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) + .toList(); + + batches.parallelStream().forEach(batch -> { + List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); + FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); + }); } private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { From 924ae47eed0e57f38876d5e75223d9e0ac7b617e Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Mon, 28 Oct 2024 09:55:52 +0000 Subject: [PATCH 26/47] Bump to version 1.0.21-10-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index ad937777..635ebc9d 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.37.0" -appVersion: "1.0.21-9-PAGOPA-2282" +version: "1.38.0" +appVersion: "1.0.21-10-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 98b4bd5f..665086c7 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-9-PAGOPA-2282 + tag: 1.0.21-10-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index ec5714dc..1e4390e2 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-9-PAGOPA-2282 + tag: 1.0.21-10-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index b41e27de..b3ac5d6a 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-9-PAGOPA-2282" + "version": "1.0.21-10-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index b6c5149d..4e116fe5 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-9-PAGOPA-2282" + "version": "1.0.21-10-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index e706f269..196719d5 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-9-PAGOPA-2282" + "version": "1.0.21-10-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 1fdb24b4..2b1d1e0f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-9-PAGOPA-2282 + 1.0.21-10-PAGOPA-2282 3.11.0 1.18.26 From d452397af52ef86f0d14c11754ad4b25e3f8bca0 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:41:53 +0100 Subject: [PATCH 27/47] [PAGOPA-2282] refactoring: Sequential stream --- src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 68f61a55..c97ce2f8 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -375,7 +375,8 @@ private void deleteAllInBatch(String fdr, List paymentIn .mapToObj(i -> paymentInsertEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) .toList(); - batches.parallelStream().forEach(batch -> { + // sequential stream + batches.forEach(batch -> { List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); }); From 89bcc4e845294dedcb8d0f326ea7c2b875a4688a Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Mon, 28 Oct 2024 10:43:50 +0000 Subject: [PATCH 28/47] Bump to version 1.0.21-11-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 635ebc9d..4f09f5c7 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.38.0" -appVersion: "1.0.21-10-PAGOPA-2282" +version: "1.39.0" +appVersion: "1.0.21-11-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 665086c7..2e5d6894 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-10-PAGOPA-2282 + tag: 1.0.21-11-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 1e4390e2..4867ce24 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-10-PAGOPA-2282 + tag: 1.0.21-11-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index b3ac5d6a..4617f33b 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-10-PAGOPA-2282" + "version": "1.0.21-11-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 4e116fe5..1c74fb63 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-10-PAGOPA-2282" + "version": "1.0.21-11-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 196719d5..68ede76d 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-10-PAGOPA-2282" + "version": "1.0.21-11-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 2b1d1e0f..0bb460e7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-10-PAGOPA-2282 + 1.0.21-11-PAGOPA-2282 3.11.0 1.18.26 From 5c8579df73ea0795d321da5c3392056eebb6ccac Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:28:56 +0100 Subject: [PATCH 29/47] [PAGOPA-2282] refactoring --- .../pagopa/fdr/service/psps/PspsService.java | 49 ++++++++----------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index c97ce2f8..07800779 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -303,8 +303,6 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrEntity.getComputedSumPayments()); } - log.debug("FdrInsertEntity PUBLISHED"); - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, pspId); List paymentInsertEntities = FdrPaymentInsertEntity.findByFdrAndPspId(fdr, pspId) @@ -316,49 +314,33 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrPublishEntity.setUpdated(now); fdrPublishEntity.setPublished(now); fdrPublishEntity.setStatus(FdrStatusEnumEntity.PUBLISHED); - List fdrPaymentPublishEntities = - mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); + List fdrPaymentPublishEntities = mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); - log.info("Starting persistent storage on Mongo of FDR payment entities"); - // FdrPaymentPublishEntityReactive.persistFdrPaymentPublishEntities(fdrPaymentPublishEntities); - int batchSizePub = 1000; - List> batchesPublish = IntStream - .range(0, (fdrPaymentPublishEntities.size() + batchSizePub - 1) / batchSizePub) - .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSizePub, Math.min((i + 1) * batchSizePub, fdrPaymentPublishEntities.size()))) - .toList(); - batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); - log.info("End of persistent storage on Mongo of FDR payment entities"); + // writes in fdr_payment_publish collection + this.parallelPersist(fdr, fdrPaymentPublishEntities); - // salva su storage dello storico + // save as JSON file in history storage HistoryBlobBody body = historyService.saveJsonFile(fdrPublishEntity, fdrPaymentPublishEntities); fdrPublishEntity.setRefJson(body); fdrPublishEntity.persistEntity(); - log.info("Starting saveOnStorage storage on BlobStorage of FDR payment entities"); CompletableFuture executeSaveOnStorage = CompletableFuture.supplyAsync( () -> { historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); - log.info("Async saveOnStorage successful executed"); return true; }); executeSaveOnStorage .thenAccept( value -> { - log.info("End of saveOnStorage storage on BlobStorage of FDR payment entities"); - + // queue this.addToConversionQueue(internalPublish, fdrEntity); - - // todo: handles deletes, check insert overwrites + // delete fdrEntity.delete(); - log.infof( - "Delete FdrPaymentInsertEntity by fdr[%s], pspId[%s]", - fdrEntity.getRevision(), fdr, pspId); - deleteAllInBatch(fdr, paymentInsertEntities); - // FdrPaymentInsertEntity.deleteByFdrAndPspId(fdr, pspId); - log.info("End delete deleteByFdrAndPspId"); - + this.batchDelete(fdr, paymentInsertEntities); + log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, pspId); + // re this.rePublish(fdr, pspId, fdrPublishEntity); }) .exceptionally( @@ -368,13 +350,12 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern }); } - private void deleteAllInBatch(String fdr, List paymentInsertEntities) { + private void batchDelete(String fdr, List paymentInsertEntities) { int batchSize = 1000; List> batches = IntStream .range(0, (paymentInsertEntities.size() + batchSize - 1) / batchSize) .mapToObj(i -> paymentInsertEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) .toList(); - // sequential stream batches.forEach(batch -> { List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); @@ -382,6 +363,16 @@ private void deleteAllInBatch(String fdr, List paymentIn }); } + private void parallelPersist(String fdr, List fdrPaymentPublishEntities) { + int batchSize = 1000; + List> batchesPublish = IntStream + .range(0, (fdrPaymentPublishEntities.size() + batchSize - 1) / batchSize) + .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, fdrPaymentPublishEntities.size()))) + .toList(); + batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); + log.infof("Published fdrPaymentPublishEntities of fdr[%s]", fdr); + } + private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { // add to conversion queue if (internalPublish) { From f958264689a1d221551e76ed1645863c94120af6 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Mon, 28 Oct 2024 13:31:05 +0000 Subject: [PATCH 30/47] Bump to version 1.0.21-12-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 4f09f5c7..e25e91ba 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.39.0" -appVersion: "1.0.21-11-PAGOPA-2282" +version: "1.40.0" +appVersion: "1.0.21-12-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 2e5d6894..8115ffb8 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-11-PAGOPA-2282 + tag: 1.0.21-12-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 4867ce24..96067e57 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-11-PAGOPA-2282 + tag: 1.0.21-12-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 4617f33b..55b1d413 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-11-PAGOPA-2282" + "version": "1.0.21-12-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 1c74fb63..28a38268 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-11-PAGOPA-2282" + "version": "1.0.21-12-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 68ede76d..58ca1dad 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-11-PAGOPA-2282" + "version": "1.0.21-12-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 0bb460e7..403c7bc3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-11-PAGOPA-2282 + 1.0.21-12-PAGOPA-2282 3.11.0 1.18.26 From e00d7db7ebac0b2daf1d0bc941f632ee17834e31 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:49:12 +0100 Subject: [PATCH 31/47] [PAGOPA-2282] test: Add py test --- performance-test/python-test/main.py | 44 ++++++++++ performance-test/python-test/methods.py | 106 ++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 performance-test/python-test/main.py create mode 100644 performance-test/python-test/methods.py diff --git a/performance-test/python-test/main.py b/performance-test/python-test/main.py new file mode 100644 index 00000000..5828067e --- /dev/null +++ b/performance-test/python-test/main.py @@ -0,0 +1,44 @@ +import sys +import logging, time +import methods + + +NUMBER_OF_PAYMENTS = 5000 +MAX_PAYMENTS_PER_ADD_OPERATION = 1000 + +def main(URL, subkey): + logging.basicConfig(level=logging.INFO) + + flow_date = "2024-10-15" + tmstmp = timestamp = int(time.time()) + flow_name = f"{flow_date}88888888888-{tmstmp}" + + create_url = URL + f"/psps/88888888888/fdrs/{flow_name}" + methods.create_empty_flow(create_url, flow_name, flow_date, NUMBER_OF_PAYMENTS, subkey) + + + add_url = URL + f"/psps/88888888888/fdrs/{flow_name}/payments/add" + methods.add_payments(add_url, NUMBER_OF_PAYMENTS, MAX_PAYMENTS_PER_ADD_OPERATION, flow_date, subkey) + + + publish_url = URL + f"/psps/88888888888/fdrs/{flow_name}/publish" + methods.publish_payments(publish_url, subkey) + +def get_url(env): + if env == 'dev': + return "https://api.dev.platform.pagopa.it/fdr-psp/service/v1" + elif env == 'uat': + return "https://upload.uat.platform.pagopa.it/fdr-psp/service/v1" + else: + raise ValueError(f"Invalid environment: {env}. Please use 'dev' or 'uat'.") + +if __name__ == "__main__": + try: + env = sys.argv[1] + key = sys.argv[2] + url = get_url(env) + main(url, key) + except IndexError: + print("Usage: python3 main.py \ni.e. python3 main.py dev your-key") + except ValueError as e: + print(e) \ No newline at end of file diff --git a/performance-test/python-test/methods.py b/performance-test/python-test/methods.py new file mode 100644 index 00000000..4211c062 --- /dev/null +++ b/performance-test/python-test/methods.py @@ -0,0 +1,106 @@ +import json, logging, requests, time +import utility + + +def create_empty_flow(url, flow_name, flow_date, total_payments, key): + + headers = { + "Ocp-Apim-Subscription-Key": key + } + request = { + "fdr": flow_name, + "fdrDate": f"{flow_date}T12:00:00.000Z", + "sender": { + "type": "LEGAL_PERSON", + "id": "SELBIT2B", + "pspId": "88888888888", + "pspName": "Bank", + "pspBrokerId": "88888888888", + "channelId": "88888888888_01", + "password": "PLACEHOLDER" + }, + "receiver": { + "id": "APPBIT2B", + "organizationId": "15376371009", + "organizationName": "PagoPA" + }, + "regulation": "SEPA - Bonifico xzy", + "regulationDate": f"{flow_date}T12:00:00.000Z", + "bicCodePouringBank": "UNCRITMMXXX", + "totPayments": total_payments, + "sumPayments": total_payments * 10 + } + logging.info(f"\nSend request to: [{url}]\nRequest: [{request}]") + start_time = time.time() + response = requests.post(url=url, + data=json.dumps(request), + headers=headers) + end_time = time.time() + logging.info(f"=====\nElapsed time: [{(end_time - start_time):.3f} sec] Status Code: [{response.status_code}]\nResponse: {response.json()}\n==================") + + + +def add_payments(url, total_payments, max_per_add, date, key): + + headers = { + "Ocp-Apim-Subscription-Key": key + } + + total_amount = total_payments * 10 + payments = generate_payments(total_payments, total_amount, date) + request = [] + + total_requests = int(total_payments / max_per_add) + for req_idx in range(total_requests): + extracted_payments = { + "payments": payments[(req_idx * max_per_add):(req_idx * max_per_add + max_per_add)] + } + request = json.dumps(extracted_payments) + logging.info(f"\nSend request to: [{url}]\nRequest: [TOO LONG]") + start_time = time.time() + response = requests.put(url=url, + data=request, + headers=headers) + end_time = time.time() + logging.info(f"=====\nElapsed time: [{(end_time - start_time):.3f} sec] Status Code: [{response.status_code}]\nResponse: {response.json()}\n==================") + + +def publish_payments(url, key): + headers = { + "Ocp-Apim-Subscription-Key": key + } + logging.info(f"\nSend request to: [{url}]") + start_time = time.time() + response = requests.post(url=url, + headers=headers) + end_time = time.time() + logging.info(f"=====\nElapsed time: [{(end_time - start_time):.3f} sec] Status Code: [{response.status_code}]\nResponse: {response.json()}\n==================") + + +######### +# UTILS # +######### +def generate_payments(number_of_payments, total_amount, date): + + payments = [] + iuvs = set() + for idx in range(number_of_payments): + iuv = utility.get_random_numeric_string(15) + if iuv not in iuvs: + iuvs.add(iuv) + payments.append({ + "index": idx + 1, + "iuv": iuv, + "iur": utility.get_random_numeric_string(11), + "pay": total_amount / number_of_payments, + "idTransfer": 1, + "payStatus": "EXECUTED", + "payDate": f"{date}T12:00:00.000Z" + }) + else: + idx -= 1 + return payments + +def get_random_numeric_string(size, dataset = "0123456789"): + random_string = ''.join(random.choices(dataset, k=size)) + return random_string \ No newline at end of file From 01a8a7fc5243d21b844f2b8fdcc7a4083b04fb0c Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:55:39 +0100 Subject: [PATCH 32/47] Fix code scanning alert no. 727: Log Injection Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../java/it/gov/pagopa/fdr/service/psps/PspsService.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 07800779..77c006f4 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -273,6 +273,10 @@ public void deletePayment( } @WithSpan(kind = SERVER) + private String sanitize(String input) { + return input.replaceAll("[\\n\\r\\t]", "_"); + } + public void publishByFdr(String action, String pspId, String fdr, boolean internalPublish) { log.infof(AppMessageUtil.logExecute(action)); @@ -303,7 +307,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrEntity.getComputedSumPayments()); } - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, pspId); + log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, sanitize(pspId)); List paymentInsertEntities = FdrPaymentInsertEntity.findByFdrAndPspId(fdr, pspId) .project(FdrPaymentInsertEntity.class) @@ -339,7 +343,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern // delete fdrEntity.delete(); this.batchDelete(fdr, paymentInsertEntities); - log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, pspId); + log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, sanitize(pspId)); // re this.rePublish(fdr, pspId, fdrPublishEntity); }) From 2178f5de5263537e9aeb9a300f46358ccab79bf4 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Mon, 28 Oct 2024 18:02:43 +0100 Subject: [PATCH 33/47] Fix code scanning alert no. 729: Log Injection Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 77c006f4..6e61f75d 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -307,7 +307,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrEntity.getComputedSumPayments()); } - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, sanitize(pspId)); + log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", sanitize(fdr), sanitize(pspId)); List paymentInsertEntities = FdrPaymentInsertEntity.findByFdrAndPspId(fdr, pspId) .project(FdrPaymentInsertEntity.class) From 180faf532cf3ddbaa8953f6e005779b5177dfd40 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Wed, 30 Oct 2024 10:43:12 +0100 Subject: [PATCH 34/47] [PAGOPA-2282] fix --- performance-test/python-test/main.py | 4 ++-- performance-test/python-test/methods.py | 6 +++--- .../fdr/FdrPaymentInsertEntity.java | 6 ++++++ .../fdr/FdrPaymentPublishEntityReactive.java | 19 ------------------- .../pagopa/fdr/service/psps/PspsService.java | 15 +++++++-------- src/main/resources/application.properties | 5 ----- 6 files changed, 18 insertions(+), 37 deletions(-) delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java diff --git a/performance-test/python-test/main.py b/performance-test/python-test/main.py index 5828067e..ee087c97 100644 --- a/performance-test/python-test/main.py +++ b/performance-test/python-test/main.py @@ -3,13 +3,13 @@ import methods -NUMBER_OF_PAYMENTS = 5000 +NUMBER_OF_PAYMENTS = 30000 MAX_PAYMENTS_PER_ADD_OPERATION = 1000 def main(URL, subkey): logging.basicConfig(level=logging.INFO) - flow_date = "2024-10-15" + flow_date = "2024-10-30" tmstmp = timestamp = int(time.time()) flow_name = f"{flow_date}88888888888-{tmstmp}" diff --git a/performance-test/python-test/methods.py b/performance-test/python-test/methods.py index 4211c062..3045161e 100644 --- a/performance-test/python-test/methods.py +++ b/performance-test/python-test/methods.py @@ -1,5 +1,5 @@ +import random import json, logging, requests, time -import utility def create_empty_flow(url, flow_name, flow_date, total_payments, key): @@ -85,13 +85,13 @@ def generate_payments(number_of_payments, total_amount, date): payments = [] iuvs = set() for idx in range(number_of_payments): - iuv = utility.get_random_numeric_string(15) + iuv = get_random_numeric_string(15) if iuv not in iuvs: iuvs.add(iuv) payments.append({ "index": idx + 1, "iuv": iuv, - "iur": utility.get_random_numeric_string(11), + "iur": get_random_numeric_string(11), "pay": total_amount / number_of_payments, "idTransfer": 1, "payStatus": "EXECUTED", diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java index f9fdbecf..fffc5c97 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java @@ -67,6 +67,12 @@ public static PanacheQuery findByFdrAndPspId(String fdr, Parameters.with("fdr", fdr).and("pspId", pspId).map()); } + public static void deleteByFdrAndIds(String fdr, List objectIds) { + delete( + "ref_fdr = :fdr and _id in :objectIds", + Parameters.with("fdr", fdr).and("ids", objectIds).map()); + } + public static long deleteByFdrAndIndexes(String fdr, List indexList) { return delete( "ref_fdr = :fdr and index in :indexes", diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java deleted file mode 100644 index ddf17536..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntityReactive.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr; - -import io.quarkus.mongodb.panache.common.MongoEntity; -import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity; -import io.smallrye.mutiny.Uni; -import java.util.List; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@Data -@EqualsAndHashCode(callSuper = true) -@MongoEntity(collection = "fdr_payment_publish") -public class FdrPaymentPublishEntityReactive extends ReactivePanacheMongoEntity { - - // Reactive persistence method for FdrPaymentPublishEntity objects - public static Uni persistFdrPaymentPublishEntities(List entities) { - return persist(entities); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 6e61f75d..26ab1cee 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -35,6 +35,7 @@ import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.IntStream; +import org.bson.types.ObjectId; import org.jboss.logging.Logger; import org.jboss.logging.MDC; @@ -362,8 +363,8 @@ private void batchDelete(String fdr, List paymentInsertE .toList(); // sequential stream batches.forEach(batch -> { - List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); - FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); + List objectIds = paymentInsertEntities.stream().map(entity -> entity.id).toList(); + FdrPaymentInsertEntity.deleteByFdrAndIds(fdr, objectIds); }); } @@ -374,15 +375,15 @@ private void parallelPersist(String fdr, List fdrPaymen .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, fdrPaymentPublishEntities.size()))) .toList(); batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); - log.infof("Published fdrPaymentPublishEntities of fdr[%s]", fdr); + log.debugf("Published fdrPaymentPublishEntities of fdr[%s]", fdr); } private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { // add to conversion queue if (internalPublish) { - log.info("NOT Add FdrInsertEntity in queue fdr message"); + log.debugf("NOT Add FdrInsertEntity in queue fdr message"); } else { - log.info("Starting add FdrInsertEntity in queue fdr message"); + log.debugf("Starting add FdrInsertEntity in queue fdr message"); conversionQueue.addQueueFlowMessage( FdrMessage.builder() .fdr(fdrEntity.getFdr()) @@ -391,12 +392,11 @@ private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEn .retry(0L) .revision(fdrEntity.getRevision()) .build()); - log.info("End add FdrInsertEntity in queue fdr message"); + log.debugf("End add FdrInsertEntity in queue fdr message"); } } private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEntity) { - log.info("Starting write to re"); String sessionId = (String) MDC.get(TRX_ID); MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); reService.sendEvent( @@ -413,7 +413,6 @@ private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEnti .revision(fdrPublishEntity.getRevision()) .fdrAction(FdrActionEnum.PUBLISH) .build()); - log.info("End write to re"); } @WithSpan(kind = SERVER) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index da9a9a02..83107936 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -69,11 +69,6 @@ quarkus.mongodb.connection-string=${MONGODB_CONNECTION_STRING:${mockserver.mongo %dev.quarkus.mongodb.connection-string=mongodb://root:example@localhost:27017/ quarkus.mongodb.database=fdr -################### -## Vert.x -################### -# quarkus.vertx.max-event-loop-execute-time=2s - ################### ## ADAPTER API CONFIG CACHE ################### From 299f981d91add3beaf8f5c94fece3c45efb119f9 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Wed, 30 Oct 2024 09:45:42 +0000 Subject: [PATCH 35/47] Bump to version 1.0.21-13-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index e25e91ba..8ccf83ac 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.40.0" -appVersion: "1.0.21-12-PAGOPA-2282" +version: "1.41.0" +appVersion: "1.0.21-13-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 8115ffb8..d9f388bb 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-12-PAGOPA-2282 + tag: 1.0.21-13-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 96067e57..e958729b 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-12-PAGOPA-2282 + tag: 1.0.21-13-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 55b1d413..9666c26a 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-12-PAGOPA-2282" + "version": "1.0.21-13-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 28a38268..e2eda86b 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-12-PAGOPA-2282" + "version": "1.0.21-13-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 58ca1dad..7116a85a 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-12-PAGOPA-2282" + "version": "1.0.21-13-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 403c7bc3..8dfeb8d9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-12-PAGOPA-2282 + 1.0.21-13-PAGOPA-2282 3.11.0 1.18.26 From 6d4fa5a89cd1a658e2fea837627586ad5ec7e9ae Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:28:10 +0100 Subject: [PATCH 36/47] [PAGOPA-2282] fix --- src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 26ab1cee..0157b9bc 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -273,7 +273,6 @@ public void deletePayment( .build()); } - @WithSpan(kind = SERVER) private String sanitize(String input) { return input.replaceAll("[\\n\\r\\t]", "_"); } From 581d965064beae6fe5a20702f1fd4ec98f1bb23e Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Wed, 30 Oct 2024 10:29:24 +0000 Subject: [PATCH 37/47] Bump to version 1.0.21-14-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 8ccf83ac..70593a83 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.41.0" -appVersion: "1.0.21-13-PAGOPA-2282" +version: "1.42.0" +appVersion: "1.0.21-14-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index d9f388bb..de2210e5 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-13-PAGOPA-2282 + tag: 1.0.21-14-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index e958729b..5906e1a6 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-13-PAGOPA-2282 + tag: 1.0.21-14-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 9666c26a..59edea5f 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-13-PAGOPA-2282" + "version": "1.0.21-14-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index e2eda86b..e93838fe 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-13-PAGOPA-2282" + "version": "1.0.21-14-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 7116a85a..a75adf9c 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-13-PAGOPA-2282" + "version": "1.0.21-14-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 8dfeb8d9..7622e3f8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-13-PAGOPA-2282 + 1.0.21-14-PAGOPA-2282 3.11.0 1.18.26 From 0395bdea7854e354e61586386f831999303207b3 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Wed, 30 Oct 2024 15:08:43 +0100 Subject: [PATCH 38/47] [PAGOPA-2282] fix(delete-by-index): Add smallrye-fault-tolerance --- README.md | 5 +++++ performance-test/python-test/main.py | 4 ++-- pom.xml | 4 ++++ .../fdr/repository/fdr/FdrPaymentInsertEntity.java | 10 ++++------ .../it/gov/pagopa/fdr/service/psps/PspsService.java | 6 +++--- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index c4128509..37f9a7ac 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,11 @@ You can run your application in dev mode that enables live coding using: ```shell script ./mvnw compile quarkus:dev ``` +Otherwise, with quarkus CLI: +``` +brew install quarkusio/tap/quarkus +quarkus dev -DskipTests=true +``` > **_NOTE:_** Quarkus now ships with a Dev UI, which is available in dev mode only > at http://localhost:8080/q/dev/. diff --git a/performance-test/python-test/main.py b/performance-test/python-test/main.py index ee087c97..4929a35f 100644 --- a/performance-test/python-test/main.py +++ b/performance-test/python-test/main.py @@ -3,8 +3,8 @@ import methods -NUMBER_OF_PAYMENTS = 30000 -MAX_PAYMENTS_PER_ADD_OPERATION = 1000 +NUMBER_OF_PAYMENTS = 300 +MAX_PAYMENTS_PER_ADD_OPERATION = 100 def main(URL, subkey): logging.basicConfig(level=logging.INFO) diff --git a/pom.xml b/pom.xml index 7622e3f8..cb8408c5 100644 --- a/pom.xml +++ b/pom.xml @@ -131,6 +131,10 @@ 1.0.0 provided + + io.quarkus + quarkus-smallrye-fault-tolerance + org.testcontainers junit-jupiter diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java index fffc5c97..16e581d4 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java @@ -8,11 +8,13 @@ import io.quarkus.panache.common.Sort; import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; import org.bson.codecs.pojo.annotations.BsonProperty; import org.bson.types.ObjectId; +import org.eclipse.microprofile.faulttolerance.Retry; @Data @EqualsAndHashCode(callSuper = true) @@ -67,12 +69,8 @@ public static PanacheQuery findByFdrAndPspId(String fdr, Parameters.with("fdr", fdr).and("pspId", pspId).map()); } - public static void deleteByFdrAndIds(String fdr, List objectIds) { - delete( - "ref_fdr = :fdr and _id in :objectIds", - Parameters.with("fdr", fdr).and("ids", objectIds).map()); - } - + // https://quarkus.io/guides/smallrye-fault-tolerance + @Retry(delay = 500, delayUnit = ChronoUnit.MILLIS) public static long deleteByFdrAndIndexes(String fdr, List indexList) { return delete( "ref_fdr = :fdr and index in :indexes", diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 0157b9bc..44838ff9 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -341,8 +341,8 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern // queue this.addToConversionQueue(internalPublish, fdrEntity); // delete - fdrEntity.delete(); this.batchDelete(fdr, paymentInsertEntities); + fdrEntity.delete(); log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, sanitize(pspId)); // re this.rePublish(fdr, pspId, fdrPublishEntity); @@ -362,8 +362,8 @@ private void batchDelete(String fdr, List paymentInsertE .toList(); // sequential stream batches.forEach(batch -> { - List objectIds = paymentInsertEntities.stream().map(entity -> entity.id).toList(); - FdrPaymentInsertEntity.deleteByFdrAndIds(fdr, objectIds); + List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); + FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); }); } From a0fe020c07267673398f976b1a2c1dba39dfad33 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Wed, 30 Oct 2024 14:10:09 +0000 Subject: [PATCH 39/47] Bump to version 1.0.21-15-PAGOPA-2282 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 70593a83..a9e5e2e0 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.42.0" -appVersion: "1.0.21-14-PAGOPA-2282" +version: "1.43.0" +appVersion: "1.0.21-15-PAGOPA-2282" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index de2210e5..e93abf01 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-14-PAGOPA-2282 + tag: 1.0.21-15-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 5906e1a6..aa458dee 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-14-PAGOPA-2282 + tag: 1.0.21-15-PAGOPA-2282 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 59edea5f..523e3cab 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-14-PAGOPA-2282" + "version": "1.0.21-15-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index e93838fe..e5cbc075 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-14-PAGOPA-2282" + "version": "1.0.21-15-PAGOPA-2282" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index a75adf9c..7a3389bc 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-14-PAGOPA-2282" + "version": "1.0.21-15-PAGOPA-2282" }, "servers": [ { diff --git a/pom.xml b/pom.xml index cb8408c5..19683857 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-14-PAGOPA-2282 + 1.0.21-15-PAGOPA-2282 3.11.0 1.18.26 From c419bf645b9f591003952c17b06baacd975b0827 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:13:38 +0100 Subject: [PATCH 40/47] [PAGOPA-2282] fix(ingress): Rollback timeout --- helm/values-uat.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index aa458dee..a336c767 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -97,9 +97,9 @@ microservice-chart: path: /pagopa-fdr-service(/|$)(.*) # currently set ingress timeout to 50m, until async handling will be introduced annotations: - nginx.ingress.kubernetes.io/proxy-connect-timeout: "3000" - nginx.ingress.kubernetes.io/proxy-read-timeout: "3000" - nginx.ingress.kubernetes.io/proxy-send-timeout: "3000" - nginx.ingress.kubernetes.io/send_timeout: "3000" + nginx.ingress.kubernetes.io/proxy-connect-timeout: "300" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + nginx.ingress.kubernetes.io/send_timeout: "300" canaryDelivery: create: false From bbe74918c4d3410ef5163e432b5a9c802ffe8700 Mon Sep 17 00:00:00 2001 From: Angelo Caporaso <56113767+cap-ang@users.noreply.github.com> Date: Wed, 30 Oct 2024 16:25:26 +0100 Subject: [PATCH 41/47] [PAGOPA-2282] refactoring(utils): Add sanitize --- .../it/gov/pagopa/fdr/service/psps/PspsService.java | 12 +++++------- src/main/java/it/gov/pagopa/fdr/util/StringUtil.java | 7 +++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java index 44838ff9..044cd462 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java @@ -15,6 +15,7 @@ import it.gov.pagopa.fdr.repository.fdr.projection.FdrInsertProjection; import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishByPspProjection; import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishRevisionProjection; +import it.gov.pagopa.fdr.rest.validation.CommonValidationService; import it.gov.pagopa.fdr.service.conversion.ConversionService; import it.gov.pagopa.fdr.service.conversion.message.FdrMessage; import it.gov.pagopa.fdr.service.dto.*; @@ -25,6 +26,7 @@ import it.gov.pagopa.fdr.service.re.model.*; import it.gov.pagopa.fdr.util.AppDBUtil; import it.gov.pagopa.fdr.util.AppMessageUtil; +import it.gov.pagopa.fdr.util.StringUtil; import jakarta.enterprise.context.ApplicationScoped; import java.math.BigDecimal; import java.time.Instant; @@ -273,10 +275,6 @@ public void deletePayment( .build()); } - private String sanitize(String input) { - return input.replaceAll("[\\n\\r\\t]", "_"); - } - public void publishByFdr(String action, String pspId, String fdr, boolean internalPublish) { log.infof(AppMessageUtil.logExecute(action)); @@ -307,7 +305,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern fdrEntity.getComputedSumPayments()); } - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", sanitize(fdr), sanitize(pspId)); + log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", StringUtil.sanitize(fdr), StringUtil.sanitize(pspId)); List paymentInsertEntities = FdrPaymentInsertEntity.findByFdrAndPspId(fdr, pspId) .project(FdrPaymentInsertEntity.class) @@ -343,7 +341,7 @@ public void publishByFdr(String action, String pspId, String fdr, boolean intern // delete this.batchDelete(fdr, paymentInsertEntities); fdrEntity.delete(); - log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", fdr, sanitize(pspId)); + log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", StringUtil.sanitize(fdr), StringUtil.sanitize(pspId)); // re this.rePublish(fdr, pspId, fdrPublishEntity); }) @@ -374,7 +372,7 @@ private void parallelPersist(String fdr, List fdrPaymen .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, fdrPaymentPublishEntities.size()))) .toList(); batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); - log.debugf("Published fdrPaymentPublishEntities of fdr[%s]", fdr); + log.debugf("Published fdrPaymentPublishEntities of fdr[%s]", StringUtil.sanitize(fdr)); } private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { diff --git a/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java b/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java index 519e64c0..b624bfb9 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java +++ b/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java @@ -17,4 +17,11 @@ public static byte[] zip(String str) throws IOException { bais.close(); return compressed; } + + // Replace newline, carriage return, tab, single quote, double quote, and backslash characters + public static String sanitize(String input) { + if (input == null) + return null; + return input.replaceAll("[\\n\\r\\t'\"\\\\]", "_"); + } } From b89e45a4061141b0bd61d1e4d1f1a3b5c10865d5 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Wed, 30 Oct 2024 17:02:31 +0000 Subject: [PATCH 42/47] Bump to version 1.0.22 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index a9e5e2e0..b8e07bcb 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.43.0" -appVersion: "1.0.21-15-PAGOPA-2282" +version: "1.44.0" +appVersion: "1.0.22" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index e93abf01..e51b6ee1 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-15-PAGOPA-2282 + tag: 1.0.22 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index aa458dee..1bb26742 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.21-15-PAGOPA-2282 + tag: 1.0.22 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 523e3cab..27fdecf3 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-15-PAGOPA-2282" + "version": "1.0.22" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index e5cbc075..aa3e8cf9 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-15-PAGOPA-2282" + "version": "1.0.22" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 7a3389bc..60039209 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.21-15-PAGOPA-2282" + "version": "1.0.22" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 19683857..3174cb93 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.21-15-PAGOPA-2282 + 1.0.22 3.11.0 1.18.26 From 642b94918bd9e104a519dbce1c942ed665433806 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Wed, 30 Oct 2024 17:04:06 +0000 Subject: [PATCH 43/47] Bump to version 1.0.23 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index b8e07bcb..8d2412cc 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.44.0" -appVersion: "1.0.22" +version: "1.45.0" +appVersion: "1.0.23" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index e51b6ee1..ec0e9219 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.22 + tag: 1.0.23 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 1bb26742..6bcea45d 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.22 + tag: 1.0.23 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 27fdecf3..c159d5b3 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.22" + "version": "1.0.23" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index aa3e8cf9..a0cb1088 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.22" + "version": "1.0.23" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 60039209..e9f42024 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.22" + "version": "1.0.23" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 3174cb93..3112e24c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.22 + 1.0.23 3.11.0 1.18.26 From 6ac39026d36d9ed22b3ed5e0b1552c79fddb1670 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Fri, 29 Nov 2024 10:41:00 +0000 Subject: [PATCH 44/47] Bump to version 1.0.24 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 8d2412cc..71036733 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.45.0" -appVersion: "1.0.23" +version: "1.46.0" +appVersion: "1.0.24" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index ec0e9219..155e24f0 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.23 + tag: 1.0.24 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 6bcea45d..94d1d332 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.23 + tag: 1.0.24 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index c159d5b3..b66bbf26 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.23" + "version": "1.0.24" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index a0cb1088..32a35516 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.23" + "version": "1.0.24" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index e9f42024..4305fdc6 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.23" + "version": "1.0.24" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 3112e24c..1e16af65 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.23 + 1.0.24 3.11.0 1.18.26 From 7aba809fb5014953e332f3db03be394d45586152 Mon Sep 17 00:00:00 2001 From: "Andrea D." <117269497+andrea-deri@users.noreply.github.com> Date: Mon, 27 Jan 2025 10:53:02 +0100 Subject: [PATCH 45/47] [PAGOPA-2528] break: Entity migration and major project refactoring (#73) Co-authored-by: pagopa-github-bot --- .identity/.terraform.lock.hcl | 19 - .identity/00_data.tf | 14 +- .identity/03_github_environment.tf | 38 +- helm/Chart.yaml | 4 +- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 30 +- src/main/java/it/gov/pagopa/fdr/App.java | 110 +-- .../java/it/gov/pagopa/fdr/AppStartup.java | 45 +- src/main/java/it/gov/pagopa/fdr/Config.java | 8 +- .../pagopa/fdr/controller/InfoController.java | 19 + .../InternalOperationsController.java | 80 ++ .../controller/OrganizationsController.java | 75 ++ .../pagopa/fdr/controller/PspsController.java | 164 ++++ .../TechnicalSupportController.java | 58 ++ .../interfaces/annotation}/Re.java | 5 +- .../controller/IInfoController.java | 46 + .../IInternalOperationsController.java | 308 +++++++ .../controller/IOrganizationsController.java | 328 +++++++ .../controller/IPspsController.java | 676 ++++++++++++++ .../controller/ISupportController.java | 139 +++ .../exceptionhandler}/ExceptionMappers.java | 53 +- .../filter}/NoInternalSchemaFilter.java | 2 +- .../middleware}/filter/RequestFilter.java | 85 +- .../middleware}/filter/ResponseFilter.java | 79 +- .../ClientGZIPDecodingInterceptor.java | 2 +- .../model/common}/Metadata.java | 2 +- .../common/response}/GenericResponse.java | 2 +- .../model/common}/response/InfoResponse.java | 24 +- .../controller/model/error/ErrorMessage.java | 26 + .../model/error}/ErrorResponse.java | 21 +- .../model/flow/FlowByCICreated.java} | 12 +- .../model/flow/FlowByCIPublished.java} | 12 +- .../model/flow/FlowByPSP.java} | 12 +- .../model/flow/FlowBySenderAndReceiver.java} | 9 +- .../model/flow}/Receiver.java | 6 +- .../model/flow}/Sender.java | 7 +- .../flow/enums}/ReportingFlowStatusEnum.java | 2 +- .../model/flow/enums}/SenderTypeEnum.java | 2 +- .../flow/request/CreateFlowRequest.java} | 13 +- ...natedFlowsBySenderAndReceiverResponse.java | 19 + .../PaginatedFlowsCreatedResponse.java | 19 + .../PaginatedFlowsPublishedResponse.java | 19 + .../flow/response/PaginatedFlowsResponse.java | 19 + .../flow/response/PaginatedResponse.java | 16 + .../response/SingleFlowCreatedResponse.java} | 17 +- .../flow/response/SingleFlowResponse.java} | 17 +- .../model/payment}/Payment.java | 3 +- .../payment/enums/PaymentStatusEnum.java | 9 + .../payment}/request/AddPaymentRequest.java | 7 +- .../request/DeletePaymentRequest.java | 4 +- .../PaginatedPaymentsCreatedResponse.java} | 8 +- .../response/PaginatedPaymentsResponse.java} | 8 +- .../exception/AppErrorCodeMessageEnum.java | 90 -- .../AppErrorCodeMessageInterface.java | 11 - .../pagopa/fdr/exception/AppException.java | 36 - .../fdr/repository/FdrFlowRepository.java | 246 ++++++ .../fdr/repository/FdrPaymentRepository.java | 202 +++++ .../fdr/repository/common/Repository.java | 44 + .../common/RepositoryPagedResult.java | 16 + .../fdr/repository/common/SortField.java | 19 + .../entity/flow/BlobBodyReferenceEntity.java} | 5 +- .../repository/entity/flow/FdrFlowEntity.java | 82 ++ .../model => entity/flow}/ReceiverEntity.java | 2 +- .../model => entity/flow}/SenderEntity.java | 5 +- .../flow/projection/FdrFlowIdProjection.java | 15 + .../entity/payment/FdrPaymentEntity.java | 96 ++ .../entity/payment/ReferencedFdrEntity.java | 24 + .../fdr/repository/enums/FlowStatusEnum.java | 7 + .../enums/JsonSchemaVersionEnum.java | 5 + .../enums}/PaymentStatusEnum.java | 2 +- .../fdr/repository/enums/SenderTypeEnum.java | 7 + .../fdr/repository/fdr/FdrInsertEntity.java | 73 -- .../fdr/FdrPaymentInsertEntity.java | 106 --- .../fdr/FdrPaymentPublishEntity.java | 106 --- .../fdr/repository/fdr/FdrPublishEntity.java | 112 --- .../fdr/model/FdrStatusEnumEntity.java | 7 - .../fdr/model/PaymentStatusEnumEntity.java | 9 - .../fdr/model/SenderTypeEnumEntity.java | 7 - .../fdr/projection/FdrInsertProjection.java | 19 - .../projection/FdrPublishByPspProjection.java | 19 - .../fdr/projection/FdrPublishProjection.java | 19 - .../FdrPublishRevisionProjection.java | 12 - .../repository/fdr/projection/Receiver.java | 11 - .../fdr/repository/fdr/projection/Sender.java | 11 - .../pagopa/fdr/rest/info/InfoResource.java | 76 -- .../BaseOrganizationsResource.java | 159 ---- .../InternalOrganizationsResource.java | 153 ---- .../organizations/OrganizationsResource.java | 149 ---- .../OrganizationsResourceServiceMapper.java | 28 - .../response/GetAllResponse.java | 24 - ...nternalOrganizationsValidationService.java | 54 -- .../OrganizationsValidationService.java | 64 -- .../pagopa/fdr/rest/psps/BasePspResource.java | 320 ------- .../fdr/rest/psps/InternalPspsResource.java | 385 -------- .../pagopa/fdr/rest/psps/PspsResource.java | 376 -------- .../mapper/PspsResourceServiceMapper.java | 45 - .../psps/response/GetAllCreatedResponse.java | 24 - .../response/GetAllPublishedResponse.java | 24 - .../InternalPspValidationService.java | 60 -- .../validation/PspsValidationService.java | 150 ---- .../fdr/rest/support/SupportResource.java | 146 --- .../mapper/SupportResourceServiceMapper.java | 19 - .../response/FdrByPspIdIuvIurResponse.java | 24 - .../validation/CommonValidationService.java | 135 --- .../pagopa/fdr/rest/validation/ListSize.java | 33 - .../rest/validation/ListSizeValidator.java | 27 - .../gov/pagopa/fdr/service/FlowService.java | 361 ++++++++ .../fdr/service/HealthCheckService.java | 30 + .../service/{history => }/HistoryService.java | 42 +- .../pagopa/fdr/service/PaymentService.java | 380 ++++++++ .../fdr/service/{re => }/ReService.java | 32 +- .../fdr/service/TechnicalSupportService.java | 70 ++ .../service/conversion/ConversionService.java | 66 -- .../conversion/message/FdrMessage.java | 19 - .../pagopa/fdr/service/dto/AddPaymentDto.java | 12 - .../fdr/service/dto/DeletePaymentDto.java | 12 - .../fdr/service/dto/FdrAllCreatedDto.java | 16 - .../gov/pagopa/fdr/service/dto/FdrAllDto.java | 16 - .../fdr/service/dto/FdrAllPublishedDto.java | 16 - .../it/gov/pagopa/fdr/service/dto/FdrDto.java | 28 - .../fdr/service/dto/FdrGetCreatedDto.java | 40 - .../gov/pagopa/fdr/service/dto/FdrGetDto.java | 42 - .../fdr/service/dto/FdrGetPaymentDto.java | 16 - .../fdr/service/dto/FdrSimpleCreatedDto.java | 18 - .../pagopa/fdr/service/dto/FdrSimpleDto.java | 18 - .../service/dto/FdrSimplePublishedDto.java | 18 - .../fdr/service/dto/FdrStatusEnumDto.java | 7 - .../pagopa/fdr/service/dto/MetadataDto.java | 15 - .../service/dto/PaymentByPspIdIuvIurDTO.java | 15 - .../pagopa/fdr/service/dto/PaymentDto.java | 24 - .../dto/PaymentGetByPspIdIuvIurDTO.java | 13 - .../fdr/service/dto/PaymentStatusEnumDto.java | 9 - .../pagopa/fdr/service/dto/ReceiverDto.java | 15 - .../gov/pagopa/fdr/service/dto/SenderDto.java | 23 - .../fdr/service/dto/SenderTypeEnumDto.java | 7 - .../history/constants/HistoryConstants.java | 55 -- .../history/mapper/HistoryServiceMapper.java | 26 - .../history/model/FdrHistoryEntity.java | 55 -- .../model/FdrHistoryPaymentEntity.java | 52 -- .../history/model/JsonSchemaVersionEnum.java | 5 - .../service/middleware/mapper/FlowMapper.java | 174 ++++ .../middleware/mapper/PaymentMapper.java | 87 ++ .../mapper/TechnicalSupportMapper.java | 20 + .../validator/SemanticValidator.java | 231 +++++ .../validator/clause/BrokerPspValidator.java | 32 + .../validator/clause/ChannelValidator.java | 69 ++ .../clause/ComputedPaymentsValidator.java | 40 + .../clause/CreditorInstitutionValidator.java | 34 + .../clause/FlowNameFormatValidator.java | 42 + .../validator/clause/PspValidator.java | 32 + .../clause/PublishableStatusValidator.java | 26 + .../request/AddPaymentRequestValidator.java | 31 + .../request/CreateFlowRequestValidator.java | 38 + .../DeletePaymentRequestValidator.java | 30 + .../arguments/FindFlowsByFiltersArgs.java | 19 + .../arguments/FindPaymentsByFiltersArgs.java} | 6 +- .../model => model/re}/AppVersionEnum.java | 2 +- .../{re/model => model/re}/BlobHttpBody.java | 2 +- .../{re/model => model/re}/EventTypeEnum.java | 2 +- .../{re/model => model/re}/FdrActionEnum.java | 2 +- .../{re/model => model/re}/FdrStatusEnum.java | 2 +- .../fdr/service/model/re/HttpTypeEnum.java | 6 + .../{re/model => model/re}/ReAbstract.java | 2 +- .../{re/model => model/re}/ReInterface.java | 2 +- .../{re/model => model/re}/ReInternal.java | 3 +- .../organizations/OrganizationsService.java | 172 ---- .../OrganizationsServiceServiceMapper.java | 23 - .../pagopa/fdr/service/psps/PspsService.java | 735 ---------------- .../psps/mapper/PspsServiceServiceMapper.java | 58 -- .../fdr/service/re/model/HttpTypeEnum.java | 6 - .../fdr/service/support/SupportService.java | 81 -- .../mapper/SupportServiceServiceMapper.java | 24 - .../it/gov/pagopa/fdr/util/AppConstant.java | 53 -- .../it/gov/pagopa/fdr/util/AppDBUtil.java | 36 - .../fdr/util/{ => common}/FileUtil.java | 7 +- .../fdr/util/{ => common}/StringUtil.java | 11 +- .../pagopa/fdr/util/constant/AppConstant.java | 18 + .../util/constant/ControllerConstants.java | 134 +++ .../fdr/util/{ => constant}/MDCKeys.java | 2 +- .../error/enums/AppErrorCodeMessageEnum.java | 108 +++ .../error/exception/common/AppException.java | 37 + .../PersistenceFailureException.java | 8 + .../TransactionRollbackException.java | 8 + .../util/{ => logging}/AppMessageUtil.java | 2 +- .../fdr/util/openapi/APIAppErrorMetadata.java | 14 + .../fdr/util/openapi/APITableMetadata.java | 76 ++ .../fdr/util/openapi/OpenAPIGenerator.java | 214 +++++ .../pagopa/fdr/util/{ => re}/AppReUtil.java | 5 +- .../fdr/util/validator/ValidationArgs.java | 35 + .../fdr/util/validator/ValidationResult.java | 36 + .../fdr/util/validator/ValidationStep.java | 55 ++ src/main/resources/application.properties | 147 +--- .../info/InfoControllerIT.java} | 4 +- .../info/InfoControllerTest.java} | 4 +- .../InternalOrganizationResourceIT.java | 2 +- .../InternalOrganizationResourceTest.java | 46 +- .../organizations/OrganizationResourceIT.java | 2 +- .../OrganizationResourceTest.java | 85 +- .../psps/InternalPspResourceIT.java | 2 +- .../psps/InternalPspResourceTest.java | 250 +++--- .../psps/PspResourceIT.java | 2 +- .../psps/PspResourceTest.java | 829 ++++++++++-------- .../support/SupportTest.java | 21 +- .../service/history/HistoryServiceTest.java | 229 +++-- .../pagopa/fdr/service/re/ReServiceTest.java | 33 +- .../it/gov/pagopa/fdr/test/util/TestUtil.java | 95 +- .../pagopa/fdr/util/AppMessageUtilTest.java | 1 + 211 files changed, 6450 insertions(+), 6379 deletions(-) create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/InfoController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/InternalOperationsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/OrganizationsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/PspsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/TechnicalSupportController.java rename src/main/java/it/gov/pagopa/fdr/{util => controller/interfaces/annotation}/Re.java (70%) create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInfoController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInternalOperationsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IOrganizationsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IPspsController.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/ISupportController.java rename src/main/java/it/gov/pagopa/fdr/{rest/exceptionmapper => controller/middleware/exceptionhandler}/ExceptionMappers.java (83%) rename src/main/java/it/gov/pagopa/fdr/{util => controller/middleware/filter}/NoInternalSchemaFilter.java (93%) rename src/main/java/it/gov/pagopa/fdr/{rest => controller/middleware}/filter/RequestFilter.java (57%) rename src/main/java/it/gov/pagopa/fdr/{rest => controller/middleware}/filter/ResponseFilter.java (73%) rename src/main/java/it/gov/pagopa/fdr/{util => controller/middleware/interceptor}/ClientGZIPDecodingInterceptor.java (95%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/common}/Metadata.java (85%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/common/response}/GenericResponse.java (82%) rename src/main/java/it/gov/pagopa/fdr/{rest/info => controller/model/common}/response/InfoResponse.java (53%) create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorMessage.java rename src/main/java/it/gov/pagopa/fdr/{rest/exceptionmapper => controller/model/error}/ErrorResponse.java (63%) rename src/main/java/it/gov/pagopa/fdr/{rest/model/FdrInserted.java => controller/model/flow/FlowByCICreated.java} (59%) rename src/main/java/it/gov/pagopa/fdr/{rest/model/FdrPublished.java => controller/model/flow/FlowByCIPublished.java} (59%) rename src/main/java/it/gov/pagopa/fdr/{rest/model/Fdr.java => controller/model/flow/FlowByPSP.java} (60%) rename src/main/java/it/gov/pagopa/fdr/{rest/model/FdrByPspIdIuvIurBase.java => controller/model/flow/FlowBySenderAndReceiver.java} (82%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/flow}/Receiver.java (85%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/flow}/Sender.java (89%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/flow/enums}/ReportingFlowStatusEnum.java (58%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/flow/enums}/SenderTypeEnum.java (64%) rename src/main/java/it/gov/pagopa/fdr/{rest/psps/request/CreateRequest.java => controller/model/flow/request/CreateFlowRequest.java} (86%) create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsBySenderAndReceiverResponse.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsCreatedResponse.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsPublishedResponse.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsResponse.java create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedResponse.java rename src/main/java/it/gov/pagopa/fdr/{rest/psps/response/GetCreatedResponse.java => controller/model/flow/response/SingleFlowCreatedResponse.java} (76%) rename src/main/java/it/gov/pagopa/fdr/{rest/organizations/response/GetResponse.java => controller/model/flow/response/SingleFlowResponse.java} (77%) rename src/main/java/it/gov/pagopa/fdr/{rest/model => controller/model/payment}/Payment.java (93%) create mode 100644 src/main/java/it/gov/pagopa/fdr/controller/model/payment/enums/PaymentStatusEnum.java rename src/main/java/it/gov/pagopa/fdr/{rest/psps => controller/model/payment}/request/AddPaymentRequest.java (70%) rename src/main/java/it/gov/pagopa/fdr/{rest/psps => controller/model/payment}/request/DeletePaymentRequest.java (76%) rename src/main/java/it/gov/pagopa/fdr/{rest/organizations/response/GetPaymentResponse.java => controller/model/payment/response/PaginatedPaymentsCreatedResponse.java} (65%) rename src/main/java/it/gov/pagopa/fdr/{rest/psps/response/GetPaymentCreatedResponse.java => controller/model/payment/response/PaginatedPaymentsResponse.java} (66%) delete mode 100644 src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageEnum.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageInterface.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/exception/AppException.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/FdrFlowRepository.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/FdrPaymentRepository.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/common/Repository.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/common/RepositoryPagedResult.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/common/SortField.java rename src/main/java/it/gov/pagopa/fdr/{service/history/model/HistoryBlobBody.java => repository/entity/flow/BlobBodyReferenceEntity.java} (78%) create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/entity/flow/FdrFlowEntity.java rename src/main/java/it/gov/pagopa/fdr/repository/{fdr/model => entity/flow}/ReceiverEntity.java (85%) rename src/main/java/it/gov/pagopa/fdr/repository/{fdr/model => entity/flow}/SenderEntity.java (74%) create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/entity/flow/projection/FdrFlowIdProjection.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/entity/payment/FdrPaymentEntity.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/entity/payment/ReferencedFdrEntity.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/enums/FlowStatusEnum.java create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/enums/JsonSchemaVersionEnum.java rename src/main/java/it/gov/pagopa/fdr/{rest/model => repository/enums}/PaymentStatusEnum.java (69%) create mode 100644 src/main/java/it/gov/pagopa/fdr/repository/enums/SenderTypeEnum.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrInsertEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPublishEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/model/FdrStatusEnumEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/model/PaymentStatusEnumEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderTypeEnumEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrInsertProjection.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishByPspProjection.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishProjection.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishRevisionProjection.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Receiver.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Sender.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/info/InfoResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/BaseOrganizationsResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationsResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/OrganizationsResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/mapper/OrganizationsResourceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetAllResponse.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/InternalOrganizationsValidationService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/OrganizationsValidationService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/BasePspResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/InternalPspsResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/PspsResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/mapper/PspsResourceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllCreatedResponse.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllPublishedResponse.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/validation/InternalPspValidationService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/psps/validation/PspsValidationService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/support/SupportResource.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/support/mapper/SupportResourceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/support/response/FdrByPspIdIuvIurResponse.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/validation/CommonValidationService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/validation/ListSize.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/rest/validation/ListSizeValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/FlowService.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/HealthCheckService.java rename src/main/java/it/gov/pagopa/fdr/service/{history => }/HistoryService.java (87%) create mode 100644 src/main/java/it/gov/pagopa/fdr/service/PaymentService.java rename src/main/java/it/gov/pagopa/fdr/service/{re => }/ReService.java (79%) create mode 100644 src/main/java/it/gov/pagopa/fdr/service/TechnicalSupportService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/conversion/ConversionService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/conversion/message/FdrMessage.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/AddPaymentDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/DeletePaymentDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllCreatedDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllPublishedDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetCreatedDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetPaymentDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleCreatedDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimplePublishedDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/FdrStatusEnumDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/MetadataDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/PaymentByPspIdIuvIurDTO.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/PaymentDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/PaymentGetByPspIdIuvIurDTO.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/PaymentStatusEnumDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/ReceiverDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/SenderDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/dto/SenderTypeEnumDto.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/history/constants/HistoryConstants.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/history/mapper/HistoryServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryPaymentEntity.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/history/model/JsonSchemaVersionEnum.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/FlowMapper.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/PaymentMapper.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/TechnicalSupportMapper.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/SemanticValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/BrokerPspValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ChannelValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ComputedPaymentsValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/CreditorInstitutionValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/FlowNameFormatValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PspValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PublishableStatusValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/AddPaymentRequestValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/CreateFlowRequestValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/DeletePaymentRequestValidator.java create mode 100644 src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindFlowsByFiltersArgs.java rename src/main/java/it/gov/pagopa/fdr/service/{support/FindPaymentsByPspIdAndIuvIurArgs.java => model/arguments/FindPaymentsByFiltersArgs.java} (70%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/AppVersionEnum.java (58%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/BlobHttpBody.java (91%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/EventTypeEnum.java (55%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/FdrActionEnum.java (94%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/FdrStatusEnum.java (63%) create mode 100644 src/main/java/it/gov/pagopa/fdr/service/model/re/HttpTypeEnum.java rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/ReAbstract.java (91%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/ReInterface.java (93%) rename src/main/java/it/gov/pagopa/fdr/service/{re/model => model/re}/ReInternal.java (88%) delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/organizations/OrganizationsService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/organizations/mapper/OrganizationsServiceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/psps/mapper/PspsServiceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/re/model/HttpTypeEnum.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/support/SupportService.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/service/support/mapper/SupportServiceServiceMapper.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/util/AppConstant.java delete mode 100644 src/main/java/it/gov/pagopa/fdr/util/AppDBUtil.java rename src/main/java/it/gov/pagopa/fdr/util/{ => common}/FileUtil.java (88%) rename src/main/java/it/gov/pagopa/fdr/util/{ => common}/StringUtil.java (79%) create mode 100644 src/main/java/it/gov/pagopa/fdr/util/constant/AppConstant.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/constant/ControllerConstants.java rename src/main/java/it/gov/pagopa/fdr/util/{ => constant}/MDCKeys.java (95%) create mode 100644 src/main/java/it/gov/pagopa/fdr/util/error/enums/AppErrorCodeMessageEnum.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/error/exception/common/AppException.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/PersistenceFailureException.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/TransactionRollbackException.java rename src/main/java/it/gov/pagopa/fdr/util/{ => logging}/AppMessageUtil.java (97%) create mode 100644 src/main/java/it/gov/pagopa/fdr/util/openapi/APIAppErrorMetadata.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/openapi/APITableMetadata.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/openapi/OpenAPIGenerator.java rename src/main/java/it/gov/pagopa/fdr/util/{ => re}/AppReUtil.java (85%) create mode 100644 src/main/java/it/gov/pagopa/fdr/util/validator/ValidationArgs.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/validator/ValidationResult.java create mode 100644 src/main/java/it/gov/pagopa/fdr/util/validator/ValidationStep.java rename src/test/java/it/gov/pagopa/fdr/{rest/info/InfoResourceIT.java => controller/info/InfoControllerIT.java} (57%) rename src/test/java/it/gov/pagopa/fdr/{rest/info/InfoResourceTest.java => controller/info/InfoControllerTest.java} (83%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/organizations/InternalOrganizationResourceIT.java (80%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/organizations/InternalOrganizationResourceTest.java (87%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/organizations/OrganizationResourceIT.java (79%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/organizations/OrganizationResourceTest.java (76%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/psps/InternalPspResourceIT.java (81%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/psps/InternalPspResourceTest.java (92%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/psps/PspResourceIT.java (80%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/psps/PspResourceTest.java (66%) rename src/test/java/it/gov/pagopa/fdr/{rest => controller}/support/SupportTest.java (84%) diff --git a/.identity/.terraform.lock.hcl b/.identity/.terraform.lock.hcl index 5d31003a..002ebc40 100644 --- a/.identity/.terraform.lock.hcl +++ b/.identity/.terraform.lock.hcl @@ -43,25 +43,6 @@ provider "registry.terraform.io/hashicorp/azurerm" { ] } -provider "registry.terraform.io/hashicorp/null" { - version = "3.2.2" - hashes = [ - "h1:vWAsYRd7MjYr3adj8BVKRohVfHpWQdvkIwUQ2Jf5FVM=", - "zh:3248aae6a2198f3ec8394218d05bd5e42be59f43a3a7c0b71c66ec0df08b69e7", - "zh:32b1aaa1c3013d33c245493f4a65465eab9436b454d250102729321a44c8ab9a", - "zh:38eff7e470acb48f66380a73a5c7cdd76cc9b9c9ba9a7249c7991488abe22fe3", - "zh:4c2f1faee67af104f5f9e711c4574ff4d298afaa8a420680b0cb55d7bbc65606", - "zh:544b33b757c0b954dbb87db83a5ad921edd61f02f1dc86c6186a5ea86465b546", - "zh:696cf785090e1e8cf1587499516b0494f47413b43cb99877ad97f5d0de3dc539", - "zh:6e301f34757b5d265ae44467d95306d61bef5e41930be1365f5a8dcf80f59452", - "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:913a929070c819e59e94bb37a2a253c228f83921136ff4a7aa1a178c7cce5422", - "zh:aa9015926cd152425dbf86d1abdbc74bfe0e1ba3d26b3db35051d7b9ca9f72ae", - "zh:bb04798b016e1e1d49bcc76d62c53b56c88c63d6f2dfe38821afef17c416a0e1", - "zh:c23084e1b23577de22603cff752e59128d83cfecc2e6819edadd8cf7a10af11e", - ] -} - provider "registry.terraform.io/integrations/github" { version = "5.18.3" constraints = "5.18.3" diff --git a/.identity/00_data.tf b/.identity/00_data.tf index 037a4306..9131b160 100644 --- a/.identity/00_data.tf +++ b/.identity/00_data.tf @@ -36,18 +36,14 @@ data "azurerm_key_vault" "nodo_key_vault" { resource_group_name = "pagopa-${var.env_short}-nodo-sec-rg" } -data "azurerm_resource_group" "apim_resource_group" { - name = "${local.product}-api-rg" -} - data "azurerm_key_vault_secret" "key_vault_sonar" { name = "sonar-token" key_vault_id = data.azurerm_key_vault.key_vault.id } -data "azurerm_key_vault_secret" "key_vault_bot_token" { - name = "bot-token-github" - key_vault_id = data.azurerm_key_vault.key_vault.id +data "azurerm_key_vault_secret" "key_vault_bot_cd_token" { + name = "pagopa-platform-domain-github-bot-cd-pat" + key_vault_id = data.azurerm_key_vault.domain_key_vault.id } data "azurerm_key_vault_secret" "key_vault_cucumber_token" { @@ -96,7 +92,7 @@ data "azurerm_key_vault_secret" "opex_org_subscription_key" { key_vault_id = data.azurerm_key_vault.domain_key_vault.id } -data "azurerm_key_vault_secret" "key_vault_slack_webhook_url" { +data "azurerm_key_vault_secret" "key_vault_integration_test_slack_webhook_url" { name = "slack-webhook-url" key_vault_id = data.azurerm_key_vault.domain_key_vault.id } @@ -116,6 +112,6 @@ data "azurerm_user_assigned_identity" "identity_cd" { } data "azurerm_user_assigned_identity" "identity_ci" { - name = "${local.product}-${local.domain}-01-github-ci-identity" + name = "${local.product}-${local.domain}-01-github-ci-identity" resource_group_name = "${local.product}-identity-rg" } \ No newline at end of file diff --git a/.identity/03_github_environment.tf b/.identity/03_github_environment.tf index ac75136d..efcf9c56 100644 --- a/.identity/03_github_environment.tf +++ b/.identity/03_github_environment.tf @@ -4,7 +4,9 @@ resource "github_repository_environment" "github_repository_environment" { # filter teams reviewers from github_organization_teams # if reviewers_teams is null no reviewers will be configured for environment dynamic "reviewers" { - for_each = (var.github_repository_environment.reviewers_teams == null || var.env_short != "p" ? [] : [1]) + for_each = (var.github_repository_environment.reviewers_teams == null || var.env_short != "p" ? [] : [ + 1 + ]) content { teams = matchkeys( data.github_organization_teams.all.teams.*.id, @@ -24,10 +26,10 @@ locals { "CD_CLIENT_ID" : data.azurerm_user_assigned_identity.identity_cd.client_id, "CI_CLIENT_ID" : data.azurerm_user_assigned_identity.identity_ci.client_id, "TENANT_ID" : data.azurerm_client_config.current.tenant_id, - "INTERNAL_SUBSCRIPTION_KEY": var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_internal_subscription_key[0].value : data.azurerm_key_vault_secret.opex_internal_subscription_key[0].value, + "INTERNAL_SUBSCRIPTION_KEY" : var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_internal_subscription_key[0].value : data.azurerm_key_vault_secret.opex_internal_subscription_key[0].value, "SUBSCRIPTION_ID" : data.azurerm_subscription.current.subscription_id, - "PSP_SUBSCRIPTION_KEY": var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_psp_subscription_key[0].value : "" - "ORG_SUBSCRIPTION_KEY": var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_org_subscription_key[0].value : "" + "PSP_SUBSCRIPTION_KEY" : var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_psp_subscription_key[0].value : "" + "ORG_SUBSCRIPTION_KEY" : var.env_short != "p" ? data.azurerm_key_vault_secret.integration_test_org_subscription_key[0].value : "" } env_variables = { "CONTAINER_APP_ENVIRONMENT_NAME" : local.container_app_environment.name, @@ -36,8 +38,8 @@ locals { "CLUSTER_RESOURCE_GROUP" : local.aks_cluster.resource_group_name, "DOMAIN" : local.domain, "NAMESPACE" : local.domain, - "INTEGRATION_TEST_STORAGE_ACCOUNT_NAME": local.integration_test.storage_account_name - "INTEGRATION_TEST_REPORTS_FOLDER": local.integration_test.reports_folder + "INTEGRATION_TEST_STORAGE_ACCOUNT_NAME" : local.integration_test.storage_account_name + "INTEGRATION_TEST_REPORTS_FOLDER" : local.integration_test.reports_folder } } @@ -71,30 +73,30 @@ resource "github_actions_environment_variable" "github_environment_runner_variab #tfsec:ignore:github-actions-no-plain-text-action-secrets # not real secret resource "github_actions_secret" "secret_sonar_token" { - repository = local.github.repository - secret_name = "SONAR_TOKEN" - plaintext_value = data.azurerm_key_vault_secret.key_vault_sonar.value + repository = local.github.repository + secret_name = "SONAR_TOKEN" + plaintext_value = data.azurerm_key_vault_secret.key_vault_sonar.value } #tfsec:ignore:github-actions-no-plain-text-action-secrets # not real secret resource "github_actions_secret" "secret_bot_token" { - repository = local.github.repository - secret_name = "BOT_TOKEN_GITHUB" - plaintext_value = data.azurerm_key_vault_secret.key_vault_bot_token.value + repository = local.github.repository + secret_name = "BOT_TOKEN_GITHUB" + plaintext_value = data.azurerm_key_vault_secret.key_vault_bot_cd_token.value } #tfsec:ignore:github-actions-no-plain-text-action-secrets # not real secret resource "github_actions_secret" "secret_slack_webhook" { - repository = local.github.repository - secret_name = "SLACK_WEBHOOK_URL" - plaintext_value = data.azurerm_key_vault_secret.key_vault_slack_webhook_url.value + repository = local.github.repository + secret_name = "SLACK_WEBHOOK_URL" + plaintext_value = data.azurerm_key_vault_secret.key_vault_slack_webhook_url.value } #tfsec:ignore:github-actions-no-plain-text-action-secrets # not real secret resource "github_actions_secret" "secret_integrationtest_slack_webhook" { - repository = local.github.repository - secret_name = "INTEGRATION_TEST_SLACK_WEBHOOK_URL" - plaintext_value = data.azurerm_key_vault_secret.key_vault_integration_test_slack_webhook_url.value + repository = local.github.repository + secret_name = "INTEGRATION_TEST_SLACK_WEBHOOK_URL" + plaintext_value = data.azurerm_key_vault_secret.key_vault_integration_test_slack_webhook_url.value } ############ diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 71036733..b226ac3f 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.46.0" -appVersion: "1.0.24" +version: "1.48.0" +appVersion: "1.0.24-2-project-refactoring" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index 155e24f0..a3fd3128 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.24 + tag: 1.0.24-2-project-refactoring pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index 94d1d332..a81a2bf1 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.24 + tag: 1.0.24-2-project-refactoring pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index b66bbf26..003fa1fe 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24" + "version": "1.0.24-2-project-refactoring" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 32a35516..22163dd2 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24" + "version": "1.0.24-2-project-refactoring" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 4305fdc6..2b283dc6 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24" + "version": "1.0.24-2-project-refactoring" }, "servers": [ { diff --git a/pom.xml b/pom.xml index 1e16af65..e52bc304 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,12 @@ - + 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.24 + 1.0.24-2-project-refactoring 3.11.0 1.18.26 @@ -12,17 +14,15 @@ 1.5.3.Final UTF-8 UTF-8 - quarkus-bom - io.quarkus.platform - 3.0.1.Final + 3.17.7 true 3.0.0 - ${quarkus.platform.group-id} - ${quarkus.platform.artifact-id} + io.quarkus.platform + quarkus-bom ${quarkus.platform.version} pom import @@ -68,16 +68,16 @@ io.quarkus - quarkus-rest-client-reactive-jackson + quarkus-rest-client-jackson io.quarkus - quarkus-resteasy-reactive-jackson + quarkus-rest-jackson io.quarkiverse.openapi.generator quarkus-openapi-generator - 2.2.2 + 2.7.1 io.quarkus @@ -187,7 +187,7 @@ - ${quarkus.platform.group-id} + io.quarkus.platform quarkus-maven-plugin ${quarkus.platform.version} true @@ -253,8 +253,10 @@ - ${project.build.directory}/${project.build.finalName}-runner - org.jboss.logmanager.LogManager + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} diff --git a/src/main/java/it/gov/pagopa/fdr/App.java b/src/main/java/it/gov/pagopa/fdr/App.java index 6c78f440..52f8a2ee 100644 --- a/src/main/java/it/gov/pagopa/fdr/App.java +++ b/src/main/java/it/gov/pagopa/fdr/App.java @@ -1,111 +1,7 @@ package it.gov.pagopa.fdr; - -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; import jakarta.ws.rs.core.Application; -import jakarta.ws.rs.core.MediaType; -import org.eclipse.microprofile.openapi.annotations.Components; -import org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition; -import org.eclipse.microprofile.openapi.annotations.enums.SecuritySchemeIn; -import org.eclipse.microprofile.openapi.annotations.enums.SecuritySchemeType; -import org.eclipse.microprofile.openapi.annotations.info.Info; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.ExampleObject; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.security.SecurityRequirement; -import org.eclipse.microprofile.openapi.annotations.security.SecurityScheme; -@SecurityScheme( - type = SecuritySchemeType.APIKEY, - securitySchemeName = "api_key", - apiKeyName="Ocp-Apim-Subscription-Key", - in = SecuritySchemeIn.HEADER) -@OpenAPIDefinition( - security = { @SecurityRequirement(name = "api_key") }, - components = - @Components( - responses = { - @APIResponse( - name = "InternalServerError", - responseCode = "500", - description = "Internal Server Error", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = ErrorResponse.class), - example = - """ - { - "errorId": "50905466-1881-457b-b42f-fb7b2bfb1610", - "httpStatusCode": 500, - "httpStatusDescription": "Internal Server Error", - "appErrorCode": "FDR-0500", - "errors": [ - { - "message": "An unexpected error has occurred. Please contact support." - } - ] - }""")), - @APIResponse( - name = "AppException400", - responseCode = "400", - description = "Default app exception for status 400", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = ErrorResponse.class), - examples = { - @ExampleObject( - name = "Error", - value = - """ - { - "httpStatusCode": 400, - "httpStatusDescription": "Bad Request", - "appErrorCode": "FDR-0702", - "errors": [ - { - "message": "Reporting Fdr [] is invalid" - } - ] - }"""), - @ExampleObject( - name = "Errors with path", - value = - """ - { - "httpStatusCode": 400, - "httpStatusDescription": "Bad Request", - "appErrorCode": "FDR-0702", - "errors": [ - { - "path": "", - "message": "" - } - ] - }""") - })), - @APIResponse( - name = "AppException404", - responseCode = "404", - description = "Default app exception for status 404", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = ErrorResponse.class), - example = - """ - { - "httpStatusCode": 404, - "httpStatusDescription": "Not Found", - "appErrorCode": "FDR-0701", - "errors": [ - { - "message": "Reporting Fdr [] not found" - } - ] - }""")), - }), - info = @Info(title = "FDR - Flussi di Rendicontazione", version = "0.0.0-SNAPSHOT")) -public class App extends Application {} +public class App extends Application { + +} diff --git a/src/main/java/it/gov/pagopa/fdr/AppStartup.java b/src/main/java/it/gov/pagopa/fdr/AppStartup.java index f776a90a..f711414f 100644 --- a/src/main/java/it/gov/pagopa/fdr/AppStartup.java +++ b/src/main/java/it/gov/pagopa/fdr/AppStartup.java @@ -1,9 +1,8 @@ package it.gov.pagopa.fdr; import io.quarkus.runtime.Startup; -import it.gov.pagopa.fdr.service.conversion.ConversionService; -import it.gov.pagopa.fdr.service.history.HistoryService; -import it.gov.pagopa.fdr.service.re.ReService; +import it.gov.pagopa.fdr.service.HistoryService; +import it.gov.pagopa.fdr.service.ReService; import jakarta.annotation.PostConstruct; import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -16,33 +15,16 @@ public class AppStartup { @ConfigProperty(name = "startconfig.enabled") boolean startconfig; - @ConfigProperty(name = "queue.conversion.enabled") - boolean queueConversionEnabled; - - @ConfigProperty(name = "eHub.re.enabled") - boolean eHubReEnabled; - - @ConfigProperty(name = "history.enabled") - boolean historyEnabled; - private final Logger log; private final Config config; - private final ConversionService conversionQueue; - private final ReService reService; private final HistoryService historyService; - public AppStartup( - Logger log, - Config config, - ConversionService conversionQueue, - ReService reService, - HistoryService historyService) { + public AppStartup(Logger log, Config config, ReService reService, HistoryService historyService) { this.log = log; this.config = config; - this.conversionQueue = conversionQueue; this.reService = reService; this.historyService = historyService; } @@ -55,26 +37,5 @@ public void init() { } else { log.info("Start Cache DISABLED"); } - - if (queueConversionEnabled) { - log.info("Start Queue Conversion ENABLED"); - conversionQueue.init(); - } else { - log.info("Start Queue Conversion DISABLED"); - } - - if (eHubReEnabled) { - log.info("Start EventHub Re and blob ENABLED"); - reService.init(); - } else { - log.info("Start EventHub Re and blob DISABLED"); - } - - if (historyEnabled) { - log.info("History ENABLED"); - historyService.init(); - } else { - log.info("History DISABLED"); - } } } diff --git a/src/main/java/it/gov/pagopa/fdr/Config.java b/src/main/java/it/gov/pagopa/fdr/Config.java index 74cccad0..5719aa51 100644 --- a/src/main/java/it/gov/pagopa/fdr/Config.java +++ b/src/main/java/it/gov/pagopa/fdr/Config.java @@ -59,12 +59,10 @@ public void init() { @SneakyThrows public ConfigDataV1 getClonedCache() { if (this.cache == null) { - log.debug("Api config cache NOT INITIALIZED"); - return null; - } else { - return objectMapper.readValue( - objectMapper.writeValueAsString(this.cache), ConfigDataV1.class); + log.debug("Api config cache NOT INITIALIZED. Initializing it by demand."); + this.cache = nodeCacheApi.cache(null); } + return objectMapper.readValue(objectMapper.writeValueAsString(this.cache), ConfigDataV1.class); } private final Logger log; diff --git a/src/main/java/it/gov/pagopa/fdr/controller/InfoController.java b/src/main/java/it/gov/pagopa/fdr/controller/InfoController.java new file mode 100644 index 00000000..c4d46d69 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/InfoController.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.controller; + +import it.gov.pagopa.fdr.controller.interfaces.controller.IInfoController; +import it.gov.pagopa.fdr.controller.model.common.response.InfoResponse; +import it.gov.pagopa.fdr.service.HealthCheckService; + +public class InfoController implements IInfoController { + + private final HealthCheckService healthCheckService; + + public InfoController(HealthCheckService healthCheckService) { + this.healthCheckService = healthCheckService; + } + + @Override + public InfoResponse healthCheck() { + return healthCheckService.getHealthInfo(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/InternalOperationsController.java b/src/main/java/it/gov/pagopa/fdr/controller/InternalOperationsController.java new file mode 100644 index 00000000..570d5b96 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/InternalOperationsController.java @@ -0,0 +1,80 @@ +package it.gov.pagopa.fdr.controller; + +import it.gov.pagopa.fdr.controller.interfaces.annotation.Re; +import it.gov.pagopa.fdr.controller.interfaces.controller.IInternalOperationsController; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.service.FlowService; +import it.gov.pagopa.fdr.service.PaymentService; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; +import jakarta.ws.rs.core.Response.Status; +import org.jboss.resteasy.reactive.RestResponse; + +public class InternalOperationsController implements IInternalOperationsController { + + private FlowService flowService; + + private PaymentService paymentService; + + protected InternalOperationsController(FlowService flowService, PaymentService paymentService) { + + this.flowService = flowService; + this.paymentService = paymentService; + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_CREATE_FLOW) + public RestResponse createEmptyFlowForInternalUse( + String pspId, String flowName, CreateFlowRequest request) { + + GenericResponse response = this.flowService.createEmptyFlow(pspId, flowName, request); + return RestResponse.status(Status.CREATED, response); + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_ADD_PAYMENT) + public GenericResponse addPaymentToExistingFlowForInternalUse( + String pspId, String flowName, AddPaymentRequest request) { + + return this.paymentService.addPaymentToExistingFlow(pspId, flowName, request); + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_DELETE_PAYMENT) + public GenericResponse deletePaymentFromExistingFlowForInternalUse( + String pspId, String flowName, DeletePaymentRequest request) { + + return this.paymentService.deletePaymentFromExistingFlow(pspId, flowName, request); + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_PUBLISH) + public GenericResponse publishFlowForInternalUse(String pspId, String flowName) { + + return this.flowService.publishFlow(pspId, flowName, true); + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_DELETE_FLOW) + public GenericResponse deleteExistingFlowForInternalUse(String pspId, String flowName) { + + return this.flowService.deleteExistingFlow(pspId, flowName); + } + + @Override + @Re(action = FdrActionEnum.INTERNAL_GET_CREATED_FDR) + public SingleFlowCreatedResponse getSingleFlowNotInPublishedStatusForInternalUse( + String pspId, String flowName, String organizationId) { + + return this.flowService.getSingleFlowNotInPublishedStatus( + FindFlowsByFiltersArgs.builder() + .pspId(pspId) + .flowName(flowName) + .organizationId(organizationId) + .build()); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/OrganizationsController.java b/src/main/java/it/gov/pagopa/fdr/controller/OrganizationsController.java new file mode 100644 index 00000000..ea94698e --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/OrganizationsController.java @@ -0,0 +1,75 @@ +package it.gov.pagopa.fdr.controller; + +import it.gov.pagopa.fdr.controller.interfaces.annotation.Re; +import it.gov.pagopa.fdr.controller.interfaces.controller.IOrganizationsController; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.service.FlowService; +import it.gov.pagopa.fdr.service.PaymentService; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; +import java.time.Instant; + +public class OrganizationsController implements IOrganizationsController { + + private final FlowService flowService; + + private final PaymentService paymentService; + + protected OrganizationsController(FlowService flowService, PaymentService paymentService) { + + this.flowService = flowService; + this.paymentService = paymentService; + } + + @Override + @Re(action = FdrActionEnum.GET_ALL_FDR) + public PaginatedFlowsResponse getAllPublishedFlows( + String organizationId, String pspId, Instant publishedGt, long pageNumber, long pageSize) { + + return this.flowService.getPaginatedPublishedFlowsForCI( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .publishedGt(publishedGt) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_FDR) + public SingleFlowResponse getSinglePublishedFlow( + String organizationId, String flowName, Long revision, String pspId) { + + return this.flowService.getSinglePublishedFlow( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .flowName(flowName) + .revision(revision) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_FDR_PAYMENT) + public PaginatedPaymentsResponse getPaymentsFromPublishedFlow( + String organizationId, + String flowName, + Long revision, + String pspId, + long pageNumber, + long pageSize) { + + return this.paymentService.getPaymentsFromPublishedFlow( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .flowName(flowName) + .revision(revision) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/PspsController.java b/src/main/java/it/gov/pagopa/fdr/controller/PspsController.java new file mode 100644 index 00000000..fc0fc1db --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/PspsController.java @@ -0,0 +1,164 @@ +package it.gov.pagopa.fdr.controller; + +import it.gov.pagopa.fdr.controller.interfaces.annotation.Re; +import it.gov.pagopa.fdr.controller.interfaces.controller.IPspsController; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsPublishedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.service.FlowService; +import it.gov.pagopa.fdr.service.PaymentService; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; +import jakarta.ws.rs.core.Response.Status; +import java.time.Instant; +import org.jboss.resteasy.reactive.RestResponse; + +public class PspsController implements IPspsController { + + private FlowService flowService; + + private PaymentService paymentService; + + protected PspsController(FlowService flowService, PaymentService paymentService) { + + this.flowService = flowService; + this.paymentService = paymentService; + } + + @Override + @Re(action = FdrActionEnum.CREATE_FLOW) + public RestResponse createEmptyFlow( + String pspId, String flowName, CreateFlowRequest request) { + + GenericResponse response = this.flowService.createEmptyFlow(pspId, flowName, request); + return RestResponse.status(Status.CREATED, response); + } + + @Override + @Re(action = FdrActionEnum.ADD_PAYMENT) + public GenericResponse addPaymentToExistingFlow( + String pspId, String flowName, AddPaymentRequest request) { + + return this.paymentService.addPaymentToExistingFlow(pspId, flowName, request); + } + + @Override + @Re(action = FdrActionEnum.DELETE_PAYMENT) + public GenericResponse deletePaymentFromExistingFlow( + String pspId, String flowName, DeletePaymentRequest request) { + + return this.paymentService.deletePaymentFromExistingFlow(pspId, flowName, request); + } + + @Override + @Re(action = FdrActionEnum.PUBLISH) + public GenericResponse publishFlow(String pspId, String flowName) { + + return this.flowService.publishFlow(pspId, flowName, false); + } + + @Override + @Re(action = FdrActionEnum.DELETE_FLOW) + public GenericResponse deleteExistingFlow(String pspId, String flowName) { + + return this.flowService.deleteExistingFlow(pspId, flowName); + } + + @Override + @Re(action = FdrActionEnum.GET_ALL_CREATED_FDR) + public PaginatedFlowsCreatedResponse getAllFlowsNotInPublishedStatus( + String pspId, Instant createdGt, long pageNumber, long pageSize) { + + return this.flowService.getAllFlowsNotInPublishedStatus( + FindFlowsByFiltersArgs.builder() + .pspId(pspId) + .createdGt(createdGt) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_CREATED_FDR) + public SingleFlowCreatedResponse getSingleFlowNotInPublishedStatus( + String pspId, String flowName, String organizationId) { + + return this.flowService.getSingleFlowNotInPublishedStatus( + FindFlowsByFiltersArgs.builder() + .pspId(pspId) + .flowName(flowName) + .organizationId(organizationId) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_CREATED_FDR_PAYMENT) + public PaginatedPaymentsResponse getPaymentsForFlowNotInPublishedStatus( + String pspId, String flowName, String organizationId, long pageNumber, long pageSize) { + + return this.paymentService.getPaymentsFromUnpublishedFlow( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .flowName(flowName) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_ALL_FDR_PUBLISHED_BY_PSP) + public PaginatedFlowsPublishedResponse getAllFlowsInPublishedStatus( + String pspId, String organizationId, Instant publishedGt, long pageNumber, long pageSize) { + + return this.flowService.getPaginatedPublishedFlowsForPSP( + FindFlowsByFiltersArgs.builder() + .pspId(pspId) + .organizationId(organizationId) + .publishedGt(publishedGt) + .pageSize(pageSize) + .pageNumber(pageNumber) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_FDR_PUBLISHED_BY_PSP) + public SingleFlowResponse getSingleFlowInPublishedStatus( + String pspId, String flowName, Long revision, String organizationId) { + + return this.flowService.getSinglePublishedFlow( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .flowName(flowName) + .revision(revision) + .build()); + } + + @Override + @Re(action = FdrActionEnum.GET_FDR_PAYMENT_PUBLISHED_BY_PSP) + public PaginatedPaymentsResponse getPaymentsForFlowInPublishedStatus( + String pspId, + String flowName, + Long revision, + String organizationId, + long pageNumber, + long pageSize) { + + return this.paymentService.getPaymentsFromPublishedFlow( + FindFlowsByFiltersArgs.builder() + .organizationId(organizationId) + .pspId(pspId) + .flowName(flowName) + .revision(revision) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/TechnicalSupportController.java b/src/main/java/it/gov/pagopa/fdr/controller/TechnicalSupportController.java new file mode 100644 index 00000000..f423eb12 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/TechnicalSupportController.java @@ -0,0 +1,58 @@ +package it.gov.pagopa.fdr.controller; + +import it.gov.pagopa.fdr.controller.interfaces.controller.ISupportController; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsBySenderAndReceiverResponse; +import it.gov.pagopa.fdr.service.TechnicalSupportService; +import it.gov.pagopa.fdr.service.model.arguments.FindPaymentsByFiltersArgs; +import java.time.Instant; + +public class TechnicalSupportController implements ISupportController { + + private final TechnicalSupportService service; + + public TechnicalSupportController(TechnicalSupportService service) { + this.service = service; + } + + @Override + public PaginatedFlowsBySenderAndReceiverResponse getByIuv( + String pspId, + String iuv, + Instant createdFrom, + Instant createdTo, + long pageNumber, + long pageSize) { + + return service.findPaymentsByFilters( + FindPaymentsByFiltersArgs.builder() + .pspId(pspId) + .iuv(iuv) + .iur(null) + .createdFrom(createdFrom) + .createdTo(createdTo) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } + + @Override + public PaginatedFlowsBySenderAndReceiverResponse getByIur( + String pspId, + String iur, + Instant createdFrom, + Instant createdTo, + long pageNumber, + long pageSize) { + + return service.findPaymentsByFilters( + FindPaymentsByFiltersArgs.builder() + .pspId(pspId) + .iuv(null) + .iur(iur) + .createdFrom(createdFrom) + .createdTo(createdTo) + .pageNumber(pageNumber) + .pageSize(pageSize) + .build()); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/Re.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/annotation/Re.java similarity index 70% rename from src/main/java/it/gov/pagopa/fdr/util/Re.java rename to src/main/java/it/gov/pagopa/fdr/controller/interfaces/annotation/Re.java index 81e292a8..3f6d35a6 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/Re.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/annotation/Re.java @@ -1,6 +1,6 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.controller.interfaces.annotation; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -9,5 +9,6 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Re { + FdrActionEnum action(); } diff --git a/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInfoController.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInfoController.java new file mode 100644 index 00000000..c7ca23ae --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInfoController.java @@ -0,0 +1,46 @@ +package it.gov.pagopa.fdr.controller.interfaces.controller; + +import it.gov.pagopa.fdr.controller.model.common.response.InfoResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +@Path("/info") +@Tag(name = "Info", description = "Info operations") +public interface IInfoController { + + @GET + @Produces(MediaType.APPLICATION_JSON) + @Operation( + operationId = "IInfoController.healthCheck", + summary = "Health-check", + description = "Get health check and deployment-related information") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = InfoResponse.class))), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + InfoResponse healthCheck(); +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInternalOperationsController.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInternalOperationsController.java new file mode 100644 index 00000000..e515657e --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IInternalOperationsController.java @@ -0,0 +1,308 @@ +package it.gov.pagopa.fdr.controller.interfaces.controller; + +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; +import org.jboss.resteasy.reactive.RestResponse; + +@Path(ControllerConstants.URL_CONTROLLER_INTERNAL_PSPS) +@Consumes("application/json") +@Produces("application/json") +@Tag(name = "Internal Operations", description = "APIs for internal operations") +public interface IInternalOperationsController { + + @POST + @Path(ControllerConstants.URL_API_CREATE_EMPTY_FLOW) + @Operation( + operationId = "IInternalOperationsController.createEmptyFlowForInternalUse", + summary = "Create fdr", + description = "Create fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = CreateFlowRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "201", + description = "Created", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + RestResponse createEmptyFlowForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) @Pattern(regexp = "[a-zA-Z0-9\\-_]{1,35}") + String flowName, + @NotNull @Valid CreateFlowRequest request); + + @PUT + @Path(ControllerConstants.URL_API_ADD_PAYMENT_IN_FLOW) + @Operation( + operationId = "IInternalOperationsController.addPaymentToExistingFlowForInternalUse", + summary = "Add payments to fdr", + description = "Add payments to fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = AddPaymentRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + GenericResponse addPaymentToExistingFlowForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @NotNull @Valid AddPaymentRequest request); + + @PUT + @Path(ControllerConstants.URL_API_DELETE_PAYMENT_IN_FLOW) + @Operation( + operationId = "IInternalOperationsController.deletePaymentFromExistingFlowForInternalUse", + summary = "Delete payments to fdr", + description = "Delete payments to fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = DeletePaymentRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + GenericResponse deletePaymentFromExistingFlowForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @NotNull @Valid DeletePaymentRequest request); + + @POST + @Path(ControllerConstants.URL_API_PUBLISH_FLOW) + @Operation( + operationId = "IInternalOperationsController.publishFlowForInternalUse", + summary = "Publish fdr", + description = "Publish fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + GenericResponse publishFlowForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName); + + @DELETE + @Path(ControllerConstants.URL_API_DELETE_FLOW) + @Operation( + operationId = "IInternalOperationsController.deleteExistingFlowForInternalUse", + summary = "Delete fdr", + description = "Delete fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + GenericResponse deleteExistingFlowForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName); + + @GET + @Path(ControllerConstants.URL_API_GET_SINGLE_NOT_PUBLISHED_FLOW) + @Operation( + operationId = "IInternalOperationsController.getSingleFlowNotInPublishedStatusForInternalUse", + summary = "Get created fdr", + description = "Get created fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = SingleFlowCreatedResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + SingleFlowCreatedResponse getSingleFlowNotInPublishedStatusForInternalUse( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) String organizationId); +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IOrganizationsController.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IOrganizationsController.java new file mode 100644 index 00000000..72d76e9d --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IOrganizationsController.java @@ -0,0 +1,328 @@ +package it.gov.pagopa.fdr.controller.interfaces.controller; + +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.openapi.APIAppErrorMetadata; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.APISecurityMode; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.APISynchronism; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.ReadWrite; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Pattern; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import java.time.Instant; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.Parameter; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +@Path(ControllerConstants.URL_CONTROLLER_ORGANIZATIONS) +@Consumes("application/json") +@Produces("application/json") +@Tag( + name = "Organizations", + description = "APIs for creditor institution, used for inspection of generated flows") +public interface IOrganizationsController { + + @GET + @Operation( + operationId = "IOrganizationsController.getAllPublishedFlows", + summary = "Get all published flow by creditor institution", + description = + """ + This API permits to search all published flows for a specific creditor institution, + formatted in a paginated view. The search can be enhanced including the PSP identifier + in order to filter only the flows for certain PSP.
+ Before executing the query, the search filters are validated against entities configured for + Nodo dei Pagamenti environment, in particular on PSP (if that search filter is defined).
+ The result of the query is paginated and contains all the metadata needed for pagination purposes.
+ """) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedFlowsResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + @APIAppErrorMetadata( + errors = { + AppErrorCodeMessageEnum.PSP_UNKNOWN, + AppErrorCodeMessageEnum.PSP_NOT_ENABLED, + AppErrorCodeMessageEnum.EC_UNKNOWN, + AppErrorCodeMessageEnum.EC_NOT_ENABLED + }) + PaginatedFlowsResponse getAllPublishedFlows( + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) + @Pattern(regexp = "^(.{1,35})$") + @Parameter( + description = "The creditor institution identifier, used as a search filter", + example = "15376371009") + String organizationId, + @Parameter( + description = "The PSP identifier, used as a search filter", + example = "88888888888") + @QueryParam(ControllerConstants.PARAMETER_PSP) + @Pattern(regexp = "^(.{1,35})$") + String pspId, + @Parameter( + description = + "A date to be used as a lower limit search on publication date. In format" + + " ISO-8601 (yyyy-MM-dd'T'HH:mm:ss)", + example = "2025-01-01T12:00:00Z") + @QueryParam(ControllerConstants.PARAMETER_PUBLISHED_GREATER_THAN) + Instant publishedGt, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + @Parameter(description = "The index of the page to be shown in the result", example = "1") + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + @Parameter( + description = "The number of the elements of the page to be shown in the result", + example = "50") + long pageSize); + + @GET + @Path(ControllerConstants.URL_API_GET_SINGLE_FLOW) + @Operation( + operationId = "IOrganizationsController.getSinglePublishedFlow", + summary = "Get single flow by creditor institution, searching by name and revision", + description = + """ + This API permits to search a single flows for a specific creditor institution. + In order to do so, it is required to add the following search filters: + - Creditor institution identifier: for filtering by specific organization + - PSP identifier: for filtering by flow-related PSP + - Flow name: for filtering by specific instance of the flow + - Revision: for filtering by flow revision + + Before executing the query, the search filters are validated against entities configured for + Nodo dei Pagamenti environment, in particular on creditor institution and PSP. Also, + the name of the flow is validated against a specific standard format.
+ """) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = SingleFlowResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + @APIAppErrorMetadata( + errors = { + AppErrorCodeMessageEnum.PSP_UNKNOWN, + AppErrorCodeMessageEnum.PSP_NOT_ENABLED, + AppErrorCodeMessageEnum.EC_UNKNOWN, + AppErrorCodeMessageEnum.EC_NOT_ENABLED, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND + }) + SingleFlowResponse getSinglePublishedFlow( + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) + @Parameter( + description = "The creditor institution identifier, used as a search filter", + example = "15376371009") + String organizationId, + @PathParam(ControllerConstants.PARAMETER_FDR) + @Parameter( + description = "The flow name, used as a search filter", + example = "2025-01-0188888888888-0001") + String flowName, + @PathParam(ControllerConstants.PARAMETER_REVISION) + @Min(value = 1) + @Parameter(description = "The specific revision of the flow needed", example = "1") + Long revision, + @PathParam(ControllerConstants.PARAMETER_PSP) + @Parameter( + description = "The PSP identifier, used as a search filter", + example = "88888888888") + String psp); + + @GET + @Path(ControllerConstants.URL_API_GET_FLOW_PAYMENTS) + @Operation( + operationId = "IOrganizationsController.getPaymentsFromPublishedFlow", + summary = + "Get all payments of single flow by creditor institution, searching by name and revision", + description = + """ + This API permits to search all the payments of single flows for a specific creditor institution, + formatted in a paginated view. In order to do so, it is required to add the following search filters: + - Creditor institution identifier: for filtering by specific organization + - PSP identifier: for filtering by flow-related PSP + - Flow name: for filtering by specific instance of the flow + - Revision: for filtering by flow revision + + Before executing the query, the search filters are validated against entities configured for + Nodo dei Pagamenti environment, in particular on creditor institution and PSP. Also, + the name of the flow is validated against a specific standard format.
+ The result of the query is paginated and contains all the metadata needed for pagination purposes.
+ """) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedPaymentsResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + @APIAppErrorMetadata( + errors = { + AppErrorCodeMessageEnum.PSP_UNKNOWN, + AppErrorCodeMessageEnum.PSP_NOT_ENABLED, + AppErrorCodeMessageEnum.EC_UNKNOWN, + AppErrorCodeMessageEnum.EC_NOT_ENABLED, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND + }) + PaginatedPaymentsResponse getPaymentsFromPublishedFlow( + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) + @Parameter( + description = "The creditor institution identifier, used as a search filter", + example = "15376371009") + String organizationId, + @PathParam(ControllerConstants.PARAMETER_FDR) + @Parameter( + description = "The flow name, used as a search filter", + example = "2025-01-0188888888888-0001") + String flowName, + @PathParam(ControllerConstants.PARAMETER_REVISION) + @Min(value = 1) + @Parameter(description = "The specific revision of the flow needed", example = "1") + Long revision, + @PathParam(ControllerConstants.PARAMETER_PSP) + @Parameter( + description = "The PSP identifier, used as a search filter", + example = "88888888888") + String pspId, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + @Parameter(description = "The index of the page to be shown in the result", example = "1") + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + @Parameter( + description = "The number of the elements of the page to be shown in the result", + example = "50") + long pageSize); +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IPspsController.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IPspsController.java new file mode 100644 index 00000000..e41e8a6b --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/IPspsController.java @@ -0,0 +1,676 @@ +package it.gov.pagopa.fdr.controller.interfaces.controller; + +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsPublishedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.openapi.APIAppErrorMetadata; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.APISecurityMode; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.APISynchronism; +import it.gov.pagopa.fdr.util.openapi.APITableMetadata.ReadWrite; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DELETE; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import java.time.Instant; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; +import org.jboss.resteasy.reactive.RestResponse; + +@Path(ControllerConstants.URL_CONTROLLER_PSPS) +@Consumes("application/json") +@Produces("application/json") +@Tag(name = "PSP", description = "PSP operations") +public interface IPspsController { + + @POST + @Path(ControllerConstants.URL_API_CREATE_EMPTY_FLOW) + @Operation( + operationId = "IPspsController.createEmptyFlow", + summary = "Create fdr", + description = "Create fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = CreateFlowRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "201", + description = "Created", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + idempotency = false, + readWriteIntense = ReadWrite.WRITE) + @APIAppErrorMetadata( + errors = { + AppErrorCodeMessageEnum.PSP_UNKNOWN, + AppErrorCodeMessageEnum.PSP_NOT_ENABLED, + AppErrorCodeMessageEnum.REPORTING_FLOW_ALREADY_EXIST, + AppErrorCodeMessageEnum.BROKER_UNKNOWN, + AppErrorCodeMessageEnum.BROKER_NOT_ENABLED, + AppErrorCodeMessageEnum.CHANNEL_UNKNOWN, + AppErrorCodeMessageEnum.CHANNEL_NOT_ENABLED, + AppErrorCodeMessageEnum.CHANNEL_BROKER_WRONG_CONFIG, + AppErrorCodeMessageEnum.CHANNEL_PSP_WRONG_CONFIG, + AppErrorCodeMessageEnum.EC_UNKNOWN, + AppErrorCodeMessageEnum.EC_NOT_ENABLED, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, + AppErrorCodeMessageEnum.REPORTING_FLOW_PSP_ID_NOT_MATCH, + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_NOT_MATCH + }) + RestResponse createEmptyFlow( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) @Pattern(regexp = "[a-zA-Z0-9\\-_]{1,35}") + String flowName, + @NotNull @Valid CreateFlowRequest request); + + @PUT + @Path(ControllerConstants.URL_API_ADD_PAYMENT_IN_FLOW) + @Operation( + operationId = "IPspsController.addPaymentToExistingFlow", + summary = "Add payments to fdr", + description = "Add payments to fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = AddPaymentRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + idempotency = false, + readWriteIntense = ReadWrite.WRITE) + GenericResponse addPaymentToExistingFlow( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @NotNull @Valid AddPaymentRequest request); + + @PUT + @Path(ControllerConstants.URL_API_DELETE_PAYMENT_IN_FLOW) + @Operation( + operationId = "IPspsController.deletePaymentFromExistingFlow", + summary = "Delete payments to fdr", + description = "Delete payments to fdr") + @RequestBody(content = @Content(schema = @Schema(implementation = DeletePaymentRequest.class))) + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + idempotency = false, + readWriteIntense = ReadWrite.WRITE) + GenericResponse deletePaymentFromExistingFlow( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @NotNull @Valid DeletePaymentRequest request); + + @POST + @Path(ControllerConstants.URL_API_PUBLISH_FLOW) + @Operation( + operationId = "IPspsController.publishFlow", + summary = "Publish fdr", + description = "Publish fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + idempotency = false, + readWriteIntense = ReadWrite.WRITE) + GenericResponse publishFlow( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName); + + @DELETE + @Path(ControllerConstants.URL_API_DELETE_FLOW) + @Operation( + operationId = "IPspsController.deleteExistingFlow", + summary = "Delete fdr", + description = "Delete fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = GenericResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + idempotency = false, + readWriteIntense = ReadWrite.BOTH) + GenericResponse deleteExistingFlow( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName); + + @GET + @Path(ControllerConstants.URL_API_GET_ALL_NOT_PUBLISHED_FLOWS) + @Operation( + operationId = "IPspsController.getAllFlowsNotInPublishedStatus", + summary = "Get all fdr created", + description = "Get all fdr created") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedFlowsCreatedResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + PaginatedFlowsCreatedResponse getAllFlowsNotInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @QueryParam(ControllerConstants.PARAMETER_CREATED_GREATER_THAN) Instant createdGt, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); + + @GET + @Path(ControllerConstants.URL_API_GET_SINGLE_NOT_PUBLISHED_FLOW) + @Operation( + operationId = "IPspsController.getSingleFlowNotInPublishedStatus", + summary = "Get created fdr", + description = "Get created fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = SingleFlowCreatedResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + SingleFlowCreatedResponse getSingleFlowNotInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) String organizationId); + + @GET + @Path(ControllerConstants.URL_API_GET_PAYMENTS_FOR_NOT_PUBLISHED_FLOW) + @Operation( + operationId = "IPspsController.getPaymentsForFlowNotInPublishedStatus", + summary = "Get created payments of fdr", + description = "Get created payments of fdr") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedPaymentsResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + PaginatedPaymentsResponse getPaymentsForFlowNotInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) String organizationId, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); + + @GET + @Path(ControllerConstants.URL_API_GET_ALL_PUBLISHED_FLOWS) + @Operation( + operationId = "IPspsController.getAllFlowsInPublishedStatus", + summary = "Get all fdr published", + description = "Get all fdr published") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedFlowsPublishedResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + PaginatedFlowsPublishedResponse getAllFlowsInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @QueryParam(ControllerConstants.PARAMETER_ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") + String organizationId, + @QueryParam(ControllerConstants.PARAMETER_PUBLISHED_GREATER_THAN) Instant publishedGt, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); + + @GET + @Path(ControllerConstants.URL_API_GET_SINGLE_PUBLISHED_FLOW) + @Operation( + operationId = "IPspsController.getSingleFlowInPublishedStatus", + summary = "Get fdr Published", + description = "Get fdr Published") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = SingleFlowResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + SingleFlowResponse getSingleFlowInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @PathParam(ControllerConstants.PARAMETER_REVISION) Long revision, + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) String organizationId); + + @GET + @Path(ControllerConstants.URL_API_GET_PAYMENTS_FOR_PUBLISHED_FLOW) + @Operation( + operationId = "IPspsController.getPaymentsForFlowInPublishedStatus", + summary = "Get payments of fdr Published", + description = "Get payments of fdr Published") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = PaginatedPaymentsResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + @APITableMetadata( + internal = false, + synchronism = APISynchronism.SYNC, + authorization = APISecurityMode.AUTHORIZER, + authentication = APISecurityMode.APIKEY, + readWriteIntense = ReadWrite.READ, + cacheable = true) + PaginatedPaymentsResponse getPaymentsForFlowInPublishedStatus( + @PathParam(ControllerConstants.PARAMETER_PSP) String pspId, + @PathParam(ControllerConstants.PARAMETER_FDR) String flowName, + @PathParam(ControllerConstants.PARAMETER_REVISION) Long revision, + @PathParam(ControllerConstants.PARAMETER_ORGANIZATION) String organizationId, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/ISupportController.java b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/ISupportController.java new file mode 100644 index 00000000..565a6bae --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/interfaces/controller/ISupportController.java @@ -0,0 +1,139 @@ +package it.gov.pagopa.fdr.controller.interfaces.controller; + +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsBySenderAndReceiverResponse; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.Pattern; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.DefaultValue; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.MediaType; +import java.time.Instant; +import org.eclipse.microprofile.openapi.annotations.Operation; +import org.eclipse.microprofile.openapi.annotations.media.Content; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; +import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; +import org.eclipse.microprofile.openapi.annotations.tags.Tag; + +@Path("/internal/psps/{" + ControllerConstants.PARAMETER_PSP + "}/") +@Consumes("application/json") +@Produces("application/json") +@Tag(name = "Support", description = "Support operations") +public interface ISupportController { + + @GET + @Path("iuv/{" + ControllerConstants.PARAMETER_IUV + "}/") + @Operation( + operationId = "ISupportController.getByIuv", + summary = "Get all payments by psp id and iuv", + description = "Get all payments by psp id and iuv") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = + @Schema(implementation = PaginatedFlowsBySenderAndReceiverResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + PaginatedFlowsBySenderAndReceiverResponse getByIuv( + @PathParam(ControllerConstants.PARAMETER_PSP) @Pattern(regexp = "^(.{1,35})$") String pspId, + @PathParam(ControllerConstants.PARAMETER_IUV) @Pattern(regexp = "^(.{1,35})$") String iuv, + @QueryParam(ControllerConstants.PARAMETER_CREATED_FROM) Instant createdFrom, + @QueryParam(ControllerConstants.PARAMETER_CREATED_TO) Instant createdTo, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); + + @GET + @Path("iur/{" + ControllerConstants.PARAMETER_IUR + "}/") + @Operation( + operationId = "ISupportController.getByIur", + summary = "Get all payments by psp id and iur", + description = "Get all payments by psp id and iur") + @APIResponses( + value = { + @APIResponse( + responseCode = "200", + description = "Success", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = + @Schema(implementation = PaginatedFlowsBySenderAndReceiverResponse.class))), + @APIResponse( + responseCode = "400", + description = "Bad Request", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_BADREQUEST_EXAMPLE)), + @APIResponse( + responseCode = "404", + description = "Not Found", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_NOTFOUND_EXAMPLE)), + @APIResponse( + responseCode = "500", + description = "Internal Server Error", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema(implementation = ErrorResponse.class), + example = ControllerConstants.OPENAPI_INTERNALSERVERERROR_EXAMPLE)) + }) + PaginatedFlowsBySenderAndReceiverResponse getByIur( + @PathParam(ControllerConstants.PARAMETER_PSP) @Pattern(regexp = "^(.{1,35})$") String pspId, + @PathParam(ControllerConstants.PARAMETER_IUR) @Pattern(regexp = "^(.{1,35})$") String iur, + @QueryParam(ControllerConstants.PARAMETER_CREATED_FROM) Instant createdFrom, + @QueryParam(ControllerConstants.PARAMETER_CREATED_TO) Instant createdTo, + @QueryParam(ControllerConstants.PARAMETER_PAGE_INDEX) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_INDEX_DEFAULT) + @Min(value = 1) + long pageNumber, + @QueryParam(ControllerConstants.PARAMETER_PAGE_SIZE) + @DefaultValue(ControllerConstants.PARAMETER_PAGE_SIZE_DEFAULT) + @Min(value = 1) + long pageSize); +} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ExceptionMappers.java b/src/main/java/it/gov/pagopa/fdr/controller/middleware/exceptionhandler/ExceptionMappers.java similarity index 83% rename from src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ExceptionMappers.java rename to src/main/java/it/gov/pagopa/fdr/controller/middleware/exceptionhandler/ExceptionMappers.java index e8060826..53b86751 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ExceptionMappers.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/middleware/exceptionhandler/ExceptionMappers.java @@ -1,17 +1,18 @@ -package it.gov.pagopa.fdr.rest.exceptionmapper; +package it.gov.pagopa.fdr.controller.middleware.exceptionhandler; -import static it.gov.pagopa.fdr.util.AppMessageUtil.logErrorMessage; -import static it.gov.pagopa.fdr.util.MDCKeys.TRX_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.TRX_ID; +import static it.gov.pagopa.fdr.util.logging.AppMessageUtil.logErrorMessage; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonMappingException.Reference; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import com.fasterxml.jackson.databind.exc.MismatchedInputException; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageInterface; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.util.AppMessageUtil; +import it.gov.pagopa.fdr.controller.model.error.ErrorMessage; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; +import it.gov.pagopa.fdr.util.logging.AppMessageUtil; import jakarta.validation.ConstraintViolationException; import jakarta.validation.UnexpectedTypeException; import jakarta.ws.rs.WebApplicationException; @@ -48,7 +49,7 @@ public Response mapWebApplicationException(WebApplicationException webApplicatio @ServerExceptionMapper public RestResponse mapAppException(AppException appEx) { - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); String message = codeMessage.message(appEx.getArgs()); @@ -57,7 +58,7 @@ public RestResponse mapAppException(AppException appEx) { .httpStatusCode(status.getStatusCode()) .httpStatusDescription(status.getReasonPhrase()) .appErrorCode(codeMessage.errorCode()) - .errors(List.of(ErrorResponse.ErrorMessage.builder().message(message).build())) + .errors(List.of(ErrorMessage.builder().message(message).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -70,7 +71,7 @@ private RestResponse mapJsonMappingException( new AppException( jsonMappingException, AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT); - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -80,9 +81,7 @@ private RestResponse mapJsonMappingException( .appErrorCode(codeMessage.errorCode()) .errors( List.of( - ErrorResponse.ErrorMessage.builder() - .message(codeMessage.message(appEx.getArgs())) - .build())) + ErrorMessage.builder().message(codeMessage.message(appEx.getArgs())).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -95,7 +94,7 @@ private RestResponse mapJsonParseException(JsonParseException jso new AppException( jsonParseException, AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT); - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -105,9 +104,7 @@ private RestResponse mapJsonParseException(JsonParseException jso .appErrorCode(codeMessage.errorCode()) .errors( List.of( - ErrorResponse.ErrorMessage.builder() - .message(codeMessage.message(appEx.getArgs())) - .build())) + ErrorMessage.builder().message(codeMessage.message(appEx.getArgs())).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -163,7 +160,7 @@ public RestResponse mapInvalidFormatException( currentValue); } - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -173,9 +170,7 @@ public RestResponse mapInvalidFormatException( .appErrorCode(codeMessage.errorCode()) .errors( List.of( - ErrorResponse.ErrorMessage.builder() - .message(codeMessage.message(appEx.getArgs())) - .build())) + ErrorMessage.builder().message(codeMessage.message(appEx.getArgs())).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -196,7 +191,7 @@ public RestResponse mapMismatchedInputException( AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_DESERIALIZE_ERROR, field); - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -206,9 +201,7 @@ public RestResponse mapMismatchedInputException( .appErrorCode(codeMessage.errorCode()) .errors( List.of( - ErrorResponse.ErrorMessage.builder() - .message(codeMessage.message(appEx.getArgs())) - .build())) + ErrorMessage.builder().message(codeMessage.message(appEx.getArgs())).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -225,7 +218,7 @@ public RestResponse mapThrowable(Throwable exception) { log.errorf(logErrorMessage(exception.getMessage())); AppException appEx = new AppException(exception, AppErrorCodeMessageEnum.ERROR); - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -236,9 +229,7 @@ public RestResponse mapThrowable(Throwable exception) { .appErrorCode(codeMessage.errorCode()) .errors( List.of( - ErrorResponse.ErrorMessage.builder() - .message(codeMessage.message(appEx.getArgs())) - .build())) + ErrorMessage.builder().message(codeMessage.message(appEx.getArgs())).build())) .build(); return RestResponse.status(codeMessage.httpStatus(), errorResponse); @@ -250,7 +241,7 @@ public RestResponse mapConstraintViolationException( AppException appEx = new AppException(constraintViolationException, AppErrorCodeMessageEnum.BAD_REQUEST); - AppErrorCodeMessageInterface codeMessage = appEx.getCodeMessage(); + AppErrorCodeMessageEnum codeMessage = appEx.getCodeMessage(); RestResponse.Status status = codeMessage.httpStatus(); ErrorResponse errorResponse = @@ -267,7 +258,7 @@ public RestResponse mapConstraintViolationException( .compareTo(a.getPropertyPath().toString())) .map( constraintViolation -> - ErrorResponse.ErrorMessage.builder() + ErrorMessage.builder() .path(constraintViolation.getPropertyPath().toString()) .message( AppMessageUtil.getMessage(constraintViolation.getMessage())) diff --git a/src/main/java/it/gov/pagopa/fdr/util/NoInternalSchemaFilter.java b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/NoInternalSchemaFilter.java similarity index 93% rename from src/main/java/it/gov/pagopa/fdr/util/NoInternalSchemaFilter.java rename to src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/NoInternalSchemaFilter.java index 20d3e379..735a676e 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/NoInternalSchemaFilter.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/NoInternalSchemaFilter.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.controller.middleware.filter; import java.util.Map; import java.util.Map.Entry; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/filter/RequestFilter.java b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/RequestFilter.java similarity index 57% rename from src/main/java/it/gov/pagopa/fdr/rest/filter/RequestFilter.java rename to src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/RequestFilter.java index a5900054..13847873 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/filter/RequestFilter.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/RequestFilter.java @@ -1,11 +1,19 @@ -package it.gov.pagopa.fdr.rest.filter; - -import static it.gov.pagopa.fdr.util.MDCKeys.*; - -import it.gov.pagopa.fdr.service.re.ReService; -import it.gov.pagopa.fdr.service.re.model.*; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.AppReUtil; +package it.gov.pagopa.fdr.controller.middleware.filter; + +import static it.gov.pagopa.fdr.util.constant.MDCKeys.ACTION; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.EVENT_CATEGORY; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.HTTP_TYPE; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.ORGANIZATION_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.PSP_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.TRX_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.URI; + +import it.gov.pagopa.fdr.service.ReService; +import it.gov.pagopa.fdr.service.model.re.EventTypeEnum; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; +import it.gov.pagopa.fdr.util.constant.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import it.gov.pagopa.fdr.util.re.AppReUtil; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ContainerRequestFilter; import jakarta.ws.rs.core.MultivaluedMap; @@ -14,8 +22,6 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.time.Instant; -import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import org.jboss.logging.Logger; @@ -44,11 +50,20 @@ public void filter(ContainerRequestContext containerRequestContext) throws IOExc String requestMethod = containerRequestContext.getMethod(); String requestPath = containerRequestContext.getUriInfo().getAbsolutePath().getPath(); String pspPathParam = - containerRequestContext.getUriInfo().getPathParameters().getFirst(AppConstant.PSP); + containerRequestContext + .getUriInfo() + .getPathParameters() + .getFirst(ControllerConstants.PARAMETER_PSP); String fdrPathParam = - containerRequestContext.getUriInfo().getPathParameters().getFirst(AppConstant.FDR); + containerRequestContext + .getUriInfo() + .getPathParameters() + .getFirst(ControllerConstants.PARAMETER_FDR); String ecPathParam = - containerRequestContext.getUriInfo().getPathParameters().getFirst(AppConstant.ORGANIZATION); + containerRequestContext + .getUriInfo() + .getPathParameters() + .getFirst(ControllerConstants.PARAMETER_ORGANIZATION); FdrActionEnum fdrActionEnum = AppReUtil.getFlowNamebyAnnotation( @@ -71,11 +86,11 @@ public void filter(ContainerRequestContext containerRequestContext) throws IOExc String pspId = null; String organizationId = null; if (!pathparam.isEmpty()) { - if (pathparam.containsKey(AppConstant.PSP)) { - subject = pathparam.getFirst(AppConstant.PSP); + if (pathparam.containsKey(ControllerConstants.PARAMETER_PSP)) { + subject = pathparam.getFirst(ControllerConstants.PARAMETER_PSP); pspId = subject; - } else if (pathparam.containsKey(AppConstant.ORGANIZATION)) { - subject = pathparam.getFirst(AppConstant.ORGANIZATION); + } else if (pathparam.containsKey(ControllerConstants.PARAMETER_ORGANIZATION)) { + subject = pathparam.getFirst(ControllerConstants.PARAMETER_ORGANIZATION); organizationId = subject; } } @@ -89,24 +104,24 @@ public void filter(ContainerRequestContext containerRequestContext) throws IOExc .collect(Collectors.joining("\n")); containerRequestContext.setEntityStream(new ByteArrayInputStream(body.getBytes())); - reService.sendEvent( - ReInterface.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERFACE) - .httpType(HttpTypeEnum.REQ) - .httpMethod(requestMethod) - .httpUrl(requestPath) - .payload(body) - .header( - containerRequestContext.getHeaders().entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))) - .pspId(pspPathParam) - .fdr(fdrPathParam) - .organizationId(ecPathParam) - .fdrAction(fdrActionEnum) - .build()); + /*reService.sendEvent( + ReInterface.builder() + .serviceIdentifier(AppVersionEnum.FDR003) + .created(Instant.now()) + .sessionId(sessionId) + .eventType(EventTypeEnum.INTERFACE) + .httpType(HttpTypeEnum.REQ) + .httpMethod(requestMethod) + .httpUrl(requestPath) + .payload(body) + .header( + containerRequestContext.getHeaders().entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))) + .pspId(pspPathParam) + .fdr(fdrPathParam) + .organizationId(ecPathParam) + .fdrAction(fdrActionEnum) + .build());*/ MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERFACE.name()); log.infof("REQ --> %s [uri:%s] [subject:%s]", requestMethod, requestPath, subject); diff --git a/src/main/java/it/gov/pagopa/fdr/rest/filter/ResponseFilter.java b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/ResponseFilter.java similarity index 73% rename from src/main/java/it/gov/pagopa/fdr/rest/filter/ResponseFilter.java rename to src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/ResponseFilter.java index b8f3e95d..d36a2350 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/filter/ResponseFilter.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/middleware/filter/ResponseFilter.java @@ -1,30 +1,37 @@ -package it.gov.pagopa.fdr.rest.filter; - -import static it.gov.pagopa.fdr.util.MDCKeys.*; +package it.gov.pagopa.fdr.controller.middleware.filter; + +import static it.gov.pagopa.fdr.util.constant.MDCKeys.ACTION; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.ELAPSED; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.EVENT_CATEGORY; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.FDR; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.HTTP_TYPE; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.ORGANIZATION_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.PSP_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.STATUS_CODE; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.TRX_ID; +import static it.gov.pagopa.fdr.util.constant.MDCKeys.URI; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse.ErrorMessage; -import it.gov.pagopa.fdr.service.re.ReService; -import it.gov.pagopa.fdr.service.re.model.*; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.AppReUtil; -import it.gov.pagopa.fdr.util.MDCKeys; +import it.gov.pagopa.fdr.controller.model.error.ErrorMessage; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.service.ReService; +import it.gov.pagopa.fdr.service.model.re.EventTypeEnum; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; +import it.gov.pagopa.fdr.util.constant.AppConstant; +import it.gov.pagopa.fdr.util.constant.MDCKeys; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; +import it.gov.pagopa.fdr.util.re.AppReUtil; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ContainerResponseContext; import jakarta.ws.rs.container.ContainerResponseFilter; import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response.Status; import jakarta.ws.rs.ext.Provider; -import java.time.Instant; -import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.jboss.logging.Logger; import org.jboss.logging.MDC; import org.jboss.resteasy.reactive.server.jaxrs.ContainerRequestContextImpl; @@ -91,27 +98,27 @@ public void filter( throw new AppException(e, AppErrorCodeMessageEnum.ERROR); } - reService.sendEvent( - ReInterface.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERFACE) - .httpType(HttpTypeEnum.RES) - .httpMethod(requestMethod) - .httpUrl(requestPath) - .payload(responsePayload) - .header( - responseContext.getHeaders().entrySet().stream() - .collect( - Collectors.toMap( - Map.Entry::getKey, - a -> Stream.of(a.getValue()).map(Object::toString).toList()))) - .pspId(psp) - .fdr(fdr) - .organizationId(organizationId) - .fdrAction(fdrActionEnum) - .build()); + /*reService.sendEvent( + ReInterface.builder() + .serviceIdentifier(AppVersionEnum.FDR003) + .created(Instant.now()) + .sessionId(sessionId) + .eventType(EventTypeEnum.INTERFACE) + .httpType(HttpTypeEnum.RES) + .httpMethod(requestMethod) + .httpUrl(requestPath) + .payload(responsePayload) + .header( + responseContext.getHeaders().entrySet().stream() + .collect( + Collectors.toMap( + Map.Entry::getKey, + a -> Stream.of(a.getValue()).map(Object::toString).toList()))) + .pspId(psp) + .fdr(fdr) + .organizationId(organizationId) + .fdrAction(fdrActionEnum) + .build());*/ MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERFACE.name()); if (responseContext.getStatus() != Response.Status.OK.getStatusCode() diff --git a/src/main/java/it/gov/pagopa/fdr/util/ClientGZIPDecodingInterceptor.java b/src/main/java/it/gov/pagopa/fdr/controller/middleware/interceptor/ClientGZIPDecodingInterceptor.java similarity index 95% rename from src/main/java/it/gov/pagopa/fdr/util/ClientGZIPDecodingInterceptor.java rename to src/main/java/it/gov/pagopa/fdr/controller/middleware/interceptor/ClientGZIPDecodingInterceptor.java index f6b613d3..c402d0c5 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/ClientGZIPDecodingInterceptor.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/middleware/interceptor/ClientGZIPDecodingInterceptor.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.controller.middleware.interceptor; import static jakarta.ws.rs.core.HttpHeaders.CONTENT_ENCODING; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/Metadata.java b/src/main/java/it/gov/pagopa/fdr/controller/model/common/Metadata.java similarity index 85% rename from src/main/java/it/gov/pagopa/fdr/rest/model/Metadata.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/common/Metadata.java index 114ca461..6f54d409 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/Metadata.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/common/Metadata.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.common; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/GenericResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/common/response/GenericResponse.java similarity index 82% rename from src/main/java/it/gov/pagopa/fdr/rest/model/GenericResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/common/response/GenericResponse.java index 06ce6d8b..50f534f7 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/GenericResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/common/response/GenericResponse.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.common.response; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/info/response/InfoResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/common/response/InfoResponse.java similarity index 53% rename from src/main/java/it/gov/pagopa/fdr/rest/info/response/InfoResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/common/response/InfoResponse.java index b694c129..3bc4faaa 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/info/response/InfoResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/common/response/InfoResponse.java @@ -1,12 +1,8 @@ -package it.gov.pagopa.fdr.rest.info.response; +package it.gov.pagopa.fdr.controller.model.common.response; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import java.util.List; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.extern.jackson.Jacksonized; import org.eclipse.microprofile.openapi.annotations.media.Schema; @@ -15,6 +11,7 @@ @Jacksonized @JsonPropertyOrder({"name", "version", "environment", "description", "errorCodes"}) public class InfoResponse { + @Schema(example = "pagopa-fdr") private String name; @@ -26,21 +23,4 @@ public class InfoResponse { @Schema(example = "FDR - Flussi di rendicontazione") private String description; - - private List errorCodes; - - @Builder - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class ErrorCode { - @Schema(example = "FDR-0500") - private String code; - - @Schema(example = "An unexpected error has occurred. Please contact support.") - private String description; - - @Schema(example = "500") - private int statusCode; - } } diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorMessage.java b/src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorMessage.java new file mode 100644 index 00000000..b228d6d1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorMessage.java @@ -0,0 +1,26 @@ +package it.gov.pagopa.fdr.controller.model.error; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import io.quarkus.runtime.annotations.RegisterForReflection; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.eclipse.microprofile.openapi.annotations.media.Schema; + +@Builder +@Data +@AllArgsConstructor +@NoArgsConstructor +@JsonPropertyOrder({"path", "message"}) +@RegisterForReflection +public class ErrorMessage { + + @Schema() // (example = "demo.test") + @JsonInclude(JsonInclude.Include.NON_NULL) + private String path; + + @Schema() // (example = "An unexpected error has occurred. Please contact support.") + private String message; +} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ErrorResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorResponse.java similarity index 63% rename from src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ErrorResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorResponse.java index 2dfc61e1..d40573aa 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/exceptionmapper/ErrorResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/error/ErrorResponse.java @@ -1,14 +1,11 @@ -package it.gov.pagopa.fdr.rest.exceptionmapper; +package it.gov.pagopa.fdr.controller.model.error; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import io.quarkus.runtime.annotations.RegisterForReflection; import java.util.List; -import lombok.AllArgsConstructor; import lombok.Builder; -import lombok.Data; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.extern.jackson.Jacksonized; import org.eclipse.microprofile.openapi.annotations.media.Schema; @@ -33,20 +30,4 @@ public class ErrorResponse { private String appErrorCode; private List errors; - - @Builder - @Data - @AllArgsConstructor - @NoArgsConstructor - @JsonPropertyOrder({"path", "message"}) - @RegisterForReflection - public static class ErrorMessage { - - @Schema(example = "demo.test") - @JsonInclude(JsonInclude.Include.NON_NULL) - private String path; - - @Schema(example = "An unexpected error has occurred. Please contact support.") - private String message; - } } diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrInserted.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCICreated.java similarity index 59% rename from src/main/java/it/gov/pagopa/fdr/rest/model/FdrInserted.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCICreated.java index ea82228f..f6b7ab09 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrInserted.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCICreated.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -9,18 +9,18 @@ @Getter @Builder -public class FdrInserted { +public class FlowByCICreated { @Schema(example = "AAABBB") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @Schema(example = "1") - @JsonProperty(AppConstant.ORGANIZATION) + @JsonProperty(ControllerConstants.PARAMETER_ORGANIZATION) private String organizationId; @Schema(example = "1") - @JsonProperty(AppConstant.REVISION) + @JsonProperty(ControllerConstants.PARAMETER_REVISION) private Long revision; @Schema(example = "2023-04-03T12:00:30.900000Z") diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrPublished.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCIPublished.java similarity index 59% rename from src/main/java/it/gov/pagopa/fdr/rest/model/FdrPublished.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCIPublished.java index f9ff797e..1974814a 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrPublished.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByCIPublished.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -9,18 +9,18 @@ @Getter @Builder -public class FdrPublished { +public class FlowByCIPublished { @Schema(example = "AAABBB") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @Schema(example = "1") - @JsonProperty(AppConstant.ORGANIZATION) + @JsonProperty(ControllerConstants.PARAMETER_ORGANIZATION) private String organizationId; @Schema(example = "1") - @JsonProperty(AppConstant.REVISION) + @JsonProperty(ControllerConstants.PARAMETER_REVISION) private Long revision; @Schema(example = "2023-04-03T12:00:30.900000Z") diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/Fdr.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByPSP.java similarity index 60% rename from src/main/java/it/gov/pagopa/fdr/rest/model/Fdr.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByPSP.java index 6819b89e..3afb21a8 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/Fdr.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowByPSP.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -9,18 +9,18 @@ @Getter @Builder -public class Fdr { +public class FlowByPSP { @Schema(example = "AAABBB") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @Schema(example = "1") - @JsonProperty(AppConstant.PSP) + @JsonProperty(ControllerConstants.PARAMETER_PSP) private String pspId; @Schema(example = "1") - @JsonProperty(AppConstant.REVISION) + @JsonProperty(ControllerConstants.PARAMETER_REVISION) private Long revision; @Schema(example = "2023-04-03T12:00:30.900000Z") diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrByPspIdIuvIurBase.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowBySenderAndReceiver.java similarity index 82% rename from src/main/java/it/gov/pagopa/fdr/rest/model/FdrByPspIdIuvIurBase.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowBySenderAndReceiver.java index 053bd697..3de56fe7 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/FdrByPspIdIuvIurBase.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/FlowBySenderAndReceiver.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import java.time.Instant; @@ -10,10 +10,15 @@ @SuperBuilder @Jacksonized @JsonPropertyOrder({"pspId", "organizationId", "fdr", "revision", "created"}) -public class FdrByPspIdIuvIurBase { +public class FlowBySenderAndReceiver { + private String pspId; + private String organizationId; + private String fdr; + private Long revision; + private Instant created; } diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/Receiver.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/Receiver.java similarity index 85% rename from src/main/java/it/gov/pagopa/fdr/rest/model/Receiver.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/Receiver.java index 760ec9c0..cd1df8f7 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/Receiver.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/Receiver.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import lombok.Builder; @@ -27,7 +27,7 @@ public class Receiver { @Schema( example = "20000000001", description = "[XML NodoInviaFlussoRendicontazione]=[identificativoDominio]") - @JsonProperty(AppConstant.ORGANIZATION) + @JsonProperty(ControllerConstants.PARAMETER_ORGANIZATION) private String organizationId; @NotNull diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/Sender.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/Sender.java similarity index 89% rename from src/main/java/it/gov/pagopa/fdr/rest/model/Sender.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/Sender.java index f753d5aa..7da1709b 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/Sender.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/Sender.java @@ -1,8 +1,9 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.controller.model.flow.enums.SenderTypeEnum; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Pattern; import lombok.Builder; @@ -39,7 +40,7 @@ public class Sender { @Schema( example = "60000000001", description = "[XML NodoInviaFlussoRendicontazione]=[identificativoPSP]") - @JsonProperty(AppConstant.PSP) + @JsonProperty(ControllerConstants.PARAMETER_PSP) private String pspId; @NotNull diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/ReportingFlowStatusEnum.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/ReportingFlowStatusEnum.java similarity index 58% rename from src/main/java/it/gov/pagopa/fdr/rest/model/ReportingFlowStatusEnum.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/ReportingFlowStatusEnum.java index 0457af01..c383956b 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/ReportingFlowStatusEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/ReportingFlowStatusEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow.enums; public enum ReportingFlowStatusEnum { CREATED, diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/SenderTypeEnum.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/SenderTypeEnum.java similarity index 64% rename from src/main/java/it/gov/pagopa/fdr/rest/model/SenderTypeEnum.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/SenderTypeEnum.java index 1d6e3147..038142a9 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/SenderTypeEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/enums/SenderTypeEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.flow.enums; import lombok.Getter; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/CreateRequest.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/request/CreateFlowRequest.java similarity index 86% rename from src/main/java/it/gov/pagopa/fdr/rest/psps/request/CreateRequest.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/request/CreateFlowRequest.java index 3d9b9813..92147e92 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/CreateRequest.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/request/CreateFlowRequest.java @@ -1,9 +1,9 @@ -package it.gov.pagopa.fdr.rest.psps.request; +package it.gov.pagopa.fdr.controller.model.flow.request; import com.fasterxml.jackson.annotation.JsonProperty; -import it.gov.pagopa.fdr.rest.model.Receiver; -import it.gov.pagopa.fdr.rest.model.Sender; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.controller.model.flow.Receiver; +import it.gov.pagopa.fdr.controller.model.flow.Sender; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import jakarta.validation.Valid; import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.Digits; @@ -19,13 +19,14 @@ @Getter @Builder @Jacksonized -public class CreateRequest { +public class CreateFlowRequest { + @NotNull @Pattern(regexp = "[a-zA-Z0-9\\-_]{1,35}") @Schema( example = "2016-08-16pspTest-1178", description = "[XML NodoInviaFlussoRendicontazione]=[identificativoFlusso]") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @NotNull diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsBySenderAndReceiverResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsBySenderAndReceiverResponse.java new file mode 100644 index 00000000..421dfc51 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsBySenderAndReceiverResponse.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.controller.model.flow.response; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import it.gov.pagopa.fdr.controller.model.flow.FlowBySenderAndReceiver; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@SuperBuilder +@Jacksonized +@JsonPropertyOrder({"metadata", "count", "data"}) +public class PaginatedFlowsBySenderAndReceiverResponse extends PaginatedResponse { + + private List data; +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsCreatedResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsCreatedResponse.java new file mode 100644 index 00000000..4cfa097b --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsCreatedResponse.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.controller.model.flow.response; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import it.gov.pagopa.fdr.controller.model.flow.FlowByCICreated; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@SuperBuilder +@Jacksonized +@JsonPropertyOrder({"metadata", "count", "data"}) +public class PaginatedFlowsCreatedResponse extends PaginatedResponse { + + private List data; +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsPublishedResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsPublishedResponse.java new file mode 100644 index 00000000..7f315a25 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsPublishedResponse.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.controller.model.flow.response; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import it.gov.pagopa.fdr.controller.model.flow.FlowByCIPublished; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@SuperBuilder +@Jacksonized +@JsonPropertyOrder({"metadata", "count", "data"}) +public class PaginatedFlowsPublishedResponse extends PaginatedResponse { + + private List data; +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsResponse.java new file mode 100644 index 00000000..f45d8a01 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedFlowsResponse.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.controller.model.flow.response; + +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import it.gov.pagopa.fdr.controller.model.flow.FlowByPSP; +import java.util.List; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.SuperBuilder; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@SuperBuilder +@Jacksonized +@JsonPropertyOrder({"metadata", "count", "data"}) +public class PaginatedFlowsResponse extends PaginatedResponse { + + private List data; +} diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedResponse.java new file mode 100644 index 00000000..e3caf0c4 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/PaginatedResponse.java @@ -0,0 +1,16 @@ +package it.gov.pagopa.fdr.controller.model.flow.response; + +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import lombok.Getter; +import lombok.experimental.SuperBuilder; +import org.eclipse.microprofile.openapi.annotations.media.Schema; + +@Getter +@SuperBuilder +public class PaginatedResponse { + + private Metadata metadata; + + @Schema(example = "100") + private long count; +} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetCreatedResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowCreatedResponse.java similarity index 76% rename from src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetCreatedResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowCreatedResponse.java index 12fe6116..8a116a17 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetCreatedResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowCreatedResponse.java @@ -1,11 +1,11 @@ -package it.gov.pagopa.fdr.rest.psps.response; +package it.gov.pagopa.fdr.controller.model.flow.response; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.Receiver; -import it.gov.pagopa.fdr.rest.model.ReportingFlowStatusEnum; -import it.gov.pagopa.fdr.rest.model.Sender; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.controller.model.flow.Receiver; +import it.gov.pagopa.fdr.controller.model.flow.Sender; +import it.gov.pagopa.fdr.controller.model.flow.enums.ReportingFlowStatusEnum; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -28,9 +28,10 @@ "sender", "receiver" }) -public class GetCreatedResponse { +public class SingleFlowCreatedResponse { + @Schema(example = "4") - @JsonProperty(AppConstant.REVISION) + @JsonProperty(ControllerConstants.PARAMETER_REVISION) private Long revision; @Schema(example = "2023-04-03T12:00:30.900000Z") @@ -43,7 +44,7 @@ public class GetCreatedResponse { private ReportingFlowStatusEnum status; @Schema(example = "2016-08-16pspTest-1178") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @Schema(example = "2023-04-05T09:21:37.810000Z") diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowResponse.java similarity index 77% rename from src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowResponse.java index 66edfd44..2c8539e2 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/flow/response/SingleFlowResponse.java @@ -1,11 +1,11 @@ -package it.gov.pagopa.fdr.rest.organizations.response; +package it.gov.pagopa.fdr.controller.model.flow.response; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.Receiver; -import it.gov.pagopa.fdr.rest.model.ReportingFlowStatusEnum; -import it.gov.pagopa.fdr.rest.model.Sender; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.controller.model.flow.Receiver; +import it.gov.pagopa.fdr.controller.model.flow.Sender; +import it.gov.pagopa.fdr.controller.model.flow.enums.ReportingFlowStatusEnum; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; import java.time.Instant; import lombok.Builder; import lombok.Getter; @@ -28,9 +28,10 @@ "sender", "receiver" }) -public class GetResponse { +public class SingleFlowResponse { + @Schema(example = "4") - @JsonProperty(AppConstant.REVISION) + @JsonProperty(ControllerConstants.PARAMETER_REVISION) private Long revision; @Schema(example = "2023-04-03T12:00:30.900000Z") @@ -46,7 +47,7 @@ public class GetResponse { private ReportingFlowStatusEnum status; @Schema(example = "2016-08-16pspTest-1178") - @JsonProperty(AppConstant.FDR) + @JsonProperty(ControllerConstants.PARAMETER_FDR) private String fdr; @Schema(example = "2023-04-05T09:21:37.810000Z") diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/Payment.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/Payment.java similarity index 93% rename from src/main/java/it/gov/pagopa/fdr/rest/model/Payment.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/payment/Payment.java index ae6ddc13..add9fb7c 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/Payment.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/Payment.java @@ -1,5 +1,6 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.controller.model.payment; +import it.gov.pagopa.fdr.controller.model.payment.enums.PaymentStatusEnum; import jakarta.validation.constraints.*; import java.time.Instant; import lombok.Builder; diff --git a/src/main/java/it/gov/pagopa/fdr/controller/model/payment/enums/PaymentStatusEnum.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/enums/PaymentStatusEnum.java new file mode 100644 index 00000000..ef5e1369 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/enums/PaymentStatusEnum.java @@ -0,0 +1,9 @@ +package it.gov.pagopa.fdr.controller.model.payment.enums; + +public enum PaymentStatusEnum { + EXECUTED, + REVOKED, + NO_RPT, + STAND_IN, + STAND_IN_NO_RPT; +} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/AddPaymentRequest.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/AddPaymentRequest.java similarity index 70% rename from src/main/java/it/gov/pagopa/fdr/rest/psps/request/AddPaymentRequest.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/AddPaymentRequest.java index 139c831b..8dd2a90f 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/AddPaymentRequest.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/AddPaymentRequest.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.rest.psps.request; +package it.gov.pagopa.fdr.controller.model.payment.request; -import it.gov.pagopa.fdr.rest.model.Payment; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.util.constant.AppConstant; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -14,6 +14,7 @@ @Builder @Jacksonized public class AddPaymentRequest { + @NotNull @Size(min = 1, max = AppConstant.MAX_PAYMENT) @Valid diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/DeletePaymentRequest.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/DeletePaymentRequest.java similarity index 76% rename from src/main/java/it/gov/pagopa/fdr/rest/psps/request/DeletePaymentRequest.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/DeletePaymentRequest.java index b004567e..c9320e92 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/request/DeletePaymentRequest.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/request/DeletePaymentRequest.java @@ -1,6 +1,6 @@ -package it.gov.pagopa.fdr.rest.psps.request; +package it.gov.pagopa.fdr.controller.model.payment.request; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.AppConstant; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import java.util.List; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetPaymentResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsCreatedResponse.java similarity index 65% rename from src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetPaymentResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsCreatedResponse.java index 9207a39f..3c708ebc 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetPaymentResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsCreatedResponse.java @@ -1,8 +1,8 @@ -package it.gov.pagopa.fdr.rest.organizations.response; +package it.gov.pagopa.fdr.controller.model.payment.response; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.Metadata; -import it.gov.pagopa.fdr.rest.model.Payment; +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import it.gov.pagopa.fdr.controller.model.payment.Payment; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,7 +13,7 @@ @Builder @Jacksonized @JsonPropertyOrder({"metadata", "count", "sum", "data"}) -public class GetPaymentResponse { +public class PaginatedPaymentsCreatedResponse { private Metadata metadata; diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetPaymentCreatedResponse.java b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsResponse.java similarity index 66% rename from src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetPaymentCreatedResponse.java rename to src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsResponse.java index b71ba506..db0b08b5 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetPaymentCreatedResponse.java +++ b/src/main/java/it/gov/pagopa/fdr/controller/model/payment/response/PaginatedPaymentsResponse.java @@ -1,8 +1,8 @@ -package it.gov.pagopa.fdr.rest.psps.response; +package it.gov.pagopa.fdr.controller.model.payment.response; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.Metadata; -import it.gov.pagopa.fdr.rest.model.Payment; +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import it.gov.pagopa.fdr.controller.model.payment.Payment; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,7 +13,7 @@ @Builder @Jacksonized @JsonPropertyOrder({"metadata", "count", "sum", "data"}) -public class GetPaymentCreatedResponse { +public class PaginatedPaymentsResponse { private Metadata metadata; diff --git a/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageEnum.java b/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageEnum.java deleted file mode 100644 index 4e801637..00000000 --- a/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageEnum.java +++ /dev/null @@ -1,90 +0,0 @@ -package it.gov.pagopa.fdr.exception; - -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import org.jboss.resteasy.reactive.RestResponse; -import org.jboss.resteasy.reactive.RestResponse.Status; - -public enum AppErrorCodeMessageEnum implements AppErrorCodeMessageInterface { - ERROR("0500", "system.error", RestResponse.Status.INTERNAL_SERVER_ERROR), - BAD_REQUEST("0400", "bad.request", RestResponse.Status.BAD_REQUEST), - BAD_REQUEST_INPUT_JSON("0401", "bad.request.inputJson", RestResponse.Status.BAD_REQUEST), - BAD_REQUEST_INPUT_JSON_INSTANT( - "0402", "bad.request.inputJson.instant", RestResponse.Status.BAD_REQUEST), - BAD_REQUEST_INPUT_JSON_ENUM( - "0403", "bad.request.inputJson.enum", RestResponse.Status.BAD_REQUEST), - - BAD_REQUEST_INPUT_JSON_DESERIALIZE_ERROR( - "0404", "bad.request.inputJson.deserialize", RestResponse.Status.BAD_REQUEST), - BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT( - "0405", "bad.request.inputJson.notValidJsonFormat", RestResponse.Status.BAD_REQUEST), - - REPORTING_FLOW_NOT_FOUND("0701", "fdr.notFound", RestResponse.Status.NOT_FOUND), - REPORTING_FLOW_ALREADY_EXIST("0702", "fdr.alreadyExist", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_WRONG_ACTION("0703", "fdr.wrongAction", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_PSP_ID_NOT_MATCH("0704", "fdr.pspId.notMatch", RestResponse.Status.BAD_REQUEST), - - REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST( - "0705", "fdr.sameIndexInSameRequest", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX( - "0706", "fdr.duplicateIndex", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX( - "0707", "fdr.noMatchIndex", RestResponse.Status.BAD_REQUEST), - PSP_UNKNOWN("0708", "pspId.unknown", RestResponse.Status.BAD_REQUEST), - PSP_NOT_ENABLED("0709", "pspId.notEnabled", RestResponse.Status.BAD_REQUEST), - BROKER_UNKNOWN("0710", "brokerId.unknown", RestResponse.Status.BAD_REQUEST), - BROKER_NOT_ENABLED("0711", "brokerId.notEnabled", RestResponse.Status.BAD_REQUEST), - CHANNEL_UNKNOWN("0712", "channelId.unknown", RestResponse.Status.BAD_REQUEST), - CHANNEL_NOT_ENABLED("0713", "channelId.notEnabled", RestResponse.Status.BAD_REQUEST), - CHANNEL_BROKER_WRONG_CONFIG( - "0714", "channel.broker.wrongConfig", RestResponse.Status.BAD_REQUEST), - CHANNEL_PSP_WRONG_CONFIG("0715", "channel.psp.wrongConfig", RestResponse.Status.BAD_REQUEST), - EC_UNKNOWN("0716", "ecId.unknown", RestResponse.Status.BAD_REQUEST), - EC_NOT_ENABLED("0717", "ecId.notEnabled", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_NAME_DATE_WRONG_FORMAT( - "0718", "fdr.name-date.wrongFormat", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_NAME_PSP_WRONG_FORMAT( - "0719", "fdr.name-psp.wrongFormat", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_NAME_NOT_MATCH("0720", "fdr.name.notMatch", RestResponse.Status.BAD_REQUEST), - EVENT_HUB_RE_PARSE_JSON("0721", "eHub.re.parse", Status.INTERNAL_SERVER_ERROR), - EVENT_HUB_RE_TOO_LARGE("0722", "eHub.re.tooLarge", Status.INTERNAL_SERVER_ERROR), - - REPORTING_FLOW_WRONG_TOT_PAYMENT("0723", "fdr.wrongTotPayment", RestResponse.Status.BAD_REQUEST), - REPORTING_FLOW_WRONG_SUM_PAYMENT("0724", "fdr.wrongSumPayment", RestResponse.Status.BAD_REQUEST), - FDR_HISTORY_VALID_JSON_ERROR( - "0725", "fdr.fdrHistoryJsonValidationError", Status.INTERNAL_SERVER_ERROR), - FDR_HISTORY_UPLOAD_JSON_BLOB_ERROR( - "0726", "fdr.fdrHistoryUploadJsonError", Status.INTERNAL_SERVER_ERROR), - FDR_HISTORY_JSON_PROCESSING_ERROR( - "0727", "fdr.fdrHistoryJsonProcessingError", Status.INTERNAL_SERVER_ERROR), - FDR_HISTORY_SAVE_TABLE_STORAGE_ERROR( - "0728", "fdr.fdrHistorySaveOnTableStorageError", Status.INTERNAL_SERVER_ERROR), - FILE_UTILS_CONVERSION_ERROR("0729", "fdr.fileUtilsConversionError", Status.INTERNAL_SERVER_ERROR), - FILE_UTILS_FILE_NOT_FOUND("0730", "fdr.fileUtilsFileNotFound", Status.INTERNAL_SERVER_ERROR), - COMPRESS_JSON("0731", "compress.json.error", Status.INTERNAL_SERVER_ERROR); - private final String errorCode; - private final String errorMessageKey; - private final RestResponse.Status httpStatus; - - AppErrorCodeMessageEnum( - String errorCode, String errorMessageKey, RestResponse.Status httpStatus) { - this.errorCode = errorCode; - this.errorMessageKey = errorMessageKey; - this.httpStatus = httpStatus; - } - - @Override - public String errorCode() { - return AppConstant.SERVICE_CODE_APP + "-" + errorCode; - } - - @Override - public String message(Object... args) { - return AppMessageUtil.getMessage(errorMessageKey, args); - } - - @Override - public RestResponse.Status httpStatus() { - return httpStatus; - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageInterface.java b/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageInterface.java deleted file mode 100644 index 74686dc5..00000000 --- a/src/main/java/it/gov/pagopa/fdr/exception/AppErrorCodeMessageInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.gov.pagopa.fdr.exception; - -import org.jboss.resteasy.reactive.RestResponse; - -public interface AppErrorCodeMessageInterface { - String errorCode(); - - String message(Object... args); - - RestResponse.Status httpStatus(); -} diff --git a/src/main/java/it/gov/pagopa/fdr/exception/AppException.java b/src/main/java/it/gov/pagopa/fdr/exception/AppException.java deleted file mode 100644 index 6cfd5817..00000000 --- a/src/main/java/it/gov/pagopa/fdr/exception/AppException.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.gov.pagopa.fdr.exception; - -import java.io.Serializable; -import lombok.Getter; - -@Getter -public class AppException extends RuntimeException { - - private final transient AppErrorCodeMessageInterface codeMessage; - - private final transient Object[] args; - - public AppException(Throwable cause, AppErrorCodeMessageInterface codeMessage) { - super(cause); - this.codeMessage = codeMessage; - this.args = null; - } - - public AppException(Throwable cause, AppErrorCodeMessageInterface codeMessage, Object... args) { - super(cause); - this.codeMessage = codeMessage; - this.args = args; - } - - public AppException(AppErrorCodeMessageInterface codeMessage) { - super(); - this.codeMessage = codeMessage; - this.args = null; - } - - public AppException(AppErrorCodeMessageInterface codeMessage, Serializable... args) { - super(); - this.codeMessage = codeMessage; - this.args = args; - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/FdrFlowRepository.java b/src/main/java/it/gov/pagopa/fdr/repository/FdrFlowRepository.java new file mode 100644 index 00000000..a338edc9 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/FdrFlowRepository.java @@ -0,0 +1,246 @@ +package it.gov.pagopa.fdr.repository; + +import io.quarkus.mongodb.panache.PanacheQuery; +import io.quarkus.panache.common.Page; +import io.quarkus.panache.common.Parameters; +import io.quarkus.panache.common.Sort; +import io.quarkus.panache.common.Sort.Direction; +import it.gov.pagopa.fdr.repository.common.Repository; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.common.SortField; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.entity.flow.projection.FdrFlowIdProjection; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import it.gov.pagopa.fdr.util.common.StringUtil; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class FdrFlowRepository extends Repository { + + public static final String QUERY_GET_BY_PSP_AND_NAME_AND_REVISION_AND_ORGANIZATION_AND_STATUS = + "sender.psp_id = :pspId" + + " and name = :flowName" + + " and revision = :revision" + + " and receiver.organization_id = :organizationId" + + " and status = :status"; + + public static final String QUERY_GET_UNPUBLISHED_BY_PSP = + "sender.psp_id = :pspId and status != 'PUBLISHED'"; + + public static final String QUERY_GET_UNPUBLISHED_BY_PSP_AND_NAME = + "sender.psp_id = :pspId and name = :flowName and status != 'PUBLISHED'"; + + public static final String QUERY_GET_UNPUBLISHED_BY_PSP_AND_NAME_AND_ORGANIZATION = + "sender.psp_id = :pspId" + + " and name = :flowName" + + " and receiver.organization_id = :organizationId" + + " and status != 'PUBLISHED'"; + + public static final String QUERY_GET_UNPUBLISHED_BY_ORGANIZATION_AND_PSP_AND_NAME = + "sender.psp_id = :pspId" + + " and name = :flowName" + + " and receiver.organization_id = :organizationId" + + " and status != 'PUBLISHED'"; + + public static final String QUERY_GET_PUBLISHED_BY_PSP_AND_NAME = + "sender.psp_id = :pspId and name = :flowName and status = 'PUBLISHED'"; + + public RepositoryPagedResult findPublishedByOrganizationIdAndOptionalPspId( + String organizationId, String pspId, Instant publishedGt, int pageNumber, int pageSize) { + + Parameters parameters = new Parameters(); + List queryBuilder = new ArrayList<>(); + + // setting mandatory field: organization id + queryBuilder.add("receiver.organization_id = :organizationId"); + parameters.and("organizationId", organizationId); + + // setting optional field: PSP id + if (!StringUtil.isNullOrBlank(pspId)) { + queryBuilder.add("sender.psp_id = :pspId"); + parameters.and("pspId", pspId); + } + + // setting optional field: publish date + if (publishedGt != null) { + queryBuilder.add("published > :publishedGt"); + parameters.and("publishedGt", publishedGt); + } + + // setting mandatory field: flow status + queryBuilder.add("status = :status"); + parameters.and("status", FlowStatusEnum.PUBLISHED); + String queryString = String.join(" and ", queryBuilder); + + Page page = Page.of(pageNumber - 1, pageSize); + Sort sort = getSort(SortField.of("_id", Direction.Ascending)); + + PanacheQuery resultPage = + FdrFlowEntity.findPageByQuery(queryString, sort, parameters).page(page); + return getPagedResult(resultPage); + } + + public RepositoryPagedResult findPublishedByPspIdAndOptionalOrganizationId( + String pspId, String organizationId, Instant publishedGt, int pageNumber, int pageSize) { + + Parameters parameters = new Parameters(); + List queryBuilder = new ArrayList<>(); + + // setting mandatory field: PSP id + queryBuilder.add("sender.psp_id = :pspId"); + parameters.and("pspId", pspId); + + // setting optional field: organization id + if (!StringUtil.isNullOrBlank(organizationId)) { + queryBuilder.add("receiver.organization_id = :organizationId"); + parameters.and("organizationId", organizationId); + } + + // setting optional field: publish date + if (publishedGt != null) { + queryBuilder.add("published > :publishedGt"); + parameters.and("publishedGt", publishedGt); + } + + // setting mandatory field: flow status + queryBuilder.add("status = :status"); + parameters.and("status", FlowStatusEnum.PUBLISHED); + String queryString = String.join(" and ", queryBuilder); + + Page page = Page.of(pageNumber - 1, pageSize); + Sort sort = getSort(SortField.of("_id", Direction.Ascending)); + + PanacheQuery resultPage = + FdrFlowEntity.findPageByQuery(queryString, sort, parameters).page(page); + return getPagedResult(resultPage); + } + + public FdrFlowEntity findPublishedByOrganizationIdAndPspIdAndName( + String organizationId, String pspId, String flowName, long revision) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + parameters.and("revision", revision); + parameters.and("organizationId", organizationId); + parameters.and("status", FlowStatusEnum.PUBLISHED); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_BY_PSP_AND_NAME_AND_REVISION_AND_ORGANIZATION_AND_STATUS, + parameters) + .project(FdrFlowEntity.class) + .firstResultOptional() + .orElse(null); + } + + public FdrFlowEntity findPublishedByPspIdAndName(String pspId, String flowName) { + + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_PUBLISHED_BY_PSP_AND_NAME, parameters) + .project(FdrFlowEntity.class) + .firstResultOptional() + .orElse(null); + } + + public RepositoryPagedResult findUnpublishedByPspId( + String pspId, Instant createdGt, int pageNumber, int pageSize) { + + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("createdGt", createdGt); + + Page page = Page.of(pageNumber - 1, pageSize); + Sort sort = getSort(SortField.of("_id", Direction.Ascending)); + + PanacheQuery resultPage = + FdrFlowEntity.findPageByQuery( + FdrFlowRepository.QUERY_GET_UNPUBLISHED_BY_PSP, sort, parameters) + .page(page); + return getPagedResult(resultPage); + } + + public FdrFlowEntity findUnpublishedByPspIdAndName(String pspId, String flowName) { + + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_UNPUBLISHED_BY_PSP_AND_NAME, parameters) + .project(FdrFlowEntity.class) + .firstResultOptional() + .orElse(null); + } + + public FdrFlowEntity findUnpublishedByOrganizationIdAndPspIdAndName( + String organizationId, String pspId, String flowName) { + + Parameters parameters = new Parameters(); + parameters.and("organizationId", organizationId); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_UNPUBLISHED_BY_ORGANIZATION_AND_PSP_AND_NAME, parameters) + .project(FdrFlowEntity.class) + .firstResultOptional() + .orElse(null); + } + + public FdrFlowIdProjection findIdByOrganizationIdAndPspIdAndNameAndRevision( + String organizationId, String pspId, String flowName, long revision, FlowStatusEnum status) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + parameters.and("revision", revision); + parameters.and("organizationId", organizationId); + parameters.and("status", status); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_BY_PSP_AND_NAME_AND_REVISION_AND_ORGANIZATION_AND_STATUS, + parameters) + .project(FdrFlowIdProjection.class) + .firstResultOptional() + .orElse(null); + } + + public FdrFlowIdProjection findUnpublishedIdByPspIdAndNameAndOrganization( + String pspId, String flowName, String organizationId) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("pspId", pspId); + parameters.and("flowName", flowName); + parameters.and("organizationId", organizationId); + + return FdrFlowEntity.findByQuery( + FdrFlowRepository.QUERY_GET_UNPUBLISHED_BY_PSP_AND_NAME_AND_ORGANIZATION, parameters) + .project(FdrFlowIdProjection.class) + .firstResultOptional() + .orElse(null); + } + + public void createEntity(FdrFlowEntity entity) { + entity.setTimestamp(Instant.now()); + entity.persist(); + } + + public void updateEntity(FdrFlowEntity entity) { + entity.setTimestamp(Instant.now()); + entity.update(); + } + + public void deleteEntity(FdrFlowEntity entity) { + entity.delete(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/FdrPaymentRepository.java b/src/main/java/it/gov/pagopa/fdr/repository/FdrPaymentRepository.java new file mode 100644 index 00000000..834d18b5 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/FdrPaymentRepository.java @@ -0,0 +1,202 @@ +package it.gov.pagopa.fdr.repository; + +import com.mongodb.client.ClientSession; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.DeleteOneModel; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.InsertOneModel; +import com.mongodb.client.model.WriteModel; +import io.quarkus.mongodb.panache.PanacheQuery; +import io.quarkus.panache.common.Page; +import io.quarkus.panache.common.Parameters; +import io.quarkus.panache.common.Sort; +import io.quarkus.panache.common.Sort.Direction; +import it.gov.pagopa.fdr.repository.common.Repository; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.common.SortField; +import it.gov.pagopa.fdr.repository.entity.payment.FdrPaymentEntity; +import it.gov.pagopa.fdr.util.error.exception.persistence.PersistenceFailureException; +import it.gov.pagopa.fdr.util.error.exception.persistence.TransactionRollbackException; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.bson.types.ObjectId; +import org.eclipse.microprofile.faulttolerance.Retry; + +@ApplicationScoped +public class FdrPaymentRepository extends Repository { + + public static final String QUERY_GET_BY_FLOW_OBJID = "ref_fdr.id = :flowObjId"; + + public static final String QUERY_GET_BY_FLOW_OBJID_AND_INDEXES = + "ref_fdr.id = :flowObjId" + " and index in :indexes"; + + private final MongoClient mongoClient; + + public FdrPaymentRepository(MongoClient mongoClient) { + this.mongoClient = mongoClient; + } + + public RepositoryPagedResult executeQueryByPspAndIuvAndIur( + String pspId, + String iuv, + String iur, + Instant createdFrom, + Instant createdTo, + int pageNumber, + int pageSize) { + + String query = "ref_fdr_sender_psp_id = :psp"; + Parameters params = new Parameters().and("psp", pspId); + if (iuv != null) { + query += " and iuv = :iuv"; + params.and("iuv", iuv); + } + if (iur != null) { + query += " and iur = :iur"; + params.and("iur", iur); + } + if (createdFrom != null) { + query += " and created >= :createdFrom"; + params.and("createdFrom", createdFrom); + } + if (createdTo != null) { + query += " and created <= :createdTo"; + params.and("createdTo", createdTo); + } + + Page page = Page.of(pageNumber - 1, pageSize); + Sort sort = getSort(SortField.of("index", Direction.Ascending)); + + PanacheQuery resultPage = + FdrPaymentEntity.findPageByQuery(query, sort, params).page(page); + return getPagedResult(resultPage); + } + + public RepositoryPagedResult findByFlowObjectId( + ObjectId flowId, int pageNumber, int pageSize) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("flowObjId", flowId); + + Page page = Page.of(pageNumber - 1, pageSize); + Sort sort = getSort(SortField.of("index", Direction.Ascending)); + + PanacheQuery resultPage = + FdrPaymentEntity.findPageByQuery( + FdrPaymentRepository.QUERY_GET_BY_FLOW_OBJID, sort, parameters) + .page(page); + return getPagedResult(resultPage); + } + + public Long countByFlowObjectIdAndIndexes(ObjectId flowId, Set indexes) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("flowObjId", flowId); + parameters.and("indexes", indexes); + + return FdrPaymentEntity.countByQuery( + FdrPaymentRepository.QUERY_GET_BY_FLOW_OBJID_AND_INDEXES, parameters); + } + + public List findByFlowObjectIdAndIndexes(ObjectId flowId, Set indexes) { + + // defining query with mandatory fields + Parameters parameters = new Parameters(); + parameters.and("flowObjId", flowId); + parameters.and("indexes", indexes); + + Page page = Page.of(0, indexes.size()); + Sort sort = getSort(SortField.of("index", Direction.Ascending)); + + PanacheQuery resultPage = + FdrPaymentEntity.findPageByQuery( + FdrPaymentRepository.QUERY_GET_BY_FLOW_OBJID_AND_INDEXES, sort, parameters) + .page(page); + return resultPage.list(); + } + + public void createEntityInTransaction(List entityBatch) + throws TransactionRollbackException { + + try (ClientSession session = this.mongoClient.startSession()) { + + try { + + // first, start a new transaction + session.startTransaction(); + MongoCollection collection = FdrPaymentEntity.getCollection(); + + // add each entity in a bulk write, in order to save it as a single batch in transaction + Instant now = Instant.now(); + List> bulkOperations = new ArrayList<>(); + for (FdrPaymentEntity entity : entityBatch) { + entity.setTimestamp(now); + bulkOperations.add(new InsertOneModel<>(entity)); + } + collection.bulkWrite(session, bulkOperations); + + // finally, close and commit the transaction + session.commitTransaction(); + + } catch (Exception e) { + + // if the transaction is active, abort it + if (session.hasActiveTransaction()) { + session.abortTransaction(); + } + throw new TransactionRollbackException(e); + } + } + } + + // https://quarkus.io/guides/smallrye-fault-tolerance + @Retry( + delay = 1000, + maxRetries = -1, + maxDuration = 1, + durationUnit = ChronoUnit.MINUTES, + retryOn = PersistenceFailureException.class) + public long deleteByFlowObjectId(ObjectId flowId) throws PersistenceFailureException { + + return FdrPaymentEntity.deleteByFilter("ref_fdr.id", flowId); + } + + public void deleteEntityInTransaction(List entityBatch) + throws TransactionRollbackException { + + try (ClientSession session = this.mongoClient.startSession()) { + + try { + + // first, start a new transaction + session.startTransaction(); + MongoCollection collection = FdrPaymentEntity.getCollection(); + + // add each entity in a bulk write, in order to delete it as a single batch in transaction + List> bulkOperations = new ArrayList<>(); + for (FdrPaymentEntity entity : entityBatch) { + bulkOperations.add(new DeleteOneModel<>(Filters.eq("_id", entity.id))); + } + collection.bulkWrite(session, bulkOperations); + + // finally, close and commit the transaction + session.commitTransaction(); + + } catch (Exception e) { + + // if the transaction is active, abort it + if (session.hasActiveTransaction()) { + session.abortTransaction(); + } + throw new TransactionRollbackException(e); + } + } + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/common/Repository.java b/src/main/java/it/gov/pagopa/fdr/repository/common/Repository.java new file mode 100644 index 00000000..2b0f8b2a --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/common/Repository.java @@ -0,0 +1,44 @@ +package it.gov.pagopa.fdr.repository.common; + +import io.quarkus.mongodb.panache.PanacheQuery; +import io.quarkus.panache.common.Sort; +import io.quarkus.panache.common.Sort.Direction; +import java.util.List; + +public abstract class Repository { + + protected RepositoryPagedResult getPagedResult(PanacheQuery query) { + + List elements = query.list(); + long totalElements = query.count(); + long totalPages = query.pageCount(); + if (elements == null) { + elements = List.of(); + totalElements = 0; + totalPages = 0; + } + return RepositoryPagedResult.builder() + .data(elements) + .totalElements(totalElements) + .totalPages((int) totalPages) + .build(); + } + + protected static Sort getSort(SortField... sortColumns) { + Sort sort = Sort.empty(); + if (sortColumns != null) { + for (SortField sortColumn : sortColumns) { + String column = sortColumn.getField(); + Direction direction = sortColumn.getDirection(); + if (!column.isBlank()) { + if (direction != null) { + sort.and(column, direction); + } else { + sort.and(column); + } + } + } + } + return sort; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/common/RepositoryPagedResult.java b/src/main/java/it/gov/pagopa/fdr/repository/common/RepositoryPagedResult.java new file mode 100644 index 00000000..1919874c --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/common/RepositoryPagedResult.java @@ -0,0 +1,16 @@ +package it.gov.pagopa.fdr.repository.common; + +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class RepositoryPagedResult { + + private List data; + + private long totalElements; + + private int totalPages; +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/common/SortField.java b/src/main/java/it/gov/pagopa/fdr/repository/common/SortField.java new file mode 100644 index 00000000..51f1b497 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/common/SortField.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.repository.common; + +import io.quarkus.panache.common.Sort.Direction; +import lombok.Data; + +@Data +public class SortField { + + private String field; + + private Direction direction; + + public static SortField of(String field, Direction direction) { + SortField sortField = new SortField(); + sortField.setField(field); + sortField.setDirection(direction); + return sortField; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/model/HistoryBlobBody.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/BlobBodyReferenceEntity.java similarity index 78% rename from src/main/java/it/gov/pagopa/fdr/service/history/model/HistoryBlobBody.java rename to src/main/java/it/gov/pagopa/fdr/repository/entity/flow/BlobBodyReferenceEntity.java index d8a6509e..2998f1cc 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/history/model/HistoryBlobBody.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/BlobBodyReferenceEntity.java @@ -1,5 +1,6 @@ -package it.gov.pagopa.fdr.service.history.model; +package it.gov.pagopa.fdr.repository.entity.flow; +import it.gov.pagopa.fdr.repository.enums.JsonSchemaVersionEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -10,7 +11,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor -public class HistoryBlobBody { +public class BlobBodyReferenceEntity { @BsonProperty("storage_account") private String storageAccount; diff --git a/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/FdrFlowEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/FdrFlowEntity.java new file mode 100644 index 00000000..cbc0d583 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/FdrFlowEntity.java @@ -0,0 +1,82 @@ +package it.gov.pagopa.fdr.repository.entity.flow; + +import io.quarkus.mongodb.panache.PanacheMongoEntity; +import io.quarkus.mongodb.panache.PanacheMongoEntityBase; +import io.quarkus.mongodb.panache.PanacheQuery; +import io.quarkus.mongodb.panache.common.MongoEntity; +import io.quarkus.panache.common.Parameters; +import io.quarkus.panache.common.Sort; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import java.time.Instant; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.bson.codecs.pojo.annotations.BsonProperty; + +@Data +@EqualsAndHashCode(callSuper = true) +@MongoEntity(collection = "fdr_flow") +public class FdrFlowEntity extends PanacheMongoEntity { + + private String name; + + private Long revision; + + @BsonProperty("fdr_date") + private Instant fdrDate; + + private FlowStatusEnum status; + + private Instant created; + + private Instant updated; + + private Instant published; + + @BsonProperty("tot_amount") + private Double totAmount; + + @BsonProperty("tot_payments") + private Long totPayments; + + @BsonProperty("computed_tot_amount") + private Double computedTotAmount; + + @BsonProperty("computed_tot_payments") + private Long computedTotPayments; + + private String regulation; + + @BsonProperty("regulation_date") + private Instant regulationDate; + + @BsonProperty("bic_code_pouring_bank") + private String bicCodePouringBank; + + private SenderEntity sender; + + private ReceiverEntity receiver; + + @BsonProperty("ref_json") + private BlobBodyReferenceEntity refJson; + + @BsonProperty("_ts") + public Instant timestamp; + + public void addOnComputedTotAmount(double value) { + this.computedTotAmount += value; + } + + public void addOnComputedTotPayments(int value) { + this.computedTotPayments += value; + } + + public static PanacheQuery findPageByQuery( + String query, Sort sort, Parameters parameters) { + return find(query, sort, parameters.map()); + } + + public static PanacheQuery findByQuery( + String query, Parameters parameters) { + return find(query, parameters.map()); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/ReceiverEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/ReceiverEntity.java similarity index 85% rename from src/main/java/it/gov/pagopa/fdr/repository/fdr/model/ReceiverEntity.java rename to src/main/java/it/gov/pagopa/fdr/repository/entity/flow/ReceiverEntity.java index 6d9b105c..5fcc129e 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/ReceiverEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/ReceiverEntity.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.repository.fdr.model; +package it.gov.pagopa.fdr.repository.entity.flow; import lombok.Data; import org.bson.codecs.pojo.annotations.BsonProperty; diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/SenderEntity.java similarity index 74% rename from src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderEntity.java rename to src/main/java/it/gov/pagopa/fdr/repository/entity/flow/SenderEntity.java index e041d13a..46f7c533 100644 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderEntity.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/SenderEntity.java @@ -1,12 +1,13 @@ -package it.gov.pagopa.fdr.repository.fdr.model; +package it.gov.pagopa.fdr.repository.entity.flow; +import it.gov.pagopa.fdr.repository.enums.SenderTypeEnum; import lombok.Data; import org.bson.codecs.pojo.annotations.BsonProperty; @Data public class SenderEntity { - private SenderTypeEnumEntity type; + private SenderTypeEnum type; @BsonProperty("id") private String id; diff --git a/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/projection/FdrFlowIdProjection.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/projection/FdrFlowIdProjection.java new file mode 100644 index 00000000..389a4a6b --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/flow/projection/FdrFlowIdProjection.java @@ -0,0 +1,15 @@ +package it.gov.pagopa.fdr.repository.entity.flow.projection; + +import io.quarkus.mongodb.panache.common.ProjectionFor; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import lombok.Data; +import org.bson.codecs.pojo.annotations.BsonProperty; +import org.bson.types.ObjectId; + +@Data +@ProjectionFor(FdrFlowEntity.class) +public class FdrFlowIdProjection { + + @BsonProperty("_id") + private ObjectId id; +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/FdrPaymentEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/FdrPaymentEntity.java new file mode 100644 index 00000000..1f5bf28e --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/FdrPaymentEntity.java @@ -0,0 +1,96 @@ +package it.gov.pagopa.fdr.repository.entity.payment; + +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Filters; +import io.quarkus.mongodb.panache.PanacheMongoEntity; +import io.quarkus.mongodb.panache.PanacheMongoEntityBase; +import io.quarkus.mongodb.panache.PanacheQuery; +import io.quarkus.mongodb.panache.common.MongoEntity; +import io.quarkus.panache.common.Parameters; +import io.quarkus.panache.common.Sort; +import it.gov.pagopa.fdr.repository.enums.PaymentStatusEnum; +import it.gov.pagopa.fdr.util.error.exception.persistence.PersistenceFailureException; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.bson.codecs.pojo.annotations.BsonProperty; +import org.bson.types.ObjectId; + +@Data +@EqualsAndHashCode(callSuper = true) +@MongoEntity(collection = "fdr_payment") +public class FdrPaymentEntity extends PanacheMongoEntity { + + private String iuv; + + private String iur; + + private Long index; + + private Double amount; + + @BsonProperty("pay_status") + private PaymentStatusEnum payStatus; + + @BsonProperty("pay_date") + private Instant payDate; + + @BsonProperty("transfer_id") + private Long transferId; + + private Instant created; + + private Instant updated; + + @BsonProperty("ref_fdr") + private ReferencedFdrEntity refFdr; + + @BsonProperty("_ts") + public Instant timestamp; + + public static PanacheQuery findPageByQuery( + String query, Sort sort, Parameters parameters) { + return find(query, sort, parameters.map()); + } + + public static long countByQuery(String query, Parameters parameters) { + return count(query, parameters.map()); + } + + public static long deleteByFilter(String filterKey, Object filterValue) + throws PersistenceFailureException { + + long deletedEntities = 0; + + try { + MongoCollection collection = mongoCollection(); + + boolean areThereMoreEntities = true; + while (areThereMoreEntities) { + List idsToDelete = + collection + .find(Filters.eq(filterKey, filterValue)) + .limit(500) + .map(document -> document.id) + .into(new ArrayList<>()); + + if (idsToDelete.isEmpty()) { + areThereMoreEntities = false; + } else { + collection.deleteMany(Filters.in("_id", idsToDelete)); + deletedEntities += idsToDelete.size(); + } + } + } catch (Exception e) { + throw new PersistenceFailureException(e); + } + + return deletedEntities; + } + + public static MongoCollection getCollection() { + return mongoCollection(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/ReferencedFdrEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/ReferencedFdrEntity.java new file mode 100644 index 00000000..0e65b000 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/entity/payment/ReferencedFdrEntity.java @@ -0,0 +1,24 @@ +package it.gov.pagopa.fdr.repository.entity.payment; + +import lombok.Data; +import org.bson.codecs.pojo.annotations.BsonProperty; +import org.bson.types.ObjectId; + +@Data +public class ReferencedFdrEntity { + + @BsonProperty("id") + private ObjectId id; + + @BsonProperty("name") + private String name; + + @BsonProperty("receiver_organization_id") + private String receiverOrganizationId; + + @BsonProperty("revision") + private Long revision; + + @BsonProperty("sender_psp_id") + private String senderPspId; +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/enums/FlowStatusEnum.java b/src/main/java/it/gov/pagopa/fdr/repository/enums/FlowStatusEnum.java new file mode 100644 index 00000000..57908e04 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/enums/FlowStatusEnum.java @@ -0,0 +1,7 @@ +package it.gov.pagopa.fdr.repository.enums; + +public enum FlowStatusEnum { + CREATED, + INSERTED, + PUBLISHED +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/enums/JsonSchemaVersionEnum.java b/src/main/java/it/gov/pagopa/fdr/repository/enums/JsonSchemaVersionEnum.java new file mode 100644 index 00000000..e3ee0052 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/enums/JsonSchemaVersionEnum.java @@ -0,0 +1,5 @@ +package it.gov.pagopa.fdr.repository.enums; + +public enum JsonSchemaVersionEnum { + V1; +} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/model/PaymentStatusEnum.java b/src/main/java/it/gov/pagopa/fdr/repository/enums/PaymentStatusEnum.java similarity index 69% rename from src/main/java/it/gov/pagopa/fdr/rest/model/PaymentStatusEnum.java rename to src/main/java/it/gov/pagopa/fdr/repository/enums/PaymentStatusEnum.java index b5d3b172..6ea7c434 100644 --- a/src/main/java/it/gov/pagopa/fdr/rest/model/PaymentStatusEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/repository/enums/PaymentStatusEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.model; +package it.gov.pagopa.fdr.repository.enums; public enum PaymentStatusEnum { EXECUTED, diff --git a/src/main/java/it/gov/pagopa/fdr/repository/enums/SenderTypeEnum.java b/src/main/java/it/gov/pagopa/fdr/repository/enums/SenderTypeEnum.java new file mode 100644 index 00000000..34901ee2 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/repository/enums/SenderTypeEnum.java @@ -0,0 +1,7 @@ +package it.gov.pagopa.fdr.repository.enums; + +public enum SenderTypeEnum { + LEGAL_PERSON, + ABI_CODE, + BIC_CODE +} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrInsertEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrInsertEntity.java deleted file mode 100644 index fb0bb7d1..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrInsertEntity.java +++ /dev/null @@ -1,73 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr; - -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.PanacheMongoEntityBase; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.mongodb.panache.common.MongoEntity; -import io.quarkus.panache.common.Parameters; -import it.gov.pagopa.fdr.repository.fdr.model.FdrStatusEnumEntity; -import it.gov.pagopa.fdr.repository.fdr.model.ReceiverEntity; -import it.gov.pagopa.fdr.repository.fdr.model.SenderEntity; -import java.time.Instant; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bson.codecs.pojo.annotations.BsonProperty; - -@Data -@EqualsAndHashCode(callSuper = true) -@MongoEntity(collection = "fdr_insert") -public class FdrInsertEntity extends PanacheMongoEntity { - - private Long revision; - - private Instant created; - - private Instant updated; - - private String fdr; - - @BsonProperty("fdr_date") - private Instant fdrDate; - - private SenderEntity sender; - - private ReceiverEntity receiver; - - private String regulation; - - @BsonProperty("regulation_date") - private Instant regulationDate; - - @BsonProperty("bic_code_pouring_bank") - private String bicCodePouringBank; - - private FdrStatusEnumEntity status; - - @BsonProperty("computed_tot_payments") - private Long computedTotPayments; - - @BsonProperty("computed_sum_payments") - private Double computedSumPayments; - - @BsonProperty("tot_payments") - private Long totPayments; - - @BsonProperty("sum_payments") - private Double sumPayments; - - public static PanacheQuery findByFdrAndPspId(String fdr, String pspId) { - return find( - "fdr = :fdr and sender.psp_id = :pspId", - Parameters.with("fdr", fdr).and("pspId", pspId).map()); - } - - public static PanacheQuery findByFdrAndRevAndPspIdAndOrganizationId( - String fdr, String pspId, String organizationId) { - return find( - "fdr = :fdr and sender.psp_id = :pspId and receiver.organization_id = :organizationId", - Parameters.with("fdr", fdr) - .and("pspId", pspId) - .and("organizationId", organizationId) - .map()); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java deleted file mode 100644 index 16e581d4..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentInsertEntity.java +++ /dev/null @@ -1,106 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr; - -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.PanacheMongoEntityBase; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.mongodb.panache.common.MongoEntity; -import io.quarkus.panache.common.Parameters; -import io.quarkus.panache.common.Sort; -import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.List; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bson.codecs.pojo.annotations.BsonProperty; -import org.bson.types.ObjectId; -import org.eclipse.microprofile.faulttolerance.Retry; - -@Data -@EqualsAndHashCode(callSuper = true) -@MongoEntity(collection = "fdr_payment_insert") -public class FdrPaymentInsertEntity extends PanacheMongoEntity { - - private Long index; - - private Long revision; - - private Instant created; - - private Instant updated; - - private String iuv; - private String iur; - - private Long idTransfer; - private Double pay; - - @BsonProperty("pay_status") - private PaymentStatusEnumEntity payStatus; - - @BsonProperty("pay_date") - private Instant payDate; - - @BsonProperty("ref_fdr_id") - private ObjectId refFdrId; - - @BsonProperty("ref_fdr") - private String refFdr; - - @BsonProperty("ref_fdr_sender_psp_id") - private String refFdrSenderPspId; - - @BsonProperty("ref_fdr_revision") - private Long refFdrRevision; - - @BsonProperty("ref_fdr_receiver_organization_id") - private String refFdrReceiverOrganizationId; - - public static PanacheQuery findByFdrAndIndexes( - String fdr, List indexList) { - return find( - "ref_fdr = :fdr and index in :indexes", - Parameters.with("fdr", fdr).and("indexes", indexList).map()); - } - - public static PanacheQuery findByFdrAndPspId(String fdr, String pspId) { - return find( - "ref_fdr = :fdr and ref_fdr_sender_psp_id = :pspId", - Parameters.with("fdr", fdr).and("pspId", pspId).map()); - } - - // https://quarkus.io/guides/smallrye-fault-tolerance - @Retry(delay = 500, delayUnit = ChronoUnit.MILLIS) - public static long deleteByFdrAndIndexes(String fdr, List indexList) { - return delete( - "ref_fdr = :fdr and index in :indexes", - Parameters.with("fdr", fdr).and("indexes", indexList).map()); - } - - public static long deleteByFdrAndPspId(String fdr, String pspId) { - return delete( - "ref_fdr = :fdr and ref_fdr_sender_psp_id = :pspId", - Parameters.with("fdr", fdr).and("pspId", pspId).map()); - } - - public static long deleteByFdr(String fdr) { - return delete("ref_fdr = :fdr", Parameters.with("fdr", fdr).map()); - } - - public static void persistFdrPaymentsInsert( - List fdrPaymentInsertEntityList) { - persist(fdrPaymentInsertEntityList); - } - - public static PanacheQuery findByFdrAndPspIAndOrganizationIdSort( - String fdr, String pspId, String organizationId, Sort sort) { - return find( - "ref_fdr = :fdr and ref_fdr_sender_psp_id = :pspId and ref_fdr_receiver_organization_id =" - + " :organizationId", - sort, - Parameters.with("fdr", fdr) - .and("pspId", pspId) - .and("organizationId", organizationId) - .map()); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java deleted file mode 100644 index 1c3558b5..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPaymentPublishEntity.java +++ /dev/null @@ -1,106 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr; - -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.PanacheMongoEntityBase; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.mongodb.panache.common.MongoEntity; -import io.quarkus.panache.common.Parameters; -import io.quarkus.panache.common.Sort; -import io.smallrye.mutiny.Uni; -import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; -import java.time.Instant; -import java.util.List; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bson.codecs.pojo.annotations.BsonProperty; -import org.bson.types.ObjectId; - -@Data -@EqualsAndHashCode(callSuper = true) -@MongoEntity(collection = "fdr_payment_publish") -public class FdrPaymentPublishEntity extends PanacheMongoEntity { - - private Long index; - - private Long revision; - - private Instant created; - - private Instant updated; - - private String iuv; - private String iur; - - private Long idTransfer; - private Double pay; - - @BsonProperty("pay_status") - private PaymentStatusEnumEntity payStatus; - - @BsonProperty("pay_date") - private Instant payDate; - - @BsonProperty("ref_fdr_id") - private ObjectId refFdrId; - - @BsonProperty("ref_fdr") - private String refFdr; - - @BsonProperty("ref_fdr_sender_psp_id") - private String refFdrSenderPspId; - - @BsonProperty("ref_fdr_revision") - private Long refFdrRevision; - - @BsonProperty("ref_fdr_receiver_organization_id") - private String refFdrReceiverOrganizationId; - - public static void persistFdrPaymentHistoryEntities( - List fdrPaymentHistoryEntities) { - persist(fdrPaymentHistoryEntities); - } - - public static PanacheQuery findByFdrAndRevAndPspIdAndOrganizationId( - String fdr, Long rev, String pspId, String organizationId, Sort sort) { - return find( - "ref_fdr = :fdr and ref_fdr_revision = :rev and ref_fdr_sender_psp_id = :pspId and" - + " ref_fdr_receiver_organization_id = :organizationId", - sort, - Parameters.with("fdr", fdr) - .and("rev", rev) - .and("pspId", pspId) - .and("organizationId", organizationId) - .map()); - } - - public static PanacheQuery findByPspAndIuvIur( - String psp, String iuv, String iur, Instant createdFrom, Instant createdTo, Sort sort) { - String query = "ref_fdr_sender_psp_id = :psp"; - Parameters params = new Parameters().and("psp", psp); - if (iuv != null && iur != null) { - query += " and iuv = :iuv and iur = :iur"; - params.and("iuv", iuv).and("iur", iur); - } else if (iuv != null) { - query += " and iuv = :iuv"; - params.and("iuv", iuv); - } else if (iur != null) { - query += " and iur = :iur"; - params.and("iur", iur); - } - if (createdFrom != null && createdTo != null) { - query += " and created >= :createdFrom and created <= :createdTo"; - params.and("createdFrom", createdFrom).and("createdTo", createdTo); - } else if (createdFrom != null) { - query += " and created >= :createdFrom"; - params.and("createdFrom", createdFrom); - } else if (createdTo != null) { - query += " and created <= :createdTo"; - params.and("createdTo", createdTo); - } - return find(query, sort, params); - } - - public static void persistFdrPaymentPublishEntities(List fdrPaymentPublishEntities) { - persist(fdrPaymentPublishEntities); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPublishEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPublishEntity.java deleted file mode 100644 index bf3854e3..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/FdrPublishEntity.java +++ /dev/null @@ -1,112 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr; - -import io.quarkus.mongodb.panache.PanacheMongoEntity; -import io.quarkus.mongodb.panache.PanacheMongoEntityBase; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.mongodb.panache.common.MongoEntity; -import io.quarkus.panache.common.Parameters; -import io.quarkus.panache.common.Sort; -import it.gov.pagopa.fdr.repository.fdr.model.FdrStatusEnumEntity; -import it.gov.pagopa.fdr.repository.fdr.model.ReceiverEntity; -import it.gov.pagopa.fdr.repository.fdr.model.SenderEntity; -import it.gov.pagopa.fdr.service.history.model.HistoryBlobBody; -import java.time.Instant; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bson.codecs.pojo.annotations.BsonProperty; - -@Data -@EqualsAndHashCode(callSuper = true) -@MongoEntity(collection = "fdr_publish") -public class FdrPublishEntity extends PanacheMongoEntity { - - private Long revision; - - private Instant created; - - private Instant updated; - - private Instant published; - - private String fdr; - - @BsonProperty("fdr_date") - private Instant fdrDate; - - private SenderEntity sender; - - private ReceiverEntity receiver; - - private String regulation; - - @BsonProperty("regulation_date") - private Instant regulationDate; - - @BsonProperty("bic_code_pouring_bank") - private String bicCodePouringBank; - - private FdrStatusEnumEntity status; - - @BsonProperty("computed_tot_payments") - private Long computedTotPayments; - - @BsonProperty("computed_sum_payments") - private Double computedSumPayments; - - @BsonProperty("tot_payments") - private Long totPayments; - - @BsonProperty("sum_payments") - private Double sumPayments; - - @BsonProperty("ref_json") - private HistoryBlobBody refJson; - - public static PanacheQuery findByFdrAndRevAndPspIdAndOrganizationId( - String fdr, Long rev, String pspId, String organizationId) { - return find( - "fdr = :fdr and revision = :rev and sender.psp_id = :pspId and receiver.organization_id =" - + " :organizationId", - Parameters.with("fdr", fdr) - .and("rev", rev) - .and("pspId", pspId) - .and("organizationId", organizationId) - .map()); - } - - public static PanacheQuery findByFdrAndPspId( - String fdr, String pspId, Sort sort) { - return find( - "fdr = :fdr and sender.psp_id = :pspId", - sort, - Parameters.with("fdr", fdr).and("pspId", pspId).map()); - } - - // - public static PanacheQuery findByOrganizationIdAndPspId( - String organizationId, String pspId, Sort sort) { - return find( - "receiver.organization_id = :organizationId and sender.psp_id = :pspId", - sort, - Parameters.with("organizationId", organizationId).and("pspId", pspId).map()); - } - - // - // public static PanacheQuery findByOrganizationId( - // String organizationId, Sort sort) { - // return find( - // "receiver.organization_id = :organizationId", - // sort, - // Parameters.with("organizationId", organizationId).map()); - // } - // - // public static long deleteByFdrAndPspId(String fdr, String pspId) { - // return delete( - // "fdr = :fdr and sender.psp_id = :pspId", - // Parameters.with("fdr", fdr).and("pspId", pspId).map()); - // } - // - public void persistEntity() { - persist(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/FdrStatusEnumEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/FdrStatusEnumEntity.java deleted file mode 100644 index 60aa4fc7..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/FdrStatusEnumEntity.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.model; - -public enum FdrStatusEnumEntity { - CREATED, - INSERTED, - PUBLISHED -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/PaymentStatusEnumEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/PaymentStatusEnumEntity.java deleted file mode 100644 index 311c2a62..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/PaymentStatusEnumEntity.java +++ /dev/null @@ -1,9 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.model; - -public enum PaymentStatusEnumEntity { - EXECUTED, - REVOKED, - NO_RPT, - STAND_IN, - STAND_IN_NO_RPT; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderTypeEnumEntity.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderTypeEnumEntity.java deleted file mode 100644 index 8b27e101..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/model/SenderTypeEnumEntity.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.model; - -public enum SenderTypeEnumEntity { - LEGAL_PERSON, - ABI_CODE, - BIC_CODE -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrInsertProjection.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrInsertProjection.java deleted file mode 100644 index 536b942e..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrInsertProjection.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import io.quarkus.mongodb.panache.common.ProjectionFor; -import it.gov.pagopa.fdr.repository.fdr.FdrInsertEntity; -import java.time.Instant; -import lombok.Data; - -@Data -@ProjectionFor(FdrInsertEntity.class) -public class FdrInsertProjection { - - private String fdr; - - private Receiver receiver; - - private Long revision; - - private Instant created; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishByPspProjection.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishByPspProjection.java deleted file mode 100644 index 32a082ae..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishByPspProjection.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import io.quarkus.mongodb.panache.common.ProjectionFor; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import java.time.Instant; -import lombok.Data; - -@Data -@ProjectionFor(FdrPublishEntity.class) -public class FdrPublishByPspProjection { - - private String fdr; - - private Receiver receiver; - - private Long revision; - - private Instant published; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishProjection.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishProjection.java deleted file mode 100644 index 4c43d6cc..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishProjection.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import io.quarkus.mongodb.panache.common.ProjectionFor; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import java.time.Instant; -import lombok.Data; - -@Data -@ProjectionFor(FdrPublishEntity.class) -public class FdrPublishProjection { - - private String fdr; - - private Sender sender; - - private Long revision; - - private Instant published; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishRevisionProjection.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishRevisionProjection.java deleted file mode 100644 index 1d407420..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/FdrPublishRevisionProjection.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import io.quarkus.mongodb.panache.common.ProjectionFor; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import lombok.Data; - -@Data -@ProjectionFor(FdrPublishEntity.class) -public class FdrPublishRevisionProjection { - - private Long revision; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Receiver.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Receiver.java deleted file mode 100644 index 22e81226..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Receiver.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import lombok.Data; -import org.bson.codecs.pojo.annotations.BsonProperty; - -@Data -public class Receiver { - - @BsonProperty("organization_id") - private String organizationId; -} diff --git a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Sender.java b/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Sender.java deleted file mode 100644 index 86d42a5e..00000000 --- a/src/main/java/it/gov/pagopa/fdr/repository/fdr/projection/Sender.java +++ /dev/null @@ -1,11 +0,0 @@ -package it.gov.pagopa.fdr.repository.fdr.projection; - -import lombok.Data; -import org.bson.codecs.pojo.annotations.BsonProperty; - -@Data -public class Sender { - - @BsonProperty("psp_id") - private String pspId; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/info/InfoResource.java b/src/main/java/it/gov/pagopa/fdr/rest/info/InfoResource.java deleted file mode 100644 index fd4427a7..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/info/InfoResource.java +++ /dev/null @@ -1,76 +0,0 @@ -package it.gov.pagopa.fdr.rest.info; - -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.rest.info.response.InfoResponse; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import it.gov.pagopa.fdr.util.Re; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; -import java.util.Arrays; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.Logger; - -@Path("/info") -@Tag(name = "Info", description = "Info operations") -public class InfoResource { - - private final Logger log; - - @ConfigProperty(name = "app.name", defaultValue = "app") - String name; - - @ConfigProperty(name = "app.version", defaultValue = "0.0.0") - String version; - - @ConfigProperty(name = "app.environment", defaultValue = "local") - String environment; - - public InfoResource(Logger log) { - this.log = log; - } - - @Operation(summary = "Get info of FDR") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = InfoResponse.class))) - }) - @Produces(MediaType.APPLICATION_JSON) - @GET - @Re(action = FdrActionEnum.INFO) - public InfoResponse hello() { - log.infof("Info environment: [%s] - name: [%s] - version: [%s]", environment, name, version); - - return InfoResponse.builder() - .name(name) - .version(version) - .environment(environment) - .description(AppMessageUtil.getMessage("app.description")) - .errorCodes( - Arrays.stream(AppErrorCodeMessageEnum.values()) - .map( - errorCode -> - InfoResponse.ErrorCode.builder() - .code(errorCode.errorCode()) - .description(errorCode.message()) - .statusCode(errorCode.httpStatus().getStatusCode()) - .build()) - .toList()) - .build(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/BaseOrganizationsResource.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/BaseOrganizationsResource.java deleted file mode 100644 index 52d1d114..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/BaseOrganizationsResource.java +++ /dev/null @@ -1,159 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations; - -import static it.gov.pagopa.fdr.util.MDCKeys.*; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.organizations.mapper.OrganizationsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.organizations.validation.InternalOrganizationsValidationService; -import it.gov.pagopa.fdr.rest.organizations.validation.OrganizationsValidationService; -import it.gov.pagopa.fdr.service.dto.FdrAllDto; -import it.gov.pagopa.fdr.service.dto.FdrGetDto; -import it.gov.pagopa.fdr.service.dto.FdrGetPaymentDto; -import it.gov.pagopa.fdr.service.organizations.OrganizationsService; -import it.gov.pagopa.fdr.service.re.model.EventTypeEnum; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import java.time.Instant; -import org.jboss.logging.Logger; -import org.jboss.logging.MDC; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; - -public abstract class BaseOrganizationsResource { - - private final Config config; - private final Logger log; - - private final OrganizationsValidationService validator; - private final InternalOrganizationsValidationService internalValidator; - - private final OrganizationsResourceServiceMapper mapper; - - private final OrganizationsService service; - - protected BaseOrganizationsResource( - Config config, - Logger log, - OrganizationsValidationService validator, - InternalOrganizationsValidationService internalValidator, - OrganizationsResourceServiceMapper mapper, - OrganizationsService service) { - this.config = config; - this.log = log; - this.validator = validator; - this.internalValidator = internalValidator; - this.mapper = mapper; - this.service = service; - } - - protected GetAllResponse baseGetAll( - String organizationId, - String idPsp, - Instant publishedGt, - long pageNumber, - long pageSize, - boolean internalGetAll) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(ORGANIZATION_ID, organizationId); - if (null != idPsp && !idPsp.isBlank()) { - MDC.put(PSP_ID, idPsp); - } - - log.infof( - AppMessageUtil.logProcess("%s by ec:[%s] with psp:[%s] - page:[%s], pageSize:[%s]"), - action, - organizationId, - idPsp, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - // if (internalGetAll) { - // internalValidator.validateGetAllInternal(action, idPsp, configData); - // } else { - validator.validateGetAllByEc(action, organizationId, idPsp, configData); - // } - - // get from db - FdrAllDto fdrAllDto = - service.find( - action, - internalGetAll ? null : organizationId, - idPsp, - publishedGt, - pageNumber, - pageSize); - - return mapper.toGetAllResponse(fdrAllDto); - } - - protected GetResponse baseGet( - String organizationId, String fdr, Long rev, String psp, boolean internalGet) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(ORGANIZATION_ID, organizationId); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, psp); - - log.infof( - AppMessageUtil.logProcess("%s by ec:[%s] with fdr=[%s], psp=[%s]"), - action, - organizationId, - fdr, - psp); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - // if (internalGet) { - // internalValidator.validateGetInternal(action, fdr, psp, configData); - // } else { - validator.validateGet(action, fdr, organizationId, psp, configData); - // } - - // get from db - FdrGetDto fdrGetDto = service.findByReportingFlowName(action, fdr, rev, psp, organizationId); - - return mapper.toGetIdResponse(fdrGetDto); - } - - protected GetPaymentResponse baseGetFdrPayment( - String organizationId, - String fdr, - Long rev, - String psp, - long pageNumber, - long pageSize, - boolean internalGetPayment) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(ORGANIZATION_ID, organizationId); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, psp); - - log.infof( - AppMessageUtil.logProcess("%s with id:[%s] - page:[%s], pageSize:[%s]"), - action, - fdr, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - // if (internalGetPayment) { - // internalValidator.validateGetPaymentInternal(action, fdr, psp, configData); - // } else { - validator.validateGetPayment(action, fdr, organizationId, psp, configData); - // } - - // get from db - FdrGetPaymentDto fdrGetPaymentDto = - service.findPaymentByReportingFlowName( - action, fdr, rev, psp, organizationId, pageNumber, pageSize); - - return mapper.toGetPaymentResponse(fdrGetPaymentDto); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationsResource.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationsResource.java deleted file mode 100644 index e0625b26..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationsResource.java +++ /dev/null @@ -1,153 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.organizations.mapper.OrganizationsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.organizations.validation.InternalOrganizationsValidationService; -import it.gov.pagopa.fdr.rest.organizations.validation.OrganizationsValidationService; -import it.gov.pagopa.fdr.service.organizations.OrganizationsService; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.Re; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.Pattern; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; -import java.time.Instant; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.Logger; - -@Tag(name = "Internal Organizations", description = "Organizations operations") -@Path("/internal/organizations/{" + AppConstant.ORGANIZATION + "}/fdrs") -@Consumes("application/json") -@Produces("application/json") -public class InternalOrganizationsResource extends BaseOrganizationsResource { - - protected InternalOrganizationsResource( - Config config, - Logger log, - OrganizationsValidationService validator, - InternalOrganizationsValidationService internalValidator, - OrganizationsResourceServiceMapper mapper, - OrganizationsService service) { - super(config, log, validator, internalValidator, mapper, service); - } - - @Operation( - operationId = "internalGetAllPublished", - summary = "Get all fdr published", - description = "Get all fdr published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllResponse.class))) - }) - @GET - @Re(action = FdrActionEnum.INTERNAL_GET_ALL_FDR) - public GetAllResponse internalGetAllPublished( - @PathParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @QueryParam(AppConstant.PSP) @Pattern(regexp = "^(.{1,35})$") String idPsp, - @QueryParam(AppConstant.PUBLISHED_GREATER_THAN) Instant publishedGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAll(organizationId, idPsp, publishedGt, pageNumber, pageSize, true); - } - - @Operation( - operationId = "internalGet", - summary = "Get fdr", - description = "Get fdr by id but not payments") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetResponse.class))) - }) - @GET - @Path( - "/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/psps/{" - + AppConstant.PSP - + "}") - @Re(action = FdrActionEnum.INTERNAL_GET_FDR) - public GetResponse internalGet( - @PathParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.PSP) String psp) { - return baseGet(organizationId, fdr, rev, psp, true); - } - - @Operation( - operationId = "internalGetPayment", - summary = "Get payments of fdr", - description = "Get payments of fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/psps/{" - + AppConstant.PSP - + "}/payments") - @Re(action = FdrActionEnum.INTERNAL_GET_FDR_PAYMENT) - public GetPaymentResponse internalGetFdrPayment( - @PathParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.PSP) String psp, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - - return baseGetFdrPayment(organizationId, fdr, rev, psp, pageNumber, pageSize, true); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/OrganizationsResource.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/OrganizationsResource.java deleted file mode 100644 index a2803622..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/OrganizationsResource.java +++ /dev/null @@ -1,149 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.organizations.mapper.OrganizationsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.organizations.validation.InternalOrganizationsValidationService; -import it.gov.pagopa.fdr.rest.organizations.validation.OrganizationsValidationService; -import it.gov.pagopa.fdr.service.organizations.OrganizationsService; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.Re; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.Pattern; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; -import java.time.Instant; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.Logger; - -@Tag(name = "Organizations", description = "Organizations operations") -@Path("/organizations/{" + AppConstant.ORGANIZATION + "}/fdrs") -@Consumes("application/json") -@Produces("application/json") -public class OrganizationsResource extends BaseOrganizationsResource { - - protected OrganizationsResource( - Config config, - Logger log, - OrganizationsValidationService validator, - InternalOrganizationsValidationService internalValidator, - OrganizationsResourceServiceMapper mapper, - OrganizationsService service) { - super(config, log, validator, internalValidator, mapper, service); - } - - @Operation( - operationId = "getAllPublished", - summary = "Get all fdr published", - description = "Get all fdr published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllResponse.class))) - }) - @GET - @Re(action = FdrActionEnum.GET_ALL_FDR) - public GetAllResponse getAllPublished( - @PathParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @QueryParam(AppConstant.PSP) @Pattern(regexp = "^(.{1,35})$") String idPsp, - @QueryParam(AppConstant.PUBLISHED_GREATER_THAN) Instant publishedGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAll(organizationId, idPsp, publishedGt, pageNumber, pageSize, false); - } - - @Operation(operationId = "get", summary = "Get fdr", description = "Get fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetResponse.class))) - }) - @GET - @Path( - "/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/psps/{" - + AppConstant.PSP - + "}") - @Re(action = FdrActionEnum.GET_FDR) - public GetResponse get( - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.PSP) String psp) { - return baseGet(organizationId, fdr, rev, psp, true); - } - - @Operation( - operationId = "getPayment", - summary = "Get payments of fdr", - description = "Get payments of fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/psps/{" - + AppConstant.PSP - + "}/payments") - @Re(action = FdrActionEnum.GET_FDR_PAYMENT) - public GetPaymentResponse getPayment( - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.PSP) String psp, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetFdrPayment(organizationId, fdr, rev, psp, pageNumber, pageSize, false); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/mapper/OrganizationsResourceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/mapper/OrganizationsResourceServiceMapper.java deleted file mode 100644 index b227ef8d..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/mapper/OrganizationsResourceServiceMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations.mapper; - -import it.gov.pagopa.fdr.rest.model.Metadata; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.service.dto.FdrAllDto; -import it.gov.pagopa.fdr.service.dto.FdrGetDto; -import it.gov.pagopa.fdr.service.dto.FdrGetPaymentDto; -import it.gov.pagopa.fdr.service.dto.MetadataDto; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface OrganizationsResourceServiceMapper { - - OrganizationsResourceServiceMapper INSTANCE = - Mappers.getMapper(OrganizationsResourceServiceMapper.class); - - GetResponse toGetIdResponse(FdrGetDto fdrGetDto); - - GetPaymentResponse toGetPaymentResponse(FdrGetPaymentDto fdrGetPaymentDto); - - GetAllResponse toGetAllResponse(FdrAllDto fdrAllDto); - - Metadata toMetadata(MetadataDto metadataDto); -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetAllResponse.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetAllResponse.java deleted file mode 100644 index c2376260..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/response/GetAllResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations.response; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.Fdr; -import it.gov.pagopa.fdr.rest.model.Metadata; -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; -import lombok.extern.jackson.Jacksonized; -import org.eclipse.microprofile.openapi.annotations.media.Schema; - -@Getter -@SuperBuilder -@Jacksonized -@JsonPropertyOrder({"metadata", "count", "data"}) -public class GetAllResponse { - - private Metadata metadata; - - @Schema(example = "100") - private long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/InternalOrganizationsValidationService.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/InternalOrganizationsValidationService.java deleted file mode 100644 index f457a7b1..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/InternalOrganizationsValidationService.java +++ /dev/null @@ -1,54 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations.validation; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import it.gov.pagopa.fdr.rest.validation.CommonValidationService; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import org.jboss.logging.Logger; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; - -@ApplicationScoped -public class InternalOrganizationsValidationService extends CommonValidationService { - - private final Logger log; - - public InternalOrganizationsValidationService(Logger log) { - this.log = log; - } - - @WithSpan(kind = SERVER) - public void validateGetAllInternal(String action, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - if (null != pspId && !pspId.isBlank()) { - checkPaymentServiceProvider(log, pspId, configData); - } - } - - @WithSpan(kind = SERVER) - public void validateGetInternal( - String action, String fdr, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } - - @WithSpan(kind = SERVER) - public void validateGetPaymentInternal( - String action, String fdr, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/OrganizationsValidationService.java b/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/OrganizationsValidationService.java deleted file mode 100644 index 798c94e5..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/organizations/validation/OrganizationsValidationService.java +++ /dev/null @@ -1,64 +0,0 @@ -package it.gov.pagopa.fdr.rest.organizations.validation; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import it.gov.pagopa.fdr.rest.validation.CommonValidationService; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import org.jboss.logging.Logger; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; - -@ApplicationScoped -public class OrganizationsValidationService extends CommonValidationService { - - private final Logger log; - - public OrganizationsValidationService(Logger log) { - this.log = log; - } - - @WithSpan(kind = SERVER) - public void validateGetAllByEc( - String action, String ecId, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - if (null != pspId && !pspId.isBlank()) { - checkPaymentServiceProvider(log, pspId, configData); - } - - // check ec - checkCreditorInstitution(log, ecId, configData); - } - - @WithSpan(kind = SERVER) - public void validateGet( - String action, String fdr, String ecId, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } - - @WithSpan(kind = SERVER) - public void validateGetPayment( - String action, String fdr, String ecId, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/BasePspResource.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/BasePspResource.java deleted file mode 100644 index 95b6cebe..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/BasePspResource.java +++ /dev/null @@ -1,320 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps; - -import static it.gov.pagopa.fdr.util.MDCKeys.*; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.model.GenericResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.psps.mapper.PspsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.psps.request.AddPaymentRequest; -import it.gov.pagopa.fdr.rest.psps.request.CreateRequest; -import it.gov.pagopa.fdr.rest.psps.request.DeletePaymentRequest; -import it.gov.pagopa.fdr.rest.psps.response.GetAllCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetAllPublishedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.validation.InternalPspValidationService; -import it.gov.pagopa.fdr.rest.psps.validation.PspsValidationService; -import it.gov.pagopa.fdr.service.dto.*; -import it.gov.pagopa.fdr.service.psps.PspsService; -import it.gov.pagopa.fdr.service.re.model.EventTypeEnum; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.ws.rs.core.Response.Status; -import java.time.Instant; -import org.jboss.logging.Logger; -import org.jboss.logging.MDC; -import org.jboss.resteasy.reactive.RestResponse; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; - -public abstract class BasePspResource { - - public static final String S_BY_PSP_S_WITH_FDR_S = "%s by psp:[%s] with fdr:[%s]"; - - private final Logger log; - - private final Config config; - - private final PspsValidationService validator; - - private final InternalPspValidationService internalValidator; - - private final PspsResourceServiceMapper mapper; - - private final PspsService service; - - protected BasePspResource( - Logger log, - Config config, - PspsValidationService validator, - InternalPspValidationService internalValidator, - PspsResourceServiceMapper mapper, - PspsService service) { - this.log = log; - this.config = config; - this.validator = validator; - this.internalValidator = internalValidator; - this.mapper = mapper; - this.service = service; - } - - protected RestResponse baseCreate( - String pspId, String fdr, CreateRequest createRequest) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(PSP_ID, pspId); - - String organizationId = createRequest.getReceiver().getOrganizationId(); - MDC.put(ORGANIZATION_ID, organizationId); - MDC.put(FDR, fdr); - - log.infof( - AppMessageUtil.logProcess("%s by psp:[%s] with fdr:[%s], organizationId:[%s]"), - action, - pspId, - fdr, - organizationId); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - validator.validateCreateFlow(action, pspId, fdr, createRequest, configData); - - // save on DB - service.save(action, mapper.toReportingFlowDto(createRequest)); - - return RestResponse.status( - Status.CREATED, - GenericResponse.builder().message(String.format("Fdr [%s] saved", fdr)).build()); - } - - protected GenericResponse baseAddPayment( - String pspId, String fdr, AddPaymentRequest addPaymentRequest) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, pspId); - - log.infof(AppMessageUtil.logProcess(S_BY_PSP_S_WITH_FDR_S), action, fdr, pspId); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - validator.validateAddPayment(action, pspId, fdr, configData); - - // save on DB - service.addPayment(action, pspId, fdr, mapper.toAddPaymentDto(addPaymentRequest)); - - return GenericResponse.builder().message(String.format("Fdr [%s] payment added", fdr)).build(); - } - - protected GenericResponse baseDeletePayment( - String pspId, String fdr, DeletePaymentRequest deletePaymentRequest) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, pspId); - - log.infof(AppMessageUtil.logProcess(S_BY_PSP_S_WITH_FDR_S), action, fdr, pspId); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - validator.validateDeletePayment(action, pspId, fdr, configData); - - // save on DB - service.deletePayment(action, pspId, fdr, mapper.toDeletePaymentDto(deletePaymentRequest)); - - return GenericResponse.builder() - .message(String.format("Fdr [%s] payment deleted", fdr)) - .build(); - } - - protected GenericResponse basePublish(String pspId, String fdr, boolean internalPublish) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, pspId); - - log.infof(AppMessageUtil.logProcess(S_BY_PSP_S_WITH_FDR_S), action, fdr, pspId); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - validator.validatePublish(action, pspId, fdr, configData); - - // save on DB e pubblica su coda solo se non iternal - service.publishByFdr(action, pspId, fdr, internalPublish); - - return GenericResponse.builder().message(String.format("Fdr [%s] published", fdr)).build(); - } - - protected GenericResponse baseDelete(String pspId, String fdr) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, pspId); - - log.infof(AppMessageUtil.logProcess(S_BY_PSP_S_WITH_FDR_S), action, fdr, pspId); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - validator.validateDelete(action, pspId, fdr, configData); - - // save on DB - service.deleteByFdr(action, pspId, fdr); - - return GenericResponse.builder().message(String.format("Fdr [%s] deleted", fdr)).build(); - } - - protected GetAllCreatedResponse baseGetAllCreated( - String idPsp, Instant createdGt, long pageNumber, long pageSize) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - if (null != idPsp && !idPsp.isBlank()) { - MDC.put(PSP_ID, idPsp); - } - - log.infof( - AppMessageUtil.logProcess("%s by psp:[%s] - page:[%s], pageSize:[%s]"), - action, - idPsp, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - internalValidator.validateGetAllInternal(action, idPsp, configData); - - // get from db - FdrAllCreatedDto fdrAllDto = service.find(action, idPsp, createdGt, pageNumber, pageSize); - - return mapper.toGetAllResponse(fdrAllDto); - } - - protected GetCreatedResponse baseGetCreated(String fdr, String psp, String organizationId) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, psp); - MDC.put(ORGANIZATION_ID, organizationId); - - log.infof(AppMessageUtil.logProcess("%s by fdr=[%s], psp=[%s]"), action, fdr, psp); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - internalValidator.validateGetInternal(action, fdr, psp, organizationId, configData); - - // get from db - FdrGetCreatedDto fdrGetDto = service.findByReportingFlowName(action, fdr, psp, organizationId); - - return mapper.toGetCreatedResponse(fdrGetDto); - } - - protected GetPaymentResponse baseGetCreatedFdrPayment( - String fdr, String psp, String organizationId, long pageNumber, long pageSize) { - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - String action = (String) MDC.get(ACTION); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, psp); - MDC.put(ORGANIZATION_ID, organizationId); - - log.infof( - AppMessageUtil.logProcess("%s with id:[%s] - page:[%s], pageSize:[%s]"), - action, - fdr, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - internalValidator.validateGetPaymentInternal(action, fdr, psp, organizationId, configData); - - // get from db - FdrGetPaymentDto fdrGetPaymentDto = - service.findPaymentByReportingFlowName( - action, fdr, psp, organizationId, pageNumber, pageSize); - - return mapper.toGetPaymentResponse(fdrGetPaymentDto); - } - - protected GetAllPublishedResponse baseGetAllPublished( - String idPsp, String organizationId, Instant publishedGt, long pageNumber, long pageSize) { - String action = (String) MDC.get(ACTION); - MDC.put(PSP_ID, idPsp); - if (null != organizationId && !organizationId.isBlank()) { - MDC.put(ORGANIZATION_ID, organizationId); - } - - log.infof( - AppMessageUtil.logProcess("%s by psp:[%s] with ec:[%s] - page:[%s], pageSize:[%s]"), - action, - idPsp, - organizationId, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - validator.validateGetAllPublished(action, idPsp, organizationId, configData); - - // get from db - FdrAllPublishedDto fdrAllDto = - service.findAllPublished(action, idPsp, organizationId, publishedGt, pageNumber, pageSize); - - return mapper.toGetAllPublishedResponse(fdrAllDto); - } - - protected GetResponse baseGetPublished(String psp, String fdr, Long rev, String organizationId) { - String action = (String) MDC.get(ACTION); - MDC.put(PSP_ID, psp); - MDC.put(FDR, fdr); - MDC.put(ORGANIZATION_ID, organizationId); - - log.infof( - AppMessageUtil.logProcess("%s by psp:[%s] with fdr=[%s], ec=[%s]"), - action, - psp, - fdr, - organizationId); - - ConfigDataV1 configData = config.getClonedCache(); - - // validation - validator.validateGetPublished(action, fdr, psp, organizationId, configData); - - // get from db - FdrGetDto fdrGetDto = - service.findByReportingFlowNamePublished(action, fdr, rev, psp, organizationId); - - return mapper.toGetIdResponsePublished(fdrGetDto); - } - - protected GetPaymentResponse baseGetFdrPaymentPublished( - String psp, String fdr, Long rev, String organizationId, long pageNumber, long pageSize) { - - String action = (String) MDC.get(ACTION); - MDC.put(ORGANIZATION_ID, organizationId); - MDC.put(FDR, fdr); - MDC.put(PSP_ID, psp); - - log.infof( - AppMessageUtil.logProcess("%s with id:[%s] - page:[%s], pageSize:[%s]"), - action, - fdr, - pageNumber, - pageSize); - - ConfigDataV1 configData = config.getClonedCache(); - // validation - validator.validateGetPaymentPublished(action, fdr, psp, organizationId, configData); - - // get from db - FdrGetPaymentDto fdrGetPaymentDto = - service.findPaymentByReportingFlowNamePublished( - action, fdr, rev, psp, organizationId, pageNumber, pageSize); - - return mapper.toGetPaymentResponse(fdrGetPaymentDto); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/InternalPspsResource.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/InternalPspsResource.java deleted file mode 100644 index fdef585b..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/InternalPspsResource.java +++ /dev/null @@ -1,385 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.model.GenericResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.psps.mapper.PspsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.psps.request.AddPaymentRequest; -import it.gov.pagopa.fdr.rest.psps.request.CreateRequest; -import it.gov.pagopa.fdr.rest.psps.request.DeletePaymentRequest; -import it.gov.pagopa.fdr.rest.psps.response.GetAllCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetAllPublishedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.validation.InternalPspValidationService; -import it.gov.pagopa.fdr.rest.psps.validation.PspsValidationService; -import it.gov.pagopa.fdr.service.psps.PspsService; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.Re; -import jakarta.validation.Valid; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DELETE; -import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.PUT; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; -import java.time.Instant; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.Logger; -import org.jboss.resteasy.reactive.RestResponse; - -@Tag(name = "Internal PSP", description = "PSP operations") -@Path("/internal/psps/{" + AppConstant.PSP + "}") -@Consumes("application/json") -@Produces("application/json") -public class InternalPspsResource extends BasePspResource { - - protected InternalPspsResource( - Logger log, - Config config, - PspsValidationService validator, - InternalPspValidationService internalValidator, - PspsResourceServiceMapper mapper, - PspsService service) { - super(log, config, validator, internalValidator, mapper, service); - } - - @Operation(operationId = "internalCreate", summary = "Create fdr", description = "Create fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = CreateRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "201", - description = "Created", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @POST - @Path("/fdrs/{" + AppConstant.FDR + "}") - @Re(action = FdrActionEnum.INTERNAL_CREATE_FLOW) - public RestResponse internalCreate( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) @Pattern(regexp = "[a-zA-Z0-9\\-_]{1,35}") String fdr, - @NotNull @Valid CreateRequest createRequest) { - - return baseCreate(pspId, fdr, createRequest); - } - - @Operation( - operationId = "internalAddPayment", - summary = "Add payments to fdr", - description = "Add payments to fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = AddPaymentRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @PUT - @Path("/fdrs/{" + AppConstant.FDR + "}/payments/add") - @Re(action = FdrActionEnum.INTERNAL_ADD_PAYMENT) - public GenericResponse internalAddPayment( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) String fdr, - @NotNull @Valid AddPaymentRequest addPaymentRequest) { - return baseAddPayment(pspId, fdr, addPaymentRequest); - } - - @Operation( - operationId = "internalDeletePayment", - summary = "Delete payments to fdr", - description = "Delete payments to fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = DeletePaymentRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @PUT - @Path("/fdrs/{" + AppConstant.FDR + "}/payments/del") - @Re(action = FdrActionEnum.INTERNAL_DELETE_PAYMENT) - public GenericResponse internalDeletePayment( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) String fdr, - @NotNull @Valid DeletePaymentRequest deletePaymentRequest) { - return baseDeletePayment(pspId, fdr, deletePaymentRequest); - } - - @Operation(operationId = "internalPublish", summary = "Publish fdr", description = "Publish fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @POST - @Path("/fdrs/{" + AppConstant.FDR + "}/publish") - @Re(action = FdrActionEnum.INTERNAL_PUBLISH) - public GenericResponse internalPublish( - @PathParam(AppConstant.PSP) String pspId, @PathParam(AppConstant.FDR) String fdr) { - return basePublish(pspId, fdr, true); - } - - @Operation(operationId = "internalDelete", summary = "Delete fdr", description = "Delete fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @DELETE - @Path("/fdrs/{" + AppConstant.FDR + "}") - @Re(action = FdrActionEnum.INTERNAL_DELETE_FLOW) - public GenericResponse internalDelete( - @PathParam(AppConstant.PSP) String pspId, @PathParam(AppConstant.FDR) String fdr) { - return baseDelete(pspId, fdr); - } - - @Operation( - operationId = "internalGetAllCreated", - summary = "Get all fdr inserted", - description = "Get all fdr inserted") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllCreatedResponse.class))) - }) - @GET - @Path("/created") - @Re(action = FdrActionEnum.INTERNAL_GET_ALL_CREATED_FDR) - public GetAllCreatedResponse internalGetAllCreated( - @PathParam(AppConstant.PSP) String pspId, - @QueryParam(AppConstant.CREATED_GREATER_THAN) Instant createdGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAllCreated(pspId, createdGt, pageNumber, pageSize); - } - - @Operation( - operationId = "internalGetCreated", - summary = "Get created fdr", - description = "Get created fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetCreatedResponse.class))) - }) - @GET - @Path("/created/fdrs/{" + AppConstant.FDR + "}/organizations/{" + AppConstant.ORGANIZATION + "}") - @Re(action = FdrActionEnum.INTERNAL_GET_CREATED_FDR) - public GetCreatedResponse internalGetCreated( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.ORGANIZATION) String organizationId) { - return baseGetCreated(fdr, psp, organizationId); - } - - @Operation( - operationId = "internalGetCreatedPayment", - summary = "Get internal created payments of fdr", - description = "Get internal created payments of fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/created/fdrs/{" - + AppConstant.FDR - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}/payments") - @Re(action = FdrActionEnum.INTERNAL_GET_CREATED_FDR_PAYMENT) - public GetPaymentResponse internalGetCreatedPayment( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetCreatedFdrPayment(fdr, psp, organizationId, pageNumber, pageSize); - } - - @Operation( - operationId = "internalGetAllPublishedByPsp", - summary = "Get all internal fdr published", - description = "Get all internal fdr published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllPublishedResponse.class))) - }) - @GET - @Path("/published") - @Re(action = FdrActionEnum.INTERNAL_GET_ALL_FDR_PUBLISHED_BY_PSP) - public GetAllPublishedResponse internalGetAllPublishedByPsp( - @PathParam(AppConstant.PSP) String idPsp, - @QueryParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @QueryParam(AppConstant.PUBLISHED_GREATER_THAN) Instant publishedGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAllPublished(idPsp, organizationId, publishedGt, pageNumber, pageSize); - } - - @Operation( - operationId = "internalGetPublishedByPsp", - summary = "Get internal fdr Published", - description = "Get internal fdr Published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetResponse.class))) - }) - @GET - @Path( - "/published/fdrs/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}") - @Re(action = FdrActionEnum.INTERNAL_GET_FDR_PUBLISHED_BY_PSP) - public GetResponse internalGetPublishedByPsp( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.ORGANIZATION) String organizationId) { - return baseGetPublished(organizationId, fdr, rev, psp); - } - - @Operation( - operationId = "internalGetPaymentPublishedByPSp", - summary = "Get internal payments of fdr Published", - description = "Get internal payments of fdr Published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/published/fdrs/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}/payments") - @Re(action = FdrActionEnum.INTERNAL_GET_FDR_PAYMENT_PUBLISHED_BY_PSP) - public GetPaymentResponse internalGetPaymentPublishedByPSp( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetFdrPaymentPublished(organizationId, fdr, rev, psp, pageNumber, pageSize); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/PspsResource.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/PspsResource.java deleted file mode 100644 index c5d0c57a..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/PspsResource.java +++ /dev/null @@ -1,376 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps; - -import it.gov.pagopa.fdr.Config; -import it.gov.pagopa.fdr.rest.model.GenericResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.psps.mapper.PspsResourceServiceMapper; -import it.gov.pagopa.fdr.rest.psps.request.AddPaymentRequest; -import it.gov.pagopa.fdr.rest.psps.request.CreateRequest; -import it.gov.pagopa.fdr.rest.psps.request.DeletePaymentRequest; -import it.gov.pagopa.fdr.rest.psps.response.GetAllCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetAllPublishedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.validation.InternalPspValidationService; -import it.gov.pagopa.fdr.rest.psps.validation.PspsValidationService; -import it.gov.pagopa.fdr.service.psps.PspsService; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.Re; -import jakarta.validation.Valid; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import java.time.Instant; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.Logger; -import org.jboss.resteasy.reactive.RestResponse; - -@Tag(name = "PSP", description = "PSP operations") -@Path("/psps/{" + AppConstant.PSP + "}") -@Consumes("application/json") -@Produces("application/json") -public class PspsResource extends BasePspResource { - - protected PspsResource( - Logger log, - Config config, - PspsValidationService validator, - InternalPspValidationService internalValidator, - PspsResourceServiceMapper mapper, - PspsService service) { - super(log, config, validator, internalValidator, mapper, service); - } - - @Operation(operationId = "create", summary = "Create fdr", description = "Create fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = CreateRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "201", - description = "Created", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @POST - @Path("/fdrs/{" + AppConstant.FDR + "}") - @Re(action = FdrActionEnum.CREATE_FLOW) - public RestResponse create( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) @Pattern(regexp = "[a-zA-Z0-9\\-_]{1,35}") String fdr, - @NotNull @Valid CreateRequest createRequest) { - - return baseCreate(pspId, fdr, createRequest); - } - - @Operation( - operationId = "addPayment", - summary = "Add payments to fdr", - description = "Add payments to fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = AddPaymentRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @PUT - @Path("/fdrs/{" + AppConstant.FDR + "}/payments/add") - @Re(action = FdrActionEnum.ADD_PAYMENT) - public GenericResponse addPayment( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) String fdr, - @NotNull @Valid AddPaymentRequest addPaymentRequest) { - return baseAddPayment(pspId, fdr, addPaymentRequest); - } - - @Operation( - operationId = "deletePayment", - summary = "Delete payments to fdr", - description = "Delete payments to fdr") - @RequestBody(content = @Content(schema = @Schema(implementation = DeletePaymentRequest.class))) - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @PUT - @Path("/fdrs/{" + AppConstant.FDR + "}/payments/del") - @Re(action = FdrActionEnum.DELETE_PAYMENT) - public GenericResponse deletePayment( - @PathParam(AppConstant.PSP) String pspId, - @PathParam(AppConstant.FDR) String fdr, - @NotNull @Valid DeletePaymentRequest deletePaymentRequest) { - return baseDeletePayment(pspId, fdr, deletePaymentRequest); - } - - @Operation(operationId = "publish", summary = "Publish fdr", description = "Publish fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @POST - @Path("/fdrs/{" + AppConstant.FDR + "}/publish") - @Re(action = FdrActionEnum.PUBLISH) - public GenericResponse publish( - @PathParam(AppConstant.PSP) String pspId, @PathParam(AppConstant.FDR) String fdr) { - return basePublish(pspId, fdr, false); - } - - @Operation(operationId = "delete", summary = "Delete fdr", description = "Delete fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GenericResponse.class))) - }) - @DELETE - @Path("/fdrs/{" + AppConstant.FDR + "}") - @Re(action = FdrActionEnum.DELETE_FLOW) - public GenericResponse delete( - @PathParam(AppConstant.PSP) String pspId, @PathParam(AppConstant.FDR) String fdr) { - return baseDelete(pspId, fdr); - } - - @Operation( - operationId = "getAllcreated", - summary = "Get all fdr created", - description = "Get all fdr created") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllCreatedResponse.class))) - }) - @GET - @Path("/created") - @Re(action = FdrActionEnum.GET_ALL_CREATED_FDR) - public GetAllCreatedResponse getAllCreated( - @PathParam(AppConstant.PSP) String pspId, - @QueryParam(AppConstant.CREATED_GREATER_THAN) Instant createdGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAllCreated(pspId, createdGt, pageNumber, pageSize); - } - - @Operation( - operationId = "getCreated", - summary = "Get created fdr", - description = "Get created fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetCreatedResponse.class))) - }) - @GET - @Path("/created/fdrs/{" + AppConstant.FDR + "}/organizations/{" + AppConstant.ORGANIZATION + "}") - @Re(action = FdrActionEnum.GET_CREATED_FDR) - public GetCreatedResponse getCreated( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.ORGANIZATION) String organizationId) { - return baseGetCreated(fdr, psp, organizationId); - } - - @Operation( - operationId = "getCreatedPayment", - summary = "Get created payments of fdr", - description = "Get created payments of fdr") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/created/fdrs/{" - + AppConstant.FDR - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}/payments") - @Re(action = FdrActionEnum.GET_CREATED_FDR_PAYMENT) - public GetPaymentResponse getCreatedPayment( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetCreatedFdrPayment(fdr, psp, organizationId, pageNumber, pageSize); - } - - @Operation( - operationId = "getAllPublishedByPsp", - summary = "Get all fdr published", - description = "Get all fdr published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetAllPublishedResponse.class))) - }) - @GET - @Path("/published") - @Re(action = FdrActionEnum.GET_ALL_FDR_PUBLISHED_BY_PSP) - public GetAllPublishedResponse getAllPublishedByPsp( - @PathParam(AppConstant.PSP) String idPsp, - @QueryParam(AppConstant.ORGANIZATION) @Pattern(regexp = "^(.{1,35})$") String organizationId, - @QueryParam(AppConstant.PUBLISHED_GREATER_THAN) Instant publishedGt, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetAllPublished(idPsp, organizationId, publishedGt, pageNumber, pageSize); - } - - @Operation( - operationId = "getPublishedByPsp", - summary = "Get fdr Published", - description = "Get fdr Published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetResponse.class))) - }) - @GET - @Path( - "/published/fdrs/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}") - @Re(action = FdrActionEnum.GET_FDR_PUBLISHED_BY_PSP) - public GetResponse getPublishedByPsp( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.ORGANIZATION) String organizationId) { - return baseGetPublished(psp, fdr, rev, organizationId); - } - - @Operation( - operationId = "getPaymentPublishedByPsp", - summary = "Get payments of fdr Published", - description = "Get payments of fdr Published") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = GetPaymentResponse.class))) - }) - @GET - @Path( - "/published/fdrs/{" - + AppConstant.FDR - + "}/revisions/{" - + AppConstant.REVISION - + "}/organizations/{" - + AppConstant.ORGANIZATION - + "}/payments") - @Re(action = FdrActionEnum.GET_FDR_PAYMENT_PUBLISHED_BY_PSP) - public GetPaymentResponse getPaymentPublishedByPsp( - @PathParam(AppConstant.PSP) String psp, - @PathParam(AppConstant.FDR) String fdr, - @PathParam(AppConstant.REVISION) Long rev, - @PathParam(AppConstant.ORGANIZATION) String organizationId, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - return baseGetFdrPaymentPublished(psp, fdr, rev, organizationId, pageNumber, pageSize); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/mapper/PspsResourceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/mapper/PspsResourceServiceMapper.java deleted file mode 100644 index 4e4b6bae..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/mapper/PspsResourceServiceMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps.mapper; - -import it.gov.pagopa.fdr.rest.model.Metadata; -import it.gov.pagopa.fdr.rest.model.ReportingFlowStatusEnum; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.psps.request.AddPaymentRequest; -import it.gov.pagopa.fdr.rest.psps.request.CreateRequest; -import it.gov.pagopa.fdr.rest.psps.request.DeletePaymentRequest; -import it.gov.pagopa.fdr.rest.psps.response.GetAllCreatedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetAllPublishedResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetCreatedResponse; -import it.gov.pagopa.fdr.service.dto.*; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface PspsResourceServiceMapper { - - PspsResourceServiceMapper INSTANCE = Mappers.getMapper(PspsResourceServiceMapper.class); - - FdrDto toReportingFlowDto(CreateRequest createRequest); - - AddPaymentDto toAddPaymentDto(AddPaymentRequest addPaymentRequest); - - DeletePaymentDto toDeletePaymentDto(DeletePaymentRequest deletePaymentRequest); - - GetAllCreatedResponse toGetAllResponse(FdrAllCreatedDto fdrAllDto); - - ReportingFlowStatusEnum toReportingFlowStatusEnum(FdrStatusEnumDto fdrStatusEnumDto); - - Metadata toMetadata(MetadataDto metadataDto); - - GetCreatedResponse toGetCreatedResponse(FdrGetCreatedDto fdrAllDto); - - GetPaymentResponse toGetPaymentResponse(FdrGetPaymentDto fdrGetPaymentDto); - - GetAllResponse toGetAllResponsePublished(FdrAllDto fdrAllDto); - - GetResponse toGetIdResponsePublished(FdrGetDto fdrGetDto); - - GetAllPublishedResponse toGetAllPublishedResponse(FdrAllPublishedDto fdrAllDto); -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllCreatedResponse.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllCreatedResponse.java deleted file mode 100644 index 76a49392..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllCreatedResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps.response; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.FdrInserted; -import it.gov.pagopa.fdr.rest.model.Metadata; -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; -import lombok.extern.jackson.Jacksonized; -import org.eclipse.microprofile.openapi.annotations.media.Schema; - -@Getter -@SuperBuilder -@Jacksonized -@JsonPropertyOrder({"metadata", "count", "data"}) -public class GetAllCreatedResponse { - - private Metadata metadata; - - @Schema(example = "100") - private long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllPublishedResponse.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllPublishedResponse.java deleted file mode 100644 index 1b779c78..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/response/GetAllPublishedResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps.response; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.FdrPublished; -import it.gov.pagopa.fdr.rest.model.Metadata; -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; -import lombok.extern.jackson.Jacksonized; -import org.eclipse.microprofile.openapi.annotations.media.Schema; - -@Getter -@SuperBuilder -@Jacksonized -@JsonPropertyOrder({"metadata", "count", "data"}) -public class GetAllPublishedResponse { - - private Metadata metadata; - - @Schema(example = "100") - private long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/InternalPspValidationService.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/InternalPspValidationService.java deleted file mode 100644 index 646251cb..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/InternalPspValidationService.java +++ /dev/null @@ -1,60 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps.validation; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import it.gov.pagopa.fdr.rest.validation.CommonValidationService; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import org.jboss.logging.Logger; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; - -@ApplicationScoped -public class InternalPspValidationService extends CommonValidationService { - - private final Logger log; - - public InternalPspValidationService(Logger log) { - this.log = log; - } - - @WithSpan(kind = SERVER) - public void validateGetAllInternal(String action, String pspId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - if (null != pspId && !pspId.isBlank()) { - checkPaymentServiceProvider(log, pspId, configData); - } - } - - @WithSpan(kind = SERVER) - public void validateGetInternal( - String action, String fdr, String pspId, String ecId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } - - @WithSpan(kind = SERVER) - public void validateGetPaymentInternal( - String action, String fdr, String pspId, String ecId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/PspsValidationService.java b/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/PspsValidationService.java deleted file mode 100644 index a8d8beaa..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/psps/validation/PspsValidationService.java +++ /dev/null @@ -1,150 +0,0 @@ -package it.gov.pagopa.fdr.rest.psps.validation; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import it.gov.pagopa.fdr.rest.psps.request.CreateRequest; -import it.gov.pagopa.fdr.rest.validation.CommonValidationService; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import org.jboss.logging.Logger; -import org.openapi.quarkus.api_config_cache_json.model.BrokerPsp; -import org.openapi.quarkus.api_config_cache_json.model.Channel; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; -import org.openapi.quarkus.api_config_cache_json.model.PaymentServiceProvider; - -@ApplicationScoped -public class PspsValidationService extends CommonValidationService { - - private final Logger log; - - public PspsValidationService(Logger log) { - this.log = log; - } - - @WithSpan(kind = SERVER) - public void validateCreateFlow( - String action, String psp, String fdr, CreateRequest createRequest, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp sender - String pspId = createRequest.getSender().getPspId(); - checkPspSender(log, psp, pspId, createRequest.getFdr()); - - // check psp - PaymentServiceProvider paymentServiceProvider = - checkPaymentServiceProvider(log, psp, configData); - - // check broker - String brokerId = createRequest.getSender().getPspBrokerId(); - BrokerPsp brokerPsp = checkBrokerPsp(log, brokerId, configData); - - // check channel - String channelId = createRequest.getSender().getChannelId(); - Channel channel = checkChannel(log, channelId, configData); - - // check channel/broker - checkChannelBrokerPsp(log, channel, channelId, brokerPsp, brokerId); - - // check channel/psp - checkChannelPsp(log, channel, channelId, paymentServiceProvider, pspId, configData); - - // check ec - String ecId = createRequest.getReceiver().getOrganizationId(); - checkCreditorInstitution(log, ecId, configData); - - // check fdr format - String createRequestFdr = createRequest.getFdr(); - checkFlowName(log, fdr, createRequestFdr); - checkReportingFlowFormat(log, createRequestFdr, pspId); - } - - @WithSpan(kind = SERVER) - public void validateAddPayment(String action, String psp, String fdr, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, psp, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, psp); - } - - @WithSpan(kind = SERVER) - public void validateDeletePayment( - String action, String psp, String fdr, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, psp, configData); - - /// check fdr format - checkReportingFlowFormat(log, fdr, psp); - } - - @WithSpan(kind = SERVER) - public void validatePublish(String action, String psp, String fdr, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, psp, configData); - - /// check fdr format - checkReportingFlowFormat(log, fdr, psp); - } - - @WithSpan(kind = SERVER) - public void validateDelete(String action, String psp, String fdr, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, psp, configData); - - /// check fdr format - checkReportingFlowFormat(log, fdr, psp); - } - - @WithSpan(kind = SERVER) - public void validateGetAllPublished( - String action, String pspId, String ecId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check ec - if (null != pspId && !pspId.isBlank()) { - checkCreditorInstitution(log, ecId, configData); - } - } - - @WithSpan(kind = SERVER) - public void validateGetPublished( - String action, String fdr, String pspId, String ecId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } - - @WithSpan(kind = SERVER) - public void validateGetPaymentPublished( - String action, String fdr, String pspId, String ecId, ConfigDataV1 configData) { - log.info(AppMessageUtil.logValidate(action)); - - // check psp - checkPaymentServiceProvider(log, pspId, configData); - - // check ec - checkCreditorInstitution(log, ecId, configData); - - // check fdr format - checkReportingFlowFormat(log, fdr, pspId); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/support/SupportResource.java b/src/main/java/it/gov/pagopa/fdr/rest/support/SupportResource.java deleted file mode 100644 index 2c307e5e..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/support/SupportResource.java +++ /dev/null @@ -1,146 +0,0 @@ -package it.gov.pagopa.fdr.rest.support; - -import static it.gov.pagopa.fdr.util.MDCKeys.ACTION; -import static it.gov.pagopa.fdr.util.MDCKeys.PSP_ID; - -import it.gov.pagopa.fdr.rest.support.mapper.SupportResourceServiceMapper; -import it.gov.pagopa.fdr.rest.support.response.FdrByPspIdIuvIurResponse; -import it.gov.pagopa.fdr.service.dto.PaymentGetByPspIdIuvIurDTO; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import it.gov.pagopa.fdr.service.support.FindPaymentsByPspIdAndIuvIurArgs; -import it.gov.pagopa.fdr.service.support.SupportService; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.Re; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.Pattern; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DefaultValue; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.QueryParam; -import jakarta.ws.rs.core.MediaType; -import java.time.Instant; -import org.eclipse.microprofile.openapi.annotations.Operation; -import org.eclipse.microprofile.openapi.annotations.media.Content; -import org.eclipse.microprofile.openapi.annotations.media.Schema; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; -import org.eclipse.microprofile.openapi.annotations.responses.APIResponses; -import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.logging.MDC; - -@Tag(name = "Support", description = "Support operations") -@Path("/internal/psps/{" + AppConstant.PSP + "}/") -@Consumes("application/json") -@Produces("application/json") -public class SupportResource { - - private final SupportResourceServiceMapper mapper; - private final SupportService service; - - public SupportResource(SupportResourceServiceMapper mapper, SupportService service) { - this.mapper = mapper; - this.service = service; - } - - @Operation( - operationId = "getByIuv", - summary = "Get all payments by psp id and iuv", - description = "Get all payments by psp id and iuv") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = FdrByPspIdIuvIurResponse.class))) - }) - @GET - @Path("iuv/{" + AppConstant.IUV + "}/") - @Re(action = FdrActionEnum.INTERNAL_GET_ALL_BY_PSP_IUV_FDR) - public FdrByPspIdIuvIurResponse getByIuv( - @PathParam(AppConstant.PSP) @Pattern(regexp = "^(.{1,35})$") String pspId, - @PathParam(AppConstant.IUV) @Pattern(regexp = "^(.{1,35})$") String iuv, - @QueryParam(AppConstant.CREATED_FROM) Instant createdFrom, - @QueryParam(AppConstant.CREATED_TO) Instant createdTo, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - String action = (String) MDC.get(ACTION); - MDC.put(PSP_ID, pspId); - PaymentGetByPspIdIuvIurDTO paymentDtoList = - service.findPaymentsByPspIdAndIuvIur( - FindPaymentsByPspIdAndIuvIurArgs.builder() - .action(action) - .pspId(pspId) - .iuv(iuv) - .iur(null) - .createdFrom(createdFrom) - .createdTo(createdTo) - .pageNumber(pageNumber) - .pageSize(pageSize) - .build()); - return FdrByPspIdIuvIurResponse.builder() - .metadata(mapper.toMetadata(paymentDtoList.getMetadata())) - .count(paymentDtoList.getCount()) - .data(mapper.toFdrByIuvIurList(paymentDtoList.getData())) - .build(); - } - - @Operation( - operationId = "getByIur", - summary = "Get all payments by psp id and iur", - description = "Get all payments by psp id and iur") - @APIResponses( - value = { - @APIResponse(ref = "#/components/responses/InternalServerError"), - @APIResponse(ref = "#/components/responses/AppException400"), - @APIResponse(ref = "#/components/responses/AppException404"), - @APIResponse( - responseCode = "200", - description = "Success", - content = - @Content( - mediaType = MediaType.APPLICATION_JSON, - schema = @Schema(implementation = FdrByPspIdIuvIurResponse.class))) - }) - @GET - @Path("iur/{" + AppConstant.IUR + "}/") - @Re(action = FdrActionEnum.INTERNAL_GET_ALL_BY_PSP_IUR_FDR) - public FdrByPspIdIuvIurResponse getByIur( - @PathParam(AppConstant.PSP) @Pattern(regexp = "^(.{1,35})$") String pspId, - @PathParam(AppConstant.IUR) @Pattern(regexp = "^(.{1,35})$") String iur, - @QueryParam(AppConstant.CREATED_FROM) Instant createdFrom, - @QueryParam(AppConstant.CREATED_TO) Instant createdTo, - @QueryParam(AppConstant.PAGE) @DefaultValue(AppConstant.PAGE_DEAFULT) @Min(value = 1) - long pageNumber, - @QueryParam(AppConstant.SIZE) @DefaultValue(AppConstant.SIZE_DEFAULT) @Min(value = 1) - long pageSize) { - String action = (String) MDC.get(ACTION); - MDC.put(PSP_ID, pspId); - PaymentGetByPspIdIuvIurDTO paymentDtoList = - service.findPaymentsByPspIdAndIuvIur( - FindPaymentsByPspIdAndIuvIurArgs.builder() - .action(action) - .pspId(pspId) - .iuv(null) - .iur(iur) - .createdFrom(createdFrom) - .createdTo(createdTo) - .pageNumber(pageNumber) - .pageSize(pageSize) - .build()); - return FdrByPspIdIuvIurResponse.builder() - .metadata(mapper.toMetadata(paymentDtoList.getMetadata())) - .count(paymentDtoList.getCount()) - .data(mapper.toFdrByIuvIurList(paymentDtoList.getData())) - .build(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/support/mapper/SupportResourceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/rest/support/mapper/SupportResourceServiceMapper.java deleted file mode 100644 index 540973c6..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/support/mapper/SupportResourceServiceMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.rest.support.mapper; - -import it.gov.pagopa.fdr.rest.model.FdrByPspIdIuvIurBase; -import it.gov.pagopa.fdr.rest.model.Metadata; -import it.gov.pagopa.fdr.service.dto.MetadataDto; -import it.gov.pagopa.fdr.service.dto.PaymentByPspIdIuvIurDTO; -import java.util.List; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface SupportResourceServiceMapper { - SupportResourceServiceMapper INSTANCE = Mappers.getMapper(SupportResourceServiceMapper.class); - - List toFdrByIuvIurList(List fdrGetPaymentDto); - - Metadata toMetadata(MetadataDto metadataDto); -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/support/response/FdrByPspIdIuvIurResponse.java b/src/main/java/it/gov/pagopa/fdr/rest/support/response/FdrByPspIdIuvIurResponse.java deleted file mode 100644 index c96374d1..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/support/response/FdrByPspIdIuvIurResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.rest.support.response; - -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import it.gov.pagopa.fdr.rest.model.FdrByPspIdIuvIurBase; -import it.gov.pagopa.fdr.rest.model.Metadata; -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; -import lombok.extern.jackson.Jacksonized; -import org.eclipse.microprofile.openapi.annotations.media.Schema; - -@Getter -@SuperBuilder -@Jacksonized -@JsonPropertyOrder({"metadata", "count", "data"}) -public class FdrByPspIdIuvIurResponse { - - private Metadata metadata; - - @Schema(example = "100") - private long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/validation/CommonValidationService.java b/src/main/java/it/gov/pagopa/fdr/rest/validation/CommonValidationService.java deleted file mode 100644 index 79aca8c3..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/validation/CommonValidationService.java +++ /dev/null @@ -1,135 +0,0 @@ -package it.gov.pagopa.fdr.rest.validation; - -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import jakarta.enterprise.context.ApplicationScoped; -import java.time.LocalDate; -import java.util.Optional; -import org.jboss.logging.Logger; -import org.openapi.quarkus.api_config_cache_json.model.BrokerPsp; -import org.openapi.quarkus.api_config_cache_json.model.Channel; -import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; -import org.openapi.quarkus.api_config_cache_json.model.CreditorInstitution; -import org.openapi.quarkus.api_config_cache_json.model.PaymentServiceProvider; -import org.openapi.quarkus.api_config_cache_json.model.PspChannelPaymentType; - -@ApplicationScoped -public class CommonValidationService { - - public void checkPspSender(Logger log, String psp, String pspId, String fdr) { - log.debugf("Check match between psp[%s], sender.pspId[%s]", psp, pspId); - if (!psp.equals(pspId)) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_PSP_ID_NOT_MATCH, fdr, pspId, psp); - } - } - - public void checkFlowName(Logger log, String fdr, String createRequestFdr) { - log.debugf("Check match between fdr[%s], createRequestFdr[%s]", fdr, createRequestFdr); - if (!fdr.equals(createRequestFdr)) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_NOT_MATCH, createRequestFdr, fdr); - } - } - - public PaymentServiceProvider checkPaymentServiceProvider( - Logger log, String psp, ConfigDataV1 configData) { - log.debugf("Check psp[%s]", psp); - PaymentServiceProvider paymentServiceProvider = - Optional.ofNullable(configData.getPsps().get(psp)) - .orElseThrow(() -> new AppException(AppErrorCodeMessageEnum.PSP_UNKNOWN, psp)); - - log.debugf("Check psp[%s] enabled", psp); - if (paymentServiceProvider.getEnabled() == null || !paymentServiceProvider.getEnabled()) { - throw new AppException(AppErrorCodeMessageEnum.PSP_NOT_ENABLED, psp); - } - return paymentServiceProvider; - } - - public BrokerPsp checkBrokerPsp(Logger log, String brokerId, ConfigDataV1 configData) { - log.debugf("Check brokerPsp[%s]", brokerId); - BrokerPsp brokerPsp = - Optional.ofNullable(configData.getPspBrokers().get(brokerId)) - .orElseThrow(() -> new AppException(AppErrorCodeMessageEnum.BROKER_UNKNOWN, brokerId)); - - log.debugf("Check brokerPsp[%s] enabled", brokerId); - if (brokerPsp.getEnabled() == null || !brokerPsp.getEnabled()) { - throw new AppException(AppErrorCodeMessageEnum.BROKER_NOT_ENABLED, brokerId); - } - return brokerPsp; - } - - public Channel checkChannel(Logger log, String channelId, ConfigDataV1 configData) { - log.debugf("Check channel[%s]", channelId); - Channel channel = - Optional.ofNullable(configData.getChannels().get(channelId)) - .orElseThrow( - () -> new AppException(AppErrorCodeMessageEnum.CHANNEL_UNKNOWN, channelId)); - - log.debugf("Check channel[%s] enabled", channelId); - if (channel.getEnabled() == null || !channel.getEnabled()) { - throw new AppException(AppErrorCodeMessageEnum.CHANNEL_NOT_ENABLED, channelId); - } - return channel; - } - - public void checkChannelBrokerPsp( - Logger log, Channel channel, String channelId, BrokerPsp brokerPsp, String brokerId) { - log.debugf("Check conjunction between channel[%s], brokerPsp[%s]", channelId, brokerId); - if (channel.getBrokerPspCode() == null - || !channel.getBrokerPspCode().equals(brokerPsp.getBrokerPspCode())) { - throw new AppException( - AppErrorCodeMessageEnum.CHANNEL_BROKER_WRONG_CONFIG, channelId, brokerId); - } - } - - public void checkChannelPsp( - Logger log, - Channel channel, - String channelId, - PaymentServiceProvider paymentServiceProvider, - String pspId, - ConfigDataV1 configData) { - log.debugf("Check conjunction between channel[%s], psp[%s]", channelId, pspId); - boolean exist = - configData.getPspChannelPaymentTypes().entrySet().stream() - .anyMatch( - a -> { - PspChannelPaymentType value = a.getValue(); - return value.getPspCode().equals(paymentServiceProvider.getPspCode()) - && value.getChannelCode().equals(channel.getChannelCode()); - }); - if (!exist) { - throw new AppException(AppErrorCodeMessageEnum.CHANNEL_PSP_WRONG_CONFIG, channelId, pspId); - } - } - - public void checkCreditorInstitution(Logger log, String ecId, ConfigDataV1 configData) { - log.debugf("Check ec[%s]", ecId); - CreditorInstitution ec = - Optional.ofNullable(configData.getCreditorInstitutions().get(ecId)) - .orElseThrow(() -> new AppException(AppErrorCodeMessageEnum.EC_UNKNOWN, ecId)); - log.debugf("Check ec[%s] enabled", ecId); - if (ec.getEnabled() == null || !ec.getEnabled()) { - throw new AppException(AppErrorCodeMessageEnum.EC_NOT_ENABLED, ecId); - } - } - - public void checkReportingFlowFormat(Logger log, String fdr, String pspId) { - log.debugf("Check date format in fdr[%s] with psp[%s]", fdr, pspId); - String date = fdr.substring(0, 10); - try { - // default, ISO_LOCAL_DATE ("2016-08-16") - LocalDate.parse(date); - } catch (RuntimeException e) { - throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, fdr); - } - - log.debugf("Check psp format in fdr[%s] with psp[%s]", fdr, pspId); - String name = fdr.substring(10); - boolean nameWrongFromat = !name.startsWith(String.format("%s-", pspId)); - if (nameWrongFromat) { - throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, fdr); - } - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSize.java b/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSize.java deleted file mode 100644 index 50ed1861..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSize.java +++ /dev/null @@ -1,33 +0,0 @@ -package it.gov.pagopa.fdr.rest.validation; - -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -@Target({ - ElementType.FIELD, - ElementType.METHOD, - ElementType.PARAMETER, - ElementType.ANNOTATION_TYPE, - ElementType.TYPE_USE -}) -@Retention(RUNTIME) -@Constraint(validatedBy = ListSizeValidator.class) -@Documented -public @interface ListSize { - - String message() default "{ListSize.invalid}"; - - Class[] groups() default {}; - - Class[] payload() default {}; - - int min() default 0; - - int max() default Integer.MAX_VALUE; -} diff --git a/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSizeValidator.java b/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSizeValidator.java deleted file mode 100644 index ca7cb26e..00000000 --- a/src/main/java/it/gov/pagopa/fdr/rest/validation/ListSizeValidator.java +++ /dev/null @@ -1,27 +0,0 @@ -package it.gov.pagopa.fdr.rest.validation; - -import it.gov.pagopa.fdr.rest.model.Payment; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class ListSizeValidator implements ConstraintValidator> { - - private int min; - private int max; - - @Override - public void initialize(ListSize constraintAnnotation) { - this.min = constraintAnnotation.min(); - this.max = constraintAnnotation.max(); - ConstraintValidator.super.initialize(constraintAnnotation); - } - - @Override - public boolean isValid(java.util.List value, ConstraintValidatorContext context) { - if (value == null) { - return true; - } - - return value.size() >= min && value.size() <= max; - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/FlowService.java b/src/main/java/it/gov/pagopa/fdr/service/FlowService.java new file mode 100644 index 00000000..4ac8a4b1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/FlowService.java @@ -0,0 +1,361 @@ +package it.gov.pagopa.fdr.service; + +import static io.opentelemetry.api.trace.SpanKind.SERVER; + +import io.opentelemetry.instrumentation.annotations.WithSpan; +import it.gov.pagopa.fdr.Config; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsPublishedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.repository.FdrFlowRepository; +import it.gov.pagopa.fdr.repository.FdrPaymentRepository; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import it.gov.pagopa.fdr.service.middleware.mapper.FlowMapper; +import it.gov.pagopa.fdr.service.middleware.validator.SemanticValidator; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; +import it.gov.pagopa.fdr.util.error.exception.persistence.PersistenceFailureException; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Instant; +import java.util.concurrent.CompletableFuture; +import org.bson.types.ObjectId; +import org.jboss.logging.Logger; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; + +@ApplicationScoped +public class FlowService { + + private final Logger log; + + private final Config cachedConfig; + + private final FdrFlowRepository flowRepository; + + private final FdrPaymentRepository paymentRepository; + + private final FlowMapper flowMapper; + + public FlowService( + Logger log, + Config cachedConfig, + FdrFlowRepository flowRepository, + FdrPaymentRepository paymentRepository, + FlowMapper flowMapper) { + + this.log = log; + this.cachedConfig = cachedConfig; + this.flowRepository = flowRepository; + this.paymentRepository = paymentRepository; + this.flowMapper = flowMapper; + } + + @WithSpan(kind = SERVER) + public PaginatedFlowsResponse getPaginatedPublishedFlowsForCI(FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(ORGANIZATION_ID, organizationId); + if (null != idPsp && !idPsp.isBlank()) { + MDC.put(PSP_ID, idPsp); + } + */ + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + long pageNumber = args.getPageNumber(); + long pageSize = args.getPageSize(); + + log.debugf( + "Executing query on published flows by organizationId [%s], pspId [%s] - pageIndex: [%s]," + + " pageSize:[%s]", + organizationId, pspId, pageNumber, pageSize); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetPaginatedFlowsRequestForOrganizations(configData, args); + + RepositoryPagedResult paginatedResult = + this.flowRepository.findPublishedByOrganizationIdAndOptionalPspId( + organizationId, pspId, args.getPublishedGt(), (int) pageNumber, (int) pageSize); + log.debugf( + "Found [%s] entities in [%s] pages. Mapping data to final response.", + paginatedResult.getTotalElements(), paginatedResult.getTotalPages()); + + return flowMapper.toPaginatedFlowResponse( + paginatedResult, args.getPageSize(), args.getPageNumber()); + } + + @WithSpan(kind = SERVER) + public PaginatedFlowsPublishedResponse getPaginatedPublishedFlowsForPSP( + FindFlowsByFiltersArgs args) { + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + long pageNumber = args.getPageNumber(); + long pageSize = args.getPageSize(); + + log.debugf( + "Executing query on published flows by pspId [%s], organizationId [%s] - pageIndex: [%s]," + + " pageSize:[%s]", + pspId, organizationId, pageNumber, pageSize); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetPaginatedFlowsRequestForPsps(configData, args); + + RepositoryPagedResult paginatedResult = + this.flowRepository.findPublishedByPspIdAndOptionalOrganizationId( + pspId, organizationId, args.getPublishedGt(), (int) pageNumber, (int) pageSize); + log.debugf( + "Found [%s] entities in [%s] pages. Mapping data to final response.", + paginatedResult.getTotalElements(), paginatedResult.getTotalPages()); + + return flowMapper.toPaginatedFlowPublishedResponse( + paginatedResult, args.getPageSize(), args.getPageNumber()); + } + + @WithSpan(kind = SERVER) + public PaginatedFlowsCreatedResponse getAllFlowsNotInPublishedStatus( + FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + if (null != idPsp && !idPsp.isBlank()) { + MDC.put(PSP_ID, idPsp); + } + */ + + String pspId = args.getPspId(); + Instant createdGt = args.getCreatedGt(); + long pageSize = args.getPageSize(); + long pageNumber = args.getPageNumber(); + + log.debugf("Executing query on flows by pspId [%s] created after [%s]", pspId, createdGt); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateOnlyPspFilters(configData, args); + + RepositoryPagedResult paginatedResult = + this.flowRepository.findUnpublishedByPspId( + pspId, createdGt, (int) pageNumber, (int) pageSize); + + return this.flowMapper.toPaginatedFlowCreatedResponse(paginatedResult, pageSize, pageNumber); + } + + @WithSpan(kind = SERVER) + public SingleFlowResponse getSinglePublishedFlow(FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(ORGANIZATION_ID, organizationId); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, psp); + */ + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + String flowName = args.getFlowName(); + long revision = args.getRevision(); + + log.debugf( + "Executing query on published flows by organizationId [%s], pspId [%s] flowName [%s]," + + " revision:[%s]", + organizationId, pspId, flowName, revision); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetSingleFlowFilters(configData, args); + + FdrFlowEntity result = + this.flowRepository.findPublishedByOrganizationIdAndPspIdAndName( + organizationId, pspId, flowName, revision); + if (result == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + log.debugf("Entity found. Mapping data to final response."); + return this.flowMapper.toSingleFlowResponse(result); + } + + @WithSpan(kind = SERVER) + public SingleFlowCreatedResponse getSingleFlowNotInPublishedStatus(FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, psp); + MDC.put(ORGANIZATION_ID, organizationId); + */ + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + String flowName = args.getFlowName(); + + log.debugf( + "Executing query on unpublished flows by organizationId [%s], pspId [%s] flowName [%s]", + organizationId, pspId, flowName); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetSingleFlowFilters(configData, args); + + FdrFlowEntity result = + this.flowRepository.findUnpublishedByOrganizationIdAndPspIdAndName( + organizationId, pspId, flowName); + if (result == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + log.debugf("Entity found. Mapping data to final response."); + return this.flowMapper.toSingleFlowCreatedResponse(result); + } + + @WithSpan(kind = SERVER) + public GenericResponse createEmptyFlow(String pspId, String flowName, CreateFlowRequest request) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(PSP_ID, pspId); + MDC.put(ORGANIZATION_ID, request.getReceiver().getOrganizationId()); + MDC.put(FDR, fdr); + */ + + log.debugf( + "Saving new flows by organizationId [%s], pspId [%s], flowName [%s]", + request.getReceiver().getOrganizationId(), pspId, flowName); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateCreateFlowRequest(configData, pspId, flowName, request); + + // check if there is already another unpublished flow that is in progress + FdrFlowEntity publishingFlow = flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + if (publishingFlow != null) { + throw new AppException( + AppErrorCodeMessageEnum.REPORTING_FLOW_ALREADY_EXIST, + flowName, + publishingFlow.getStatus()); + } + + // retrieve the last published flow, in order to take its revision and increment it + FdrFlowEntity lastPublishedFlow = flowRepository.findPublishedByPspIdAndName(pspId, flowName); + Long revision = lastPublishedFlow != null ? (lastPublishedFlow.getRevision() + 1) : 1L; + + // finally, persist the newly generated entity + FdrFlowEntity entity = flowMapper.toEntity(request, revision); + this.flowRepository.createEntity(entity); + + /* + reService.sendEvent( + ReInternal.builder() + .serviceIdentifier(AppVersionEnum.FDR003).created(Instant.now()) + .sessionId(sessionId).eventType(EventTypeEnum.INTERNAL).fdrPhysicalDelete(false) + .fdrStatus(it.gov.pagopa.fdr.service.re.model.FdrStatusEnum.CREATED) + .flowRead(false).fdr(fdr).pspId(pspId).organizationId(ecId) + .revision(revision).fdrAction(FdrActionEnum.CREATE_FLOW).build()); + */ + + return GenericResponse.builder().message(String.format("Fdr [%s] saved", flowName)).build(); + } + + @WithSpan(kind = SERVER) + public GenericResponse publishFlow(String pspId, String flowName, boolean isInternalCall) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, pspId); + */ + + log.debugf("Publishing existing flows by pspId [%s], flowName [%s]", pspId, flowName); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateOnlyFlowFilters(configData, pspId, flowName); + + // check if there is an unpublished flow that is in progress + FdrFlowEntity publishingFlow = flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + if (publishingFlow == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + if (publishingFlow.getStatus() != FlowStatusEnum.INSERTED) { + throw new AppException( + AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION, + flowName, + publishingFlow.getStatus()); + } + + // check if retrieved flow can be published + SemanticValidator.validatePublishingFlow(publishingFlow); + + // update the publishing flow in order to set its status to PUBLISHED + Instant now = Instant.now(); + publishingFlow.setUpdated(now); + publishingFlow.setPublished(now); + publishingFlow.setStatus(FlowStatusEnum.PUBLISHED); + this.flowRepository.updateEntity(publishingFlow); + + // TODO do this in transactional way + // FdrFlowToHistoryEntity flowToHistoryEntity = flowMapper.toEntity(publishingFlow, + // isInternalCall); + // this.flowToHistoryRepository.createEntity(flowToHistoryEntity); + + return GenericResponse.builder().message(String.format("Fdr [%s] published", flowName)).build(); + } + + @WithSpan(kind = SERVER) + public GenericResponse deleteExistingFlow(String pspId, String flowName) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, pspId); + */ + + log.debugf("Deleting existing flows by pspId [%s], flowName [%s]", pspId, flowName); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateOnlyFlowFilters(configData, pspId, flowName); + + // check if there is already another unpublished flow that is in progress + FdrFlowEntity publishingFlow = flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + if (publishingFlow == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + // delete flow and if there are multiple payments related to it yet, delete them in async mode + this.flowRepository.deleteEntity(publishingFlow); + deleteFlowPaymentsInAsync(publishingFlow.id); + + return GenericResponse.builder().message(String.format("Fdr [%s] deleted", flowName)).build(); + } + + private void deleteFlowPaymentsInAsync(ObjectId flowObjectId) { + CompletableFuture.supplyAsync( + () -> { + try { + log.infof( + "Asynchronously deleting payments related to flow with id [%s]", flowObjectId); + long deletedPayments = this.paymentRepository.deleteByFlowObjectId(flowObjectId); + log.debugf("Deleted existing flows and all [%s] related payments", deletedPayments); + } catch (PersistenceFailureException e) { + log.error( + String.format( + "Deleted existing flows but not all related payments were deleted. If the" + + " deletion is required, you can find them searching by fdr_ref.id = [%s]." + + " Error cause: ", + flowObjectId), + e); + } + return null; + }); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/HealthCheckService.java b/src/main/java/it/gov/pagopa/fdr/service/HealthCheckService.java new file mode 100644 index 00000000..de8106d5 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/HealthCheckService.java @@ -0,0 +1,30 @@ +package it.gov.pagopa.fdr.service; + +import it.gov.pagopa.fdr.controller.model.common.response.InfoResponse; +import it.gov.pagopa.fdr.util.logging.AppMessageUtil; +import jakarta.enterprise.context.ApplicationScoped; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +@ApplicationScoped +public class HealthCheckService { + + @ConfigProperty(name = "app.name", defaultValue = "app") + String name; + + @ConfigProperty(name = "app.version", defaultValue = "0.0.0") + String version; + + @ConfigProperty(name = "app.environment", defaultValue = "local") + String environment; + + public InfoResponse getHealthInfo() { + + // Generate Health check response + return InfoResponse.builder() + .name(name) + .version(version) + .environment(environment) + .description(AppMessageUtil.getMessage("app.description")) + .build(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java b/src/main/java/it/gov/pagopa/fdr/service/HistoryService.java similarity index 87% rename from src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java rename to src/main/java/it/gov/pagopa/fdr/service/HistoryService.java index 941086a3..cc0b61f1 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/history/HistoryService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/HistoryService.java @@ -1,44 +1,13 @@ -package it.gov.pagopa.fdr.service.history; +package it.gov.pagopa.fdr.service; -import com.azure.core.util.BinaryData; -import com.azure.data.tables.TableClient; -import com.azure.data.tables.TableServiceClient; -import com.azure.data.tables.TableServiceClientBuilder; -import com.azure.data.tables.models.TableEntity; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.azure.storage.blob.BlobServiceClientBuilder; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.networknt.schema.JsonSchema; -import com.networknt.schema.JsonSchemaFactory; -import com.networknt.schema.SpecVersion; -import com.networknt.schema.ValidationMessage; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import it.gov.pagopa.fdr.service.history.constants.HistoryConstants; -import it.gov.pagopa.fdr.service.history.mapper.HistoryServiceMapper; -import it.gov.pagopa.fdr.service.history.model.FdrHistoryEntity; -import it.gov.pagopa.fdr.service.history.model.FdrHistoryPaymentEntity; -import it.gov.pagopa.fdr.service.history.model.HistoryBlobBody; -import it.gov.pagopa.fdr.service.history.model.JsonSchemaVersionEnum; -import it.gov.pagopa.fdr.util.FileUtil; -import it.gov.pagopa.fdr.util.StringUtil; import jakarta.enterprise.context.ApplicationScoped; -import java.io.IOException; -import java.time.Instant; -import java.util.*; -import java.util.stream.Collectors; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.jboss.logging.Logger; @ApplicationScoped public class HistoryService { + + // TODO to be refactored when historicization cron will be defined + + /* private final HistoryServiceMapper mapper; private final Logger logger; private final ObjectMapper objMapper; @@ -291,4 +260,5 @@ private void saveFdrPaymentsOnTableStorage( tableClient.createEntity(entity); }); } + */ } diff --git a/src/main/java/it/gov/pagopa/fdr/service/PaymentService.java b/src/main/java/it/gov/pagopa/fdr/service/PaymentService.java new file mode 100644 index 00000000..08decef1 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/PaymentService.java @@ -0,0 +1,380 @@ +package it.gov.pagopa.fdr.service; + +import static io.opentelemetry.api.trace.SpanKind.SERVER; + +import io.opentelemetry.instrumentation.annotations.WithSpan; +import it.gov.pagopa.fdr.Config; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.repository.FdrFlowRepository; +import it.gov.pagopa.fdr.repository.FdrPaymentRepository; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.entity.flow.projection.FdrFlowIdProjection; +import it.gov.pagopa.fdr.repository.entity.payment.FdrPaymentEntity; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import it.gov.pagopa.fdr.service.middleware.mapper.PaymentMapper; +import it.gov.pagopa.fdr.service.middleware.validator.SemanticValidator; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; +import it.gov.pagopa.fdr.util.error.exception.persistence.TransactionRollbackException; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Instant; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.jboss.logging.Logger; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; + +@ApplicationScoped +public class PaymentService { + + private final Logger log; + + private final Config cachedConfig; + + private final FdrFlowRepository flowRepository; + + private final FdrPaymentRepository paymentRepository; + + private final PaymentMapper paymentMapper; + + public PaymentService( + Logger log, + Config cachedConfig, + FdrFlowRepository flowRepository, + FdrPaymentRepository paymentRepository, + PaymentMapper paymentMapper) { + + this.log = log; + this.cachedConfig = cachedConfig; + this.flowRepository = flowRepository; + this.paymentRepository = paymentRepository; + this.paymentMapper = paymentMapper; + } + + @WithSpan(kind = SERVER) + public PaginatedPaymentsResponse getPaymentsFromPublishedFlow(FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(ORGANIZATION_ID, organizationId); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, psp); + */ + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + String flowName = args.getFlowName(); + long revision = args.getRevision(); + long pageNumber = args.getPageNumber(); + long pageSize = args.getPageSize(); + + log.debugf( + "Executing query on payments related on published flow by organizationId [%s], pspId [%s]," + + " flowName [%s], revision:[%s]", + organizationId, pspId, flowName, revision); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetSingleFlowFilters(configData, args); + + FdrFlowIdProjection flowIdProjection = + this.flowRepository.findIdByOrganizationIdAndPspIdAndNameAndRevision( + organizationId, pspId, flowName, revision, FlowStatusEnum.PUBLISHED); + if (flowIdProjection == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + RepositoryPagedResult paginatedResult = + this.paymentRepository.findByFlowObjectId( + flowIdProjection.getId(), (int) pageNumber, (int) pageSize); + + return paymentMapper.toPaginatedPaymentsResponse(paginatedResult, pageSize, pageNumber); + } + + @WithSpan(kind = SERVER) + public PaginatedPaymentsResponse getPaymentsFromUnpublishedFlow(FindFlowsByFiltersArgs args) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(ORGANIZATION_ID, organizationId); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, psp); + */ + + String organizationId = args.getOrganizationId(); + String pspId = args.getPspId(); + String flowName = args.getFlowName(); + long pageNumber = args.getPageNumber(); + long pageSize = args.getPageSize(); + + log.debugf( + "Executing query on payments related on unpublished flow by organizationId [%s], pspId" + + " [%s], flowName [%s]", + organizationId, pspId, flowName); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateGetSingleFlowFilters(configData, args); + + FdrFlowIdProjection flowIdProjection = + this.flowRepository.findUnpublishedIdByPspIdAndNameAndOrganization( + pspId, flowName, organizationId); + if (flowIdProjection == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + RepositoryPagedResult paginatedResult = + this.paymentRepository.findByFlowObjectId( + flowIdProjection.getId(), (int) pageNumber, (int) pageSize); + + return paymentMapper.toPaginatedPaymentsResponse(paginatedResult, pageSize, pageNumber); + } + + @WithSpan(kind = SERVER) + public GenericResponse addPaymentToExistingFlow( + String pspId, String flowName, AddPaymentRequest request) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, pspId); + */ + + log.debugf( + "Adding [%s] new payments on flow [%s], pspId [%s]", + request.getPayments().size(), flowName, pspId); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateAddPaymentRequest(configData, pspId, flowName, request); + + // check if there is an unpublished flow on which is possible to add payments + FdrFlowEntity publishingFlow = flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + if (publishingFlow == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + + // check if there is any payment that uses at least one of passed indexes + List paymentsToAdd = request.getPayments(); + Set indexes = paymentsToAdd.stream().map(Payment::getIndex).collect(Collectors.toSet()); + long numberOfAlreadyUsedIndexes = + paymentRepository.countByFlowObjectIdAndIndexes(publishingFlow.id, indexes); + if (numberOfAlreadyUsedIndexes > 0) { + throw new AppException( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX, flowName); + } + + // create all entities in batch, from each payment to be added, in transactional way + Instant now = Instant.now(); + List paymentEntities = + paymentMapper.toEntity(publishingFlow, paymentsToAdd, now); + addPaymentToExistingFlowInTransaction(publishingFlow, paymentEntities, now); + + /* + String sessionId = org.slf4j.MDC.get(TRX_ID); + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + reService.sendEvent( + ReInternal.builder() + .serviceIdentifier(AppVersionEnum.FDR003).created(Instant.now()).sessionId(sessionId) + .eventType(EventTypeEnum.INTERNAL).fdrPhysicalDelete(false) + .fdrStatus(it.gov.pagopa.fdr.service.re.model.FdrStatusEnum.INSERTED).flowRead(false) + .fdr(fdr).pspId(pspId).organizationId(fdrEntity.getReceiver().getOrganizationId()) + .revision(fdrEntity.getRevision()).fdrAction(FdrActionEnum.ADD_PAYMENT).build()); + } + */ + + return GenericResponse.builder() + .message(String.format("Fdr [%s] payment added", flowName)) + .build(); + } + + @WithSpan(kind = SERVER) + public GenericResponse deletePaymentFromExistingFlow( + String pspId, String flowName, DeletePaymentRequest request) { + + /* + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + String action = (String) MDC.get(ACTION); + MDC.put(FDR, fdr); + MDC.put(PSP_ID, pspId); + */ + + log.debugf( + "Deleting [%s] payments on flow [%s], pspId [%s]", + request.getIndexList().size(), flowName, pspId); + + ConfigDataV1 configData = cachedConfig.getClonedCache(); + SemanticValidator.validateDeletePaymentRequest(configData, pspId, flowName, request); + + // check if there is an unpublished flow on which is possible to add payments + FdrFlowEntity publishingFlow = + this.flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + if (publishingFlow == null) { + throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, flowName); + } + if (publishingFlow.getStatus() != FlowStatusEnum.INSERTED) { + throw new AppException( + AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION, + flowName, + publishingFlow.getStatus()); + } + + // check if each passed index refers to an existing payment + Set indexes = new HashSet<>(request.getIndexList()); + List paymentEntities = + this.paymentRepository.findByFlowObjectIdAndIndexes(publishingFlow.id, indexes); + boolean containsAllIndexes = + paymentEntities.stream() + .map(FdrPaymentEntity::getIndex) + .collect(Collectors.toSet()) + .containsAll(indexes); + if (!containsAllIndexes) { + throw new AppException( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX, flowName); + } + + // create all entities in batch, from each payment to be added, in transactional way + Instant now = Instant.now(); + deletePaymentToExistingFlowInTransaction(publishingFlow, paymentEntities, now); + + /* + String sessionId = org.slf4j.MDC.get(TRX_ID); + MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); + reService.sendEvent( + ReInternal.builder() + .serviceIdentifier(AppVersionEnum.FDR003).created(Instant.now()).sessionId(sessionId) + .eventType(EventTypeEnum.INTERNAL).fdrPhysicalDelete(false) + .fdrStatus( + FlowStatusEnum.INSERTED == status + ? it.gov.pagopa.fdr.service.re.model.FdrStatusEnum.INSERTED + : it.gov.pagopa.fdr.service.re.model.FdrStatusEnum.CREATED) + .flowRead(false).fdr(fdr).pspId(pspId).organizationId(fdrEntity.getReceiver().getOrganizationId()) + .revision(fdrEntity.getRevision()).fdrAction(FdrActionEnum.DELETE_PAYMENT).build()); + */ + + return GenericResponse.builder() + .message(String.format("Fdr [%s] payment deleted", flowName)) + .build(); + } + + private void addPaymentToExistingFlowInTransaction( + FdrFlowEntity publishingFlow, List paymentEntities, Instant now) + throws TransactionRollbackException { + + // making a backup of previous data, to be used for rollback operation + Instant oldUpdateDate = Instant.from(publishingFlow.getUpdated()); + FlowStatusEnum oldStatus = FlowStatusEnum.valueOf(publishingFlow.getStatus().name()); + + // generate quantity to add on computed values + int paymentsToAdd = paymentEntities.size(); + double amountToAdd = paymentEntities.stream().mapToDouble(FdrPaymentEntity::getAmount).sum(); + + // finally, update referenced flow: increment counters about computed total payments and + // their total sum, define last update time and change status if needed + publishingFlow.addOnComputedTotPayments(paymentsToAdd); + publishingFlow.addOnComputedTotAmount(amountToAdd); + publishingFlow.setUpdated(now); + publishingFlow.setStatus(FlowStatusEnum.INSERTED); + flowRepository.updateEntity(publishingFlow); + + // try to persist payments using a transaction: if it does not end successfully, it throws an + // accepted Exception that will cause a compensation operation in order to execute the + // rollback. + try { + + paymentRepository.createEntityInTransaction(paymentEntities); + + } catch (TransactionRollbackException e) { + + String pspId = publishingFlow.getSender().getPspId(); + String flowName = publishingFlow.getName(); + compensateFlowChanges(pspId, flowName, paymentsToAdd, amountToAdd, oldUpdateDate, oldStatus); + throw e; + } + } + + private void deletePaymentToExistingFlowInTransaction( + FdrFlowEntity publishingFlow, List paymentEntities, Instant now) + throws TransactionRollbackException { + + // making a backup of previous data, to be used for rollback operation + Instant oldUpdateDate = Instant.from(publishingFlow.getUpdated()); + FlowStatusEnum oldStatus = FlowStatusEnum.valueOf(publishingFlow.getStatus().name()); + + // generate quantity to subtract on computed values (evaluated as negative value) + int paymentsToAdd = -1 * paymentEntities.size(); + double amountToAdd = + -1 * paymentEntities.stream().mapToDouble(FdrPaymentEntity::getAmount).sum(); + + // finally, update referenced flow: increment counters about computed total payments and + // their total sum, define last update time and change status if needed + publishingFlow.addOnComputedTotPayments(paymentsToAdd); + publishingFlow.addOnComputedTotAmount(amountToAdd); + publishingFlow.setUpdated(now); + publishingFlow.setStatus( + publishingFlow.getComputedTotPayments() > 0 + ? FlowStatusEnum.INSERTED + : FlowStatusEnum.CREATED); + flowRepository.updateEntity(publishingFlow); + + // try to delete payments using a transaction: if it does not end successfully, it throws an + // accepted Exception that will cause a compensation operation in order to execute the + // rollback. + try { + + paymentRepository.deleteEntityInTransaction(paymentEntities); + + } catch (TransactionRollbackException e) { + + String pspId = publishingFlow.getSender().getPspId(); + String flowName = publishingFlow.getName(); + compensateFlowChanges(pspId, flowName, paymentsToAdd, amountToAdd, oldUpdateDate, oldStatus); + throw e; + } + } + + /** + * ... Due to impossibility to operate a multi-collection transaction on CosmosDB with MongoDB + * APIs, the 'rollback' on FdrFlowEntity must be executed with a compensation operation, on which + * the changed fields are subtracted with previously added values + * + * @param pspId + * @param flowName + * @param paymentsCountAdded + * @param amountAdded + * @param oldUpdateDate + * @param oldStatus + */ + private void compensateFlowChanges( + String pspId, + String flowName, + int paymentsCountAdded, + double amountAdded, + Instant oldUpdateDate, + FlowStatusEnum oldStatus) { + + // search current value of the flow + FdrFlowEntity publishingFlowToCompensate = + flowRepository.findUnpublishedByPspIdAndName(pspId, flowName); + + // update flow computed amounts + publishingFlowToCompensate.addOnComputedTotPayments(-1 * paymentsCountAdded); + publishingFlowToCompensate.addOnComputedTotAmount(-1 * amountAdded); + + // update flow status + if (oldUpdateDate.isBefore(publishingFlowToCompensate.getUpdated())) { + publishingFlowToCompensate.setUpdated(oldUpdateDate); + publishingFlowToCompensate.setStatus(oldStatus); + } + + // finally, update it + flowRepository.updateEntity(publishingFlowToCompensate); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/ReService.java b/src/main/java/it/gov/pagopa/fdr/service/ReService.java similarity index 79% rename from src/main/java/it/gov/pagopa/fdr/service/re/ReService.java rename to src/main/java/it/gov/pagopa/fdr/service/ReService.java index f9c688b2..2fcdd870 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/ReService.java +++ b/src/main/java/it/gov/pagopa/fdr/service/ReService.java @@ -1,36 +1,11 @@ -package it.gov.pagopa.fdr.service.re; - -import com.azure.core.util.BinaryData; -import com.azure.messaging.eventhubs.EventData; -import com.azure.messaging.eventhubs.EventDataBatch; -import com.azure.messaging.eventhubs.EventHubClientBuilder; -import com.azure.messaging.eventhubs.EventHubProducerClient; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.azure.storage.blob.BlobServiceClientBuilder; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.service.re.model.BlobHttpBody; -import it.gov.pagopa.fdr.service.re.model.ReAbstract; -import it.gov.pagopa.fdr.service.re.model.ReInterface; -import it.gov.pagopa.fdr.util.AppConstant; -import it.gov.pagopa.fdr.util.StringUtil; +package it.gov.pagopa.fdr.service; + import jakarta.enterprise.context.ApplicationScoped; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.List; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.jboss.logging.Logger; @ApplicationScoped public class ReService { + /* private final Logger log; @ConfigProperty(name = "ehub.re.connect-str") @@ -160,4 +135,5 @@ public void publishEvents(List allEvents) { producer.send(eventDataBatch); } } + */ } diff --git a/src/main/java/it/gov/pagopa/fdr/service/TechnicalSupportService.java b/src/main/java/it/gov/pagopa/fdr/service/TechnicalSupportService.java new file mode 100644 index 00000000..c51906ca --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/TechnicalSupportService.java @@ -0,0 +1,70 @@ +package it.gov.pagopa.fdr.service; + +import static io.opentelemetry.api.trace.SpanKind.SERVER; + +import io.opentelemetry.instrumentation.annotations.WithSpan; +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsBySenderAndReceiverResponse; +import it.gov.pagopa.fdr.repository.FdrPaymentRepository; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.entity.payment.FdrPaymentEntity; +import it.gov.pagopa.fdr.service.middleware.mapper.TechnicalSupportMapper; +import it.gov.pagopa.fdr.service.model.arguments.FindPaymentsByFiltersArgs; +import jakarta.enterprise.context.ApplicationScoped; +import java.time.Instant; +import org.jboss.logging.Logger; + +@ApplicationScoped +public class TechnicalSupportService { + + private final FdrPaymentRepository paymentRepository; + + private final TechnicalSupportMapper mapper; + + private final Logger log; + + public TechnicalSupportService( + TechnicalSupportMapper mapper, FdrPaymentRepository paymentRepository, Logger log) { + + this.mapper = mapper; + this.paymentRepository = paymentRepository; + this.log = log; + } + + @WithSpan(kind = SERVER) + public PaginatedFlowsBySenderAndReceiverResponse findPaymentsByFilters( + FindPaymentsByFiltersArgs args) { + + // Extracting field data from argument object + String pspId = args.getPspId(); + String iuv = args.getIuv(); + String iur = args.getIur(); + int pageNumber = (int) args.getPageNumber(); + int pageSize = (int) args.getPageSize(); + Instant createdFrom = args.getCreatedFrom(); + Instant createdTo = args.getCreatedTo(); + + // Executing query with passed fields as filters + log.debugf( + "Executing query by: pspId [%s], iuv [%s], iur [%s], createdFrom: [%s], createdTo: [%s]", + pspId, iuv, iur, createdFrom, createdTo); + RepositoryPagedResult result = + paymentRepository.executeQueryByPspAndIuvAndIur( + pspId, iuv, iur, createdFrom, createdTo, pageNumber, pageSize); + log.debugf( + "Found [%s] entities in [%s] pages. Mapping data to final response.", + result.getTotalElements(), result.getTotalPages()); + + // Finally, map found element in the final response + return PaginatedFlowsBySenderAndReceiverResponse.builder() + .metadata( + Metadata.builder() + .pageSize(pageSize) + .pageNumber(pageNumber) + .totPage(result.getTotalPages()) + .build()) + .count(result.getTotalElements()) + .data(mapper.toFlowBySenderAndReceiver(result.getData())) + .build(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/conversion/ConversionService.java b/src/main/java/it/gov/pagopa/fdr/service/conversion/ConversionService.java deleted file mode 100644 index 23674d6d..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/conversion/ConversionService.java +++ /dev/null @@ -1,66 +0,0 @@ -package it.gov.pagopa.fdr.service.conversion; - -import com.azure.core.util.BinaryData; -import com.azure.storage.queue.QueueClient; -import com.azure.storage.queue.QueueClientBuilder; -import com.azure.storage.queue.QueueMessageEncoding; -import com.fasterxml.jackson.databind.ObjectMapper; -import it.gov.pagopa.fdr.service.conversion.message.FdrMessage; -import jakarta.enterprise.context.ApplicationScoped; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import lombok.SneakyThrows; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.jboss.logging.Logger; - -@ApplicationScoped -public class ConversionService { - - @ConfigProperty(name = "queue.conversion.connect-str") - String connectStr; - - @ConfigProperty(name = "queue.conversion.name") - String queueName; - - private final Logger log; - - private QueueClient queue; - - private final ObjectMapper objectMapper; - - public ConversionService(Logger log, ObjectMapper objectMapper) { - this.log = log; - this.objectMapper = objectMapper; - } - - @SneakyThrows - public void init() { - QueueClient queueClient = - new QueueClientBuilder() - .connectionString(connectStr) - .queueName(queueName) - .messageEncoding(QueueMessageEncoding.BASE64) - .buildClient(); - queueClient.createIfNotExists(); - - log.infof("Queue conversion init. Queue name [%s]", queueName); - this.queue = queueClient; - } - - @SneakyThrows - public void addQueueFlowMessage(FdrMessage fdrMessage) { - if (this.queue == null) { - log.debugf( - "Queue conversion NOT INITIALIZED. Queue name [%s], pspId [%s], fdr [%s] NOT SENDED", - queueName, fdrMessage.getPspId(), fdrMessage.getFdr()); - } else { - log.infof( - "Send message. Queue name [%s], pspId [%s], fdr [%s]", - queueName, fdrMessage.getPspId(), fdrMessage.getFdr()); - String rawString = objectMapper.writeValueAsString(fdrMessage); - String b64String = - Base64.getEncoder().encodeToString(rawString.getBytes(StandardCharsets.UTF_8)); - this.queue.sendMessage(BinaryData.fromString(b64String)); - } - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/conversion/message/FdrMessage.java b/src/main/java/it/gov/pagopa/fdr/service/conversion/message/FdrMessage.java deleted file mode 100644 index 452b1f54..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/conversion/message/FdrMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.gov.pagopa.fdr.service.conversion.message; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrMessage { - - private String fdr; - - private String pspId; - - private String organizationId; - - private Long retry; - - private Long revision; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/AddPaymentDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/AddPaymentDto.java deleted file mode 100644 index f89c9196..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/AddPaymentDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -public class AddPaymentDto { - - private List payments; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/DeletePaymentDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/DeletePaymentDto.java deleted file mode 100644 index 9baf369a..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/DeletePaymentDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Getter; -import lombok.experimental.SuperBuilder; - -@Getter -@SuperBuilder -public class DeletePaymentDto { - - private List indexList; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllCreatedDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllCreatedDto.java deleted file mode 100644 index 056202bf..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllCreatedDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrAllCreatedDto { - - private MetadataDto metadata; - - private Long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllDto.java deleted file mode 100644 index 943238ff..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrAllDto { - - private MetadataDto metadata; - - private Long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllPublishedDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllPublishedDto.java deleted file mode 100644 index fea9e316..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrAllPublishedDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrAllPublishedDto { - - private MetadataDto metadata; - - private Long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrDto.java deleted file mode 100644 index f59e30f2..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrDto.java +++ /dev/null @@ -1,28 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrDto { - - private String fdr; - - private Instant fdrDate; - - private SenderDto sender; - - private ReceiverDto receiver; - - private String regulation; - - private Instant regulationDate; - - private String bicCodePouringBank; - - private Long totPayments; - - private Double sumPayments; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetCreatedDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetCreatedDto.java deleted file mode 100644 index cd9d5c3f..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetCreatedDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrGetCreatedDto { - - private Long revision; - - private Instant created; - - private Instant updated; - - private FdrStatusEnumDto status; - - private String fdr; - - private Instant fdrDate; - - private SenderDto sender; - - private ReceiverDto receiver; - - private String regulation; - - private Instant regulationDate; - - private String bicCodePouringBank; - - private Long computedTotPayments; - - private Double computedSumPayments; - - private Long totPayments; - - private Double sumPayments; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetDto.java deleted file mode 100644 index a2ba9822..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetDto.java +++ /dev/null @@ -1,42 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrGetDto { - - private Long revision; - - private Instant created; - - private Instant updated; - - private Instant published; - - private FdrStatusEnumDto status; - - private String fdr; - - private Instant fdrDate; - - private SenderDto sender; - - private ReceiverDto receiver; - - private String regulation; - - private Instant regulationDate; - - private String bicCodePouringBank; - - private Long computedTotPayments; - - private Double computedSumPayments; - - private Long totPayments; - - private Double sumPayments; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetPaymentDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetPaymentDto.java deleted file mode 100644 index a2f296bc..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrGetPaymentDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrGetPaymentDto { - - private MetadataDto metadata; - - private Long count; - - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleCreatedDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleCreatedDto.java deleted file mode 100644 index e47516fd..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleCreatedDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrSimpleCreatedDto { - - private String fdr; - - private String organizationId; - - private Long revision; - - private Instant created; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleDto.java deleted file mode 100644 index f92e709b..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimpleDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrSimpleDto { - - private String fdr; - - private String pspId; - - private Long revision; - - private Instant published; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimplePublishedDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimplePublishedDto.java deleted file mode 100644 index a3de7f27..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrSimplePublishedDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class FdrSimplePublishedDto { - - private String fdr; - - private String organizationId; - - private Long revision; - - private Instant published; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrStatusEnumDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/FdrStatusEnumDto.java deleted file mode 100644 index 3b362c56..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/FdrStatusEnumDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -public enum FdrStatusEnumDto { - CREATED, - INSERTED, - PUBLISHED -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/MetadataDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/MetadataDto.java deleted file mode 100644 index 6f01988c..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/MetadataDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class MetadataDto { - - private long pageSize; - - private long pageNumber; - - private long totPage; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentByPspIdIuvIurDTO.java b/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentByPspIdIuvIurDTO.java deleted file mode 100644 index 52c0393d..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentByPspIdIuvIurDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class PaymentByPspIdIuvIurDTO { - private String pspId; - private String organizationId; - private String fdr; - private Long revision; - private Instant created; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentDto.java deleted file mode 100644 index ca42bc85..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.time.Instant; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class PaymentDto { - - private Long index; - - private String iuv; - - private String iur; - - private Long idTransfer; - - private Double pay; - - private PaymentStatusEnumDto payStatus; - - private Instant payDate; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentGetByPspIdIuvIurDTO.java b/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentGetByPspIdIuvIurDTO.java deleted file mode 100644 index d7dd4169..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentGetByPspIdIuvIurDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class PaymentGetByPspIdIuvIurDTO { - private MetadataDto metadata; - private Long count; - private List data; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentStatusEnumDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentStatusEnumDto.java deleted file mode 100644 index 673fc70c..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/PaymentStatusEnumDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -public enum PaymentStatusEnumDto { - EXECUTED, - REVOKED, - NO_RPT, - STAND_IN, - STAND_IN_NO_RPT; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/ReceiverDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/ReceiverDto.java deleted file mode 100644 index 28f0c7f1..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/ReceiverDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class ReceiverDto { - - private String id; - - private String organizationId; - - private String organizationName; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/SenderDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/SenderDto.java deleted file mode 100644 index fb8f6eab..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/SenderDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class SenderDto { - - private SenderTypeEnumDto type; - - private String id; - - private String pspId; - - private String pspName; - - private String pspBrokerId; - - private String channelId; - - private String password; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/dto/SenderTypeEnumDto.java b/src/main/java/it/gov/pagopa/fdr/service/dto/SenderTypeEnumDto.java deleted file mode 100644 index dce5024e..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/dto/SenderTypeEnumDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.gov.pagopa.fdr.service.dto; - -public enum SenderTypeEnumDto { - LEGAL_PERSON, - ABI_CODE, - BIC_CODE -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/constants/HistoryConstants.java b/src/main/java/it/gov/pagopa/fdr/service/history/constants/HistoryConstants.java deleted file mode 100644 index e2375db7..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/history/constants/HistoryConstants.java +++ /dev/null @@ -1,55 +0,0 @@ -package it.gov.pagopa.fdr.service.history.constants; - -public class HistoryConstants { - private HistoryConstants() { - throw new IllegalStateException("Utility Class"); - } - - public static final String FDR_PUBLISH_ID = "id"; - public static final String FDR_PUBLISH_REVISION = "revision"; - public static final String FDR_PUBLISH_CREATED = "created"; - public static final String FDR_PUBLISH_UPDATED = "updated"; - public static final String FDR_PUBLISH_PUBLISHED = "published"; - public static final String FDR_PUBLISH_FDR = "fdr"; - public static final String FDR_PUBLISH_FDR_DATE = "fdr_date"; - public static final String FDR_PUBLISH_FDR_REF_JSON_CONTAINER_NAME = "jsonref_container_name"; - public static final String FDR_PUBLISH_FDR_REF_JSON_FILE_LENGTH = "jsonref_file_length"; - public static final String FDR_PUBLISH_FDR_REF_JSON_FILE_NAME = "jsonref_file_name"; - public static final String FDR_PUBLISH_FDR_REF_JSON_STORAGE_ACCOUNT = "jsonref_storage_account"; - public static final String FDR_PUBLISH_FDR_REF_JSON_JSON_SCHEMA_VERSION = - "jsonref_json_schema_version"; - public static final String FDR_PUBLISH_SENDER_TYPE = "sender_type"; - public static final String FDR_PUBLISH_SENDER_ID = "sender_id"; - public static final String FDR_PUBLISH_SENDER_PSP_ID = "sender_psp_id"; - public static final String FDR_PUBLISH_SENDER_PSP_NAME = "sender_psp_name"; - public static final String FDR_PUBLISH_SENDER_PSP_BROKER_ID = "sender_psp_broker_id"; - public static final String FDR_PUBLISH_SENDER_CHANNEL_ID = "sender_channel_id"; - public static final String FDR_PUBLISH_SENDER_PASSWORD = "sender_password"; - public static final String FDR_PUBLISH_RECEIVER_ID = "receiver_id"; - public static final String FDR_PUBLISH_RECEIVER_ORGANIZATION_ID = "receiver_organization_id"; - public static final String FDR_PUBLISH_RECEIVER_ORGANIZATION_NAME = "receiver_organization_name"; - public static final String FDR_PUBLISH_REGULATION = "regulation"; - public static final String FDR_PUBLISH_REGULATION_DATE = "regulation_date"; - public static final String FDR_PUBLISH_BIC_CODE_POURING_BANK = "bic_code_pouring_bank"; - public static final String FDR_PUBLISH_STATUS = "status"; - public static final String FDR_PUBLISH_COMPUTED_TOT_PAYMENTS = "computed_tot_payments"; - public static final String FDR_PUBLISH_COMPUTED_SUM_PAYMENTS = "computed_sum_payments"; - public static final String FDR_PUBLISH_TOT_PAYMENTS = "tot_payments"; - public static final String FDR_PUBLISH_SUM_PAYMENTS = "sum_payments"; - public static final String FDR_PAYMENT_PUBLISH_ID = "id"; - public static final String FDR_PAYMENT_PUBLISH_REVISION = "revision"; - public static final String FDR_PAYMENT_PUBLISH_CREATED = "created"; - public static final String FDR_PAYMENT_PUBLISH_UPDATED = "updated"; - public static final String FDR_PAYMENT_PUBLISH_IUV = "iuv"; - public static final String FDR_PAYMENT_PUBLISH_IUR = "iur"; - public static final String FDR_PAYMENT_PUBLISH_INDEX = "index"; - public static final String FDR_PAYMENT_PUBLISH_PAY = "pay"; - public static final String FDR_PAYMENT_PUBLISH_PAY_STATUS = "pay_status"; - public static final String FDR_PAYMENT_PUBLISH_PAY_DATE = "pay_date"; - public static final String FDR_PAYMENT_PUBLISH_REF_FDR_ID = "ref_fdr_id"; - public static final String FDR_PAYMENT_PUBLISH_REF_FDR = "ref_fdr"; - public static final String FDR_PAYMENT_PUBLISH_REF_FDR_SENDER_PSP_ID = "ref_fdr_sender_psp_id"; - public static final String FDR_PAYMENT_PUBLISH_REF_FDR_REVISION = "ref_fdr_revision"; - public static final String FDR_PAYMENT_PUBLISH_REF_FDR_RECEIVER_ORGANIZATION_ID = - "ref_fdr_receiver_organization_id"; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/mapper/HistoryServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/service/history/mapper/HistoryServiceMapper.java deleted file mode 100644 index 45cc34a6..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/history/mapper/HistoryServiceMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.gov.pagopa.fdr.service.history.mapper; - -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import it.gov.pagopa.fdr.service.history.model.FdrHistoryEntity; -import it.gov.pagopa.fdr.service.history.model.FdrHistoryPaymentEntity; -import java.util.List; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface HistoryServiceMapper { - - HistoryServiceMapper INSTANCE = Mappers.getMapper(HistoryServiceMapper.class); - - @Mapping(target = "paymentList", ignore = true) - FdrHistoryEntity toFdrHistoryEntity(FdrPublishEntity fdrEntity); - - FdrHistoryPaymentEntity toFdrHistoryPaymentEntity( - FdrPaymentPublishEntity fdrPaymentPublishEntity); - - List toFdrHistoryPaymentEntityList( - List fdrPaymentPublishEntities); -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryEntity.java b/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryEntity.java deleted file mode 100644 index 9098e997..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryEntity.java +++ /dev/null @@ -1,55 +0,0 @@ -package it.gov.pagopa.fdr.service.history.model; - -import it.gov.pagopa.fdr.repository.fdr.model.FdrStatusEnumEntity; -import it.gov.pagopa.fdr.repository.fdr.model.ReceiverEntity; -import it.gov.pagopa.fdr.repository.fdr.model.SenderEntity; -import java.time.Instant; -import java.util.List; -import lombok.*; -import org.bson.codecs.pojo.annotations.BsonProperty; - -@Data -@Builder -public class FdrHistoryEntity { - - private FdrStatusEnumEntity status; - - private Long revision; - - private Instant created; - - private Instant updated; - - private String fdr; - - @BsonProperty("fdr_date") - private Instant fdrDate; - - private String regulation; - - @BsonProperty("regulation_date") - private Instant regulationDate; - - @BsonProperty("bic_code_pouring_bank") - private String bicCodePouringBank; - - private SenderEntity sender; - - private ReceiverEntity receiver; - - private Instant published; - - @BsonProperty("computed_tot_payments") - private Long computedTotPayments; - - @BsonProperty("computed_sum_payments") - private Double computedSumPayments; - - @BsonProperty("tot_payments") - private Long totPayments; - - @BsonProperty("sum_payments") - private Double sumPayments; - - @Setter private List paymentList; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryPaymentEntity.java b/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryPaymentEntity.java deleted file mode 100644 index 23b58dfc..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/history/model/FdrHistoryPaymentEntity.java +++ /dev/null @@ -1,52 +0,0 @@ -package it.gov.pagopa.fdr.service.history.model; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import it.gov.pagopa.fdr.repository.fdr.model.PaymentStatusEnumEntity; -import java.time.Instant; -import lombok.Data; -import org.bson.codecs.pojo.annotations.BsonProperty; -import org.bson.types.ObjectId; - -@Data -public class FdrHistoryPaymentEntity { - - private String iuv; - - private String iur; - - private Long index; - - private Double pay; - - @JsonIgnore private Long revision; - - @JsonIgnore private Instant created; - - @JsonIgnore private Instant updated; - - @BsonProperty("pay_status") - private PaymentStatusEnumEntity payStatus; - - @BsonProperty("pay_date") - private Instant payDate; - - @JsonIgnore - @BsonProperty("ref_fdr_id") - private ObjectId refFdrId; - - @JsonIgnore - @BsonProperty("ref_fdr") - private String refFdr; - - @JsonIgnore - @BsonProperty("ref_fdr_sender_psp_id") - private String refFdrSenderPspId; - - @JsonIgnore - @BsonProperty("ref_fdr_revision") - private Long refFdrRevision; - - @JsonIgnore - @BsonProperty("ref_fdr_receiver_organization_id") - private String refFdrReceiverOrganizationId; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/history/model/JsonSchemaVersionEnum.java b/src/main/java/it/gov/pagopa/fdr/service/history/model/JsonSchemaVersionEnum.java deleted file mode 100644 index f646a0d0..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/history/model/JsonSchemaVersionEnum.java +++ /dev/null @@ -1,5 +0,0 @@ -package it.gov.pagopa.fdr.service.history.model; - -public enum JsonSchemaVersionEnum { - V1; -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/FlowMapper.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/FlowMapper.java new file mode 100644 index 00000000..e4310fdd --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/FlowMapper.java @@ -0,0 +1,174 @@ +package it.gov.pagopa.fdr.service.middleware.mapper; + +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import it.gov.pagopa.fdr.controller.model.flow.FlowByCICreated; +import it.gov.pagopa.fdr.controller.model.flow.FlowByCIPublished; +import it.gov.pagopa.fdr.controller.model.flow.FlowByPSP; +import it.gov.pagopa.fdr.controller.model.flow.Receiver; +import it.gov.pagopa.fdr.controller.model.flow.Sender; +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsPublishedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.entity.flow.ReceiverEntity; +import it.gov.pagopa.fdr.repository.entity.flow.SenderEntity; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import it.gov.pagopa.fdr.repository.enums.SenderTypeEnum; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants.ComponentModel; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = ComponentModel.JAKARTA) +public interface FlowMapper { + + FlowMapper INSTANCE = Mappers.getMapper(FlowMapper.class); + + default List toFlowByPSP(List list) { + + List converted = new ArrayList<>(); + for (FdrFlowEntity entity : list) { + converted.add( + FlowByPSP.builder() + .fdr(entity.getName()) + .pspId(entity.getSender() != null ? entity.getSender().getPspId() : null) + .revision(entity.getRevision()) + .published(entity.getPublished()) + .build()); + } + return converted; + } + + default List toFlowByCICreated(List list) { + + List converted = new ArrayList<>(); + for (FdrFlowEntity entity : list) { + converted.add( + FlowByCICreated.builder() + .fdr(entity.getName()) + .organizationId( + entity.getReceiver() != null ? entity.getReceiver().getOrganizationId() : null) + .revision(entity.getRevision()) + .created(entity.getCreated()) + .build()); + } + return converted; + } + + default List toFlowByCIPublished(List list) { + + List converted = new ArrayList<>(); + for (FdrFlowEntity entity : list) { + converted.add( + FlowByCIPublished.builder() + .fdr(entity.getName()) + .organizationId( + entity.getReceiver() != null ? entity.getReceiver().getOrganizationId() : null) + .revision(entity.getRevision()) + .published(entity.getPublished()) + .build()); + } + return converted; + } + + default PaginatedFlowsResponse toPaginatedFlowResponse( + RepositoryPagedResult paginatedResult, long pageSize, long pageNumber) { + + return PaginatedFlowsResponse.builder() + .metadata( + Metadata.builder() + .pageSize((int) pageSize) + .pageNumber((int) pageNumber) + .totPage(paginatedResult.getTotalPages()) + .build()) + .count(paginatedResult.getTotalElements()) + .data(toFlowByPSP(paginatedResult.getData())) + .build(); + } + + default PaginatedFlowsCreatedResponse toPaginatedFlowCreatedResponse( + RepositoryPagedResult paginatedResult, long pageSize, long pageNumber) { + + return PaginatedFlowsCreatedResponse.builder() + .metadata( + Metadata.builder() + .pageSize((int) pageSize) + .pageNumber((int) pageNumber) + .totPage(paginatedResult.getTotalPages()) + .build()) + .count(paginatedResult.getTotalElements()) + .data(toFlowByCICreated(paginatedResult.getData())) + .build(); + } + + default PaginatedFlowsPublishedResponse toPaginatedFlowPublishedResponse( + RepositoryPagedResult paginatedResult, long pageSize, long pageNumber) { + + return PaginatedFlowsPublishedResponse.builder() + .metadata( + Metadata.builder() + .pageSize((int) pageSize) + .pageNumber((int) pageNumber) + .totPage(paginatedResult.getTotalPages()) + .build()) + .count(paginatedResult.getTotalElements()) + .data(toFlowByCIPublished(paginatedResult.getData())) + .build(); + } + + @Mapping(source = "name", target = "fdr") + @Mapping(source = "totAmount", target = "sumPayments") + @Mapping(source = "computedTotAmount", target = "computedSumPayments") + SingleFlowResponse toSingleFlowResponse(FdrFlowEntity result); + + @Mapping(source = "name", target = "fdr") + @Mapping(source = "totAmount", target = "sumPayments") + @Mapping(source = "computedTotAmount", target = "computedSumPayments") + SingleFlowCreatedResponse toSingleFlowCreatedResponse(FdrFlowEntity result); + + default FdrFlowEntity toEntity(CreateFlowRequest request, Long revision) { + + Instant now = Instant.now(); + + Sender requestSender = request.getSender(); + SenderEntity sender = new SenderEntity(); + sender.setId(requestSender.getId()); + sender.setType(SenderTypeEnum.valueOf(requestSender.getType().name())); + sender.setPspId(requestSender.getPspId()); + sender.setPspBrokerId(requestSender.getPspBrokerId()); + sender.setChannelId(requestSender.getChannelId()); + sender.setPspName(requestSender.getPspName()); + sender.setPassword(requestSender.getPassword()); + + Receiver requestReceiver = request.getReceiver(); + ReceiverEntity receiver = new ReceiverEntity(); + receiver.setId(requestReceiver.getId()); + receiver.setOrganizationId(requestReceiver.getOrganizationId()); + receiver.setOrganizationName(requestReceiver.getOrganizationName()); + + FdrFlowEntity entity = new FdrFlowEntity(); + entity.setName(request.getFdr()); + entity.setRevision(revision); + entity.setFdrDate(request.getFdrDate()); + entity.setStatus(FlowStatusEnum.CREATED); + entity.setCreated(now); + entity.setUpdated(now); + entity.setTotAmount(request.getSumPayments()); + entity.setTotPayments(request.getTotPayments()); + entity.setComputedTotPayments(0L); + entity.setComputedTotAmount(0.0); + entity.setRegulation(request.getRegulation()); + entity.setRegulationDate(request.getRegulationDate()); + entity.setBicCodePouringBank(request.getBicCodePouringBank()); + entity.setSender(sender); + entity.setReceiver(receiver); + return entity; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/PaymentMapper.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/PaymentMapper.java new file mode 100644 index 00000000..2cf4dfd8 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/PaymentMapper.java @@ -0,0 +1,87 @@ +package it.gov.pagopa.fdr.service.middleware.mapper; + +import it.gov.pagopa.fdr.controller.model.common.Metadata; +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.controller.model.payment.enums.PaymentStatusEnum; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; +import it.gov.pagopa.fdr.repository.common.RepositoryPagedResult; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.entity.payment.FdrPaymentEntity; +import it.gov.pagopa.fdr.repository.entity.payment.ReferencedFdrEntity; +import java.time.Instant; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import org.mapstruct.Mapper; +import org.mapstruct.MappingConstants.ComponentModel; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = ComponentModel.JAKARTA) +public interface PaymentMapper { + + PaymentMapper INSTANCE = Mappers.getMapper(PaymentMapper.class); + + default List toPayment(List list) { + + List converted = new ArrayList<>(); + for (FdrPaymentEntity entity : list) { + converted.add( + Payment.builder() + .index(entity.getIndex()) + .iuv(entity.getIuv()) + .iur(entity.getIur()) + .idTransfer(entity.getTransferId()) + .pay(entity.getAmount()) + .payStatus(PaymentStatusEnum.valueOf(entity.getPayStatus().name())) + .payDate(entity.getPayDate()) + .build()); + } + return converted; + } + + default PaginatedPaymentsResponse toPaginatedPaymentsResponse( + RepositoryPagedResult paginatedResult, long pageSize, long pageNumber) { + + return PaginatedPaymentsResponse.builder() + .metadata( + Metadata.builder() + .pageSize((int) pageSize) + .pageNumber((int) pageNumber) + .totPage(paginatedResult.getTotalPages()) + .build()) + .count(paginatedResult.getTotalElements()) + .data(toPayment(paginatedResult.getData())) + .build(); + } + + default List toEntity( + FdrFlowEntity flowEntity, List payments, Instant operationTime) { + + ReferencedFdrEntity referencedFdrEntity = new ReferencedFdrEntity(); + referencedFdrEntity.setId(flowEntity.id); + referencedFdrEntity.setName(flowEntity.getName()); + referencedFdrEntity.setRevision(flowEntity.getRevision()); + referencedFdrEntity.setSenderPspId(flowEntity.getSender().getPspId()); + referencedFdrEntity.setReceiverOrganizationId(flowEntity.getReceiver().getOrganizationId()); + + List converted = new LinkedList<>(); + for (Payment payment : payments) { + FdrPaymentEntity entity = new FdrPaymentEntity(); + entity.setIuv(payment.getIuv()); + entity.setIur(payment.getIur()); + entity.setIndex(payment.getIndex()); + entity.setAmount(payment.getPay()); + entity.setPayStatus( + it.gov.pagopa.fdr.repository.enums.PaymentStatusEnum.valueOf( + payment.getPayStatus().name())); + entity.setPayDate(payment.getPayDate()); + entity.setTransferId(payment.getIdTransfer()); + entity.setCreated(operationTime); + entity.setUpdated(operationTime); + entity.setRefFdr(referencedFdrEntity); + converted.add(entity); + } + + return converted; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/TechnicalSupportMapper.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/TechnicalSupportMapper.java new file mode 100644 index 00000000..1d50493d --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/mapper/TechnicalSupportMapper.java @@ -0,0 +1,20 @@ +package it.gov.pagopa.fdr.service.middleware.mapper; + +import it.gov.pagopa.fdr.controller.model.flow.FlowBySenderAndReceiver; +import it.gov.pagopa.fdr.repository.entity.payment.FdrPaymentEntity; +import java.util.List; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingConstants.ComponentModel; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = ComponentModel.JAKARTA) +public interface TechnicalSupportMapper { + + TechnicalSupportMapper INSTANCE = Mappers.getMapper(TechnicalSupportMapper.class); + + @Mapping(source = "refFdr.senderPspId", target = "pspId") + @Mapping(source = "refFdr.receiverOrganizationId", target = "organizationId") + @Mapping(source = "refFdr.name", target = "fdr") + List toFlowBySenderAndReceiver(List list); +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/SemanticValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/SemanticValidator.java new file mode 100644 index 00000000..13462cd3 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/SemanticValidator.java @@ -0,0 +1,231 @@ +package it.gov.pagopa.fdr.service.middleware.validator; + +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.service.middleware.validator.clause.BrokerPspValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.ChannelValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.ComputedPaymentsValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.CreditorInstitutionValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.FlowNameFormatValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.PspValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.PublishableStatusValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.request.AddPaymentRequestValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.request.CreateFlowRequestValidator; +import it.gov.pagopa.fdr.service.middleware.validator.clause.request.DeletePaymentRequestValidator; +import it.gov.pagopa.fdr.service.model.arguments.FindFlowsByFiltersArgs; +import it.gov.pagopa.fdr.util.common.StringUtil; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; + +public class SemanticValidator { + + private SemanticValidator() {} + + public static void validateGetSingleFlowFilters( + ConfigDataV1 cachedConfig, FindFlowsByFiltersArgs args) throws AppException { + + // set validation arguments + String pspId = args.getPspId(); + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("creditorInstitutionId", args.getOrganizationId()) + .addArgument("flowName", args.getFlowName()); + + ValidationResult validationResult = + new PspValidator() + .linkTo(new CreditorInstitutionValidator()) + .linkTo(new FlowNameFormatValidator()) + .validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateOnlyFlowFilters( + ConfigDataV1 cachedConfig, String pspId, String flowName) throws AppException { + + // set validation arguments + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("flowName", flowName); + + ValidationResult validationResult = + new PspValidator().linkTo(new FlowNameFormatValidator()).validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateOnlyPspFilters( + ConfigDataV1 cachedConfig, FindFlowsByFiltersArgs args) { + + // set validation arguments + String pspId = args.getPspId(); + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId); + + ValidationResult validationResult = new PspValidator().validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validatePublishingFlow(FdrFlowEntity flow) throws AppException { + + // set validation arguments + ValidationArgs validationArgs = ValidationArgs.newArgs().addArgument("flow", flow); + + ValidationResult validationResult = + new PublishableStatusValidator() + .linkTo(new ComputedPaymentsValidator()) + .validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateGetPaginatedFlowsRequestForOrganizations( + ConfigDataV1 cachedConfig, FindFlowsByFiltersArgs args) throws AppException { + + // set validation arguments + String pspId = args.getPspId(); + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("creditorInstitutionId", args.getOrganizationId()); + + ValidationResult validationResult; + + // if "filter-by-psp" is not passed, exclude from validation + if (StringUtil.isNullOrBlank(pspId)) { + validationResult = new CreditorInstitutionValidator().validate(validationArgs); + } + + // if "filter-by-psp" is passed, include it in validation + else { + validationResult = + new PspValidator().linkTo(new CreditorInstitutionValidator()).validate(validationArgs); + } + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateGetPaginatedFlowsRequestForPsps( + ConfigDataV1 cachedConfig, FindFlowsByFiltersArgs args) throws AppException { + + // set validation arguments + String organizationId = args.getOrganizationId(); + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", args.getPspId()) + .addArgument("creditorInstitutionId", organizationId); + + ValidationResult validationResult; + + // if "filter-by-organization" is not passed, exclude from validation + if (StringUtil.isNullOrBlank(organizationId)) { + validationResult = new PspValidator().validate(validationArgs); + } + + // if "filter-by-organization" is passed, include it in validation + else { + validationResult = + new PspValidator().linkTo(new CreditorInstitutionValidator()).validate(validationArgs); + } + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateCreateFlowRequest( + ConfigDataV1 cachedConfig, String pspId, String flowName, CreateFlowRequest request) + throws AppException { + + // set validation arguments + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("channelId", request.getSender().getChannelId()) + .addArgument("brokerPspId", request.getSender().getPspBrokerId()) + .addArgument("creditorInstitutionId", request.getReceiver().getOrganizationId()) + .addArgument("flowName", flowName) + .addArgument("request", request); + + ValidationResult validationResult = + new PspValidator() + .linkTo(new BrokerPspValidator()) + .linkTo(new ChannelValidator()) + .linkTo(new CreditorInstitutionValidator()) + .linkTo(new FlowNameFormatValidator()) + .linkTo(new CreateFlowRequestValidator()) + .validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateAddPaymentRequest( + ConfigDataV1 cachedConfig, String pspId, String flowName, AddPaymentRequest request) { + + // set validation arguments + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("flowName", flowName) + .addArgument("request", request); + + ValidationResult validationResult = + new PspValidator() + .linkTo(new FlowNameFormatValidator()) + .linkTo(new AddPaymentRequestValidator()) + .validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } + + public static void validateDeletePaymentRequest( + ConfigDataV1 cachedConfig, String pspId, String flowName, DeletePaymentRequest request) { + + // set validation arguments + ValidationArgs validationArgs = + ValidationArgs.newArgs() + .addArgument("configDataV1", cachedConfig) + .addArgument("pspId", pspId) + .addArgument("flowName", flowName) + .addArgument("request", request); + + ValidationResult validationResult = + new PspValidator() + .linkTo(new FlowNameFormatValidator()) + .linkTo(new DeletePaymentRequestValidator()) + .validate(validationArgs); + + if (validationResult.isInvalid()) { + throw new AppException(validationResult.getError(), validationResult.getErrorArgs()); + } + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/BrokerPspValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/BrokerPspValidator.java new file mode 100644 index 00000000..7a8ca0b6 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/BrokerPspValidator.java @@ -0,0 +1,32 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import org.openapi.quarkus.api_config_cache_json.model.BrokerPsp; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; + +public class BrokerPspValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + ConfigDataV1 configData = args.getArgument("configDataV1", ConfigDataV1.class); + String brokerPspId = args.getArgument("brokerPspId", String.class); + + BrokerPsp brokerPsp = configData.getPspBrokers().get(brokerPspId); + + // executing a lookup in cached configuration, check if broker PSP exists + if (brokerPsp == null) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.BROKER_UNKNOWN, brokerPspId); + } + + // executing a lookup in cached configuration, check if broker PSP is enabled + if (brokerPsp.getEnabled() == null || !brokerPsp.getEnabled()) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.BROKER_NOT_ENABLED, brokerPspId); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ChannelValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ChannelValidator.java new file mode 100644 index 00000000..e49ad4da --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ChannelValidator.java @@ -0,0 +1,69 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import java.util.Map; +import org.openapi.quarkus.api_config_cache_json.model.BrokerPsp; +import org.openapi.quarkus.api_config_cache_json.model.Channel; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; +import org.openapi.quarkus.api_config_cache_json.model.PaymentServiceProvider; +import org.openapi.quarkus.api_config_cache_json.model.PspChannelPaymentType; + +public class ChannelValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + ConfigDataV1 configData = args.getArgument("configDataV1", ConfigDataV1.class); + String pspId = args.getArgument("pspId", String.class); + String channelId = args.getArgument("channelId", String.class); + String brokerPspId = args.getArgument("brokerPspId", String.class); + + // executing a lookup in cached configuration, check if channel exists + Channel channel = configData.getChannels().get(channelId); + if (channel == null) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.CHANNEL_UNKNOWN, channelId); + } + + // executing a lookup in cached configuration, check if channel is enabled + if (channel.getEnabled() == null || !channel.getEnabled()) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.CHANNEL_NOT_ENABLED, channelId); + } + + // executing a lookup in cached configuration, check if channel is correctly linked to broker + // PSP + BrokerPsp brokerPsp = configData.getPspBrokers().get(brokerPspId); + String brokerPspCode = brokerPsp.getBrokerPspCode(); + if (channel.getBrokerPspCode() == null || !channel.getBrokerPspCode().equals(brokerPspCode)) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.CHANNEL_BROKER_WRONG_CONFIG, channelId, brokerPspId); + } + + // executing a lookup in cached configuration, check if there is a valid configuration on PSP + // for channel about payment type + PaymentServiceProvider psp = configData.getPsps().get(pspId); + Map paymentTypes = configData.getPspChannelPaymentTypes(); + boolean existsChannelConfiguration = + paymentTypes.entrySet().stream() + .anyMatch(entry -> checkConfigurationOnPaymentType(entry.getValue(), channel, psp)); + if (!existsChannelConfiguration) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.CHANNEL_PSP_WRONG_CONFIG, channelId, pspId); + } + + return this.checkNext(args); + } + + private static boolean checkConfigurationOnPaymentType( + PspChannelPaymentType paymentType, Channel channel, PaymentServiceProvider psp) { + + String channelCode = channel.getChannelCode(); + String pspCode = psp.getPspCode(); + boolean i1 = paymentType.getPspCode() != null && paymentType.getPspCode().equals(pspCode); + boolean i2 = + paymentType.getChannelCode() != null && paymentType.getChannelCode().equals(channelCode); + return i1 && i2; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ComputedPaymentsValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ComputedPaymentsValidator.java new file mode 100644 index 00000000..fb31ebcc --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/ComputedPaymentsValidator.java @@ -0,0 +1,40 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; + +public class ComputedPaymentsValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + FdrFlowEntity flow = args.getArgument("flow", FdrFlowEntity.class); + + // check if computed total payments is equals to pre-set total payments + Long totPayments = flow.getTotPayments(); + Long computedTotPayments = flow.getComputedTotPayments(); + if (!totPayments.equals(computedTotPayments)) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_TOT_PAYMENT, + flow.getName(), + totPayments.toString(), + computedTotPayments.toString()); + } + + // check if computed total amount is equals to pre-set total amount + Double totAmount = flow.getTotAmount(); + Double computedTotAmount = flow.getComputedTotAmount(); + if (!totAmount.equals(computedTotAmount)) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_SUM_PAYMENT, + flow.getName(), + totAmount.toString(), + computedTotAmount.toString()); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/CreditorInstitutionValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/CreditorInstitutionValidator.java new file mode 100644 index 00000000..dfd1489a --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/CreditorInstitutionValidator.java @@ -0,0 +1,34 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; +import org.openapi.quarkus.api_config_cache_json.model.CreditorInstitution; + +public class CreditorInstitutionValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + ConfigDataV1 configData = args.getArgument("configDataV1", ConfigDataV1.class); + String creditorInstitutionId = args.getArgument("creditorInstitutionId", String.class); + + CreditorInstitution creditorInstitution = + configData.getCreditorInstitutions().get(creditorInstitutionId); + + // executing a lookup in cached configuration, check if CI exists + if (creditorInstitution == null) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.EC_UNKNOWN, creditorInstitutionId); + } + + // executing a lookup in cached configuration, check if CI is enabled + else if (creditorInstitution.getEnabled() == null || !creditorInstitution.getEnabled()) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.EC_NOT_ENABLED, creditorInstitutionId); + } + + return checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/FlowNameFormatValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/FlowNameFormatValidator.java new file mode 100644 index 00000000..f608f575 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/FlowNameFormatValidator.java @@ -0,0 +1,42 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import java.time.LocalDate; +import java.time.format.DateTimeParseException; + +public class FlowNameFormatValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + String flowName = args.getArgument("flowName", String.class); + String pspId = args.getArgument("pspId", String.class); + + // check if flow name contains at least ten characters + if (flowName.length() < 10) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, flowName); + } + + // check if flow name contains generation date on first ten characters + try { + String date = flowName.substring(0, 10); + LocalDate.parse(date); + } catch (DateTimeParseException e) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, flowName); + } + + // check if flow name contains PSP identifier after first ten characters and has a '-' separator + String name = flowName.substring(10); + if (!name.startsWith(String.format("%s-", pspId))) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, flowName); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PspValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PspValidator.java new file mode 100644 index 00000000..b548defe --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PspValidator.java @@ -0,0 +1,32 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import org.openapi.quarkus.api_config_cache_json.model.ConfigDataV1; +import org.openapi.quarkus.api_config_cache_json.model.PaymentServiceProvider; + +public class PspValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + ConfigDataV1 configData = args.getArgument("configDataV1", ConfigDataV1.class); + String pspId = args.getArgument("pspId", String.class); + + PaymentServiceProvider psp = configData.getPsps().get(pspId); + + // executing a lookup in cached configuration, check if PSP exists + if (psp == null) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.PSP_UNKNOWN, pspId); + } + + // executing a lookup in cached configuration, check if PSP is enabled + if (psp.getEnabled() == null || !psp.getEnabled()) { + return ValidationResult.asInvalid(AppErrorCodeMessageEnum.PSP_NOT_ENABLED, pspId); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PublishableStatusValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PublishableStatusValidator.java new file mode 100644 index 00000000..4f16fdb6 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/PublishableStatusValidator.java @@ -0,0 +1,26 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause; + +import it.gov.pagopa.fdr.repository.entity.flow.FdrFlowEntity; +import it.gov.pagopa.fdr.repository.enums.FlowStatusEnum; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; + +public class PublishableStatusValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + FdrFlowEntity flow = args.getArgument("flow", FdrFlowEntity.class); + + // check if flow status is different from INSERTED + FlowStatusEnum flowStatus = flow.getStatus(); + if (flowStatus != FlowStatusEnum.INSERTED) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION, flow.getName(), flowStatus.name()); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/AddPaymentRequestValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/AddPaymentRequestValidator.java new file mode 100644 index 00000000..f237b774 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/AddPaymentRequestValidator.java @@ -0,0 +1,31 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause.request; + +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.controller.model.payment.request.AddPaymentRequest; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class AddPaymentRequestValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + String flowName = args.getArgument("flowName", String.class); + AddPaymentRequest request = args.getArgument("request", AddPaymentRequest.class); + + // check if there are some duplicated indexes in request + List payments = request.getPayments(); + Set uniqueIndexes = payments.stream().map(Payment::getIndex).collect(Collectors.toSet()); + if (payments.size() != uniqueIndexes.size()) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST, flowName); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/CreateFlowRequestValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/CreateFlowRequestValidator.java new file mode 100644 index 00000000..5d38c486 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/CreateFlowRequestValidator.java @@ -0,0 +1,38 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause.request; + +import it.gov.pagopa.fdr.controller.model.flow.request.CreateFlowRequest; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; + +public class CreateFlowRequestValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + CreateFlowRequest request = args.getArgument("request", CreateFlowRequest.class); + String pspId = args.getArgument("pspId", String.class); + String flowName = args.getArgument("flowName", String.class); + + String flowNameFromRequest = request.getFdr(); + String pspIdFromRequest = request.getSender().getPspId(); + + // check if PSP identifier extracted from request is equals to URL parameter + if (!pspId.equals(pspIdFromRequest)) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_PSP_ID_NOT_MATCH, + flowName, + pspId, + pspIdFromRequest); + } + + // check if flow name extracted from request is equals to URL parameter + if (!flowName.equals(flowNameFromRequest)) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_NOT_MATCH, flowNameFromRequest, flowName); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/DeletePaymentRequestValidator.java b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/DeletePaymentRequestValidator.java new file mode 100644 index 00000000..c8e038d4 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/middleware/validator/clause/request/DeletePaymentRequestValidator.java @@ -0,0 +1,30 @@ +package it.gov.pagopa.fdr.service.middleware.validator.clause.request; + +import it.gov.pagopa.fdr.controller.model.payment.request.DeletePaymentRequest; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.validator.ValidationArgs; +import it.gov.pagopa.fdr.util.validator.ValidationResult; +import it.gov.pagopa.fdr.util.validator.ValidationStep; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class DeletePaymentRequestValidator extends ValidationStep { + + @Override + public ValidationResult validate(ValidationArgs args) { + + String flowName = args.getArgument("flowName", String.class); + DeletePaymentRequest request = args.getArgument("request", DeletePaymentRequest.class); + + // check if there are some duplicated indexes in request + List indexes = request.getIndexList(); + Set uniqueIndexes = new HashSet<>(indexes); + if (indexes.size() != uniqueIndexes.size()) { + return ValidationResult.asInvalid( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST, flowName); + } + + return this.checkNext(args); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindFlowsByFiltersArgs.java b/src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindFlowsByFiltersArgs.java new file mode 100644 index 00000000..60c76c4f --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindFlowsByFiltersArgs.java @@ -0,0 +1,19 @@ +package it.gov.pagopa.fdr.service.model.arguments; + +import java.time.Instant; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class FindFlowsByFiltersArgs { + + private String pspId; + private String organizationId; + private String flowName; + private Long revision; + private Instant createdGt; + private Instant publishedGt; + private long pageNumber; + private long pageSize; +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/support/FindPaymentsByPspIdAndIuvIurArgs.java b/src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindPaymentsByFiltersArgs.java similarity index 70% rename from src/main/java/it/gov/pagopa/fdr/service/support/FindPaymentsByPspIdAndIuvIurArgs.java rename to src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindPaymentsByFiltersArgs.java index e75ec404..799dcd12 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/support/FindPaymentsByPspIdAndIuvIurArgs.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/arguments/FindPaymentsByFiltersArgs.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.support; +package it.gov.pagopa.fdr.service.model.arguments; import java.time.Instant; import lombok.Builder; @@ -6,8 +6,8 @@ @Builder @Getter -public class FindPaymentsByPspIdAndIuvIurArgs { - private String action; +public class FindPaymentsByFiltersArgs { + private String pspId; private String iuv; private String iur; diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/AppVersionEnum.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/AppVersionEnum.java similarity index 58% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/AppVersionEnum.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/AppVersionEnum.java index 96b46693..2199a8c9 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/AppVersionEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/AppVersionEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; public enum AppVersionEnum { FDR001, diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/BlobHttpBody.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/BlobHttpBody.java similarity index 91% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/BlobHttpBody.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/BlobHttpBody.java index a52132b9..e78f5875 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/BlobHttpBody.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/BlobHttpBody.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/EventTypeEnum.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/EventTypeEnum.java similarity index 55% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/EventTypeEnum.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/EventTypeEnum.java index 53c929a0..a410885d 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/EventTypeEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/EventTypeEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; public enum EventTypeEnum { INTERFACE, diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/FdrActionEnum.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/FdrActionEnum.java similarity index 94% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/FdrActionEnum.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/FdrActionEnum.java index a0252d9d..1993e923 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/FdrActionEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/FdrActionEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; public enum FdrActionEnum { INFO, diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/FdrStatusEnum.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/FdrStatusEnum.java similarity index 63% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/FdrStatusEnum.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/FdrStatusEnum.java index 4655a8b3..3d250436 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/FdrStatusEnum.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/FdrStatusEnum.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; public enum FdrStatusEnum { CREATED, diff --git a/src/main/java/it/gov/pagopa/fdr/service/model/re/HttpTypeEnum.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/HttpTypeEnum.java new file mode 100644 index 00000000..3aaf5001 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/HttpTypeEnum.java @@ -0,0 +1,6 @@ +package it.gov.pagopa.fdr.service.model.re; + +public enum HttpTypeEnum { + REQ, + RES +} diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReAbstract.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReAbstract.java similarity index 91% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/ReAbstract.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/ReAbstract.java index 1a1ef071..668d3ba8 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReAbstract.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReAbstract.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; import java.time.Instant; import lombok.Data; diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReInterface.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReInterface.java similarity index 93% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/ReInterface.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/ReInterface.java index 03b8d280..981c197e 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReInterface.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReInterface.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.util.List; diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReInternal.java b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReInternal.java similarity index 88% rename from src/main/java/it/gov/pagopa/fdr/service/re/model/ReInternal.java rename to src/main/java/it/gov/pagopa/fdr/service/model/re/ReInternal.java index 1bde58fa..1ad0fb9d 100644 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/ReInternal.java +++ b/src/main/java/it/gov/pagopa/fdr/service/model/re/ReInternal.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.service.re.model; +package it.gov.pagopa.fdr.service.model.re; import lombok.Data; import lombok.EqualsAndHashCode; @@ -10,6 +10,7 @@ @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) public class ReInternal extends ReAbstract { + private boolean fdrPhysicalDelete; private FdrStatusEnum fdrStatus; private Long revision; diff --git a/src/main/java/it/gov/pagopa/fdr/service/organizations/OrganizationsService.java b/src/main/java/it/gov/pagopa/fdr/service/organizations/OrganizationsService.java deleted file mode 100644 index ca52694f..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/organizations/OrganizationsService.java +++ /dev/null @@ -1,172 +0,0 @@ -package it.gov.pagopa.fdr.service.organizations; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; -import static it.gov.pagopa.fdr.util.MDCKeys.ORGANIZATION_ID; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.panache.common.Page; -import io.quarkus.panache.common.Parameters; -import io.quarkus.panache.common.Sort; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishProjection; -import it.gov.pagopa.fdr.service.dto.FdrAllDto; -import it.gov.pagopa.fdr.service.dto.FdrGetDto; -import it.gov.pagopa.fdr.service.dto.FdrGetPaymentDto; -import it.gov.pagopa.fdr.service.dto.FdrSimpleDto; -import it.gov.pagopa.fdr.service.dto.MetadataDto; -import it.gov.pagopa.fdr.service.organizations.mapper.OrganizationsServiceServiceMapper; -import it.gov.pagopa.fdr.util.AppDBUtil; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import org.jboss.logging.Logger; -import org.jboss.logging.MDC; - -@ApplicationScoped -public class OrganizationsService { - - private final OrganizationsServiceServiceMapper mapper; - - private final Logger log; - - public OrganizationsService(OrganizationsServiceServiceMapper mapper, Logger log) { - this.mapper = mapper; - this.log = log; - } - - @WithSpan(kind = SERVER) - public FdrAllDto find( - String action, - String ecId, - String pspId, - Instant publishedGt, - long pageNumber, - long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("_id,asc")); - - List queryAnd = new ArrayList<>(); - Parameters parameters = new Parameters(); - - if (pspId != null && !pspId.isBlank()) { - queryAnd.add("sender.psp_id = :pspId"); - parameters.and("pspId", pspId); - } - if (ecId != null && !ecId.isBlank()) { - queryAnd.add("receiver.organization_id = :organizationId"); - parameters.and("organizationId", ecId); - } - - if (publishedGt != null) { - queryAnd.add("published > :publishedGt"); - parameters.and("publishedGt", publishedGt); - } - - log.debugf("Get all FdrPublishEntity"); - PanacheQuery fdrPublishPanacheQuery; - if (queryAnd.isEmpty()) { - log.debugf("Get all FdrPublishEntity"); - fdrPublishPanacheQuery = FdrPublishEntity.findAll(sort); - } else { - log.debugf("Get all FdrPublishEntity with pspId[%s] organizationId[%s]", pspId, ecId); - fdrPublishPanacheQuery = - FdrPublishEntity.find(String.join(" and ", queryAnd), sort, parameters); - } - - log.debug("Get paging FdrPublishReportingFlowNameProjection"); - PanacheQuery fdrProjectionPanacheQuery = - fdrPublishPanacheQuery.page(page).project(FdrPublishProjection.class); - - List reportingFlowIds = fdrProjectionPanacheQuery.list(); - - long totPage = fdrProjectionPanacheQuery.pageCount(); - long countReportingFlow = fdrProjectionPanacheQuery.count(); - - log.debug("Building ReportingFlowByIdEcDto"); - return FdrAllDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlow) - .data( - reportingFlowIds.stream() - .map( - rf -> - FdrSimpleDto.builder() - .fdr(rf.getFdr()) - .published(rf.getPublished()) - .revision(rf.getRevision()) - .pspId(rf.getSender().getPspId()) - .build()) - .toList()) - .build(); - } - - @WithSpan(kind = SERVER) - public FdrGetDto findByReportingFlowName( - String action, String fdr, Long rev, String pspId, String organizationId) { - log.infof(AppMessageUtil.logExecute(action)); - - log.debugf("Existence check FdrPublishEntity by fdr[%s], psp[%s]", fdr, pspId); - FdrPublishEntity fdrPublishPanacheQuery = - FdrPublishEntity.findByFdrAndRevAndPspIdAndOrganizationId(fdr, rev, pspId, organizationId) - .project(FdrPublishEntity.class) - .firstResultOptional() - .orElseThrow( - () -> new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrPublishPanacheQuery.getReceiver().getOrganizationId()); - - log.debug("Mapping ReportingFlowGetDto from FdrPublishEntity"); - return mapper.toFdrGetDto(fdrPublishPanacheQuery); - } - - @WithSpan(kind = SERVER) - public FdrGetPaymentDto findPaymentByReportingFlowName( - String action, - String fdr, - Long rev, - String pspId, - String organizationId, - long pageNumber, - long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("index,asc")); - - log.debugf("Existence check fdr by fdr[%s], psp[%s]", fdr, pspId); - PanacheQuery fdrPaymentPublishPanacheQuery = - FdrPaymentPublishEntity.findByFdrAndRevAndPspIdAndOrganizationId( - fdr, rev, pspId, organizationId, sort) - .page(page); - - List list = fdrPaymentPublishPanacheQuery.list(); - - long totPage = fdrPaymentPublishPanacheQuery.pageCount(); - long countReportingFlowPayment = fdrPaymentPublishPanacheQuery.count(); - - log.debug("Mapping ReportingFlowGetPaymentDto from FdrPaymentPublishEntity"); - return FdrGetPaymentDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlowPayment) - .data(mapper.toPaymentDtoList(list)) - .build(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/organizations/mapper/OrganizationsServiceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/service/organizations/mapper/OrganizationsServiceServiceMapper.java deleted file mode 100644 index 49ef091f..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/organizations/mapper/OrganizationsServiceServiceMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.gov.pagopa.fdr.service.organizations.mapper; - -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import it.gov.pagopa.fdr.service.dto.FdrGetDto; -import it.gov.pagopa.fdr.service.dto.PaymentDto; -import java.util.List; -import org.mapstruct.Mapper; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface OrganizationsServiceServiceMapper { - - OrganizationsServiceServiceMapper INSTANCE = - Mappers.getMapper(OrganizationsServiceServiceMapper.class); - - FdrGetDto toFdrGetDto(FdrPublishEntity fdrPublishEntity); - - PaymentDto toPaymentDto(FdrPaymentPublishEntity paymentEntity); - - List toPaymentDtoList(List paymentEntities); -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java b/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java deleted file mode 100644 index 044cd462..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/PspsService.java +++ /dev/null @@ -1,735 +0,0 @@ -package it.gov.pagopa.fdr.service.psps; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; -import static it.gov.pagopa.fdr.util.MDCKeys.*; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.panache.common.Page; -import io.quarkus.panache.common.Parameters; -import io.quarkus.panache.common.Sort; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.repository.fdr.*; -import it.gov.pagopa.fdr.repository.fdr.model.FdrStatusEnumEntity; -import it.gov.pagopa.fdr.repository.fdr.projection.FdrInsertProjection; -import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishByPspProjection; -import it.gov.pagopa.fdr.repository.fdr.projection.FdrPublishRevisionProjection; -import it.gov.pagopa.fdr.rest.validation.CommonValidationService; -import it.gov.pagopa.fdr.service.conversion.ConversionService; -import it.gov.pagopa.fdr.service.conversion.message.FdrMessage; -import it.gov.pagopa.fdr.service.dto.*; -import it.gov.pagopa.fdr.service.history.HistoryService; -import it.gov.pagopa.fdr.service.history.model.HistoryBlobBody; -import it.gov.pagopa.fdr.service.psps.mapper.PspsServiceServiceMapper; -import it.gov.pagopa.fdr.service.re.ReService; -import it.gov.pagopa.fdr.service.re.model.*; -import it.gov.pagopa.fdr.util.AppDBUtil; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import it.gov.pagopa.fdr.util.StringUtil; -import jakarta.enterprise.context.ApplicationScoped; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import org.bson.types.ObjectId; -import org.jboss.logging.Logger; -import org.jboss.logging.MDC; - -@ApplicationScoped -public class PspsService { - - private final PspsServiceServiceMapper mapper; - - private final Logger log; - - private final ConversionService conversionQueue; - - private final ReService reService; - - private final HistoryService historyService; - - public PspsService( - PspsServiceServiceMapper mapper, - Logger log, - ConversionService conversionQueue, - ReService reService, - HistoryService historyService) { - this.mapper = mapper; - this.log = log; - this.conversionQueue = conversionQueue; - this.reService = reService; - this.historyService = historyService; - } - - @WithSpan(kind = SERVER) - public void save(String action, FdrDto fdrDto) { - log.infof(AppMessageUtil.logExecute(action)); - - Instant now = Instant.now(); - String fdr = fdrDto.getFdr(); - String pspId = fdrDto.getSender().getPspId(); - String ecId = fdrDto.getReceiver().getOrganizationId(); - - log.debugf("Existence check FdrInsertEntity by fdr[%s], psp[%s]", fdr, pspId); - - Optional byfdr = - FdrInsertEntity.findByFdrAndPspId(fdr, pspId).firstResultOptional(); - - if (byfdr.isPresent()) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_ALREADY_EXIST, fdr, byfdr.get().getStatus()); - } - - log.debugf("Get FdrPublishRevision by fdr[%s], psp[%s]", fdr, pspId); - Optional fdrPublishedByfdr = - FdrPublishEntity.findByFdrAndPspId(fdr, pspId, Sort.descending("revision")) - .project(FdrPublishRevisionProjection.class) - .firstResultOptional(); - - // sono stati tolti i check con il vecchio FDR, vale solo che se arriva stesso fdr con - // stesso pspId si crea la rev2 - - Long revision = fdrPublishedByfdr.map(r -> r.getRevision() + 1).orElse(1L); - log.debugf("Mapping FdrInsertEntity from reportingFlowDto for revision {}", revision); - FdrInsertEntity fdrEntity = mapper.toFdrInsertEntity(fdrDto); - - fdrEntity.setCreated(now); - fdrEntity.setUpdated(now); - fdrEntity.setStatus(FdrStatusEnumEntity.CREATED); - fdrEntity.setComputedTotPayments(0L); - fdrEntity.setComputedSumPayments(0.0); - fdrEntity.setTotPayments(fdrDto.getTotPayments()); - fdrEntity.setSumPayments(fdrDto.getSumPayments()); - fdrEntity.setRevision(revision); - fdrEntity.persist(); - - String sessionId = org.slf4j.MDC.get(TRX_ID); - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus(FdrStatusEnum.CREATED) - // .flowRead(false) - .fdr(fdr) - .pspId(pspId) - .organizationId(ecId) - .revision(revision) - .fdrAction(FdrActionEnum.CREATE_FLOW) - .build()); - log.debug("FdrInsertEntity CREATED"); - } - - @WithSpan(kind = SERVER) - public void addPayment(String action, String pspId, String fdr, AddPaymentDto addPaymentDto) { - log.infof(AppMessageUtil.logExecute(action)); - Instant now = Instant.now(); - - FdrInsertEntity fdrEntity = - checkFdrInsertEntity( - fdr, pspId, new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrEntity.getReceiver().getOrganizationId()); - - log.debug("Check payments indexes"); - List indexList = addPaymentDto.getPayments().stream().map(PaymentDto::getIndex).toList(); - if (indexList.size() != indexList.stream().distinct().toList().size()) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST, fdr); - } - - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], indexList", fdr); - List paymentIndexAlreadyExist = - FdrPaymentInsertEntity.findByFdrAndIndexes(fdr, indexList) - .project(FdrPaymentInsertEntity.class) - .list(); - - if (paymentIndexAlreadyExist != null && !paymentIndexAlreadyExist.isEmpty()) { - throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX, fdr); - } - - log.debug("Mapping FdrPaymentInsertEntity from addPaymentDto.getPayments()"); - List reportingFlowPaymentEntities = - mapper.toFdrPaymentInsertEntityList(addPaymentDto.getPayments()); - - fdrEntity.setComputedTotPayments(addAndSumCount(fdrEntity, reportingFlowPaymentEntities)); - fdrEntity.setComputedSumPayments(addAndSum(fdrEntity, reportingFlowPaymentEntities)); - - fdrEntity.setUpdated(now); - fdrEntity.setStatus(FdrStatusEnumEntity.INSERTED); - fdrEntity.update(); - log.debug("FdrInsertEntity INSERTED"); - - log.debug("Mapping FdrPaymentInsertEntity from addPaymentDto.getPayments()"); - FdrPaymentInsertEntity.persistFdrPaymentsInsert( - reportingFlowPaymentEntities.stream() - .peek( - reportingFlowPaymentEntity -> { - reportingFlowPaymentEntity.setCreated(now); - reportingFlowPaymentEntity.setUpdated(now); - reportingFlowPaymentEntity.setRefFdrId(fdrEntity.id); - reportingFlowPaymentEntity.setRefFdr(fdrEntity.getFdr()); - reportingFlowPaymentEntity.setRefFdrSenderPspId(fdrEntity.getSender().getPspId()); - reportingFlowPaymentEntity.setRefFdrReceiverOrganizationId( - fdrEntity.getReceiver().getOrganizationId()); - reportingFlowPaymentEntity.setRefFdrRevision(fdrEntity.getRevision()); - }) - .toList()); - - String sessionId = org.slf4j.MDC.get(TRX_ID); - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus(FdrStatusEnum.INSERTED) - // .flowRead(false) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .revision(fdrEntity.getRevision()) - .fdrAction(FdrActionEnum.ADD_PAYMENT) - .build()); - } - - @WithSpan(kind = SERVER) - public void deletePayment( - String action, String pspId, String fdr, DeletePaymentDto deletePaymentDto) { - log.infof(AppMessageUtil.logExecute(action)); - Instant now = Instant.now(); - - FdrInsertEntity fdrEntity = - checkFdrInsertEntity( - fdr, pspId, new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrEntity.getReceiver().getOrganizationId()); - - if (FdrStatusEnumEntity.INSERTED != fdrEntity.getStatus()) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION, fdr, fdrEntity.getStatus()); - } - - List indexList = deletePaymentDto.getIndexList(); - if (indexList.size() != indexList.stream().distinct().toList().size()) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST, fdr); - } - - log.debugf("Existence check FdrPaymentInsertEntity to delete by fdr[%s], indexList", fdr); - List paymentToDelete = - FdrPaymentInsertEntity.findByFdrAndIndexes(fdr, indexList) - .project(FdrPaymentInsertEntity.class) - .list(); - if (!paymentToDelete.stream() - .map(FdrPaymentInsertEntity::getIndex) - .collect(Collectors.toSet()) - .containsAll(indexList)) { - throw new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX, fdr); - } - - log.debugf("Delete FdrPaymentInsertEntity by fdr[%s], indexList", fdr); - FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexList); - - long tot = deleteAndSumCount(fdrEntity, paymentToDelete); - double sum = deleteAndSubtract(fdrEntity, paymentToDelete); - FdrStatusEnumEntity status = - sum > 0 ? FdrStatusEnumEntity.INSERTED : FdrStatusEnumEntity.CREATED; - fdrEntity.setComputedTotPayments(tot); - fdrEntity.setComputedSumPayments(sum); - fdrEntity.setUpdated(now); - fdrEntity.setStatus(status); - fdrEntity.update(); - log.debugf("FdrInsertEntity %s", fdrEntity.getStatus().name()); - - String sessionId = org.slf4j.MDC.get(TRX_ID); - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus( - FdrStatusEnumEntity.INSERTED == status - ? FdrStatusEnum.INSERTED - : FdrStatusEnum.CREATED) - // .flowRead(false) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .revision(fdrEntity.getRevision()) - .fdrAction(FdrActionEnum.DELETE_PAYMENT) - .build()); - } - - public void publishByFdr(String action, String pspId, String fdr, boolean internalPublish) { - log.infof(AppMessageUtil.logExecute(action)); - - FdrInsertEntity fdrEntity = - checkFdrInsertEntity( - fdr, pspId, new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrEntity.getReceiver().getOrganizationId()); - - if (FdrStatusEnumEntity.INSERTED != fdrEntity.getStatus()) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION, fdr, fdrEntity.getStatus()); - } - - if (!fdrEntity.getTotPayments().equals(fdrEntity.getComputedTotPayments())) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_TOT_PAYMENT, - fdr, - fdrEntity.getTotPayments(), - fdrEntity.getComputedTotPayments()); - } - - if (!fdrEntity.getSumPayments().equals(fdrEntity.getComputedSumPayments())) { - throw new AppException( - AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_SUM_PAYMENT, - fdr, - fdrEntity.getSumPayments(), - fdrEntity.getComputedSumPayments()); - } - - log.debugf("Existence check FdrPaymentInsertEntity by fdr[%s], pspId[%s]", StringUtil.sanitize(fdr), StringUtil.sanitize(pspId)); - List paymentInsertEntities = - FdrPaymentInsertEntity.findByFdrAndPspId(fdr, pspId) - .project(FdrPaymentInsertEntity.class) - .list(); - - FdrPublishEntity fdrPublishEntity = mapper.toFdrPublishEntity(fdrEntity); - Instant now = Instant.now(); - fdrPublishEntity.setUpdated(now); - fdrPublishEntity.setPublished(now); - fdrPublishEntity.setStatus(FdrStatusEnumEntity.PUBLISHED); - List fdrPaymentPublishEntities = mapper.toFdrPaymentPublishEntityList(paymentInsertEntities); - - // writes in fdr_payment_publish collection - this.parallelPersist(fdr, fdrPaymentPublishEntities); - - // save as JSON file in history storage - HistoryBlobBody body = historyService.saveJsonFile(fdrPublishEntity, fdrPaymentPublishEntities); - - fdrPublishEntity.setRefJson(body); - fdrPublishEntity.persistEntity(); - - CompletableFuture executeSaveOnStorage = - CompletableFuture.supplyAsync( - () -> { - historyService.saveOnStorage(fdrPublishEntity, fdrPaymentPublishEntities); - return true; - }); - executeSaveOnStorage - .thenAccept( - value -> { - // queue - this.addToConversionQueue(internalPublish, fdrEntity); - // delete - this.batchDelete(fdr, paymentInsertEntities); - fdrEntity.delete(); - log.infof("Deleted FdrPaymentInsertEntity by fdr[%s], pspId[%s]", StringUtil.sanitize(fdr), StringUtil.sanitize(pspId)); - // re - this.rePublish(fdr, pspId, fdrPublishEntity); - }) - .exceptionally( - e -> { - log.error("Exception during async saveOnStorage: ", e); - return null; - }); - } - - private void batchDelete(String fdr, List paymentInsertEntities) { - int batchSize = 1000; - List> batches = IntStream - .range(0, (paymentInsertEntities.size() + batchSize - 1) / batchSize) - .mapToObj(i -> paymentInsertEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, paymentInsertEntities.size()))) - .toList(); - // sequential stream - batches.forEach(batch -> { - List indexes = paymentInsertEntities.stream().map(FdrPaymentInsertEntity::getIndex).toList(); - FdrPaymentInsertEntity.deleteByFdrAndIndexes(fdr, indexes); - }); - } - - private void parallelPersist(String fdr, List fdrPaymentPublishEntities) { - int batchSize = 1000; - List> batchesPublish = IntStream - .range(0, (fdrPaymentPublishEntities.size() + batchSize - 1) / batchSize) - .mapToObj(i -> fdrPaymentPublishEntities.subList(i * batchSize, Math.min((i + 1) * batchSize, fdrPaymentPublishEntities.size()))) - .toList(); - batchesPublish.parallelStream().forEach(FdrPaymentPublishEntity::persistFdrPaymentPublishEntities); - log.debugf("Published fdrPaymentPublishEntities of fdr[%s]", StringUtil.sanitize(fdr)); - } - - private void addToConversionQueue(boolean internalPublish, FdrInsertEntity fdrEntity) { - // add to conversion queue - if (internalPublish) { - log.debugf("NOT Add FdrInsertEntity in queue fdr message"); - } else { - log.debugf("Starting add FdrInsertEntity in queue fdr message"); - conversionQueue.addQueueFlowMessage( - FdrMessage.builder() - .fdr(fdrEntity.getFdr()) - .pspId(fdrEntity.getSender().getPspId()) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .retry(0L) - .revision(fdrEntity.getRevision()) - .build()); - log.debugf("End add FdrInsertEntity in queue fdr message"); - } - } - - private void rePublish(String fdr, String pspId, FdrPublishEntity fdrPublishEntity) { - String sessionId = (String) MDC.get(TRX_ID); - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(false) - .fdrStatus(FdrStatusEnum.PUBLISHED) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrPublishEntity.getReceiver().getOrganizationId()) - .revision(fdrPublishEntity.getRevision()) - .fdrAction(FdrActionEnum.PUBLISH) - .build()); - } - - @WithSpan(kind = SERVER) - public void deleteByFdr(String action, String pspId, String fdr) { - log.infof(AppMessageUtil.logExecute(action)); - - FdrInsertEntity fdrEntity = - checkFdrInsertEntity( - fdr, pspId, new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrEntity.getReceiver().getOrganizationId()); - - if (fdrEntity.getComputedTotPayments() > 0L) { - log.debugf("Delete FdrPaymentInsertEntity for FdrInsertEntity by fdr[%s]", fdr); - FdrPaymentInsertEntity.deleteByFdr(fdr); - } - log.debug("Delete FdrInsertEntity"); - fdrEntity.delete(); - - String sessionId = org.slf4j.MDC.get(TRX_ID); - MDC.put(EVENT_CATEGORY, EventTypeEnum.INTERNAL.name()); - reService.sendEvent( - ReInternal.builder() - .serviceIdentifier(AppVersionEnum.FDR003) - .created(Instant.now()) - .sessionId(sessionId) - .eventType(EventTypeEnum.INTERNAL) - .fdrPhysicalDelete(true) - .fdrStatus(FdrStatusEnum.DELETED) - .fdr(fdr) - .pspId(pspId) - .organizationId(fdrEntity.getReceiver().getOrganizationId()) - .revision(fdrEntity.getRevision()) - .fdrAction(FdrActionEnum.DELETE_FLOW) - .build()); - } - - private static double addAndSum( - FdrInsertEntity fdrEntity, List reportingFlowPaymentEntities) { - return Double.sum( - Objects.requireNonNullElseGet(fdrEntity.getComputedSumPayments(), () -> (double) 0), - reportingFlowPaymentEntities.stream() - .map(FdrPaymentInsertEntity::getPay) - .mapToDouble(Double::doubleValue) - .sum()); - } - - private static double deleteAndSubtract( - FdrInsertEntity fdrEntity, List paymentToDelete) { - return BigDecimal.valueOf( - Objects.requireNonNullElseGet(fdrEntity.getComputedSumPayments(), () -> (double) 0)) - .subtract( - BigDecimal.valueOf( - paymentToDelete.stream() - .map(FdrPaymentInsertEntity::getPay) - .mapToDouble(Double::doubleValue) - .sum())) - .doubleValue(); - } - - private static long addAndSumCount( - FdrInsertEntity fdrEntity, List reportingFlowPaymentEntities) { - return Objects.requireNonNullElseGet(fdrEntity.getComputedTotPayments(), () -> (long) 0) - + reportingFlowPaymentEntities.size(); - } - - private static long deleteAndSumCount( - FdrInsertEntity fdrEntity, List reportingFlowPaymentEntities) { - return Objects.requireNonNullElseGet(fdrEntity.getComputedTotPayments(), () -> (long) 0) - - reportingFlowPaymentEntities.size(); - } - - private FdrInsertEntity checkFdrInsertEntity( - String fdr, String pspId, AppException appException) { - log.debugf("Find FdrInsertEntity by fdr[%s], psp[%s]", fdr, pspId); - return FdrInsertEntity.findByFdrAndPspId(fdr, pspId) - .project(FdrInsertEntity.class) - .firstResultOptional() - .orElseThrow(() -> appException); - } - - @WithSpan(kind = SERVER) - public FdrAllCreatedDto find( - String action, String pspId, Instant createdGt, long pageNumber, long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("_id,asc")); - - List queryAnd = new ArrayList<>(); - Parameters parameters = new Parameters(); - - if (pspId != null && !pspId.isBlank()) { - queryAnd.add("sender.psp_id = :pspId"); - parameters.and("pspId", pspId); - } - - if (createdGt != null) { - queryAnd.add("created > :createdGt"); - parameters.and("createdGt", createdGt); - } - - log.debugf("Get all FdrInsertedEntity"); - PanacheQuery fdrInsertEntityPanacheQuery; - if (queryAnd.isEmpty()) { - log.debugf("Get all FdrInsertedEntity"); - fdrInsertEntityPanacheQuery = FdrInsertEntity.findAll(sort); - } else { - log.debugf("Get all FdrInsertedEntity with pspId[%s]", pspId); - fdrInsertEntityPanacheQuery = - FdrInsertEntity.find(String.join(" and ", queryAnd), sort, parameters); - } - - log.debug("Get paging FdrInsertedReportingFlowNameProjection"); - PanacheQuery fdrProjectionPanacheQuery = - fdrInsertEntityPanacheQuery.page(page).project(FdrInsertProjection.class); - - List reportingFlowIds = fdrProjectionPanacheQuery.list(); - - long totPage = fdrProjectionPanacheQuery.pageCount(); - long countReportingFlow = fdrProjectionPanacheQuery.count(); - - log.debug("Building ReportingFlowByIdEcDto"); - return FdrAllCreatedDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlow) - .data( - reportingFlowIds.stream() - .map( - rf -> - FdrSimpleCreatedDto.builder() - .fdr(rf.getFdr()) - .created(rf.getCreated()) - .revision(rf.getRevision()) - .organizationId(rf.getReceiver().getOrganizationId()) - .build()) - .toList()) - .build(); - } - - @WithSpan(kind = SERVER) - public FdrGetCreatedDto findByReportingFlowName( - String action, String fdr, String pspId, String organizationId) { - log.infof(AppMessageUtil.logExecute(action)); - - log.debugf("Existence check FdrInsertEntity by fdr[%s], psp[%s]", fdr, pspId); - FdrInsertEntity fdrInsertPanacheQuery = - FdrInsertEntity.findByFdrAndRevAndPspIdAndOrganizationId(fdr, pspId, organizationId) - .project(FdrInsertEntity.class) - .firstResultOptional() - .orElseThrow( - () -> new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrInsertPanacheQuery.getReceiver().getOrganizationId()); - - log.debug("Mapping ReportingFlowGetDto from FdrInsertEntity"); - return mapper.toFdrGetCreatedDto(fdrInsertPanacheQuery); - } - - @WithSpan(kind = SERVER) - public FdrGetPaymentDto findPaymentByReportingFlowName( - String action, - String fdr, - String pspId, - String organizationId, - long pageNumber, - long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("index,asc")); - - log.debugf("Existence check fdr by fdr[%s], psp[%s]", fdr, pspId); - PanacheQuery fdrPaymentInsertPanacheQuery = - FdrPaymentInsertEntity.findByFdrAndPspIAndOrganizationIdSort( - fdr, pspId, organizationId, sort) - .page(page); - - List list = fdrPaymentInsertPanacheQuery.list(); - - long totPage = fdrPaymentInsertPanacheQuery.pageCount(); - long countReportingFlowPayment = fdrPaymentInsertPanacheQuery.count(); - - log.debug("Mapping ReportingFlowGetPaymentDto from FdrPaymentPublishEntity"); - return FdrGetPaymentDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlowPayment) - .data(mapper.toPaymentDtoList(list)) - .build(); - } - - @WithSpan(kind = SERVER) - public FdrAllPublishedDto findAllPublished( - String action, - String pspId, - String ecId, - Instant publishedGt, - long pageNumber, - long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("_id,asc")); - - List queryAnd = new ArrayList<>(); - Parameters parameters = new Parameters(); - - queryAnd.add("sender.psp_id = :pspId"); - parameters.and("pspId", pspId); - - if (ecId != null && !ecId.isBlank()) { - queryAnd.add("receiver.organization_id = :organizationId"); - parameters.and("organizationId", ecId); - } - - if (publishedGt != null) { - queryAnd.add("published > :publishedGt"); - parameters.and("publishedGt", publishedGt); - } - - log.debugf("Get all FdrPublishEntity with pspId[%s] organizationId[%s]", pspId, ecId); - PanacheQuery fdrPublishPanacheQuery = - FdrPublishEntity.find(String.join(" and ", queryAnd), sort, parameters); - - log.debug("Get paging FdrPublishReportingFlowNameProjection"); - PanacheQuery fdrProjectionPanacheQuery = - fdrPublishPanacheQuery.page(page).project(FdrPublishByPspProjection.class); - - List reportingFlowIds = fdrProjectionPanacheQuery.list(); - - long totPage = fdrProjectionPanacheQuery.pageCount(); - long countReportingFlow = fdrProjectionPanacheQuery.count(); - - log.debug("Building ReportingFlowByIdEcDto"); - return FdrAllPublishedDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlow) - .data( - reportingFlowIds.stream() - .map( - rf -> - FdrSimplePublishedDto.builder() - .fdr(rf.getFdr()) - .published(rf.getPublished()) - .revision(rf.getRevision()) - .organizationId(rf.getReceiver().getOrganizationId()) - .build()) - .toList()) - .build(); - } - - @WithSpan(kind = SERVER) - public FdrGetDto findByReportingFlowNamePublished( - String action, String fdr, Long rev, String pspId, String organizationId) { - log.infof(AppMessageUtil.logExecute(action)); - - log.debugf("Existence check FdrPublishEntity by fdr[%s], psp[%s]", fdr, pspId); - FdrPublishEntity fdrPublishPanacheQuery = - FdrPublishEntity.findByFdrAndRevAndPspIdAndOrganizationId(fdr, rev, pspId, organizationId) - .project(FdrPublishEntity.class) - .firstResultOptional() - .orElseThrow( - () -> new AppException(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND, fdr)); - - MDC.put(ORGANIZATION_ID, fdrPublishPanacheQuery.getReceiver().getOrganizationId()); - - log.debug("Mapping ReportingFlowGetDto from FdrPublishEntity"); - return mapper.toFdrGetDtoByPsp(fdrPublishPanacheQuery); - } - - @WithSpan(kind = SERVER) - public FdrGetPaymentDto findPaymentByReportingFlowNamePublished( - String action, - String fdr, - Long rev, - String pspId, - String organizationId, - long pageNumber, - long pageSize) { - log.infof(AppMessageUtil.logExecute(action)); - - Page page = Page.of((int) pageNumber - 1, (int) pageSize); - Sort sort = AppDBUtil.getSort(List.of("index,asc")); - - log.debugf("Existence check fdr by fdr[%s], psp[%s]", fdr, pspId); - PanacheQuery fdrPaymentPublishPanacheQuery = - FdrPaymentPublishEntity.findByFdrAndRevAndPspIdAndOrganizationId( - fdr, rev, pspId, organizationId, sort) - .page(page); - - List list = fdrPaymentPublishPanacheQuery.list(); - - long totPage = fdrPaymentPublishPanacheQuery.pageCount(); - long countReportingFlowPayment = fdrPaymentPublishPanacheQuery.count(); - - log.debug("Mapping ReportingFlowGetPaymentDto from FdrPaymentPublishEntity"); - return FdrGetPaymentDto.builder() - .metadata( - MetadataDto.builder() - .pageSize(pageSize) - .pageNumber(pageNumber) - .totPage(totPage) - .build()) - .count(countReportingFlowPayment) - .data(mapper.toPaymentDtoListByPsp(list)) - .build(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/psps/mapper/PspsServiceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/service/psps/mapper/PspsServiceServiceMapper.java deleted file mode 100644 index 2d4c9437..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/psps/mapper/PspsServiceServiceMapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package it.gov.pagopa.fdr.service.psps.mapper; - -import it.gov.pagopa.fdr.repository.fdr.FdrInsertEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentInsertEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.repository.fdr.FdrPublishEntity; -import it.gov.pagopa.fdr.service.dto.FdrDto; -import it.gov.pagopa.fdr.service.dto.FdrGetCreatedDto; -import it.gov.pagopa.fdr.service.dto.FdrGetDto; -import it.gov.pagopa.fdr.service.dto.PaymentDto; -import java.util.List; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface PspsServiceServiceMapper { - - PspsServiceServiceMapper INSTANCE = Mappers.getMapper(PspsServiceServiceMapper.class); - - @Mapping(target = "id", ignore = true) - @Mapping(target = "revision", ignore = true) - @Mapping(target = "created", ignore = true) - @Mapping(target = "updated", ignore = true) - @Mapping(target = "status", ignore = true) - @Mapping(target = "computedTotPayments", ignore = true) - @Mapping(target = "computedSumPayments", ignore = true) - FdrInsertEntity toFdrInsertEntity(FdrDto fdrDto); - - @Mapping(target = "id", ignore = true) - @Mapping(target = "revision", ignore = true) - @Mapping(target = "created", ignore = true) - @Mapping(target = "updated", ignore = true) - @Mapping(target = "refFdrId", ignore = true) - @Mapping(target = "refFdr", ignore = true) - @Mapping(target = "refFdrSenderPspId", ignore = true) - @Mapping(target = "refFdrRevision", ignore = true) - @Mapping(target = "refFdrReceiverOrganizationId", ignore = true) - FdrPaymentInsertEntity toFdrPaymentInsertEntity(PaymentDto paymentDto); - - List toFdrPaymentInsertEntityList(List paymentDto); - - @Mapping(target = "published", ignore = true) - @Mapping(target = "refJson", ignore = true) - FdrPublishEntity toFdrPublishEntity(FdrInsertEntity fdrInsertEntity); - - List toFdrPaymentPublishEntityList( - List fdrInsertEntityList); - - FdrGetCreatedDto toFdrGetCreatedDto(FdrInsertEntity fdrInsertEntity); - - List toPaymentDtoList(List paymentEntities); - - List toPaymentDtoListByPsp(List paymentEntities); - - FdrGetDto toFdrGetDtoByPsp(FdrPublishEntity fdrPublishEntity); -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/re/model/HttpTypeEnum.java b/src/main/java/it/gov/pagopa/fdr/service/re/model/HttpTypeEnum.java deleted file mode 100644 index 4a441639..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/re/model/HttpTypeEnum.java +++ /dev/null @@ -1,6 +0,0 @@ -package it.gov.pagopa.fdr.service.re.model; - -public enum HttpTypeEnum { - REQ, - RES -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/support/SupportService.java b/src/main/java/it/gov/pagopa/fdr/service/support/SupportService.java deleted file mode 100644 index 1a5a2f39..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/support/SupportService.java +++ /dev/null @@ -1,81 +0,0 @@ -package it.gov.pagopa.fdr.service.support; - -import static io.opentelemetry.api.trace.SpanKind.SERVER; -import static it.gov.pagopa.fdr.util.MDCKeys.IUR; -import static it.gov.pagopa.fdr.util.MDCKeys.IUV; -import static it.gov.pagopa.fdr.util.MDCKeys.PSP_ID; - -import io.opentelemetry.instrumentation.annotations.WithSpan; -import io.quarkus.mongodb.panache.PanacheQuery; -import io.quarkus.panache.common.Page; -import io.quarkus.panache.common.Sort; -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.service.dto.MetadataDto; -import it.gov.pagopa.fdr.service.dto.PaymentGetByPspIdIuvIurDTO; -import it.gov.pagopa.fdr.service.support.mapper.SupportServiceServiceMapper; -import it.gov.pagopa.fdr.util.AppDBUtil; -import it.gov.pagopa.fdr.util.AppMessageUtil; -import jakarta.enterprise.context.ApplicationScoped; -import java.util.List; -import java.util.Optional; -import org.jboss.logging.Logger; -import org.jboss.logging.MDC; - -@ApplicationScoped -public class SupportService { - private final SupportServiceServiceMapper mapper; - - private final Logger log; - - public SupportService(SupportServiceServiceMapper mapper, Logger log) { - this.mapper = mapper; - this.log = log; - } - - @WithSpan(kind = SERVER) - public PaymentGetByPspIdIuvIurDTO findPaymentsByPspIdAndIuvIur( - FindPaymentsByPspIdAndIuvIurArgs args) { - MDC.put(PSP_ID, args.getPspId()); - Optional.ofNullable(args.getIuv()).ifPresent(iuvz -> MDC.put(IUV, iuvz)); - Optional.ofNullable(args.getIur()).ifPresent(iurz -> MDC.put(IUR, iurz)); - log.infof( - AppMessageUtil.logProcess("%s with id:[%s] - page:[%s], pageSize:[%s]"), - args.getAction(), - args.getPspId(), - args.getPageNumber(), - args.getPageSize()); - - Page page = Page.of((int) args.getPageNumber() - 1, (int) args.getPageSize()); - Sort sort = AppDBUtil.getSort(List.of("index,asc")); - - log.debugf( - "Existence check fdr by pspId[%s], iuv[%s], iur[%s], createdFrom: [%s], createdTo: [%s]", - args.getPspId(), args.getIuv(), args.getIur(), args.getCreatedFrom(), args.getCreatedTo()); - PanacheQuery fdrPaymentPublishPanacheQuery = - FdrPaymentPublishEntity.findByPspAndIuvIur( - args.getPspId(), - args.getIuv(), - args.getIur(), - args.getCreatedFrom(), - args.getCreatedTo(), - sort) - .page(page); - - List list = fdrPaymentPublishPanacheQuery.list(); - - long totPage = fdrPaymentPublishPanacheQuery.pageCount(); - long countReportingFlowPayment = fdrPaymentPublishPanacheQuery.count(); - - log.debug("Mapping PaymentGetByPspIdIuvIurDTO from FdrPaymentPublishEntity"); - return PaymentGetByPspIdIuvIurDTO.builder() - .metadata( - MetadataDto.builder() - .pageSize(args.getPageSize()) - .pageNumber(args.getPageNumber()) - .totPage(totPage) - .build()) - .count(countReportingFlowPayment) - .data(mapper.toPaymentByPspIdIuvIurList(list)) - .build(); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/service/support/mapper/SupportServiceServiceMapper.java b/src/main/java/it/gov/pagopa/fdr/service/support/mapper/SupportServiceServiceMapper.java deleted file mode 100644 index cb187d0c..00000000 --- a/src/main/java/it/gov/pagopa/fdr/service/support/mapper/SupportServiceServiceMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package it.gov.pagopa.fdr.service.support.mapper; - -import it.gov.pagopa.fdr.repository.fdr.FdrPaymentPublishEntity; -import it.gov.pagopa.fdr.service.dto.PaymentByPspIdIuvIurDTO; -import java.util.List; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.MappingConstants.ComponentModel; -import org.mapstruct.factory.Mappers; - -@Mapper(componentModel = ComponentModel.JAKARTA) -public interface SupportServiceServiceMapper { - - SupportServiceServiceMapper INSTANCE = Mappers.getMapper(SupportServiceServiceMapper.class); - - @Mapping(source = "refFdrSenderPspId", target = "pspId") - @Mapping(source = "refFdr", target = "fdr") - @Mapping(source = "refFdrRevision", target = "revision") - @Mapping(source = "refFdrReceiverOrganizationId", target = "organizationId") - PaymentByPspIdIuvIurDTO toPaymentByPspIdIuvIur(FdrPaymentPublishEntity fdrPaymentPublishEntity); - - List toPaymentByPspIdIuvIurList( - List paymentEntities); -} diff --git a/src/main/java/it/gov/pagopa/fdr/util/AppConstant.java b/src/main/java/it/gov/pagopa/fdr/util/AppConstant.java deleted file mode 100644 index 453dddf8..00000000 --- a/src/main/java/it/gov/pagopa/fdr/util/AppConstant.java +++ /dev/null @@ -1,53 +0,0 @@ -package it.gov.pagopa.fdr.util; - -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; -import java.util.ArrayList; -import java.util.List; - -public class AppConstant { - - public static final String SERVICE_CODE_APP = "FDR"; - - public static final String REQUEST = "REQ"; - public static final String RESPONSE = "RES"; - public static final String OK = "OK"; - public static final String KO = "KO"; - public static final String PSP = "pspId"; - public static final String PUBLISHED_GREATER_THAN = "publishedGt"; - public static final String CREATED_GREATER_THAN = "createdGt"; - public static final String CREATED_FROM = "createdFrom"; - public static final String CREATED_TO = "createdTo"; - public static final String ORGANIZATION = "organizationId"; - public static final String IUV = "iuv"; - public static final String IUR = "iur"; - - public static final String FDR = "fdr"; - public static final String REVISION = "revision"; - public static final String PAGE = "page"; - public static final String PAGE_DEAFULT = "1"; - public static final String SIZE = "size"; - public static final String SIZE_DEFAULT = "1000"; - public static final int MAX_PAYMENT = 1000; - - private AppConstant() { - throw new IllegalStateException("Constants class"); - } - - private static final List fdrActionExcludeToSendEvent = new ArrayList<>(); - - static { - fdrActionExcludeToSendEvent.add(FdrActionEnum.INFO); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_CREATE_FLOW); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_DELETE_FLOW); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_ADD_PAYMENT); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_DELETE_PAYMENT); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_PUBLISH); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_GET_ALL_FDR); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_GET_FDR); - // fdrActionExcludeToSendEvent.add(FdrActionEnum.INTERNAL_GET_FDR_PAYMENT); - } - - public static boolean sendReEvent(FdrActionEnum fdrActionEnum) { - return !fdrActionExcludeToSendEvent.contains(fdrActionEnum); - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/util/AppDBUtil.java b/src/main/java/it/gov/pagopa/fdr/util/AppDBUtil.java deleted file mode 100644 index 53695a24..00000000 --- a/src/main/java/it/gov/pagopa/fdr/util/AppDBUtil.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.gov.pagopa.fdr.util; - -import io.quarkus.panache.common.Sort; -import io.quarkus.panache.common.Sort.Direction; -import java.util.List; - -public class AppDBUtil { - - private AppDBUtil() { - throw new IllegalStateException("Utility class"); - } - - public static Sort getSort(List sortColumn) { - Sort sort = Sort.empty(); - if (sortColumn != null && !sortColumn.isEmpty()) { - sortColumn.stream() - .filter(s -> s.replace(",", "").isBlank()) - .forEach( - a -> { - String[] split = a.split(","); - String column = split[0].trim(); - String direction = split[1].trim(); - if (!column.isBlank()) { - if (direction.equalsIgnoreCase("asc")) { - sort.and(column, Direction.Ascending); - } else if (direction.equalsIgnoreCase("desc")) { - sort.and(column, Direction.Descending); - } else { - sort.and(column); - } - } - }); - } - return sort; - } -} diff --git a/src/main/java/it/gov/pagopa/fdr/util/FileUtil.java b/src/main/java/it/gov/pagopa/fdr/util/common/FileUtil.java similarity index 88% rename from src/main/java/it/gov/pagopa/fdr/util/FileUtil.java rename to src/main/java/it/gov/pagopa/fdr/util/common/FileUtil.java index e43e689f..ae31d5e7 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/FileUtil.java +++ b/src/main/java/it/gov/pagopa/fdr/util/common/FileUtil.java @@ -1,7 +1,7 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.util.common; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import it.gov.pagopa.fdr.util.error.exception.common.AppException; import jakarta.enterprise.context.ApplicationScoped; import java.io.BufferedReader; import java.io.IOException; @@ -13,6 +13,7 @@ @ApplicationScoped public class FileUtil { + private final Logger log; public FileUtil(Logger log) { diff --git a/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java b/src/main/java/it/gov/pagopa/fdr/util/common/StringUtil.java similarity index 79% rename from src/main/java/it/gov/pagopa/fdr/util/StringUtil.java rename to src/main/java/it/gov/pagopa/fdr/util/common/StringUtil.java index b624bfb9..1e3197a4 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/StringUtil.java +++ b/src/main/java/it/gov/pagopa/fdr/util/common/StringUtil.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.util.common; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -7,6 +7,8 @@ public class StringUtil { + private StringUtil() {} + public static byte[] zip(String str) throws IOException { byte[] strBytes = str.getBytes(StandardCharsets.UTF_8); ByteArrayOutputStream bais = new ByteArrayOutputStream(strBytes.length); @@ -20,8 +22,13 @@ public static byte[] zip(String str) throws IOException { // Replace newline, carriage return, tab, single quote, double quote, and backslash characters public static String sanitize(String input) { - if (input == null) + if (input == null) { return null; + } return input.replaceAll("[\\n\\r\\t'\"\\\\]", "_"); } + + public static boolean isNullOrBlank(String value) { + return value == null || value.isBlank(); + } } diff --git a/src/main/java/it/gov/pagopa/fdr/util/constant/AppConstant.java b/src/main/java/it/gov/pagopa/fdr/util/constant/AppConstant.java new file mode 100644 index 00000000..5bc06c20 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/constant/AppConstant.java @@ -0,0 +1,18 @@ +package it.gov.pagopa.fdr.util.constant; + +public class AppConstant { + + public static final String SERVICE_CODE_APP = "FDR"; + + public static final String REQUEST = "REQ"; + public static final String RESPONSE = "RES"; + + public static final String OK = "OK"; + public static final String KO = "KO"; + + public static final int MAX_PAYMENT = 1000; + + private AppConstant() { + throw new IllegalStateException("Constants class"); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/constant/ControllerConstants.java b/src/main/java/it/gov/pagopa/fdr/util/constant/ControllerConstants.java new file mode 100644 index 00000000..4e6c95a6 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/constant/ControllerConstants.java @@ -0,0 +1,134 @@ +package it.gov.pagopa.fdr.util.constant; + +public class ControllerConstants { + + public static final String PARAMETER_CREATED_FROM = "createdFrom"; + public static final String PARAMETER_CREATED_TO = "createdTo"; + public static final String PARAMETER_FDR = "fdr"; + public static final String PARAMETER_IUR = "iur"; + public static final String PARAMETER_IUV = "iuv"; + public static final String PARAMETER_ORGANIZATION = "organizationId"; + public static final String PARAMETER_PAGE_INDEX = "page"; + public static final String PARAMETER_PAGE_INDEX_DEFAULT = "1"; + public static final String PARAMETER_PAGE_SIZE = "size"; + public static final String PARAMETER_PAGE_SIZE_DEFAULT = "1000"; + public static final String PARAMETER_PSP = "pspId"; + public static final String PARAMETER_CREATED_GREATER_THAN = "createdGt"; + public static final String PARAMETER_PUBLISHED_GREATER_THAN = "publishedGt"; + public static final String PARAMETER_REVISION = "revision"; + + public static final String URL_PARAMETER_FDR = "fdrs/{" + ControllerConstants.PARAMETER_FDR + "}"; + public static final String URL_PARAMETER_ORGANIZATION = + "organizations/{" + ControllerConstants.PARAMETER_ORGANIZATION + "}"; + public static final String URL_PARAMETER_REVISION = + "revisions/{" + ControllerConstants.PARAMETER_REVISION + "}"; + public static final String URL_PARAMETER_PSP = "psps/{" + ControllerConstants.PARAMETER_PSP + "}"; + + public static final String URL_API_GET_SINGLE_FLOW = + "/{" + + ControllerConstants.PARAMETER_FDR + + "}/" + + ControllerConstants.URL_PARAMETER_REVISION + + "/" + + ControllerConstants.URL_PARAMETER_PSP; + + public static final String URL_API_GET_FLOW_PAYMENTS = + "/{" + + ControllerConstants.PARAMETER_FDR + + "}/" + + ControllerConstants.URL_PARAMETER_REVISION + + "/" + + ControllerConstants.URL_PARAMETER_PSP + + "/payments"; + + public static final String URL_API_CREATE_EMPTY_FLOW = ControllerConstants.URL_PARAMETER_FDR; + + public static final String URL_API_DELETE_FLOW = ControllerConstants.URL_PARAMETER_FDR; + + public static final String URL_API_GET_ALL_NOT_PUBLISHED_FLOWS = "/created"; + + public static final String URL_API_GET_ALL_PUBLISHED_FLOWS = "/published"; + + public static final String URL_API_GET_SINGLE_NOT_PUBLISHED_FLOW = + ControllerConstants.URL_API_GET_ALL_NOT_PUBLISHED_FLOWS + + "/" + + ControllerConstants.URL_PARAMETER_FDR + + "/" + + ControllerConstants.URL_PARAMETER_ORGANIZATION; + + public static final String URL_API_GET_SINGLE_PUBLISHED_FLOW = + ControllerConstants.URL_API_GET_ALL_PUBLISHED_FLOWS + + "/" + + ControllerConstants.URL_PARAMETER_FDR + + "/" + + ControllerConstants.URL_PARAMETER_REVISION + + "/" + + ControllerConstants.URL_PARAMETER_ORGANIZATION; + + public static final String URL_API_GET_PAYMENTS_FOR_NOT_PUBLISHED_FLOW = + ControllerConstants.URL_API_GET_SINGLE_NOT_PUBLISHED_FLOW + "/payments"; + + public static final String URL_API_GET_PAYMENTS_FOR_PUBLISHED_FLOW = + ControllerConstants.URL_API_GET_SINGLE_PUBLISHED_FLOW + "/payments"; + public static final String URL_API_ADD_PAYMENT_IN_FLOW = + "/" + ControllerConstants.URL_PARAMETER_FDR + "/payments/add"; + + public static final String URL_API_DELETE_PAYMENT_IN_FLOW = + "/" + ControllerConstants.URL_PARAMETER_FDR + "/payments/del"; + + public static final String URL_API_PUBLISH_FLOW = + "/" + ControllerConstants.URL_PARAMETER_FDR + "/publish"; + + public static final String URL_CONTROLLER_ORGANIZATIONS = + "/" + ControllerConstants.URL_PARAMETER_ORGANIZATION + "/fdrs"; + + public static final String URL_CONTROLLER_INTERNAL_ORGANIZATIONS = + "/internal" + ControllerConstants.URL_CONTROLLER_ORGANIZATIONS; + + public static final String URL_CONTROLLER_PSPS = "/" + ControllerConstants.URL_PARAMETER_PSP; + + public static final String URL_CONTROLLER_INTERNAL_PSPS = "/internal" + URL_CONTROLLER_PSPS; + + public static final String OPENAPI_BADREQUEST_EXAMPLE = + """ + { + "httpStatusCode": 400, + "httpStatusDescription": "Bad Request", + "appErrorCode": "FDR-XXXX", + "errors": [ + { + "path": "", + "message": "" + } + ] + }"""; + + public static final String OPENAPI_NOTFOUND_EXAMPLE = + """ + { + "httpStatusCode": 404, + "httpStatusDescription": "Not Found", + "appErrorCode": "FDR-XXXX", + "errors": [ + { + "message": "" + } + ] + }"""; + + public static final String OPENAPI_INTERNALSERVERERROR_EXAMPLE = + """ + { + "errorId": "50905466-1881-457b-b42f-fb7b2bfb1610", + "httpStatusCode": 500, + "httpStatusDescription": "Internal Server Error", + "appErrorCode": "FDR-0500", + "errors": [ + { + "message": "An unexpected error has occurred. Please contact support." + } + ] + }"""; + + private ControllerConstants() {} +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/MDCKeys.java b/src/main/java/it/gov/pagopa/fdr/util/constant/MDCKeys.java similarity index 95% rename from src/main/java/it/gov/pagopa/fdr/util/MDCKeys.java rename to src/main/java/it/gov/pagopa/fdr/util/constant/MDCKeys.java index ac6d9224..0faf2fbc 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/MDCKeys.java +++ b/src/main/java/it/gov/pagopa/fdr/util/constant/MDCKeys.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.util.constant; public class MDCKeys { diff --git a/src/main/java/it/gov/pagopa/fdr/util/error/enums/AppErrorCodeMessageEnum.java b/src/main/java/it/gov/pagopa/fdr/util/error/enums/AppErrorCodeMessageEnum.java new file mode 100644 index 00000000..8d531785 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/error/enums/AppErrorCodeMessageEnum.java @@ -0,0 +1,108 @@ +package it.gov.pagopa.fdr.util.error.enums; + +import it.gov.pagopa.fdr.util.constant.AppConstant; +import it.gov.pagopa.fdr.util.logging.AppMessageUtil; +import org.jboss.resteasy.reactive.RestResponse; +import org.jboss.resteasy.reactive.RestResponse.Status; + +public enum AppErrorCodeMessageEnum { + ERROR("0500", "system.error", RestResponse.Status.INTERNAL_SERVER_ERROR, "-"), + + // syntactic errors + BAD_REQUEST("1000", "bad.request", RestResponse.Status.BAD_REQUEST, "-"), + BAD_REQUEST_INPUT_JSON("1001", "bad.request.inputJson", RestResponse.Status.BAD_REQUEST, "-"), + BAD_REQUEST_INPUT_JSON_INSTANT( + "1002", "bad.request.inputJson.instant", RestResponse.Status.BAD_REQUEST, "-"), + BAD_REQUEST_INPUT_JSON_ENUM( + "1003", "bad.request.inputJson.enum", RestResponse.Status.BAD_REQUEST, "-"), + BAD_REQUEST_INPUT_JSON_DESERIALIZE_ERROR( + "1004", "bad.request.inputJson.deserialize", RestResponse.Status.BAD_REQUEST, "-"), + BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT( + "1005", "bad.request.inputJson.notValidJsonFormat", RestResponse.Status.BAD_REQUEST, "-"), + + // semantic errors - cached configuration + PSP_UNKNOWN("2000", "pspId.unknown", RestResponse.Status.BAD_REQUEST, "-"), + PSP_NOT_ENABLED("2001", "pspId.notEnabled", RestResponse.Status.BAD_REQUEST, "-"), + BROKER_UNKNOWN("2002", "brokerId.unknown", RestResponse.Status.BAD_REQUEST, "-"), + BROKER_NOT_ENABLED("2003", "brokerId.notEnabled", RestResponse.Status.BAD_REQUEST, "-"), + CHANNEL_UNKNOWN("2004", "channelId.unknown", RestResponse.Status.BAD_REQUEST, "-"), + CHANNEL_NOT_ENABLED("2005", "channelId.notEnabled", RestResponse.Status.BAD_REQUEST, "-"), + CHANNEL_BROKER_WRONG_CONFIG( + "2006", "channel.broker.wrongConfig", RestResponse.Status.BAD_REQUEST, "-"), + CHANNEL_PSP_WRONG_CONFIG("2007", "channel.psp.wrongConfig", RestResponse.Status.BAD_REQUEST, "-"), + EC_UNKNOWN("2008", "ecId.unknown", RestResponse.Status.BAD_REQUEST, "-"), + EC_NOT_ENABLED("2009", "ecId.notEnabled", RestResponse.Status.BAD_REQUEST, "-"), + + // semantic checks - prepublish-related checks + REPORTING_FLOW_NOT_FOUND("3001", "fdr.notFound", RestResponse.Status.NOT_FOUND, "-"), + REPORTING_FLOW_ALREADY_EXIST("3002", "fdr.alreadyExist", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_WRONG_ACTION("3003", "fdr.wrongAction", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_PSP_ID_NOT_MATCH( + "3004", "fdr.pspId.notMatch", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST( + "3005", "fdr.sameIndexInSameRequest", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX( + "3006", "fdr.duplicateIndex", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX( + "3007", "fdr.noMatchIndex", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_NAME_DATE_WRONG_FORMAT( + "3008", "fdr.name-date.wrongFormat", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_NAME_PSP_WRONG_FORMAT( + "3009", "fdr.name-psp.wrongFormat", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_NAME_NOT_MATCH("3010", "fdr.name.notMatch", RestResponse.Status.BAD_REQUEST, "-"), + // EVENT_HUB_RE_PARSE_JSON("2021", "eHub.re.parse", Status.INTERNAL_SERVER_ERROR, "-"), + // EVENT_HUB_RE_TOO_LARGE("0722", "eHub.re.tooLarge", Status.INTERNAL_SERVER_ERROR, "-"), + + // semantic checks - publish-related checks + REPORTING_FLOW_WRONG_TOT_PAYMENT( + "4001", "fdr.wrongTotPayment", RestResponse.Status.BAD_REQUEST, "-"), + REPORTING_FLOW_WRONG_SUM_PAYMENT( + "4002", "fdr.wrongSumPayment", RestResponse.Status.BAD_REQUEST, "-"), + // FDR_HISTORY_VALID_JSON_ERROR("0725", "fdr.fdrHistoryJsonValidationError", + // Status.INTERNAL_SERVER_ERROR, "-"), + // FDR_HISTORY_UPLOAD_JSON_BLOB_ERROR("0726", "fdr.fdrHistoryUploadJsonError", + // Status.INTERNAL_SERVER_ERROR, "-"), + // FDR_HISTORY_JSON_PROCESSING_ERROR("0727", "fdr.fdrHistoryJsonProcessingError", + // Status.INTERNAL_SERVER_ERROR, "-"), + // FDR_HISTORY_SAVE_TABLE_STORAGE_ERROR("0728", "fdr.fdrHistorySaveOnTableStorageError", + // Status.INTERNAL_SERVER_ERROR, "-"), + + // other checks + FILE_UTILS_CONVERSION_ERROR( + "5000", "fdr.fileUtilsConversionError", Status.INTERNAL_SERVER_ERROR, "-"), + FILE_UTILS_FILE_NOT_FOUND("5001", "fdr.fileUtilsFileNotFound", Status.INTERNAL_SERVER_ERROR, "-"), + COMPRESS_JSON("5002", "compress.json.error", Status.INTERNAL_SERVER_ERROR, "-"); + + private final String errorCode; + private final String errorMessageKey; + private final RestResponse.Status httpStatus; + private final String openAPIDescription; + + AppErrorCodeMessageEnum( + String errorCode, + String errorMessageKey, + RestResponse.Status httpStatus, + String openAPIDescription) { + + this.errorCode = errorCode; + this.errorMessageKey = errorMessageKey; + this.httpStatus = httpStatus; + this.openAPIDescription = openAPIDescription; + } + + public String errorCode() { + return AppConstant.SERVICE_CODE_APP + "-" + errorCode; + } + + public String message(Object... args) { + return AppMessageUtil.getMessage(errorMessageKey, args); + } + + public RestResponse.Status httpStatus() { + return httpStatus; + } + + public String openAPIDescription() { + return this.openAPIDescription; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/error/exception/common/AppException.java b/src/main/java/it/gov/pagopa/fdr/util/error/exception/common/AppException.java new file mode 100644 index 00000000..6f5406a7 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/error/exception/common/AppException.java @@ -0,0 +1,37 @@ +package it.gov.pagopa.fdr.util.error.exception.common; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import java.io.Serializable; +import lombok.Getter; + +@Getter +public class AppException extends RuntimeException { + + private final transient AppErrorCodeMessageEnum codeMessage; + + private final transient Object[] args; + + public AppException(Throwable cause, AppErrorCodeMessageEnum codeMessage) { + super(cause); + this.codeMessage = codeMessage; + this.args = null; + } + + public AppException(Throwable cause, AppErrorCodeMessageEnum codeMessage, Object... args) { + super(cause); + this.codeMessage = codeMessage; + this.args = args; + } + + public AppException(AppErrorCodeMessageEnum codeMessage) { + super(); + this.codeMessage = codeMessage; + this.args = null; + } + + public AppException(AppErrorCodeMessageEnum codeMessage, Serializable... args) { + super(); + this.codeMessage = codeMessage; + this.args = args; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/PersistenceFailureException.java b/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/PersistenceFailureException.java new file mode 100644 index 00000000..3124bdc8 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/PersistenceFailureException.java @@ -0,0 +1,8 @@ +package it.gov.pagopa.fdr.util.error.exception.persistence; + +public class PersistenceFailureException extends Exception { + + public PersistenceFailureException(Exception e) { + super(e); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/TransactionRollbackException.java b/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/TransactionRollbackException.java new file mode 100644 index 00000000..e12c7757 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/error/exception/persistence/TransactionRollbackException.java @@ -0,0 +1,8 @@ +package it.gov.pagopa.fdr.util.error.exception.persistence; + +public class TransactionRollbackException extends RuntimeException { + + public TransactionRollbackException(Exception e) { + super(e); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/AppMessageUtil.java b/src/main/java/it/gov/pagopa/fdr/util/logging/AppMessageUtil.java similarity index 97% rename from src/main/java/it/gov/pagopa/fdr/util/AppMessageUtil.java rename to src/main/java/it/gov/pagopa/fdr/util/logging/AppMessageUtil.java index 25d1c8d3..ce311c98 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/AppMessageUtil.java +++ b/src/main/java/it/gov/pagopa/fdr/util/logging/AppMessageUtil.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.util.logging; import java.text.MessageFormat; import java.util.Locale; diff --git a/src/main/java/it/gov/pagopa/fdr/util/openapi/APIAppErrorMetadata.java b/src/main/java/it/gov/pagopa/fdr/util/openapi/APIAppErrorMetadata.java new file mode 100644 index 00000000..9d899915 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/openapi/APIAppErrorMetadata.java @@ -0,0 +1,14 @@ +package it.gov.pagopa.fdr.util.openapi; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface APIAppErrorMetadata { + + AppErrorCodeMessageEnum[] errors() default {}; +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/openapi/APITableMetadata.java b/src/main/java/it/gov/pagopa/fdr/util/openapi/APITableMetadata.java new file mode 100644 index 00000000..ec5b3722 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/openapi/APITableMetadata.java @@ -0,0 +1,76 @@ +package it.gov.pagopa.fdr.util.openapi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface APITableMetadata { + + /** The field that define if the API is used for internal communications. */ + boolean internal() default true; + + /** The field that define if the API is exposed to public uses. */ + boolean external() default true; + + /** + * The field that define if the communication with the API can be executed in synchronous mode. + */ + APISynchronism synchronism() default APISynchronism.SYNC; + + /** The field that define if the API is secured with an authorization strategy. */ + APISecurityMode authorization() default APISecurityMode.NONE; + + /** The field that define if the API is secured with an authentication strategy. */ + APISecurityMode authentication() default APISecurityMode.NONE; + + /** The field that define the estimated number of invocation per second for this API. */ + float tps() default 1; + + /** The field that define if the API is idempotent. */ + boolean idempotency() default true; + + /** The field that define if the API operates without volatile state. */ + boolean stateless() default true; + + /** The field that define what kind of operation the API executes. */ + ReadWrite readWriteIntense() default ReadWrite.READ; + + /** The field that define if the API is cacheable. */ + boolean cacheable() default false; + + @Getter + @AllArgsConstructor + enum ReadWrite { + NONE(""), + READ("Read"), + WRITE("Write"), + BOTH("Read and Write"); + + public final String value; + } + + @Getter + @AllArgsConstructor + enum APISecurityMode { + NONE("N"), + APIKEY("Y (Subscription Key)"), + JWT("Y (JWT Token)"), + AUTHORIZER("Y (Authorizer)"); + + public final String value; + } + + @Getter + @AllArgsConstructor + enum APISynchronism { + SYNC("Synchronous"), + ASYNC("Asynchronous"); + + public final String value; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/openapi/OpenAPIGenerator.java b/src/main/java/it/gov/pagopa/fdr/util/openapi/OpenAPIGenerator.java new file mode 100644 index 00000000..6c62ca9a --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/openapi/OpenAPIGenerator.java @@ -0,0 +1,214 @@ +package it.gov.pagopa.fdr.util.openapi; + +import io.quarkus.smallrye.openapi.OpenApiFilter; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import org.eclipse.microprofile.config.inject.ConfigProperty; +import org.eclipse.microprofile.openapi.OASFactory; +import org.eclipse.microprofile.openapi.OASFilter; +import org.eclipse.microprofile.openapi.models.OpenAPI; +import org.eclipse.microprofile.openapi.models.Operation; +import org.eclipse.microprofile.openapi.models.PathItem; +import org.eclipse.microprofile.openapi.models.Paths; +import org.jboss.jandex.IndexView; + +@OpenApiFilter(OpenApiFilter.RunStage.BUILD) +public class OpenAPIGenerator implements OASFilter { + + private static final String TABLE_SEPARATOR = " | "; + + @ConfigProperty(name = "app.version", defaultValue = "0.0.0") + String version; + + private IndexView view; + + public OpenAPIGenerator(IndexView view) { + this.view = view; + } + + @Override + public void filterOpenAPI(OpenAPI openAPI) { + + openAPI.setInfo( + OASFactory.createInfo() + .title("FDR - Flussi di Rendicontazione") + .description(getMainDescription()) + .version(version) + .termsOfService("https://www.pagopa.gov.it/")); + openAPI.setServers( + List.of(OASFactory.createServer().url("http://localhost:8080/").description("Localhost"))); + + updateAPIsWithTableMetadata(openAPI.getPaths()); + } + + private static String getMainDescription() { + + StringBuilder builder = new StringBuilder(); + builder.append("Manage FDR (aka \"Flussi di Rendicontazione\") exchanged between PSP and EC"); + builder.append("\n\n## OPERATIONAL ERROR CODES\n"); + builder.append("\n
Details\n"); + builder.append(generateOperationalErrorCodeSection()); + return builder.toString(); + } + + private static String generateOperationalErrorCodeSection() { + + StringBuilder builder = new StringBuilder(); + builder + .append("NAME") + .append(TABLE_SEPARATOR) + .append("CODE") + .append(TABLE_SEPARATOR) + .append("DESCRIPTION") + .append("\n"); + builder + .append("-") + .append(TABLE_SEPARATOR) + .append("-") + .append(TABLE_SEPARATOR) + .append("-") + .append("\n"); + + for (AppErrorCodeMessageEnum appError : AppErrorCodeMessageEnum.values()) { + + String detail = appError.openAPIDescription(); + builder + .append("**") + .append(appError.errorCode()) + .append("**") + .append(TABLE_SEPARATOR) + .append("*") + .append(appError.name()) + .append("*") + .append(TABLE_SEPARATOR) + .append(detail) + .append("\n"); + } + + return builder.toString(); + } + + private static void updateAPIsWithTableMetadata(Paths paths) { + + for (PathItem path : paths.getPathItems().values()) { + List operationPerSamePath = path.getOperations().values().stream().toList(); + for (Operation operation : operationPerSamePath) { + operation.setDescription("## Description:\n" + operation.getDescription()); + extractTableMetadata(operation); + } + } + } + + private static void extractTableMetadata(Operation operation) { + try { + String[] operationIdMethodReference = operation.getOperationId().split("\\."); + if (operationIdMethodReference.length == 2) { + + Class controllerClass = + Class.forName( + "it.gov.pagopa.fdr.controller.interfaces.controller." + + operationIdMethodReference[0]); + Optional method = + Arrays.stream(controllerClass.getMethods()) + .filter(m -> m.getName().equals(operationIdMethodReference[1])) + .findFirst(); + + if (method.isPresent()) { + // write app error that can be returned as response + APIAppErrorMetadata appErrorMetadata = + method.get().getAnnotation(APIAppErrorMetadata.class); + if (appErrorMetadata != null) { + operation.setDescription( + operation.getDescription() + "\n\n" + buildErrorData(appErrorMetadata)); + } + // write table related to API characteristics + APITableMetadata tableMetadata = method.get().getAnnotation(APITableMetadata.class); + if (tableMetadata != null) { + operation.setDescription( + operation.getDescription() + "\n\n" + buildTableData(tableMetadata)); + } + } + } + } catch (ClassNotFoundException e) { + // skip extraction + } + } + + private static String buildErrorData(APIAppErrorMetadata annotation) { + StringBuilder builder = new StringBuilder(); + builder.append("## Error codes:").append("\n"); + + builder.append("APPLICATIVE CODE").append(TABLE_SEPARATOR); + builder.append("HTTP CODE").append(TABLE_SEPARATOR).append("MESSAGE\n"); + builder.append("-").append(TABLE_SEPARATOR).append("-").append(TABLE_SEPARATOR).append("-\n"); + + for (AppErrorCodeMessageEnum error : annotation.errors()) { + builder.append("**").append(error.errorCode()).append("**").append(TABLE_SEPARATOR); + builder.append(error.httpStatus().getStatusCode()).append(TABLE_SEPARATOR); + builder.append(error.message()).append("\n"); + } + return builder.toString(); + } + + private static String buildTableData(APITableMetadata annotation) { + return "## API properties:\n" + + "PROPERTY" + + TABLE_SEPARATOR + + "VALUE\n" + + "-" + + TABLE_SEPARATOR + + "-\n" + + "***Internal***" + + TABLE_SEPARATOR + + parseBoolToYN(annotation.internal()) + + "\n" + + "***External***" + + TABLE_SEPARATOR + + parseBoolToYN(annotation.external()) + + "\n" + + "***Synchronous***" + + TABLE_SEPARATOR + + annotation.synchronism().value + + "\n" + + "***Authorization***" + + TABLE_SEPARATOR + + annotation.authorization().value + + "\n" + + "***Authentication***" + + TABLE_SEPARATOR + + annotation.authentication().value + + "\n" + + "***TPS***" + + TABLE_SEPARATOR + + annotation.tps() + + "/sec" + + "\n" + + "***Idempotency***" + + TABLE_SEPARATOR + + parseBoolToYN(annotation.idempotency()) + + "\n" + + "***Stateless***" + + TABLE_SEPARATOR + + parseBoolToYN(annotation.stateless()) + + "\n" + + "***Read/Write Intensive***" + + TABLE_SEPARATOR + + parseReadWrite(annotation.readWriteIntense()) + + "\n" + + "***Cacheable***" + + TABLE_SEPARATOR + + parseBoolToYN(annotation.cacheable()) + + "\n"; + } + + private static String parseReadWrite(APITableMetadata.ReadWrite readWrite) { + return readWrite.getValue(); + } + + private static String parseBoolToYN(boolean value) { + return value ? "Y" : "N"; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/AppReUtil.java b/src/main/java/it/gov/pagopa/fdr/util/re/AppReUtil.java similarity index 85% rename from src/main/java/it/gov/pagopa/fdr/util/AppReUtil.java rename to src/main/java/it/gov/pagopa/fdr/util/re/AppReUtil.java index dda2f0e7..802ea9fa 100644 --- a/src/main/java/it/gov/pagopa/fdr/util/AppReUtil.java +++ b/src/main/java/it/gov/pagopa/fdr/util/re/AppReUtil.java @@ -1,6 +1,7 @@ -package it.gov.pagopa.fdr.util; +package it.gov.pagopa.fdr.util.re; -import it.gov.pagopa.fdr.service.re.model.FdrActionEnum; +import it.gov.pagopa.fdr.controller.interfaces.annotation.Re; +import it.gov.pagopa.fdr.service.model.re.FdrActionEnum; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; diff --git a/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationArgs.java b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationArgs.java new file mode 100644 index 00000000..6bc4629c --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationArgs.java @@ -0,0 +1,35 @@ +package it.gov.pagopa.fdr.util.validator; + +import java.util.HashMap; +import java.util.Map; + +public class ValidationArgs { + + private Map data; + + private ValidationArgs() { + this.data = new HashMap<>(); + } + + public static ValidationArgs newArgs() { + return new ValidationArgs(); + } + + public ValidationArgs addArgument(String key, Object value) { + this.data.put(key.toLowerCase(), value); + return this; + } + + public T getArgument(String key, Class clazz) { + T result = null; + try { + Object rawResult = this.data.get(key.toLowerCase()); + if (rawResult != null) { + result = clazz.cast(rawResult); + } + } catch (ClassCastException e) { + // nothing to do, return a null value + } + return result; + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationResult.java b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationResult.java new file mode 100644 index 00000000..163d4f06 --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationResult.java @@ -0,0 +1,36 @@ +package it.gov.pagopa.fdr.util.validator; + +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import java.io.Serializable; +import lombok.Getter; + +public class ValidationResult { + + private final boolean isValid; + + @Getter private final AppErrorCodeMessageEnum error; + + @Getter private final Serializable[] errorArgs; + + private ValidationResult(boolean isValid, AppErrorCodeMessageEnum error, String... errorArgs) { + this.isValid = isValid; + this.error = error; + this.errorArgs = errorArgs; + } + + public static ValidationResult asValid() { + return new ValidationResult(true, null); + } + + public static ValidationResult asInvalid(AppErrorCodeMessageEnum error, String... errorArgs) { + return new ValidationResult(false, error, errorArgs); + } + + public boolean isValid() { + return this.isValid; + } + + public boolean isInvalid() { + return !isValid(); + } +} diff --git a/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationStep.java b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationStep.java new file mode 100644 index 00000000..31b0015e --- /dev/null +++ b/src/main/java/it/gov/pagopa/fdr/util/validator/ValidationStep.java @@ -0,0 +1,55 @@ +package it.gov.pagopa.fdr.util.validator; + +public abstract class ValidationStep { + + private ValidationStep nextStep; + + /** + * @param nextStep + * @return + */ + public ValidationStep linkTo(ValidationStep nextStep) { + + // no next step already defined, can link to this step + if (this.nextStep == null) { + + this.nextStep = nextStep; + } + + /* + Next step was already defined in previous invocation, + add it as last step for the validation chain's last-ring + */ + else { + + ValidationStep analyzedStep = this.nextStep; + while (analyzedStep.nextStep != null) { + analyzedStep = analyzedStep.nextStep; + } + analyzedStep.nextStep = nextStep; + } + + return this; + } + + /** + * @param args + * @return + */ + protected ValidationResult checkNext(ValidationArgs args) { + + ValidationResult result; + if (nextStep == null) { + result = ValidationResult.asValid(); + } else { + result = nextStep.validate(args); + } + return result; + } + + /** + * @param args + * @return + */ + public abstract ValidationResult validate(ValidationArgs args); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 83107936..29b2b2b8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,71 +4,46 @@ app.name=${APP_NAME:pagopafdr} app.version=${APP_VERSION:0.0.0-SNAPSHOT} app.environment=${APP_ENVIRONMENT:local} - ################### ## COMMON OVERRIDE ################### quarkus.native.additional-build-args=-H:ResourceConfigurationFiles=resources-config.json quarkus.default-locale=it-IT quarkus.locales=it-IT - ################### ## LOG ################### quarkus.log.file.json=false quarkus.log.level=INFO quarkus.log.category."it.gov.pagopa.fdr".level=${LOG_LEVEL:INFO} - %dev.quarkus.log.console.json=false %test.quarkus.log.console.json=false -#%openapi.quarkus.log.console.json=false %openapi_internal.quarkus.log.console.json=false %openapi_psp.quarkus.log.console.json=false %openapi_organization.quarkus.log.console.json=false - quarkus.log.console.json.additional-field."app_name".value=${app.name} quarkus.log.console.json.additional-field."app_version".value=${app.version} quarkus.log.console.json.additional-field."app_environment".value=${app.environment} - ################### ## OPENTELEMETRY ################### quarkus.otel.enabled=true %dev.quarkus.otel.enabled=false %test.quarkus.otel.enabled=false -#%openapi.quarkus.otel.enabled=false %openapi_internal.quarkus.otel.enabled=false %openapi_psp.quarkus.otel.enabled=false %openapi_organization.quarkus.otel.enabled=false - quarkus.otel.exporter.otlp.traces.endpoint=${OTEL_ENDPOINT:http://localhost:4317} quarkus.otel.exporter.otlp.traces.headers=${OTEL_AUTH_BEARER:Authorization=Bearer my-token} - %docker.quarkus.otel.exporter.otlp.traces.endpoint=http://otel-collector:4317 %docker.quarkus.otel.exporter.otlp.traces.headers=Authorization=Bearer my-token - #quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p traceId=%X{traceId}, parentId=%X{parentId}, spanId=%X{spanId}, sampled=%X{sampled} [%c{3.}] (%t) %s%e%n - -################### -## OPENAPI - SWAGGER -################### -quarkus.smallrye-openapi.info-title=FDR - Flussi di rendicontazione (${app.environment}) -%dev.quarkus.smallrye-openapi.info-title=FDR - Flussi di rendicontazione (DEV) -%test.quarkus.smallrye-openapi.info-title=FDR - Flussi di rendicontazione (TEST) -%docker.quarkus.smallrye-openapi.info-title=FDR - Flussi di rendicontazione (DOCKER) - -quarkus.smallrye-openapi.info-description=Manage FDR ( aka "Flussi di Rendicontazione" ) exchanged between PSP and EC -quarkus.smallrye-openapi.info-terms-of-service=https://www.pagopa.gov.it/ -quarkus.smallrye-openapi.servers=http://localhost:8080/ -#quarkus.smallrye-openapi.servers=\\$\{host\}/fdr/api/v1 - APIM - ################### ## DATABASE ################### quarkus.mongodb.connection-string=${MONGODB_CONNECTION_STRING:${mockserver.mongodb.connection-string}} -%dev.quarkus.mongodb.connection-string=mongodb://root:example@localhost:27017/ +#%dev.quarkus.mongodb.connection-string=mongodb://root:example@localhost:27017/ quarkus.mongodb.database=fdr - ################### ## ADAPTER API CONFIG CACHE ################### @@ -84,7 +59,6 @@ adapter.api_config_cache.url=${ADAPTER_API_CONFIG_CACHE_URL:${quarkus.mockserver %openapi_internal.adapter.api_config_cache.url=na %openapi_psp.adapter.api_config_cache.url=na %openapi_organization.adapter.api_config_cache.url=na - ################### ## SCHEDULER ################### @@ -93,133 +67,20 @@ adapter.api_config_cache.url=${ADAPTER_API_CONFIG_CACHE_URL:${quarkus.mockserver %openapi_internal.quarkus.scheduler.enabled=false %openapi_psp.quarkus.scheduler.enabled=false %openapi_organization.quarkus.scheduler.enabled=false - # By default, the syntax used for cron expressions is based on Quartz - https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html # You can change the syntax using the following property: # quarkus.scheduler.cron-type=unix api_config_cache.cron.expr=${ADAPTER_API_CONFIG_CACHE_CRON:*/15 * * * * ?} - -################### -## QUEUE CONVERSION -################### -queue.conversion.enabled=true -%dev.queue.conversion.enabled=true -%test.queue.conversion.enabled=false -#%openapi.queue.conversion.enabled=false -%openapi_internal.queue.conversion.enabled=false -%openapi_psp.queue.conversion.enabled=false -%openapi_organization.queue.conversion.enabled=false - -queue.conversion.connect-str=${QUEUE_CONVERSION_CONNECTION_STRING:${mockserver.azurite.connection-string}} -%dev.queue.conversion.connect-str=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; -#%openapi.queue.conversion.connect-str=na -%openapi_internal.queue.conversion.connect-str=na -%openapi_psp.queue.conversion.connect-str=na -%openapi_organization.queue.conversion.connect-str=na - -queue.conversion.name=${QUEUE_CONVERSION_NAME:${mockserver.azurite.queue-name}} -%dev.queue.conversion.name=queueconversion -#%openapi.queue.conversion.name=na -%openapi_internal.queue.conversion.name=na -%openapi_psp.queue.conversion.name=na -%openapi_organization.queue.conversion.name=na - -################### -## EVENT HUB RE -################### -eHub.re.enabled=true -%dev.eHub.re.enabled=true -%test.eHub.re.enabled=false -#%openapi.eHub.re.enabled=false -%openapi_internal.eHub.re.enabled=false -%openapi_psp.eHub.re.enabled=false -%openapi_organization.eHub.re.enabled=false - -#per il run inserire l'env nel proprio profilo -ehub.re.connect-str=${EVENT_HUB_RE_CONNECTION_STRING:na} -%test.ehub.re.connect-str=na -#%openapi.ehub.re.connect-str=na -%openapi_internal.ehub.re.connect-str=na -%openapi_psp.ehub.re.connect-str=na -%openapi_organization.ehub.re.connect-str=na - -ehub.re.name=${EVENT_HUB_RE_NAME:fdr-re} -%dev.ehub.re.name=fdr-re -#%openapi.ehub.re.name=na -%openapi_internal.ehub.re.name=na -%openapi_psp.ehub.re.name=na -%openapi_organization.ehub.re.name=na - -blob.re.connect-str=${BLOB_RE_CONNECTION_STRING:${mockserver.azurite.connection-string}} -%dev.blob.re.connect-str=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; -#%openapi.blob.re.connect-str=na -%openapi_internal.blob.re.connect-str=na -%openapi_psp.blob.re.connect-str=na -%openapi_organization.blob.re.connect-str=na - -blob.re.containername=${BLOB_RE_CONTAINER_NAME:${mockserver.azurite.container-name}} -%dev.blob.re.containername=blobcontainerre -#%openapi.blob.re.containername=na -%openapi_internal.blob.re.containername=na -%openapi_psp.blob.re.containername=na -%openapi_organization.blob.re.containername=na - -################### -## BLOB HISTORY -################### -history.enabled=true -%dev.history.enabled=true -%test.history.enabled=true -%openapi_internal.history.enabled=false -%openapi_psp.history.enabled=false -%openapi_organization.history.enabled=false - -blob.history.connect-str=${BLOB_HISTORY_CONNECTION_STRING:${mockserver.azurite.connection-string}} -%dev.blob.history.connect-str=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; -%openapi_internal.blob.history.connect-str=na -%openapi_psp.blob.history.connect-str=na -%openapi_organization.blob.history.connect-str=na - -blob.history.containername=${BLOB_HISTORY_CONTAINER_NAME:${mockserver.azurite.history.container-name}} -%dev.blob.history.containername=fdrhistory -%openapi_internal.blob.history.containername=na -%openapi_psp.blob.history.containername=na -%openapi_organization.blob.history.containername=na - -table.history.connect-str=${TABLE_HISTORY_CONNECTION_STRING:${mockserver.azurite.connection-string}} -%dev.table.history.connect-str=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1; -%openapi_internal.table.history.connect-str=na -%openapi_psp.table.history.connect-str=na -%openapi_organization.table.history.connect-str=na - -table.history.tablename.fdrpublish=${TABLE_HISTORY_FDR_PUBLISH_TABLE:${mockserver.azurite.table.fdrpublish}} -%dev.table.history.tablename.fdrpublish=fdrpublish -%openapi_internal.table.history.tablename.fdrpublish=na -%openapi_psp.table.history.tablename.fdrpublish=na -%openapi_organization.table.history.tablename.fdrpublish=na - -table.history.tablename.fdrpaymentpublish=${TABLE_HISTORY_FDR_PAYMENT_PUBLISH_TABLE:${mockserver.azurite.table.fdrpaymentpublish}} -%dev.table.history.tablename.fdrpaymentpublish=fdrpaymentpublish -%openapi_internal.table.history.tablename.fdrpaymentpublish=na -%openapi_psp.table.history.tablename.fdrpaymentpublish=na -%openapi_organization.table.history.tablename.fdrpaymentpublish=na - -json.schema.version=V1 - ################### ## OPENAPI FILTER ################### #operations.filter=".*" - %openapi_internal.operations.filter=/internal/.* -%openapi_internal.mp.openapi.filter=it.gov.pagopa.fdr.util.NoInternalSchemaFilter - +%openapi_internal.mp.openapi.filter=it.gov.pagopa.fdr.controller.middleware.filter.NoInternalSchemaFilter %openapi_psp.operations.filter=/(info|psps/).* -%openapi_psp.mp.openapi.filter=it.gov.pagopa.fdr.util.NoInternalSchemaFilter - +%openapi_psp.mp.openapi.filter=it.gov.pagopa.fdr.controller.middleware.filter.NoInternalSchemaFilter %openapi_organization.operations.filter=/(info|organizations/).* -%openapi_organization.mp.openapi.filter=it.gov.pagopa.fdr.util.NoInternalSchemaFilter - +%openapi_organization.mp.openapi.filter=it.gov.pagopa.fdr.controller.middleware.filter.NoInternalSchemaFilter ############## # MOCK SERVER ############## diff --git a/src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceIT.java b/src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerIT.java similarity index 57% rename from src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceIT.java rename to src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerIT.java index 49d6707a..5f674961 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceIT.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerIT.java @@ -1,8 +1,8 @@ -package it.gov.pagopa.fdr.rest.info; +package it.gov.pagopa.fdr.controller.info; import io.quarkus.test.junit.QuarkusIntegrationTest; @QuarkusIntegrationTest -class InfoResourceIT extends InfoResourceTest { +class InfoControllerIT extends InfoControllerTest { // Execute the same tests but in packaged mode. } diff --git a/src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceTest.java b/src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerTest.java similarity index 83% rename from src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerTest.java index 301c97db..ae558872 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/info/InfoResourceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/info/InfoControllerTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.info; +package it.gov.pagopa.fdr.controller.info; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.equalTo; @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; @QuarkusTest -class InfoResourceTest { +class InfoControllerTest { String name = "pagopafdr"; diff --git a/src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceIT.java b/src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceIT.java similarity index 80% rename from src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceIT.java rename to src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceIT.java index 136728f2..fcbbed2c 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceIT.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceIT.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.organizations; +package it.gov.pagopa.fdr.controller.organizations; import io.quarkus.test.junit.QuarkusIntegrationTest; diff --git a/src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceTest.java b/src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceTest.java similarity index 87% rename from src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceTest.java index 20756bb7..23520fb1 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/organizations/InternalOrganizationResourceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/organizations/InternalOrganizationResourceTest.java @@ -1,7 +1,11 @@ -package it.gov.pagopa.fdr.rest.organizations; +package it.gov.pagopa.fdr.controller.organizations; import static io.restassured.RestAssured.given; -import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.*; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.EC_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.HEADER; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE_2; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE_NOT_ENABLED; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.containsInAnyOrder; @@ -14,17 +18,17 @@ import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; -import it.gov.pagopa.fdr.rest.model.PaymentStatusEnum; -import it.gov.pagopa.fdr.rest.model.ReportingFlowStatusEnum; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.enums.ReportingFlowStatusEnum; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.enums.PaymentStatusEnum; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; import it.gov.pagopa.fdr.test.util.AzuriteResource; import it.gov.pagopa.fdr.test.util.MongoResource; import it.gov.pagopa.fdr.test.util.TestUtil; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,7 +40,7 @@ class InternalOrganizationResourceTest { private static final String GET_ALL_PUBLISHED_FLOW_URL = - "/internal/organizations/%s/fdrs?" + AppConstant.PSP + "=%s"; + "/internal/organizations/%s/fdrs?" + ControllerConstants.PARAMETER_PSP + "=%s"; private static final String GET_REPORTING_FLOW_URL = "/internal/organizations/%s/fdrs/%s/revisions/%s/psps/%s"; private static final String GET_REPORTING_FLOW_PAYMENTS_URL = @@ -49,7 +53,7 @@ void testOrganization_getAllPublishedFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_PUBLISHED_FLOW_URL.formatted(EC_CODE, PSP_CODE); - GetAllResponse res = + PaginatedFlowsResponse res = given() .header(HEADER) .when() @@ -57,7 +61,7 @@ void testOrganization_getAllPublishedFlow_Ok() { .then() .statusCode(200) .extract() - .as(GetAllResponse.class); + .as(PaginatedFlowsResponse.class); assertThat(res.getCount(), greaterThan(0L)); assertThat( res.getData(), @@ -72,7 +76,7 @@ void testOrganization_getAllPublishedFlow_OkNoResults() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_PUBLISHED_FLOW_URL.formatted(EC_CODE, PSP_CODE_2); - GetAllResponse res = + PaginatedFlowsResponse res = given() .header(HEADER) .when() @@ -80,7 +84,7 @@ void testOrganization_getAllPublishedFlow_OkNoResults() { .then() .statusCode(200) .extract() - .as(GetAllResponse.class); + .as(PaginatedFlowsResponse.class); assertThat(res.getCount(), equalTo(0L)); } @@ -136,7 +140,7 @@ void testOrganization_getReportingFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_REPORTING_FLOW_URL.formatted(EC_CODE, flowName, 1, PSP_CODE); - GetResponse res = + SingleFlowResponse res = given() .header(HEADER) .when() @@ -144,7 +148,7 @@ void testOrganization_getReportingFlow_Ok() { .then() .statusCode(200) .extract() - .as(GetResponse.class); + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getReceiver().getOrganizationId(), equalTo(EC_CODE)); assertThat(res.getSender().getPspId(), equalTo(PSP_CODE)); @@ -160,7 +164,7 @@ void testOrganization_getReportingFlow_revision_2_OK() { TestUtil.pspSunnyDay(flowName); String url = GET_REPORTING_FLOW_URL.formatted(EC_CODE, flowName, 2, PSP_CODE); - GetResponse res = + SingleFlowResponse res = given() .header(HEADER) .when() @@ -168,7 +172,7 @@ void testOrganization_getReportingFlow_revision_2_OK() { .then() .statusCode(200) .extract() - .as(GetResponse.class); + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getRevision(), equalTo(2L)); assertThat(res.getStatus(), equalTo(ReportingFlowStatusEnum.PUBLISHED)); @@ -209,7 +213,7 @@ void testOrganization_getReportingFlowPayments_Ok() { TestUtil.pspSunnyDay(flowName); String url = GET_REPORTING_FLOW_PAYMENTS_URL.formatted(EC_CODE, flowName, 1, PSP_CODE); - GetPaymentResponse res = + PaginatedPaymentsResponse res = given() .header(HEADER) .when() @@ -217,7 +221,7 @@ void testOrganization_getReportingFlowPayments_Ok() { .then() .statusCode(200) .extract() - .as(GetPaymentResponse.class); + .as(PaginatedPaymentsResponse.class); assertThat(res.getCount(), equalTo(5L)); List expectedList = List.of( diff --git a/src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceIT.java b/src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceIT.java similarity index 79% rename from src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceIT.java rename to src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceIT.java index 6b6b6f62..2d7cef32 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceIT.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceIT.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.organizations; +package it.gov.pagopa.fdr.controller.organizations; import io.quarkus.test.junit.QuarkusIntegrationTest; diff --git a/src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceTest.java b/src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceTest.java similarity index 76% rename from src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceTest.java index 2d95fc3f..ddd18e57 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/organizations/OrganizationResourceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/organizations/OrganizationResourceTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.organizations; +package it.gov.pagopa.fdr.controller.organizations; import static io.restassured.RestAssured.given; import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.EC_CODE; @@ -19,18 +19,18 @@ import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; -import it.gov.pagopa.fdr.rest.model.Payment; -import it.gov.pagopa.fdr.rest.model.PaymentStatusEnum; -import it.gov.pagopa.fdr.rest.model.ReportingFlowStatusEnum; -import it.gov.pagopa.fdr.rest.organizations.response.GetAllResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.enums.ReportingFlowStatusEnum; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.controller.model.payment.enums.PaymentStatusEnum; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; import it.gov.pagopa.fdr.test.util.AzuriteResource; import it.gov.pagopa.fdr.test.util.MongoResource; import it.gov.pagopa.fdr.test.util.TestUtil; -import it.gov.pagopa.fdr.util.AppConstant; +import it.gov.pagopa.fdr.util.constant.ControllerConstants; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,18 +40,22 @@ @QuarkusTestResource(MongoResource.class) @QuarkusTestResource(AzuriteResource.class) class OrganizationResourceTest { - private static final String GET_ALL_PUBLISHED_FLOW_URL = "/organizations/%s/fdrs?"+ AppConstant.PSP +"=%s"; + + private static final String GET_ALL_PUBLISHED_FLOW_URL = + "/organizations/%s/fdrs?" + ControllerConstants.PARAMETER_PSP + "=%s"; private static final String GET_REPORTING_FLOW_URL = "/organizations/%s/fdrs/%s/revisions/%s/psps/%s"; private static final String GET_REPORTING_FLOW_PAYMENTS_URL = "/organizations/%s/fdrs/%s/revisions/%s/psps/%s/payments"; - /** ############### getAllPublishedFlow ################ */ + /** + * ############### getAllPublishedFlow ################ + */ @Test @DisplayName("ORGANIZATIONS - OK - getAllPublishedFlow") void testOrganization_getAllPublishedFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_PUBLISHED_FLOW_URL.formatted(EC_CODE, PSP_CODE); - GetAllResponse res = + PaginatedFlowsResponse res = given() .header(HEADER) .when() @@ -59,7 +63,7 @@ void testOrganization_getAllPublishedFlow_Ok() { .then() .statusCode(200) .extract() - .as(GetAllResponse.class); + .as(PaginatedFlowsResponse.class); assertThat(res.getCount(), greaterThan(0L)); assertThat(res.getData(), hasItem(anyOf( hasProperty("name", equalTo(flowName)), @@ -73,14 +77,14 @@ void testOrganization_getAllPublishedFlow_OkNoResults() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_PUBLISHED_FLOW_URL.formatted(EC_CODE, PSP_CODE_2); - GetAllResponse res = given() + PaginatedFlowsResponse res = given() .header(HEADER) .when() .get(url) .then() .statusCode(200) .extract() - .as(GetAllResponse.class); + .as(PaginatedFlowsResponse.class); assertThat(res.getCount(), equalTo(0L)); } @@ -100,7 +104,8 @@ void testOrganization_getAllPublishedFlow_KO_FDR0708() { assertThat(res.getHttpStatusDescription(), equalTo("Bad Request")); assertThat(res.getAppErrorCode(), equalTo("FDR-0708")); assertThat(res.getErrors(), hasSize(1)); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown",pspUnknown))))); + assertThat(res.getErrors(), + hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown", pspUnknown))))); } @Test @@ -117,7 +122,8 @@ void testOrganization_getAllPublishedFlow_KO_FDR0709() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.PSP_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Psp [%s] not enabled".formatted(PSP_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo("Psp [%s] not enabled".formatted(PSP_CODE_NOT_ENABLED))))); } @Test @@ -135,7 +141,8 @@ void testOrganization_getAllPublishedFlow_KO_FDR0716() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_UNKNOWN.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Creditor institution [%s] unknown".formatted(ecUnknown))))); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo("Creditor institution [%s] unknown".formatted(ecUnknown))))); } @Test @@ -152,24 +159,27 @@ void testOrganization_getAllPublishedFlow_KO_FDR0717() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Creditor institution [%s] not enabled".formatted(EC_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo("Creditor institution [%s] not enabled".formatted(EC_CODE_NOT_ENABLED))))); } - /** ################# getReportingFlow ############### */ + /** + * ################# getReportingFlow ############### + */ @Test @DisplayName("ORGANIZATIONS - OK - recupero di un reporting flow") void testOrganization_getReportingFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_REPORTING_FLOW_URL.formatted(EC_CODE, flowName, 1L, PSP_CODE); - GetResponse res = given() + SingleFlowResponse res = given() .header(HEADER) .when() .get(url) .then() .statusCode(200) .extract() - .as(GetResponse.class); + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getReceiver().getOrganizationId(), equalTo(EC_CODE)); assertThat(res.getSender().getPspId(), equalTo(PSP_CODE)); @@ -185,14 +195,14 @@ void testOrganization_getReportingFlow_revision_2_OK() { TestUtil.pspSunnyDay(flowName); String url = GET_REPORTING_FLOW_URL.formatted(EC_CODE, flowName, 2L, PSP_CODE); - GetResponse res = given() + SingleFlowResponse res = given() .header(HEADER) .when() .get(url) .then() .statusCode(200) .extract() - .as(GetResponse.class); + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getRevision(), equalTo(2L)); assertThat(res.getStatus(), equalTo(ReportingFlowStatusEnum.PUBLISHED)); @@ -215,11 +225,15 @@ void testOrganization_getReportingFlow_KO_FDR0701() { .statusCode(404) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found",flowNameWrong))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowNameWrong))))); } - /** ################# getReportingFlowPayments ############### */ + /** + * ################# getReportingFlowPayments ############### + */ @Test @DisplayName("ORGANIZATIONS - OK - recupero dei payments di un flow pubblicato") void testOrganization_getReportingFlowPayments_Ok() { @@ -228,16 +242,18 @@ void testOrganization_getReportingFlowPayments_Ok() { String url = GET_REPORTING_FLOW_PAYMENTS_URL.formatted(EC_CODE, flowName, 1L, PSP_CODE); - GetPaymentResponse res = given() + PaginatedPaymentsResponse res = given() .header(HEADER) .when() .get(url) .then() .statusCode(200) .extract() - .as(GetPaymentResponse.class); + .as(PaginatedPaymentsResponse.class); assertThat(res.getCount(), equalTo(5L)); - List expectedList = List.of(PaymentStatusEnum.EXECUTED.name(), PaymentStatusEnum.REVOKED.name(), PaymentStatusEnum.NO_RPT.name(), PaymentStatusEnum.STAND_IN.name(), PaymentStatusEnum.STAND_IN_NO_RPT.name()); + List expectedList = List.of(PaymentStatusEnum.EXECUTED.name(), PaymentStatusEnum.REVOKED.name(), + PaymentStatusEnum.NO_RPT.name(), PaymentStatusEnum.STAND_IN.name(), + PaymentStatusEnum.STAND_IN_NO_RPT.name()); assertThat(res.getData().stream().map(o -> o.getPayStatus().name()).toList(), equalTo(expectedList)); assertThat(res.getData().stream().map(o -> o.getPayStatus().name()).toList(), @@ -250,15 +266,16 @@ void testOrganization_getReportingFlowPayments_pagination_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); - String url = (GET_REPORTING_FLOW_PAYMENTS_URL+"?page=2&size=1").formatted(EC_CODE, flowName, 1L, PSP_CODE); - GetPaymentResponse res = given() + String url = (GET_REPORTING_FLOW_PAYMENTS_URL + "?page=2&size=1").formatted(EC_CODE, flowName, + 1L, PSP_CODE); + PaginatedPaymentsResponse res = given() .header(HEADER) .when() .get(url) .then() .statusCode(200) .extract() - .as(GetPaymentResponse.class); + .as(PaginatedPaymentsResponse.class); List data = res.getData(); assertThat(res.getMetadata().getPageSize(), equalTo(1)); diff --git a/src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceIT.java b/src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceIT.java similarity index 81% rename from src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceIT.java rename to src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceIT.java index b7b572c9..cb563592 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceIT.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceIT.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.psps; +package it.gov.pagopa.fdr.controller.psps; import io.quarkus.test.junit.QuarkusIntegrationTest; diff --git a/src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceTest.java b/src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceTest.java similarity index 92% rename from src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceTest.java index c7e32668..37f97a39 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/psps/InternalPspResourceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/psps/InternalPspResourceTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.psps; +package it.gov.pagopa.fdr.controller.psps; import static io.restassured.RestAssured.given; import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.BROKER_CODE; @@ -25,14 +25,13 @@ import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; -import it.gov.pagopa.fdr.rest.model.GenericResponse; -import it.gov.pagopa.fdr.rest.model.SenderTypeEnum; -import it.gov.pagopa.fdr.service.dto.SenderTypeEnumDto; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.enums.SenderTypeEnum; import it.gov.pagopa.fdr.test.util.AzuriteResource; import it.gov.pagopa.fdr.test.util.MongoResource; import it.gov.pagopa.fdr.test.util.TestUtil; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -50,72 +49,73 @@ class InternalPspResourceTest { protected static String PAYMENTS_SAME_INDEX_ADD_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 100, - "iuv": "b", - "iur": "abcdefg", - "idTransfer": 2, - "pay": 0.01, - "payStatus": "REVOKED", - "payDate": "2023-02-03T12:00:30.900000Z" + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 100, + "iuv": "b", + "iur": "abcdefg", + "idTransfer": 2, + "pay": 0.01, + "payStatus": "REVOKED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + ] } - ] - } - """; + """; protected static String PAYMENTS_2_ADD_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - }] - } - """; + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + }] + } + """; protected static String PAYMENTS_DELETE_WRONG_TEMPLATE = """ - { - "indexList": [ - 5 - ] - } - """; - - protected static String MALFORMED_JSON = """ - { - 12345 - } - """; + { + "indexList": [ + 5 + ] + } + """; + + protected static String MALFORMED_JSON = + """ + { + 12345 + } + """; protected static String PAYMENTS_ADD_INVALID_FORMAT_TEMPLATE = """ - { - "payments": { - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": "%s", - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - } - } - """; + { + "payments": { + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": "%s", + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + } + """; protected static String FLOW_TEMPLATE_WRONG_INSTANT = """ @@ -146,19 +146,19 @@ class InternalPspResourceTest { protected static String PAYMENTS_ADD_INVALID_FIELD_VALUE_FORMAT_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": "%s", - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": "%s", + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + ] } - ] - } - """; + """; protected static String FLOW_TEMPLATE_WRONG_FIELDS = """ @@ -189,16 +189,16 @@ class InternalPspResourceTest { protected static String PAYMENTS_DELETE_TEMPLATE = """ - { - "indexList": [ - 100, - 101, - 102, - 103, - 104 - ] - } - """; + { + "indexList": [ + 100, + 101, + 102, + 103, + 104 + ] + } + """; @Test @DisplayName("PSPS - OK - inserimento completo e pubblicazione di un flusso") @@ -215,12 +215,7 @@ void test_psp_ABICODE_createFlow_OK() { String bodyFmt = TestUtil.FLOW_TEMPLATE.formatted( - flowName, - SenderTypeEnumDto.ABI_CODE.name(), - PSP_CODE, - BROKER_CODE, - CHANNEL_CODE, - EC_CODE); + flowName, SenderTypeEnum.ABI_CODE.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse res = given() @@ -243,12 +238,7 @@ void test_psp_BIC_CODE_createFlow_OK() { String bodyFmt = FLOW_TEMPLATE.formatted( - flowName, - SenderTypeEnumDto.BIC_CODE.name(), - PSP_CODE, - BROKER_CODE, - CHANNEL_CODE, - EC_CODE); + flowName, SenderTypeEnum.BIC_CODE.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse res = given() @@ -272,7 +262,7 @@ void test_psp_deleteFlow_OK() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -333,7 +323,7 @@ void test_psp_deleteFlowWithPayment_OK() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -389,7 +379,7 @@ void test_psp_deletePayments_OK() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -479,7 +469,7 @@ void test_psp_deletePayments_partial_OK() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -535,7 +525,7 @@ void test_psp_publish_KO_FDR0701() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -597,7 +587,7 @@ void test_psp_payments_add_KO_FDR0701() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -644,7 +634,7 @@ void test_psp_payments_delete_KO_FDR0701() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -691,7 +681,7 @@ void test_psp_KO_FDR0702() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -739,7 +729,7 @@ void test_psp_CREATED_publish_KO_FDR0703() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -787,7 +777,7 @@ void test_psp_payments_delete_KO_FDR0703() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -837,7 +827,7 @@ void test_psp_KO_FDR0704() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), pspNotMatch, BROKER_CODE, CHANNEL_CODE, @@ -875,7 +865,7 @@ void test_psp_payments_add_KO_FDR0705() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -929,7 +919,7 @@ void test_psp_payments_delete_KO_FDR0705() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -964,13 +954,13 @@ void test_psp_payments_delete_KO_FDR0705() { String urlDelPays = PAYMENTS_DELETE_URL.formatted(PSP_CODE, flowName); bodyFmt = """ - { - "indexList": [ - 1, - 1 - ] - } - """; + { + "indexList": [ + 1, + 1 + ] + } + """; ErrorResponse resDelError = given() .body(bodyFmt) @@ -1005,7 +995,7 @@ void test_psp_KO_FDR0706() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -1069,7 +1059,7 @@ void test_psp_KO_FDR0707() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -1135,7 +1125,7 @@ void test_psp_KO_FDR0708() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), pspUnknown, BROKER_CODE, CHANNEL_CODE, @@ -1164,7 +1154,7 @@ void test_psp_KO_FDR0709() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE_NOT_ENABLED, BROKER_CODE, CHANNEL_CODE, @@ -1196,7 +1186,7 @@ void test_brokerpsp_KO_FDR0710() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, brokerPspUnknown, CHANNEL_CODE, @@ -1229,7 +1219,7 @@ void test_brokerpsp_KO_FDR0711() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE_NOT_ENABLED, CHANNEL_CODE, @@ -1264,7 +1254,7 @@ void test_channel_KO_FDR0712() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, channelUnknown, @@ -1296,7 +1286,7 @@ void test_channel_KO_FDR0713() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE_NOT_ENABLED, @@ -1325,7 +1315,7 @@ void test_channelBroker_KO_FDR0714() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE_2, CHANNEL_CODE, @@ -1363,7 +1353,7 @@ void test_channelPsp_KO_FDR0715() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE_2, BROKER_CODE, CHANNEL_CODE, @@ -1401,7 +1391,7 @@ void test_organizationId_KO_FDR0716() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -1434,7 +1424,7 @@ void test_organizationId_KO_FDR0717() { String bodyFmt = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -1467,7 +1457,7 @@ void test_flowName_KO_FDR0718() { String bodyFmt = FLOW_TEMPLATE.formatted( REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, @@ -1501,7 +1491,7 @@ void test_flowName_KO_FDR0719() { String bodyFmt = FLOW_TEMPLATE.formatted( REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, diff --git a/src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceIT.java b/src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceIT.java similarity index 80% rename from src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceIT.java rename to src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceIT.java index d731f7fb..b216bc51 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceIT.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceIT.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.psps; +package it.gov.pagopa.fdr.controller.psps; import io.quarkus.test.junit.QuarkusIntegrationTest; diff --git a/src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceTest.java b/src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceTest.java similarity index 66% rename from src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceTest.java index f65578e9..20df2cee 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/psps/PspResourceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/psps/PspResourceTest.java @@ -1,30 +1,57 @@ -package it.gov.pagopa.fdr.rest.psps; +package it.gov.pagopa.fdr.controller.psps; + +import static io.restassured.RestAssured.given; +import static io.smallrye.common.constraint.Assert.assertTrue; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.BROKER_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.BROKER_CODE_2; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.BROKER_CODE_NOT_ENABLED; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.CHANNEL_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.CHANNEL_CODE_NOT_ENABLED; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.EC_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.EC_CODE_NOT_ENABLED; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.FLOWS_DELETE_URL; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.FLOWS_PUBLISH_URL; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.FLOWS_URL; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.HEADER; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PAYMENTS_ADD_URL; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PAYMENTS_DELETE_URL; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE_2; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE_3; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.PSP_CODE_NOT_ENABLED; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT; +import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT; +import static it.gov.pagopa.fdr.test.util.TestUtil.FLOW_TEMPLATE; +import static it.gov.pagopa.fdr.test.util.TestUtil.PAYMENTS_ADD_TEMPLATE; +import static it.gov.pagopa.fdr.test.util.TestUtil.PAYMENTS_ADD_TEMPLATE_2; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.hasSize; import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.rest.exceptionmapper.ErrorResponse; -import it.gov.pagopa.fdr.rest.model.*; -import it.gov.pagopa.fdr.rest.organizations.response.GetPaymentResponse; -import it.gov.pagopa.fdr.rest.organizations.response.GetResponse; -import it.gov.pagopa.fdr.rest.psps.response.GetAllCreatedResponse; -import it.gov.pagopa.fdr.service.dto.SenderTypeEnumDto; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.error.ErrorResponse; +import it.gov.pagopa.fdr.controller.model.flow.enums.ReportingFlowStatusEnum; +import it.gov.pagopa.fdr.controller.model.flow.enums.SenderTypeEnum; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsCreatedResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.SingleFlowResponse; +import it.gov.pagopa.fdr.controller.model.payment.Payment; +import it.gov.pagopa.fdr.controller.model.payment.enums.PaymentStatusEnum; +import it.gov.pagopa.fdr.controller.model.payment.response.PaginatedPaymentsResponse; import it.gov.pagopa.fdr.test.util.AzuriteResource; import it.gov.pagopa.fdr.test.util.MongoResource; import it.gov.pagopa.fdr.test.util.TestUtil; +import it.gov.pagopa.fdr.util.error.enums.AppErrorCodeMessageEnum; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.List; - -import static io.restassured.RestAssured.given; -import static io.smallrye.common.constraint.Assert.assertTrue; -import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.*; -import static it.gov.pagopa.fdr.test.util.TestUtil.*; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; - @QuarkusTest @QuarkusTestResource(MockServerTestResource.class) @QuarkusTestResource(MongoResource.class) @@ -40,115 +67,115 @@ class PspResourceTest { protected static String PAYMENTS_SAME_INDEX_ADD_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 100, - "iuv": "b", - "iur": "abcdefg", - "idTransfer": 2, - "pay": 0.01, - "payStatus": "REVOKED", - "payDate": "2023-02-03T12:00:30.900000Z" + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 100, + "iuv": "b", + "iur": "abcdefg", + "idTransfer": 2, + "pay": 0.01, + "payStatus": "REVOKED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + ] } - ] - } - """; + """; protected static String PAYMENTS_2_ADD_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - }] - } - """; + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + }] + } + """; protected static String PAYMENTS_DELETE_WRONG_TEMPLATE = """ + { + "indexList": [ + 5 + ] + } + """; + + protected static String MALFORMED_JSON = """ { - "indexList": [ - 5 - ] + 12345 } """; - protected static String MALFORMED_JSON = """ - { - 12345 - } - """; - protected static String PAYMENTS_ADD_INVALID_FORMAT_TEMPLATE = - """ - { - "payments": { - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": "%s", - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - } - } - """; + """ + { + "payments": { + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": "%s", + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + } + """; protected static String FLOW_TEMPLATE_WRONG_INSTANT = - """ - { - "fdr": "%s", - "fdrDate": "%s", - "sender": { - "type": "%s", - "id": "SELBIT2B", - "pspId": "%s", - "pspName": "Bank", - "pspBrokerId": "%s", - "channelId": "%s", - "password": "1234567890" - }, - "receiver": { - "id": "APPBIT2B", - "organizationId": "%s", - "organizationName": "Comune di xyz" - }, - "regulation": "SEPA - Bonifico xzy", - "regulationDate": "2023-04-03T12:00:30.900000Z", - "bicCodePouringBank": "UNCRITMMXXX", - "totPayments": 3, - "sumPayments": 0.03 - } - """; + """ + { + "fdr": "%s", + "fdrDate": "%s", + "sender": { + "type": "%s", + "id": "SELBIT2B", + "pspId": "%s", + "pspName": "Bank", + "pspBrokerId": "%s", + "channelId": "%s", + "password": "1234567890" + }, + "receiver": { + "id": "APPBIT2B", + "organizationId": "%s", + "organizationName": "Comune di xyz" + }, + "regulation": "SEPA - Bonifico xzy", + "regulationDate": "2023-04-03T12:00:30.900000Z", + "bicCodePouringBank": "UNCRITMMXXX", + "totPayments": 3, + "sumPayments": 0.03 + } + """; - protected static String PAYMENTS_ADD_INVALID_FIELD_VALUE_FORMAT_TEMPLATE = + protected static String PAYMENTS_ADD_INVALID_FIELD_VALUE_FORMAT_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": "%s", - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": "%s", + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + } + ] } - ] - } - """; + """; protected static String FLOW_TEMPLATE_WRONG_FIELDS = """ @@ -177,17 +204,17 @@ class PspResourceTest { } """; - protected static String PAYMENTS_DELETE_TEMPLATE = + protected static String PAYMENTS_DELETE_TEMPLATE = """ - { - "indexList": [ - 100, - 101, - 102, - 103 - ] - } - """; + { + "indexList": [ + 100, + 101, + 102, + 103 + ] + } + """; @Test @DisplayName("PSPS - OK - inserimento completo e pubblicazione di un flusso") @@ -202,7 +229,9 @@ void test_psp_ABICODE_createFlow_OK() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = TestUtil.FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.ABI_CODE.name(), PSP_CODE, + String bodyFmt = TestUtil.FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.ABI_CODE.name(), + PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse res = given() @@ -223,7 +252,8 @@ void test_psp_BIC_CODE_createFlow_OK() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.BIC_CODE.name(), PSP_CODE, + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.BIC_CODE.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse res = given() @@ -244,7 +274,8 @@ void test_psp_deleteFlow_OK() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -282,8 +313,10 @@ void test_psp_deleteFlow_OK() { .statusCode(404) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowName))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + assertThat(resDelError.getErrors(), + hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowName))))); } @Test @@ -292,7 +325,8 @@ void test_psp_deleteFlowWithPayment_OK() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -309,14 +343,14 @@ void test_psp_deleteFlowWithPayment_OK() { String urlSavePayment = PAYMENTS_ADD_URL.formatted(PSP_CODE, flowName); GenericResponse resSavePays = given() - .body(PAYMENTS_ADD_TEMPLATE) - .header(HEADER) - .when() - .put(urlSavePayment) - .then() - .statusCode(200) - .extract() - .as(GenericResponse.class); + .body(PAYMENTS_ADD_TEMPLATE) + .header(HEADER) + .when() + .put(urlSavePayment) + .then() + .statusCode(200) + .extract() + .as(GenericResponse.class); assertThat(resSavePays.getMessage(), equalTo("Fdr [%s] payment added".formatted(flowName))); String urlDeleteFlow = FLOWS_DELETE_URL.formatted(PSP_CODE, flowName); @@ -339,7 +373,8 @@ void test_psp_deletePayments_OK() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -399,8 +434,10 @@ void test_psp_deletePayments_OK() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Index of payment not match with index loaded on fdr [%s]", flowName))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Index of payment not match with index loaded on fdr [%s]", flowName))))); } @Test @@ -409,7 +446,8 @@ void test_psp_deletePayments_partial_OK() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -457,7 +495,8 @@ void test_psp_publish_KO_FDR0701() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -495,8 +534,10 @@ void test_psp_publish_KO_FDR0701() { .statusCode(404) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowNameWrong))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + assertThat(resDelError.getErrors(), hasItem( + hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowNameWrong))))); } @Test @@ -505,7 +546,8 @@ void test_psp_payments_add_KO_FDR0701() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -530,8 +572,10 @@ void test_psp_payments_add_KO_FDR0701() { .statusCode(404) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowName2))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + assertThat(resDelError.getErrors(), + hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowName2))))); } @Test @@ -540,7 +584,8 @@ void test_psp_payments_delete_KO_FDR0701() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() .body(bodyFmt) @@ -564,8 +609,10 @@ void test_psp_payments_delete_KO_FDR0701() { .statusCode(404) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowNameUnknown))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + assertThat(resDelError.getErrors(), hasItem( + hasProperty("message", equalTo(String.format("Fdr [%s] not found", flowNameUnknown))))); } @Test @@ -574,7 +621,8 @@ void test_psp_KO_FDR0702() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -597,8 +645,10 @@ void test_psp_KO_FDR0702() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_ALREADY_EXIST.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] already exist in [CREATED] status", flowName))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_ALREADY_EXIST.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Fdr [%s] already exist in [CREATED] status", flowName))))); } @Test @@ -607,7 +657,8 @@ void test_psp_CREATED_publish_KO_FDR0703() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -630,8 +681,10 @@ void test_psp_CREATED_publish_KO_FDR0703() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resPublish.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION.errorCode())); - assertThat(resPublish.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] exist but in [CREATED] status", flowName))))); + assertThat(resPublish.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION.errorCode())); + assertThat(resPublish.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Fdr [%s] exist but in [CREATED] status", flowName))))); } @Test @@ -640,7 +693,8 @@ void test_psp_payments_delete_KO_FDR0703() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -664,8 +718,10 @@ void test_psp_payments_delete_KO_FDR0703() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] exist but in [CREATED] status", flowName))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_WRONG_ACTION.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Fdr [%s] exist but in [CREATED] status", flowName))))); } @Test @@ -675,7 +731,9 @@ void test_psp_KO_FDR0704() { String pspNotMatch = "PSP_NOT_MATCH"; String url = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), pspNotMatch, + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), + pspNotMatch, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse resDelError = given() .header(HEADER) @@ -686,8 +744,11 @@ void test_psp_KO_FDR0704() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PSP_ID_NOT_MATCH.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [%s] have sender.pspId [%s] but not match with query param [%s]", flowName, pspNotMatch, PSP_CODE))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PSP_ID_NOT_MATCH.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Fdr [%s] have sender.pspId [%s] but not match with query param [%s]", + flowName, pspNotMatch, PSP_CODE))))); } @Test @@ -696,7 +757,8 @@ void test_psp_payments_add_KO_FDR0705() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -721,8 +783,10 @@ void test_psp_payments_add_KO_FDR0705() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Exist one or more payment index in same request on fdr [%s]", flowName))))); + assertThat(resDelError.getAppErrorCode(), equalTo( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Exist one or more payment index in same request on fdr [%s]", flowName))))); } @Test @@ -731,7 +795,8 @@ void test_psp_payments_delete_KO_FDR0705() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -776,8 +841,10 @@ void test_psp_payments_delete_KO_FDR0705() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Exist one or more payment index in same request on fdr [%s]", flowName))))); + assertThat(resDelError.getAppErrorCode(), equalTo( + AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_SAME_INDEX_IN_SAME_REQUEST.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Exist one or more payment index in same request on fdr [%s]", flowName))))); } @Test @@ -786,7 +853,8 @@ void test_psp_KO_FDR0706() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -822,8 +890,10 @@ void test_psp_KO_FDR0706() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resSavePays2.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX.errorCode())); - assertThat(resSavePays2.getErrors(), hasItem(hasProperty("message", equalTo(String.format("One or more payment index already added on fdr [%s]", flowName))))); + assertThat(resSavePays2.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_DUPLICATE_INDEX.errorCode())); + assertThat(resSavePays2.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("One or more payment index already added on fdr [%s]", flowName))))); } @Test @@ -832,7 +902,8 @@ void test_psp_KO_FDR0707() { String flowName = TestUtil.getDynamicFlowName(); String urlSave = FLOWS_URL.formatted(PSP_CODE, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); GenericResponse resSave = given() @@ -869,8 +940,10 @@ void test_psp_KO_FDR0707() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Index of payment not match with index loaded on fdr [%s]", flowName))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_PAYMENT_NO_MATCH_INDEX.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Index of payment not match with index loaded on fdr [%s]", flowName))))); } @Test @@ -880,7 +953,9 @@ void test_psp_KO_FDR0708() { String pspUnknown = "PSP_UNKNOWN"; String url = FLOWS_URL.formatted(pspUnknown, flowName); - String bodyFmt = FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), pspUnknown, + String bodyFmt = FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), + pspUnknown, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() .body(bodyFmt) @@ -892,7 +967,8 @@ void test_psp_KO_FDR0708() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.PSP_UNKNOWN.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown", pspUnknown))))); + assertThat(res.getErrors(), + hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown", pspUnknown))))); } @Test @@ -901,7 +977,8 @@ void test_psp_KO_FDR0709() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE_NOT_ENABLED, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE_NOT_ENABLED, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() .body(bodyFmt) @@ -913,7 +990,8 @@ void test_psp_KO_FDR0709() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.PSP_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Psp [%s] not enabled", PSP_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Psp [%s] not enabled", PSP_CODE_NOT_ENABLED))))); } @Test @@ -923,7 +1001,9 @@ void test_brokerpsp_KO_FDR0710() { String brokerPspUnknown = "BROKERPSP_UNKNOWN"; String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, brokerPspUnknown, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, + brokerPspUnknown, CHANNEL_CODE, EC_CODE); ErrorResponse resDelError = given() @@ -935,8 +1015,10 @@ void test_brokerpsp_KO_FDR0710() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BROKER_UNKNOWN.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Broker [%s] unknown", brokerPspUnknown))))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BROKER_UNKNOWN.errorCode())); + assertThat(resDelError.getErrors(), hasItem( + hasProperty("message", equalTo(String.format("Broker [%s] unknown", brokerPspUnknown))))); } @Test @@ -945,7 +1027,8 @@ void test_brokerpsp_KO_FDR0711() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE_NOT_ENABLED, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() @@ -957,8 +1040,10 @@ void test_brokerpsp_KO_FDR0711() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BROKER_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Broker [%s] not enabled", BROKER_CODE_NOT_ENABLED))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BROKER_NOT_ENABLED.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Broker [%s] not enabled", BROKER_CODE_NOT_ENABLED))))); } @Test @@ -968,7 +1053,8 @@ void test_channel_KO_FDR0712() { String channelUnknown = "CHANNEL_UNKNOWN"; String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, channelUnknown, EC_CODE); ErrorResponse res = given() @@ -981,7 +1067,8 @@ void test_channel_KO_FDR0712() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.CHANNEL_UNKNOWN.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Channel [%s] unknown", channelUnknown))))); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo(String.format("Channel [%s] unknown", channelUnknown))))); } @Test @@ -990,7 +1077,8 @@ void test_channel_KO_FDR0713() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE_NOT_ENABLED, EC_CODE); ErrorResponse res = given() @@ -1002,7 +1090,8 @@ void test_channel_KO_FDR0713() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.CHANNEL_NOT_ENABLED.errorCode())); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.CHANNEL_NOT_ENABLED.errorCode())); assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("channelId.notEnabled")))); } @@ -1012,7 +1101,8 @@ void test_channelBroker_KO_FDR0714() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE_2, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() @@ -1024,8 +1114,11 @@ void test_channelBroker_KO_FDR0714() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.CHANNEL_BROKER_WRONG_CONFIG.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Channel [%s] with broker [%s] not authorized", CHANNEL_CODE, BROKER_CODE_2))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.CHANNEL_BROKER_WRONG_CONFIG.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Channel [%s] with broker [%s] not authorized", CHANNEL_CODE, + BROKER_CODE_2))))); } @Test @@ -1034,7 +1127,8 @@ void test_channelPsp_KO_FDR0715() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE_2, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE_2, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() @@ -1046,8 +1140,10 @@ void test_channelPsp_KO_FDR0715() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.CHANNEL_PSP_WRONG_CONFIG.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Channel [%s] with psp [%s] not authorized", CHANNEL_CODE, PSP_CODE_2))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.CHANNEL_PSP_WRONG_CONFIG.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Channel [%s] with psp [%s] not authorized", CHANNEL_CODE, PSP_CODE_2))))); } @Test @@ -1057,7 +1153,8 @@ void test_ecId_KO_FDR0716() { String ecUnknown = "EC_UNKNOWN"; String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, ecUnknown); ErrorResponse res = given() @@ -1070,7 +1167,8 @@ void test_ecId_KO_FDR0716() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_UNKNOWN.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Creditor institution [%s] unknown", ecUnknown))))); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Creditor institution [%s] unknown", ecUnknown))))); } @Test @@ -1079,7 +1177,8 @@ void test_ecId_KO_FDR0717() { String flowName = TestUtil.getDynamicFlowName(); String url = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmt = - FLOW_TEMPLATE.formatted(flowName, SenderTypeEnumDto.LEGAL_PERSON.name(), PSP_CODE, + FLOW_TEMPLATE.formatted(flowName, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE_NOT_ENABLED); ErrorResponse res = given() @@ -1092,7 +1191,8 @@ void test_ecId_KO_FDR0717() { .extract() .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Creditor institution [%s] not enabled", EC_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Creditor institution [%s] not enabled", EC_CODE_NOT_ENABLED))))); } @Test @@ -1100,7 +1200,8 @@ void test_ecId_KO_FDR0717() { void test_flowName_KO_FDR0718() { String url = FLOWS_URL.formatted(PSP_CODE, REPORTING_FLOW_NAME_DATE_WRONG_FORMAT); String bodyFmt = - FLOW_TEMPLATE.formatted(REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, SenderTypeEnumDto.LEGAL_PERSON.name(), + FLOW_TEMPLATE.formatted(REPORTING_FLOW_NAME_DATE_WRONG_FORMAT, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() @@ -1112,8 +1213,10 @@ void test_flowName_KO_FDR0718() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Fdr [2016-aa-16%s-1176] has wrong date", PSP_CODE))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_DATE_WRONG_FORMAT.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo(String.format("Fdr [2016-aa-16%s-1176] has wrong date", PSP_CODE))))); } @Test @@ -1121,7 +1224,8 @@ void test_flowName_KO_FDR0718() { void test_flowName_KO_FDR0719() { String url = FLOWS_URL.formatted(PSP_CODE, REPORTING_FLOW_NAME_PSP_WRONG_FORMAT); String bodyFmt = - FLOW_TEMPLATE.formatted(REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, SenderTypeEnumDto.LEGAL_PERSON.name(), + FLOW_TEMPLATE.formatted(REPORTING_FLOW_NAME_PSP_WRONG_FORMAT, + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, EC_CODE); ErrorResponse res = given() @@ -1133,8 +1237,10 @@ void test_flowName_KO_FDR0719() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Fdr [2016-08-16-psp-1176] has wrong psp")))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NAME_PSP_WRONG_FORMAT.errorCode())); + assertThat(res.getErrors(), + hasItem(hasProperty("message", equalTo("Fdr [2016-08-16-psp-1176] has wrong psp")))); } @Test @@ -1181,8 +1287,11 @@ void test_psp_KO_FDR0401() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Bad request. Field [payments.pay] is [%s]. Not match a correct value", wrongFormatDecimal))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo( + String.format("Bad request. Field [payments.pay] is [%s]. Not match a correct value", + wrongFormatDecimal))))); } @Test @@ -1209,8 +1318,11 @@ void test_psp_KO_FDR0402() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_INSTANT.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Bad request. Field [fdrDate] is [%s]. Expected ISO-8601 [2011-12-03T10:15:30Z] [2023-04-05T09:21:37.810000Z]", wrongFormatDate))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_INSTANT.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format( + "Bad request. Field [fdrDate] is [%s]. Expected ISO-8601 [2011-12-03T10:15:30Z] [2023-04-05T09:21:37.810000Z]", + wrongFormatDate))))); } @Test @@ -1236,8 +1348,11 @@ void test_psp_KO_FDR0403() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_ENUM.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Bad request. Field [sender.type] is [%s]. Expected value one of [LEGAL_PERSON, ABI_CODE, BIC_CODE]", wrongEnum))))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_ENUM.errorCode())); + assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format( + "Bad request. Field [sender.type] is [%s]. Expected value one of [LEGAL_PERSON, ABI_CODE, BIC_CODE]", + wrongEnum))))); } @Test @@ -1255,8 +1370,10 @@ void test_psp_KO_FDR0404() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(resDelError.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_DESERIALIZE_ERROR.errorCode())); - assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo("Bad request. Field [payments] generate an deserialize error. Set correct value")))); + assertThat(resDelError.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_DESERIALIZE_ERROR.errorCode())); + assertThat(resDelError.getErrors(), hasItem(hasProperty("message", equalTo( + "Bad request. Field [payments] generate an deserialize error. Set correct value")))); } @Test @@ -1274,30 +1391,31 @@ void test_psp_KO_FDR0405() { .statusCode(400) .extract() .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Bad request. Json format not valid")))); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.BAD_REQUEST_INPUT_JSON_NON_VALID_FORMAT.errorCode())); + assertThat(res.getErrors(), + hasItem(hasProperty("message", equalTo("Bad request. Json format not valid")))); } - - - - /** ############### getAllPublishedFlow ################ */ + /** + * ############### getAllPublishedFlow ################ + */ @Test @DisplayName("PSPS - OK - getAllPublishedFlow") void testOrganization_getAllPublishedFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1, EC_CODE); - GetResponse res = - given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetResponse.class); + SingleFlowResponse res = + given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(SingleFlowResponse.class); assertThat(res.getTotPayments(), equalTo(5L)); assertThat(res.getStatus(), equalTo(ReportingFlowStatusEnum.PUBLISHED)); } @@ -1309,37 +1427,38 @@ void test_psp_getAllPublishedFlow_OkNoResults() { String urlPspFlow = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmtPspFlow = - FLOW_TEMPLATE.formatted( - flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), - PSP_CODE, - BROKER_CODE, - CHANNEL_CODE, - EC_CODE); + FLOW_TEMPLATE.formatted( + flowName, + SenderTypeEnum.LEGAL_PERSON.name(), + PSP_CODE, + BROKER_CODE, + CHANNEL_CODE, + EC_CODE); GenericResponse resPspFlow = - given() - .body(bodyFmtPspFlow) - .header(HEADER) - .when() - .post(urlPspFlow) - .then() - .statusCode(201) - .extract() - .body() - .as(GenericResponse.class); - assertThat(resPspFlow.getMessage(), equalTo(String.format("Fdr [%s] saved", flowName))); - - String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1, EC_CODE); - ErrorResponse res = given() + given() + .body(bodyFmtPspFlow) .header(HEADER) .when() - .get(url) + .post(urlPspFlow) .then() - .statusCode(404) + .statusCode(201) .extract() - .as(ErrorResponse.class); - assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); + .body() + .as(GenericResponse.class); + assertThat(resPspFlow.getMessage(), equalTo(String.format("Fdr [%s] saved", flowName))); + + String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1, EC_CODE); + ErrorResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(404) + .extract() + .as(ErrorResponse.class); + assertThat(res.getAppErrorCode(), + equalTo(AppErrorCodeMessageEnum.REPORTING_FLOW_NOT_FOUND.errorCode())); } @Test @@ -1350,17 +1469,18 @@ void test_psp_getAllPublishedFlow_KO_FDR0708() { String pspUnknown = "PSP_UNKNOWN"; String url = GET_FDR_PUBLISHED_URL.formatted(pspUnknown, flowName, 1, EC_CODE); ErrorResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(400) - .extract() - .as(ErrorResponse.class); + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(400) + .extract() + .as(ErrorResponse.class); assertThat(res.getHttpStatusDescription(), equalTo("Bad Request")); assertThat(res.getAppErrorCode(), equalTo("FDR-0708")); assertThat(res.getErrors(), hasSize(1)); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown",pspUnknown))))); + assertThat(res.getErrors(), + hasItem(hasProperty("message", equalTo(String.format("Psp [%s] unknown", pspUnknown))))); } @Test @@ -1371,15 +1491,16 @@ void test_psp_getAllPublishedFlow_KO_FDR0709() { String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE_NOT_ENABLED, flowName, 1, EC_CODE); ErrorResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(400) - .extract() - .as(ErrorResponse.class); + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(400) + .extract() + .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.PSP_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Psp [%s] not enabled".formatted(PSP_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo("Psp [%s] not enabled".formatted(PSP_CODE_NOT_ENABLED))))); } @Test @@ -1391,15 +1512,16 @@ void test_psp_getAllPublishedFlow_KO_FDR0716() { String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1, ecUnknown); ErrorResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(400) - .extract() - .as(ErrorResponse.class); + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(400) + .extract() + .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_UNKNOWN.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Creditor institution [%s] unknown".formatted(ecUnknown))))); + assertThat(res.getErrors(), hasItem( + hasProperty("message", equalTo("Creditor institution [%s] unknown".formatted(ecUnknown))))); } @Test @@ -1410,32 +1532,35 @@ void test_psp_getAllPublishedFlow_KO_FDR0717() { String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1, EC_CODE_NOT_ENABLED); ErrorResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(400) - .extract() - .as(ErrorResponse.class); + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(400) + .extract() + .as(ErrorResponse.class); assertThat(res.getAppErrorCode(), equalTo(AppErrorCodeMessageEnum.EC_NOT_ENABLED.errorCode())); - assertThat(res.getErrors(), hasItem(hasProperty("message", equalTo("Creditor institution [%s] not enabled".formatted(EC_CODE_NOT_ENABLED))))); + assertThat(res.getErrors(), hasItem(hasProperty("message", + equalTo("Creditor institution [%s] not enabled".formatted(EC_CODE_NOT_ENABLED))))); } - /** ################# getReportingFlow ############### */ + /** + * ################# getReportingFlow ############### + */ @Test @DisplayName("PSPS - OK - recupero di un reporting flow") void test_psp_getReportingFlow_Ok() { String flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1L, EC_CODE); - GetResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetResponse.class); + SingleFlowResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getReceiver().getOrganizationId(), equalTo(EC_CODE)); assertThat(res.getSender().getPspId(), equalTo(PSP_CODE)); @@ -1451,14 +1576,14 @@ void test_psp_getReportingFlow_revision_2_OK() { TestUtil.pspSunnyDay(flowName); String url = GET_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 2L, EC_CODE); - GetResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetResponse.class); + SingleFlowResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(SingleFlowResponse.class); assertThat(res.getFdr(), equalTo(flowName)); assertThat(res.getRevision(), equalTo(2L)); assertThat(res.getStatus(), equalTo(ReportingFlowStatusEnum.PUBLISHED)); @@ -1467,20 +1592,22 @@ void test_psp_getReportingFlow_revision_2_OK() { @Test @DisplayName("PSPS - OK - nessun flusso trovato in stato CREATED per uno specifico PSP") void test_psp_getAllReportingFlowCreated_OK() { - String url = (GET_ALL_FDR_CREATED_URL+"?page=2&size=1").formatted(PSP_CODE_3); + String url = (GET_ALL_FDR_CREATED_URL + "?page=2&size=1").formatted(PSP_CODE_3); - GetAllCreatedResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetAllCreatedResponse.class); + PaginatedFlowsCreatedResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(PaginatedFlowsCreatedResponse.class); assertThat(res.getCount(), equalTo(0L)); } - /** ################# getReportingFlowPayments ############### */ + /** + * ################# getReportingFlowPayments ############### + */ @Test @DisplayName("PSPS - OK - recupero dei payments di un flow pubblicato") void test_psp_getReportingFlowPaymentsPublished_Ok() { @@ -1489,20 +1616,22 @@ void test_psp_getReportingFlowPaymentsPublished_Ok() { String url = GET_PAYMENTS_FDR_PUBLISHED_URL.formatted(PSP_CODE, flowName, 1L, EC_CODE); - GetPaymentResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetPaymentResponse.class); + PaginatedPaymentsResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(PaginatedPaymentsResponse.class); assertThat(res.getCount(), equalTo(5L)); - List expectedList = List.of(PaymentStatusEnum.EXECUTED.name(), PaymentStatusEnum.REVOKED.name(), PaymentStatusEnum.NO_RPT.name(), PaymentStatusEnum.STAND_IN.name(), PaymentStatusEnum.STAND_IN_NO_RPT.name()); + List expectedList = List.of(PaymentStatusEnum.EXECUTED.name(), PaymentStatusEnum.REVOKED.name(), + PaymentStatusEnum.NO_RPT.name(), PaymentStatusEnum.STAND_IN.name(), + PaymentStatusEnum.STAND_IN_NO_RPT.name()); assertThat(res.getData().stream().map(o -> o.getPayStatus().name()).toList(), - equalTo(expectedList)); + equalTo(expectedList)); assertThat(res.getData().stream().map(o -> o.getPayStatus().name()).toList(), - containsInAnyOrder(expectedList.toArray())); + containsInAnyOrder(expectedList.toArray())); } @Test @@ -1511,36 +1640,36 @@ void test_psp_getReportingFlows_created_Ok() { String flowName = TestUtil.getDynamicFlowName(); String urlPspFlow = FLOWS_URL.formatted(PSP_CODE, flowName); String bodyFmtPspFlow = - FLOW_TEMPLATE.formatted( - flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), - PSP_CODE, - BROKER_CODE, - CHANNEL_CODE, - EC_CODE); + FLOW_TEMPLATE.formatted( + flowName, + SenderTypeEnum.LEGAL_PERSON.name(), + PSP_CODE, + BROKER_CODE, + CHANNEL_CODE, + EC_CODE); GenericResponse resPspFlow = - given() - .body(bodyFmtPspFlow) - .header(HEADER) - .when() - .post(urlPspFlow) - .then() - .statusCode(201) - .extract() - .body() - .as(GenericResponse.class); - assertThat(resPspFlow.getMessage(), equalTo(String.format("Fdr [%s] saved", flowName))); - - String url = (GET_ALL_FDR_CREATED_URL).formatted(PSP_CODE); - GetAllCreatedResponse res = given() + given() + .body(bodyFmtPspFlow) .header(HEADER) .when() - .get(url) + .post(urlPspFlow) .then() - .statusCode(200) + .statusCode(201) .extract() - .as(GetAllCreatedResponse.class); + .body() + .as(GenericResponse.class); + assertThat(resPspFlow.getMessage(), equalTo(String.format("Fdr [%s] saved", flowName))); + + String url = (GET_ALL_FDR_CREATED_URL).formatted(PSP_CODE); + PaginatedFlowsCreatedResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(PaginatedFlowsCreatedResponse.class); assertThat(res.getCount(), greaterThan(0L)); // assertThat(res.getData(), contains(hasProperty("fdr", is(flowName)))); @@ -1554,14 +1683,14 @@ void test_psp_getReportingFlowPayments_created_Ok() { TestUtil.pspSunnyDay(flowName); String url = (GET_PAYMENTS_FDR_CREATED_URL).formatted(PSP_CODE, flowName, EC_CODE); - GetPaymentResponse res = given() - .header(HEADER) - .when() - .get(url) - .then() - .statusCode(200) - .extract() - .as(GetPaymentResponse.class); + PaginatedPaymentsResponse res = given() + .header(HEADER) + .when() + .get(url) + .then() + .statusCode(200) + .extract() + .as(PaginatedPaymentsResponse.class); List data = res.getData(); assertThat(res.getCount(), equalTo(0L)); diff --git a/src/test/java/it/gov/pagopa/fdr/rest/support/SupportTest.java b/src/test/java/it/gov/pagopa/fdr/controller/support/SupportTest.java similarity index 84% rename from src/test/java/it/gov/pagopa/fdr/rest/support/SupportTest.java rename to src/test/java/it/gov/pagopa/fdr/controller/support/SupportTest.java index 56079822..27b40ac9 100644 --- a/src/test/java/it/gov/pagopa/fdr/rest/support/SupportTest.java +++ b/src/test/java/it/gov/pagopa/fdr/controller/support/SupportTest.java @@ -1,4 +1,4 @@ -package it.gov.pagopa.fdr.rest.support; +package it.gov.pagopa.fdr.controller.support; import static io.restassured.RestAssured.given; import static it.gov.pagopa.fdr.test.util.AppConstantTestHelper.HEADER; @@ -13,7 +13,7 @@ import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.rest.support.response.FdrByPspIdIuvIurResponse; +import it.gov.pagopa.fdr.controller.model.flow.response.PaginatedFlowsBySenderAndReceiverResponse; import it.gov.pagopa.fdr.test.util.AzuriteResource; import it.gov.pagopa.fdr.test.util.MongoResource; import it.gov.pagopa.fdr.test.util.TestUtil; @@ -25,6 +25,7 @@ @QuarkusTestResource(MongoResource.class) @QuarkusTestResource(AzuriteResource.class) class SupportTest { + private static final String GET_ALL_FDR_BY_PSP_ID_IUV = "/internal/psps/" + "%s" + "/iuv/" + "%s"; private static final String GET_ALL_FDR_BY_PSP_ID_IUR = "/internal/psps/" + "%s" + "/iur/" + "%s"; @@ -37,7 +38,7 @@ void testSupport_getFdrByPspIdIuv_Ok() { flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_FDR_BY_PSP_ID_IUV.formatted(PSP_CODE, "a"); - FdrByPspIdIuvIurResponse res = + PaginatedFlowsBySenderAndReceiverResponse res = given() .header(HEADER) .when() @@ -45,7 +46,7 @@ void testSupport_getFdrByPspIdIuv_Ok() { .then() .statusCode(200) .extract() - .as(FdrByPspIdIuvIurResponse.class); + .as(PaginatedFlowsBySenderAndReceiverResponse.class); assertThat(res.getCount(), greaterThan(0L)); assertThat( res.getData(), @@ -58,7 +59,7 @@ void testSupport_getFdrByPspIdIuv_Ok() { @DisplayName("SUPPORT - OK - getFdrByPspIdIuv - NO RESULTS") void testSupport_getFdrByPspIdIuv_Ok_No_Results() { String url = GET_ALL_FDR_BY_PSP_ID_IUV.formatted(PSP_CODE, "NO_RESULTS_IUV"); - FdrByPspIdIuvIurResponse res = + PaginatedFlowsBySenderAndReceiverResponse res = given() .header(HEADER) .when() @@ -66,7 +67,7 @@ void testSupport_getFdrByPspIdIuv_Ok_No_Results() { .then() .statusCode(200) .extract() - .as(FdrByPspIdIuvIurResponse.class); + .as(PaginatedFlowsBySenderAndReceiverResponse.class); assertThat(res.getCount(), equalTo(0L)); } @@ -77,7 +78,7 @@ void testSupport_getFdrByPspIdIur_Ok() { flowName = TestUtil.getDynamicFlowName(); TestUtil.pspSunnyDay(flowName); String url = GET_ALL_FDR_BY_PSP_ID_IUR.formatted(PSP_CODE, "abcdefg"); - FdrByPspIdIuvIurResponse res = + PaginatedFlowsBySenderAndReceiverResponse res = given() .header(HEADER) .when() @@ -85,7 +86,7 @@ void testSupport_getFdrByPspIdIur_Ok() { .then() .statusCode(200) .extract() - .as(FdrByPspIdIuvIurResponse.class); + .as(PaginatedFlowsBySenderAndReceiverResponse.class); assertThat(res.getCount(), greaterThan(0L)); assertThat( res.getData(), @@ -98,7 +99,7 @@ void testSupport_getFdrByPspIdIur_Ok() { @DisplayName("SUPPORT - OK - getFdrByPspIdIur - NO RESULTS") void testSupport_getFdrByPspIdIur_Ok_No_Results() { String url = GET_ALL_FDR_BY_PSP_ID_IUR.formatted(PSP_CODE, "NO_RESULTS_IUR"); - FdrByPspIdIuvIurResponse res = + PaginatedFlowsBySenderAndReceiverResponse res = given() .header(HEADER) .when() @@ -106,7 +107,7 @@ void testSupport_getFdrByPspIdIur_Ok_No_Results() { .then() .statusCode(200) .extract() - .as(FdrByPspIdIuvIurResponse.class); + .as(PaginatedFlowsBySenderAndReceiverResponse.class); assertThat(res.getCount(), equalTo(0L)); } } diff --git a/src/test/java/it/gov/pagopa/fdr/service/history/HistoryServiceTest.java b/src/test/java/it/gov/pagopa/fdr/service/history/HistoryServiceTest.java index 8e78d4e5..c91a119a 100644 --- a/src/test/java/it/gov/pagopa/fdr/service/history/HistoryServiceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/service/history/HistoryServiceTest.java @@ -1,15 +1,11 @@ package it.gov.pagopa.fdr.service.history; import io.quarkus.test.junit.QuarkusTest; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.util.FileUtil; -import jakarta.inject.Inject; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; @QuarkusTest class HistoryServiceTest { + + /* @Inject HistoryService historyService; @Inject FileUtil fileUtil; @@ -24,63 +20,63 @@ void testHistoryJsonValidation_OK() { "/schema-json/fdr_history_schema_" + jsonSchemaVersion.toLowerCase() + ".json")); String jsonString = """ + { + "status": "PUBLISHED", + "revision": 1, + "created": "2024-01-26T08:42:17.708Z", + "updated": "2024-01-26T08:42:21.788414200Z", + "fdr": "2024-01-2660000000001-17062585352", + "fdrDate": "2024-01-26T08:42:15.242Z", + "regulation": "SEPA - Bonifico xzy", + "regulationDate": "2024-01-26T08:42:15.242Z", + "bicCodePouringBank": "UNCRITMMXXX", + "sender": { + "type": "LEGAL_PERSON", + "id": "SELBIT2B", + "pspId": "60000000001", + "pspName": "Bank", + "pspBrokerId": "60000000001", + "channelId": "15376371009_04", + "password": "PLACEHOLDER" + }, + "receiver": { + "id": "APPBIT2B", + "organizationId": "15376371009", + "organizationName": "Comune di xyz" + }, + "published": "2024-01-26T08:42:21.788414200Z", + "computedTotPayments": 3, + "computedSumPayments": 0.03, + "totPayments": 3, + "sumPayments": 0.03, + "paymentList": [ + { + "iuv": "84100314577508a", + "iur": "6208035415a", + "index": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" + }, + { + "iuv": "84100314577508b", + "iur": "6208035415b", + "index": 2, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" + }, { - "status": "PUBLISHED", - "revision": 1, - "created": "2024-01-26T08:42:17.708Z", - "updated": "2024-01-26T08:42:21.788414200Z", - "fdr": "2024-01-2660000000001-17062585352", - "fdrDate": "2024-01-26T08:42:15.242Z", - "regulation": "SEPA - Bonifico xzy", - "regulationDate": "2024-01-26T08:42:15.242Z", - "bicCodePouringBank": "UNCRITMMXXX", - "sender": { - "type": "LEGAL_PERSON", - "id": "SELBIT2B", - "pspId": "60000000001", - "pspName": "Bank", - "pspBrokerId": "60000000001", - "channelId": "15376371009_04", - "password": "PLACEHOLDER" - }, - "receiver": { - "id": "APPBIT2B", - "organizationId": "15376371009", - "organizationName": "Comune di xyz" - }, - "published": "2024-01-26T08:42:21.788414200Z", - "computedTotPayments": 3, - "computedSumPayments": 0.03, - "totPayments": 3, - "sumPayments": 0.03, - "paymentList": [ - { - "iuv": "84100314577508a", - "iur": "6208035415a", - "index": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - }, - { - "iuv": "84100314577508b", - "iur": "6208035415b", - "index": 2, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - }, - { - "iuv": "84100314577508c", - "iur": "6208035415c", - "index": 3, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - } - ] + "iuv": "84100314577508c", + "iur": "6208035415c", + "index": 3, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" } - """; + ] + } + """; Assertions.assertDoesNotThrow(() -> historyService.isJsonValid(jsonString, jsonSchema)); } @@ -92,64 +88,65 @@ void testHistoryJsonValidation_Error() { "/schema-json/fdr_history_schema_" + jsonSchemaVersion.toLowerCase() + ".json")); String jsonString = """ + { + "status": "PUBLISHED", + "revision": "1", + "created": "2024-01-26T08:42:17.708Z", + "updated": "2024-01-26T08:42:21.788414200Z", + "fdr": "2024-01-2660000000001-17062585352", + "fdrDate": "2024-01-26T08:42:15.242Z", + "regulation": "SEPA - Bonifico xzy", + "regulationDate": "2024-01-26T08:42:15.242Z", + "bicCodePouringBank": "UNCRITMMXXX", + "sender": { + "type": "LEGAL_PERSON", + "id": "SELBIT2B", + "pspId": "60000000001", + "pspName": "Bank", + "pspBrokerId": "60000000001", + "channelId": "15376371009_04", + "password": "PLACEHOLDER" + }, + "receiver": { + "id": "APPBIT2B", + "organizationId": "15376371009", + "organizationName": "Comune di xyz" + }, + "published": "2024-01-26T08:42:21.788414200Z", + "computedTotPayments": 3, + "computedSumPayments": 0.03, + "totPayments": 3, + "sumPayments": 0.03, + "paymentList": [ + { + "iuv": "84100314577508a", + "iur": "6208035415a", + "index": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" + }, + { + "iuv": "84100314577508b", + "iur": "6208035415b", + "index": 2, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" + }, { - "status": "PUBLISHED", - "revision": "1", - "created": "2024-01-26T08:42:17.708Z", - "updated": "2024-01-26T08:42:21.788414200Z", - "fdr": "2024-01-2660000000001-17062585352", - "fdrDate": "2024-01-26T08:42:15.242Z", - "regulation": "SEPA - Bonifico xzy", - "regulationDate": "2024-01-26T08:42:15.242Z", - "bicCodePouringBank": "UNCRITMMXXX", - "sender": { - "type": "LEGAL_PERSON", - "id": "SELBIT2B", - "pspId": "60000000001", - "pspName": "Bank", - "pspBrokerId": "60000000001", - "channelId": "15376371009_04", - "password": "PLACEHOLDER" - }, - "receiver": { - "id": "APPBIT2B", - "organizationId": "15376371009", - "organizationName": "Comune di xyz" - }, - "published": "2024-01-26T08:42:21.788414200Z", - "computedTotPayments": 3, - "computedSumPayments": 0.03, - "totPayments": 3, - "sumPayments": 0.03, - "paymentList": [ - { - "iuv": "84100314577508a", - "iur": "6208035415a", - "index": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - }, - { - "iuv": "84100314577508b", - "iur": "6208035415b", - "index": 2, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - }, - { - "iuv": "84100314577508c", - "iur": "6208035415c", - "index": 3, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900Z" - } - ] + "iuv": "84100314577508c", + "iur": "6208035415c", + "index": 3, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900Z" } - """; + ] + } + """; Assertions.assertThrows( AppException.class, () -> historyService.isJsonValid(jsonString, jsonSchema)); } + */ } diff --git a/src/test/java/it/gov/pagopa/fdr/service/re/ReServiceTest.java b/src/test/java/it/gov/pagopa/fdr/service/re/ReServiceTest.java index 120750b9..cd719dcf 100644 --- a/src/test/java/it/gov/pagopa/fdr/service/re/ReServiceTest.java +++ b/src/test/java/it/gov/pagopa/fdr/service/re/ReServiceTest.java @@ -1,39 +1,18 @@ package it.gov.pagopa.fdr.service.re; -import static org.bson.assertions.Assertions.fail; - -import com.azure.messaging.eventhubs.EventData; -import com.azure.messaging.eventhubs.EventDataBatch; -import com.azure.messaging.eventhubs.EventHubProducerClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.azure.storage.blob.BlobServiceClientBuilder; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import io.quarkiverse.mockserver.test.MockServerTestResource; import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.mockito.InjectMock; -import it.gov.pagopa.fdr.exception.AppErrorCodeMessageEnum; -import it.gov.pagopa.fdr.exception.AppException; -import it.gov.pagopa.fdr.service.re.model.*; import it.gov.pagopa.fdr.test.util.AzuriteResource; -import java.lang.reflect.Field; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.jboss.logging.Logger; -import org.junit.Assert; -import org.junit.jupiter.api.*; -import org.mockito.Mockito; +import org.junit.jupiter.api.TestInstance; @QuarkusTest @QuarkusTestResource(MockServerTestResource.class) @QuarkusTestResource(AzuriteResource.class) @TestInstance(TestInstance.Lifecycle.PER_CLASS) class ReServiceTest { + + /* private final ObjectMapper objectMapper; @InjectMock ReService reServiceMock; @@ -195,7 +174,9 @@ void testPublishEvent_FullBatch_OK() throws JsonProcessingException { Mockito.when(eventDataBatch.tryAdd(Mockito.any())) .thenAnswer( invocation -> { - if (counter.get() == 1) return true; + if (counter.get() == 1) { + return true; + } counter.set(1); return false; }); @@ -231,5 +212,5 @@ void testPublishEvent_TooLarge() throws JsonProcessingException { void testSendEventDataBachLT0() { reServiceMock.publishEvents(null); Mockito.verify(producerMock, Mockito.times(0)).send((EventDataBatch) Mockito.any()); - } + }*/ } diff --git a/src/test/java/it/gov/pagopa/fdr/test/util/TestUtil.java b/src/test/java/it/gov/pagopa/fdr/test/util/TestUtil.java index f5228db3..d2500230 100644 --- a/src/test/java/it/gov/pagopa/fdr/test/util/TestUtil.java +++ b/src/test/java/it/gov/pagopa/fdr/test/util/TestUtil.java @@ -12,11 +12,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import it.gov.pagopa.fdr.rest.model.GenericResponse; -import it.gov.pagopa.fdr.service.dto.SenderTypeEnumDto; +import it.gov.pagopa.fdr.controller.model.common.response.GenericResponse; +import it.gov.pagopa.fdr.controller.model.flow.enums.SenderTypeEnum; import java.time.Instant; public class TestUtil { + public static String getDynamicFlowName() { return getDynamicFlowName(PSP_CODE); } @@ -54,51 +55,51 @@ public static String getDynamicFlowName(String psp) { public static String PAYMENTS_ADD_TEMPLATE = """ - { - "payments": [{ - "index": 100, - "iuv": "a", - "iur": "abcdefg", - "idTransfer": 1, - "pay": 0.01, - "payStatus": "EXECUTED", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 101, - "iuv": "b", - "iur": "abcdefg", - "idTransfer": 2, - "pay": 0.01, - "payStatus": "REVOKED", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 102, - "iuv": "c", - "iur": "abcdefg", - "idTransfer": 3, - "pay": 0.01, - "payStatus": "NO_RPT", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 103, - "iuv": "d", - "iur": "abcdefg", - "idTransfer": 4, - "pay": 0.01, - "payStatus": "STAND_IN", - "payDate": "2023-02-03T12:00:30.900000Z" - },{ - "index": 104, - "iuv": "e", - "iur": "abcdefg", - "idTransfer": 5, - "pay": 0.01, - "payStatus": "STAND_IN_NO_RPT", - "payDate": "2023-02-03T12:00:30.900000Z" + { + "payments": [{ + "index": 100, + "iuv": "a", + "iur": "abcdefg", + "idTransfer": 1, + "pay": 0.01, + "payStatus": "EXECUTED", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 101, + "iuv": "b", + "iur": "abcdefg", + "idTransfer": 2, + "pay": 0.01, + "payStatus": "REVOKED", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 102, + "iuv": "c", + "iur": "abcdefg", + "idTransfer": 3, + "pay": 0.01, + "payStatus": "NO_RPT", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 103, + "iuv": "d", + "iur": "abcdefg", + "idTransfer": 4, + "pay": 0.01, + "payStatus": "STAND_IN", + "payDate": "2023-02-03T12:00:30.900000Z" + },{ + "index": 104, + "iuv": "e", + "iur": "abcdefg", + "idTransfer": 5, + "pay": 0.01, + "payStatus": "STAND_IN_NO_RPT", + "payDate": "2023-02-03T12:00:30.900000Z" + } + ] } - ] - } - """; + """; public static String PAYMENTS_ADD_TEMPLATE_2 = """ @@ -153,7 +154,7 @@ public static void pspSunnyDay(String flowName) { String bodyFmtPspFlow = FLOW_TEMPLATE.formatted( flowName, - SenderTypeEnumDto.LEGAL_PERSON.name(), + SenderTypeEnum.LEGAL_PERSON.name(), PSP_CODE, BROKER_CODE, CHANNEL_CODE, diff --git a/src/test/java/it/gov/pagopa/fdr/util/AppMessageUtilTest.java b/src/test/java/it/gov/pagopa/fdr/util/AppMessageUtilTest.java index 59dfb211..116566cc 100644 --- a/src/test/java/it/gov/pagopa/fdr/util/AppMessageUtilTest.java +++ b/src/test/java/it/gov/pagopa/fdr/util/AppMessageUtilTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import io.quarkus.test.junit.QuarkusTest; +import it.gov.pagopa.fdr.util.logging.AppMessageUtil; import org.junit.jupiter.api.Test; @QuarkusTest From a11d547dd4d273f2b08b77624f921da4a05f1db9 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Mon, 27 Jan 2025 09:53:53 +0000 Subject: [PATCH 46/47] Bump to version 1.0.25 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index b226ac3f..7bc1b330 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.48.0" -appVersion: "1.0.24-2-project-refactoring" +version: "1.49.0" +appVersion: "1.0.25" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index a3fd3128..fde9248d 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.24-2-project-refactoring + tag: 1.0.25 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index a81a2bf1..b7ecd354 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.24-2-project-refactoring + tag: 1.0.25 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 003fa1fe..834b0ba9 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24-2-project-refactoring" + "version": "1.0.25" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 22163dd2..0e9040cf 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24-2-project-refactoring" + "version": "1.0.25" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 2b283dc6..41a95394 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.24-2-project-refactoring" + "version": "1.0.25" }, "servers": [ { diff --git a/pom.xml b/pom.xml index e52bc304..e8d4afde 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.24-2-project-refactoring + 1.0.25 3.11.0 1.18.26 From e4e6ba3db45525556c88461e9706144520347f67 Mon Sep 17 00:00:00 2001 From: pagopa-github-bot Date: Mon, 27 Jan 2025 09:57:44 +0000 Subject: [PATCH 47/47] Bump to version 1.1.0 [skip ci] --- helm/Chart.yaml | 4 ++-- helm/values-dev.yaml | 2 +- helm/values-uat.yaml | 2 +- openapi/openapi_internal.json | 2 +- openapi/openapi_organization.json | 2 +- openapi/openapi_psp.json | 2 +- pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/helm/Chart.yaml b/helm/Chart.yaml index 7bc1b330..16f62923 100644 --- a/helm/Chart.yaml +++ b/helm/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: pagopa-fdr-chart description: Flussi di rendicontazioni type: application -version: "1.49.0" -appVersion: "1.0.25" +version: "1.50.0" +appVersion: "1.1.0" dependencies: - name: microservice-chart version: 3.0.0 diff --git a/helm/values-dev.yaml b/helm/values-dev.yaml index fde9248d..13125570 100644 --- a/helm/values-dev.yaml +++ b/helm/values-dev.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.25 + tag: 1.1.0 pullPolicy: Always readinessProbe: httpGet: diff --git a/helm/values-uat.yaml b/helm/values-uat.yaml index b7ecd354..0628d4a4 100644 --- a/helm/values-uat.yaml +++ b/helm/values-uat.yaml @@ -4,7 +4,7 @@ microservice-chart: fullnameOverride: "" image: repository: ghcr.io/pagopa/pagopa-fdr - tag: 1.0.25 + tag: 1.1.0 pullPolicy: Always readinessProbe: httpGet: diff --git a/openapi/openapi_internal.json b/openapi/openapi_internal.json index 834b0ba9..a98b7462 100644 --- a/openapi/openapi_internal.json +++ b/openapi/openapi_internal.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.25" + "version": "1.1.0" }, "servers": [ { diff --git a/openapi/openapi_organization.json b/openapi/openapi_organization.json index 0e9040cf..b5c9a8de 100644 --- a/openapi/openapi_organization.json +++ b/openapi/openapi_organization.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.25" + "version": "1.1.0" }, "servers": [ { diff --git a/openapi/openapi_psp.json b/openapi/openapi_psp.json index 41a95394..11312cb9 100644 --- a/openapi/openapi_psp.json +++ b/openapi/openapi_psp.json @@ -4,7 +4,7 @@ "title": "FDR - Flussi di rendicontazione (local)", "description": "Manage FDR ( aka \"Flussi di Rendicontazione\" ) exchanged between PSP and EC", "termsOfService": "https://www.pagopa.gov.it/", - "version": "1.0.25" + "version": "1.1.0" }, "servers": [ { diff --git a/pom.xml b/pom.xml index e8d4afde..616969c6 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 it.gov.pagopa pagopa-fdr - 1.0.25 + 1.1.0 3.11.0 1.18.26