diff --git a/.github/workflows/api.yml b/.github/workflows/ci-api-build.and.test.yml
similarity index 52%
rename from .github/workflows/api.yml
rename to .github/workflows/ci-api-build.and.test.yml
index 9f40dbb4..54caff35 100644
--- a/.github/workflows/api.yml
+++ b/.github/workflows/ci-api-build.and.test.yml
@@ -1,7 +1,7 @@
name: API CI
on:
- workflow_dispatch:
+ workflow_dispatch:
push:
branches:
- master
@@ -18,51 +18,51 @@ on:
jobs:
quality_profile:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
defaults:
run:
working-directory: api
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
fetch-depth: 0
- - uses: actions/setup-java@v1
+ - uses: actions/setup-java@v3
with:
- java-version: 11
- - uses: actions/cache@v1
+ java-version: 17
+ distribution: oracle
+ - uses: actions/cache@v3
with:
path: ~/.m2/repository
- key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ key: ${{ runner.os }}-maven-5Jun-${{ hashFiles('**/pom.xml') }}
restore-keys: |
- ${{ runner.os }}-maven-
+ ${{ runner.os }}-maven-5Jun-
- name: Run unit tests
- run: mvn -f pom.xml clean test
+ run: mvn -f pom.xml clean package
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
- #- name: Run Sonar Analysis
- # run: mvn -f pom.xml sonar:sonar
- # -Dsonar.login=${{ secrets.SONAR_TOKEN }}
- # -Dsonar.host.url=https://sonarcloud.io
- #-Dsonar.organization=bcgov-sonarcloud
- #-Dsonar.projectKey=${{ secrets.SONAR_PROJECT_KEY }}
+ - name: Run Sonar Analysis
+ run: mvn -f pom.xml sonar:sonar
+ -Dsonar.login=${{ secrets.SONAR_TOKEN }}
+ -Dsonar.host.url=https://sonarcloud.io
+ -Dsonar.organization=bcgov-sonarcloud
+ -Dsonar.projectKey=${{ secrets.SONAR_PROJECT_KEY }}
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Run Trivy vulnerability scanner in repo mode
- uses: aquasecurity/trivy-action@master
+ uses: aquasecurity/trivy-action@0.10.0
with:
scan-type: 'fs'
ignore-unfixed: true
- format: 'template'
- template: '@/contrib/sarif.tpl'
+ format: 'sarif'
output: 'trivy-results.sarif'
- severity: 'LOW'
+ severity: 'CRITICAL'
- name: Upload Trivy scan results to GitHub Security tab
- uses: github/codeql-action/upload-sarif@v1
+ uses: github/codeql-action/upload-sarif@v2
with:
- sarif_file: 'trivy-results.sarif'
+ sarif_file: 'trivy-results.sarif'
\ No newline at end of file
diff --git a/.github/workflows/deploy-to.openshift-dev.yml b/.github/workflows/deploy-to.openshift-dev.yml
new file mode 100644
index 00000000..4d08004b
--- /dev/null
+++ b/.github/workflows/deploy-to.openshift-dev.yml
@@ -0,0 +1,170 @@
+name: Build & Deploy to DEV
+
+env:
+ # 🖊️ EDIT your repository secrets to log into your OpenShift cluster and set up the context.
+ # See https://github.com/redhat-actions/oc-login#readme for how to retrieve these values.
+ # To get a permanent token, refer to https://github.com/redhat-actions/oc-login/wiki/Using-a-Service-Account-for-GitHub-Actions
+ OPENSHIFT_SERVER: ${{ secrets.OPENSHIFT_SERVER }}
+ OPENSHIFT_TOKEN: ${{ secrets.OPENSHIFT_TOKEN }}
+ OPENSHIFT_NAMESPACE_DEV: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-dev
+
+ DB_JDBC_CONNECT_STRING: ${{ secrets.DB_JDBC_CONNECT_STRING }}
+ DB_PWD: ${{ secrets.DB_PWD }}
+ DB_USER: ${{ secrets.DB_USER }}
+ SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }}
+
+ # 🖊️ EDIT to change the image registry settings.
+ # Registries such as GHCR, Quay.io, and Docker Hub are supported.
+ IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }}
+ IMAGE_REGISTRY_USER: ${{ github.actor }}
+ IMAGE_REGISTRY_PASSWORD: ${{ github.token }}
+
+ # 🖊️ EDIT to specify custom tags for the container image, or default tags will be generated below.
+ IMAGE_TAGS: ""
+
+ SPRING_BOOT_IMAGE_NAME: pen-reg-batch-api-master
+ DOCKER_ARTIFACTORY_REPO: artifacts.developer.gov.bc.ca/docker-remote
+ ARTIFACTORY_REPO: artifacts.developer.gov.bc.ca
+
+ APP_NAME: "pen-reg-batch-api"
+ REPO_NAME: "educ-pen-reg-batch-api"
+ BRANCH: "master"
+ APP_NAME_FULL: "pen-reg-batch-api-master"
+ NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}
+ COMMON_NAMESPACE: ${{ secrets.COMMON_NAMESPACE_NO_ENV }}
+ TAG: "latest"
+ MIN_REPLICAS_DEV: "1"
+ MAX_REPLICAS_DEV: "1"
+ MIN_CPU: "250m"
+ MAX_CPU: "500m"
+ MIN_MEM: "1Gi"
+ MAX_MEM: "2Gi"
+
+on:
+ push:
+ branches:
+ - master
+ workflow_dispatch:
+
+jobs:
+ build-and-deploy-dev:
+ name: Build and deploy to OpenShift DEV
+ # ubuntu-20.04 can also be used.
+ runs-on: ubuntu-20.04
+ environment: dev
+
+ outputs:
+ ROUTE: ${{ steps.deploy-and-expose.outputs.route }}
+ SELECTOR: ${{ steps.deploy-and-expose.outputs.selector }}
+
+ steps:
+ - name: Check for required secrets
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const secrets = {
+ OPENSHIFT_SERVER: `${{ secrets.OPENSHIFT_SERVER }}`,
+ OPENSHIFT_TOKEN: `${{ secrets.OPENSHIFT_TOKEN }}`,
+ };
+ const GHCR = "ghcr.io";
+ if (`${{ env.IMAGE_REGISTRY }}`.startsWith(GHCR)) {
+ core.info(`Image registry is ${GHCR} - no registry password required`);
+ }
+ else {
+ core.info("A registry password is required");
+ secrets["IMAGE_REGISTRY_PASSWORD"] = `${{ secrets.IMAGE_REGISTRY_PASSWORD }}`;
+ }
+ const missingSecrets = Object.entries(secrets).filter(([ name, value ]) => {
+ if (value.length === 0) {
+ core.error(`Secret "${name}" is not set`);
+ return true;
+ }
+ core.info(`✔️ Secret "${name}" is set`);
+ return false;
+ });
+ if (missingSecrets.length > 0) {
+ core.setFailed(`❌ At least one required secret is not set in the repository. \n` +
+ "You can add it using:\n" +
+ "GitHub UI: https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository \n" +
+ "GitHub CLI: https://cli.github.com/manual/gh_secret_set \n" +
+ "Also, refer to https://github.com/redhat-actions/oc-login#getting-started-with-the-action-or-see-example");
+ }
+ else {
+ core.info(`✅ All the required secrets are set`);
+ }
+ - name: Check out repository
+ uses: actions/checkout@v3
+
+ - name: Determine image tags
+ if: env.IMAGE_TAGS == ''
+ run: |
+ echo "IMAGE_TAGS=latest ${GITHUB_SHA::12}" | tee -a $GITHUB_ENV
+ - name: Login to Docker Hub
+ uses: docker/login-action@v2
+ with:
+ registry: ${{ env.DOCKER_ARTIFACTORY_REPO }}
+ username: ${{ secrets.DOCKER_HUB_USERNAME }}
+ password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
+
+ # https://github.com/redhat-actions/buildah-build#readme
+ - name: Build from Dockerfile
+ id: build-image
+ uses: redhat-actions/buildah-build@v2
+ with:
+ image: ${{ env.APP_NAME_FULL }}
+ tags: ${{ env.IMAGE_TAGS }}
+
+ # If you don't have a Dockerfile/Containerfile, refer to https://github.com/redhat-actions/buildah-build#scratch-build-inputs
+ # Or, perform a source-to-image build using https://github.com/redhat-actions/s2i-build
+ # Otherwise, point this to your Dockerfile/Containerfile relative to the repository root.
+ dockerfiles: |
+ ./Dockerfile
+ # https://github.com/redhat-actions/push-to-registry#readme
+ - name: Push to registry
+ id: push-image
+ uses: redhat-actions/push-to-registry@v2
+ with:
+ image: ${{ steps.build-image.outputs.image }}
+ tags: ${{ steps.build-image.outputs.tags }}
+ registry: ${{ env.IMAGE_REGISTRY }}
+ username: ${{ env.IMAGE_REGISTRY_USER }}
+ password: ${{ env.IMAGE_REGISTRY_PASSWORD }}
+
+ # The path the image was pushed to is now stored in ${{ steps.push-image.outputs.registry-path }}
+
+ - name: Install oc
+ uses: redhat-actions/openshift-tools-installer@v1
+ with:
+ oc: 4
+
+ # https://github.com/redhat-actions/oc-login#readme
+ - uses: actions/checkout@v3
+
+ - name: Deploy API
+ run: |
+ set -eu
+ # Login to OpenShift and select project
+ oc login --token=${{ env.OPENSHIFT_TOKEN }} --server=${{ env.OPENSHIFT_SERVER }}
+ oc project ${{ env.OPENSHIFT_NAMESPACE_DEV }}
+ # Cancel any rollouts in progress
+ oc rollout cancel dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "No rollout in progress"
+
+ oc tag ${{ steps.push-image.outputs.registry-path }} ${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ env.TAG }}
+
+ # Process and apply deployment template
+ oc process -f tools/openshift/api.dc.yaml -p APP_NAME=${{ env.APP_NAME }} -p REPO_NAME=${{ env.REPO_NAME }} -p BRANCH=${{ env.BRANCH }} -p NAMESPACE=${{ env.OPENSHIFT_NAMESPACE_DEV }} -p TAG=${{ env.TAG }} -p MIN_REPLICAS=${{ env.MIN_REPLICAS_DEV }} -p MAX_REPLICAS=${{ env.MAX_REPLICAS_DEV }} -p MIN_CPU=${{ env.MIN_CPU }} -p MAX_CPU=${{ env.MAX_CPU }} -p MIN_MEM=${{ env.MIN_MEM }} -p MAX_MEM=${{ env.MAX_MEM }} \
+ | oc apply -f -
+
+ curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin dev ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.DB_JDBC_CONNECT_STRING }} ${{ env.DB_PWD }} ${{ env.DB_USER }} ${{ env.SPLUNK_TOKEN }}
+
+ # Start rollout (if necessary) and follow it
+ oc rollout latest dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "Rollout in progress"
+ oc logs -f dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
+ # Get status, returns 0 if rollout is successful
+ oc rollout status dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
+ - name: ZAP Scan
+ uses: zaproxy/action-api-scan@v0.2.0
+ with:
+ target: 'https://${{ env.APP_NAME }}-${{ env.OPENSHIFT_NAMESPACE_DEV }}.apps.silver.devops.gov.bc.ca/v3/api-docs'
\ No newline at end of file
diff --git a/.github/workflows/deploy-to.openshift-prod.yml b/.github/workflows/deploy-to.openshift-prod.yml
new file mode 100644
index 00000000..ab9a7268
--- /dev/null
+++ b/.github/workflows/deploy-to.openshift-prod.yml
@@ -0,0 +1,131 @@
+name: Deploy to PROD
+
+env:
+ # 🖊️ EDIT your repository secrets to log into your OpenShift cluster and set up the context.
+ # See https://github.com/redhat-actions/oc-login#readme for how to retrieve these values.
+ # To get a permanent token, refer to https://github.com/redhat-actions/oc-login/wiki/Using-a-Service-Account-for-GitHub-Actions
+ # Added this comment
+ OPENSHIFT_SERVER: ${{ secrets.OPENSHIFT_SERVER }}
+ OPENSHIFT_TOKEN: ${{ secrets.OPENSHIFT_TOKEN }}
+ OPENSHIFT_NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-prod
+
+ DB_JDBC_CONNECT_STRING: ${{ secrets.DB_JDBC_CONNECT_STRING }}
+ DB_PWD: ${{ secrets.DB_PWD }}
+ DB_USER: ${{ secrets.DB_USER }}
+ SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }}
+
+ # 🖊️ EDIT to change the image registry settings.
+ # Registries such as GHCR, Quay.io, and Docker Hub are supported.
+ IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }}
+ IMAGE_REGISTRY_USER: ${{ github.actor }}
+ IMAGE_REGISTRY_PASSWORD: ${{ github.token }}
+
+ SPRING_BOOT_IMAGE_NAME: pen-reg-batch-api-master
+
+ APP_NAME: "pen-reg-batch-api"
+ REPO_NAME: "educ-pen-reg-batch-api"
+ BRANCH: "master"
+ NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}
+ COMMON_NAMESPACE: ${{ secrets.COMMON_NAMESPACE_NO_ENV }}
+ TAG: "latest"
+ TARGET_ENV: "prod"
+ MIN_REPLICAS: "3"
+ MAX_REPLICAS: "3"
+ MIN_CPU: "250m"
+ MAX_CPU: "500m"
+ MIN_MEM: "1Gi"
+ MAX_MEM: "2Gi"
+
+on:
+ # https://docs.github.com/en/actions/reference/events-that-trigger-workflows
+ workflow_dispatch:
+
+jobs:
+ openshift-ci-cd:
+ name: Deploy to OpenShift PROD
+ # ubuntu-20.04 can also be used.
+ runs-on: ubuntu-20.04
+ environment: production
+
+ outputs:
+ ROUTE: ${{ steps.deploy-and-expose.outputs.route }}
+ SELECTOR: ${{ steps.deploy-and-expose.outputs.selector }}
+
+ steps:
+ - name: Check for required secrets
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const secrets = {
+ OPENSHIFT_SERVER: `${{ secrets.OPENSHIFT_SERVER }}`,
+ OPENSHIFT_TOKEN: `${{ secrets.OPENSHIFT_TOKEN }}`,
+ };
+
+ const GHCR = "ghcr.io";
+ if (`${{ env.IMAGE_REGISTRY }}`.startsWith(GHCR)) {
+ core.info(`Image registry is ${GHCR} - no registry password required`);
+ }
+ else {
+ core.info("A registry password is required");
+ secrets["IMAGE_REGISTRY_PASSWORD"] = `${{ secrets.IMAGE_REGISTRY_PASSWORD }}`;
+ }
+
+ const missingSecrets = Object.entries(secrets).filter(([ name, value ]) => {
+ if (value.length === 0) {
+ core.error(`Secret "${name}" is not set`);
+ return true;
+ }
+ core.info(`✔️ Secret "${name}" is set`);
+ return false;
+ });
+
+ if (missingSecrets.length > 0) {
+ core.setFailed(`❌ At least one required secret is not set in the repository. \n` +
+ "You can add it using:\n" +
+ "GitHub UI: https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository \n" +
+ "GitHub CLI: https://cli.github.com/manual/gh_secret_set \n" +
+ "Also, refer to https://github.com/redhat-actions/oc-login#getting-started-with-the-action-or-see-example");
+ }
+ else {
+ core.info(`✅ All the required secrets are set`);
+ }
+
+ - name: Check out repository
+ uses: actions/checkout@v3
+
+ - name: Get latest tag
+ uses: actions-ecosystem/action-get-latest-tag@v1
+ id: get-latest-tag
+
+ - name: Install oc
+ uses: redhat-actions/openshift-tools-installer@v1
+ with:
+ oc: 4
+
+ # https://github.com/redhat-actions/oc-login#readme
+ - uses: actions/checkout@v3
+
+ - name: Deploy API
+ run: |
+ set -eux
+ # Login to OpenShift and select project
+ oc login --token=${{ env.OPENSHIFT_TOKEN }} --server=${{ env.OPENSHIFT_SERVER }}
+ oc project ${{ env.OPENSHIFT_NAMESPACE }}
+ # Cancel any rollouts in progress
+ oc rollout cancel dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "No rollout in progress"
+
+ oc tag ${{ env.NAMESPACE }}-dev/${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ steps.get-latest-tag.outputs.tag }} ${{ env.NAMESPACE }}-prod/${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ steps.get-latest-tag.outputs.tag }}
+
+ # Process and apply deployment template
+ oc process -f tools/openshift/api.dc.yaml -p APP_NAME=${{ env.APP_NAME }} -p REPO_NAME=${{ env.REPO_NAME }} -p BRANCH=${{ env.BRANCH }} -p NAMESPACE=${{ env.OPENSHIFT_NAMESPACE }} -p TAG=${{ steps.get-latest-tag.outputs.tag }} -p MIN_REPLICAS=${{ env.MIN_REPLICAS }} -p MAX_REPLICAS=${{ env.MAX_REPLICAS }} -p MIN_CPU=${{ env.MIN_CPU }} -p MAX_CPU=${{ env.MAX_CPU }} -p MIN_MEM=${{ env.MIN_MEM }} -p MAX_MEM=${{ env.MAX_MEM }} \
+ | oc apply -f -
+
+ curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/${{ steps.get-latest-tag.outputs.tag }}/tools/config/update-configmap.sh | bash /dev/stdin ${{ env.TARGET_ENV }} ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.DB_JDBC_CONNECT_STRING }} ${{ env.DB_PWD }} ${{ env.DB_USER }} ${{ env.SPLUNK_TOKEN }}
+
+ # Start rollout (if necessary) and follow it
+ oc rollout latest dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "Rollout in progress"
+ oc logs -f dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
+ # Get status, returns 0 if rollout is successful
+ oc rollout status dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
\ No newline at end of file
diff --git a/.github/workflows/deploy-to.openshift-test.yml b/.github/workflows/deploy-to.openshift-test.yml
new file mode 100644
index 00000000..d123816b
--- /dev/null
+++ b/.github/workflows/deploy-to.openshift-test.yml
@@ -0,0 +1,130 @@
+name: Build & Deploy to TEST
+
+env:
+ # 🖊️ EDIT your repository secrets to log into your OpenShift cluster and set up the context.
+ # See https://github.com/redhat-actions/oc-login#readme for how to retrieve these values.
+ # To get a permanent token, refer to https://github.com/redhat-actions/oc-login/wiki/Using-a-Service-Account-for-GitHub-Actions
+ OPENSHIFT_SERVER: ${{ secrets.OPENSHIFT_SERVER }}
+ OPENSHIFT_TOKEN: ${{ secrets.OPENSHIFT_TOKEN }}
+ OPENSHIFT_NAMESPACE_TEST: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-test
+
+ DB_JDBC_CONNECT_STRING: ${{ secrets.DB_JDBC_CONNECT_STRING }}
+ DB_PWD: ${{ secrets.DB_PWD }}
+ DB_USER: ${{ secrets.DB_USER }}
+ SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }}
+
+ # 🖊️ EDIT to change the image registry settings.
+ # Registries such as GHCR, Quay.io, and Docker Hub are supported.
+ IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }}
+ IMAGE_REGISTRY_USER: ${{ github.actor }}
+ IMAGE_REGISTRY_PASSWORD: ${{ github.token }}
+
+ # 🖊️ EDIT to specify custom tags for the container image, or default tags will be generated below.
+ IMAGE_TAGS: ""
+
+ SPRING_BOOT_IMAGE_NAME: pen-reg-batch-api-master
+ DOCKER_ARTIFACTORY_REPO: artifacts.developer.gov.bc.ca/docker-remote
+ ARTIFACTORY_REPO: artifacts.developer.gov.bc.ca
+
+ APP_NAME: "pen-reg-batch-api"
+ REPO_NAME: "educ-pen-reg-batch-api"
+ BRANCH: "master"
+ NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}
+ COMMON_NAMESPACE: ${{ secrets.COMMON_NAMESPACE_NO_ENV }}
+ TAG: "latest"
+ MIN_REPLICAS_TEST: "2"
+ MAX_REPLICAS_TEST: "2"
+ MIN_CPU: "250m"
+ MAX_CPU: "500m"
+ MIN_MEM: "1Gi"
+ MAX_MEM: "2Gi"
+
+on:
+ workflow_dispatch:
+
+jobs:
+ deploy-test:
+ name: Deploy to OpenShift TEST
+ runs-on: ubuntu-20.04
+ environment: test
+
+ outputs:
+ ROUTE: ${{ steps.deploy-and-expose.outputs.route }}
+ SELECTOR: ${{ steps.deploy-and-expose.outputs.selector }}
+
+ steps:
+ - name: Check for required secrets
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const secrets = {
+ OPENSHIFT_SERVER: `${{ secrets.OPENSHIFT_SERVER }}`,
+ OPENSHIFT_TOKEN: `${{ secrets.OPENSHIFT_TOKEN }}`,
+ };
+
+ const GHCR = "ghcr.io";
+ if (`${{ env.IMAGE_REGISTRY }}`.startsWith(GHCR)) {
+ core.info(`Image registry is ${GHCR} - no registry password required`);
+ }
+ else {
+ core.info("A registry password is required");
+ secrets["IMAGE_REGISTRY_PASSWORD"] = `${{ secrets.IMAGE_REGISTRY_PASSWORD }}`;
+ }
+
+ const missingSecrets = Object.entries(secrets).filter(([ name, value ]) => {
+ if (value.length === 0) {
+ core.error(`Secret "${name}" is not set`);
+ return true;
+ }
+ core.info(`✔️ Secret "${name}" is set`);
+ return false;
+ });
+
+ if (missingSecrets.length > 0) {
+ core.setFailed(`❌ At least one required secret is not set in the repository. \n` +
+ "You can add it using:\n" +
+ "GitHub UI: https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository \n" +
+ "GitHub CLI: https://cli.github.com/manual/gh_secret_set \n" +
+ "Also, refer to https://github.com/redhat-actions/oc-login#getting-started-with-the-action-or-see-example");
+ }
+ else {
+ core.info(`✅ All the required secrets are set`);
+ }
+
+ - name: Check out repository
+ uses: actions/checkout@v3
+
+ - name: Install oc
+ uses: redhat-actions/openshift-tools-installer@v1
+ with:
+ oc: 4
+
+ - name: Deploy API
+ run: |
+ set -eu
+ # Login to OpenShift and select project
+ oc login --token=${{ env.OPENSHIFT_TOKEN }} --server=${{ env.OPENSHIFT_SERVER }}
+ oc project ${{ env.OPENSHIFT_NAMESPACE_TEST }}
+ # Cancel any rollouts in progress
+ oc rollout cancel dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "No rollout in progress"
+
+ oc tag ${{ env.NAMESPACE }}-dev/${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ env.TAG }} ${{ env.NAMESPACE }}-test/${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ env.TAG }}
+
+ # Process and apply deployment template
+ oc process -f tools/openshift/api.dc.yaml -p APP_NAME=${{ env.APP_NAME }} -p REPO_NAME=${{ env.REPO_NAME }} -p BRANCH=${{ env.BRANCH }} -p NAMESPACE=${{ env.OPENSHIFT_NAMESPACE_TEST }} -p TAG=${{ env.TAG }} -p MIN_REPLICAS=${{ env.MIN_REPLICAS_TEST }} -p MAX_REPLICAS=${{ env.MAX_REPLICAS_TEST }} -p MIN_CPU=${{ env.MIN_CPU }} -p MAX_CPU=${{ env.MAX_CPU }} -p MIN_MEM=${{ env.MIN_MEM }} -p MAX_MEM=${{ env.MAX_MEM }} \
+ | oc apply -f -
+
+ curl -s https://raw.githubusercontent.com/bcgov/${{ env.REPO_NAME }}/master/tools/config/update-configmap.sh | bash /dev/stdin test ${{ env.APP_NAME }} ${{ env.NAMESPACE }} ${{ env.COMMON_NAMESPACE }} ${{ env.DB_JDBC_CONNECT_STRING }} ${{ env.DB_PWD }} ${{ env.DB_USER }} ${{ env.SPLUNK_TOKEN }}
+
+ # Start rollout (if necessary) and follow it
+ oc rollout latest dc/${{ env.SPRING_BOOT_IMAGE_NAME }} 2> /dev/null \
+ || true && echo "Rollout in progress"
+ oc logs -f dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
+ # Get status, returns 0 if rollout is successful
+ oc rollout status dc/${{ env.SPRING_BOOT_IMAGE_NAME }}
+
+ - name: ZAP Scan
+ uses: zaproxy/action-api-scan@v0.2.0
+ with:
+ target: 'https://${{ env.APP_NAME }}-${{ env.OPENSHIFT_NAMESPACE_TEST }}.apps.silver.devops.gov.bc.ca/v3/api-docs'
\ No newline at end of file
diff --git a/.github/workflows/tag-create.git.and.imagestream.tag.yml b/.github/workflows/tag-create.git.and.imagestream.tag.yml
new file mode 100644
index 00000000..57b1f8a8
--- /dev/null
+++ b/.github/workflows/tag-create.git.and.imagestream.tag.yml
@@ -0,0 +1,63 @@
+name: Create Tag
+
+env:
+ # 🖊️ EDIT your repository secrets to log into your OpenShift cluster and set up the context.
+ # See https://github.com/redhat-actions/oc-login#readme for how to retrieve these values.
+ # To get a permanent token, refer to https://github.com/redhat-actions/oc-login/wiki/Using-a-Service-Account-for-GitHub-Actions
+ OPENSHIFT_SERVER: ${{ secrets.OPENSHIFT_SERVER }}
+ OPENSHIFT_TOKEN: ${{ secrets.OPENSHIFT_TOKEN }}
+ OPENSHIFT_NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}-dev
+
+ REPO_NAME: "educ-pen-reg-batch-api"
+ BRANCH: "master"
+ NAMESPACE: ${{ secrets.PEN_NAMESPACE_NO_ENV }}
+
+on:
+ # https://docs.github.com/en/actions/reference/events-that-trigger-workflows
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Version Number'
+ required: true
+
+jobs:
+ openshift-ci-cd:
+ name: Tag Image
+ # ubuntu-latest can also be used.
+ runs-on: ubuntu-22.04
+ environment: dev
+
+ outputs:
+ ROUTE: ${{ steps.deploy-and-expose.outputs.route }}
+ SELECTOR: ${{ steps.deploy-and-expose.outputs.selector }}
+
+ steps:
+ - name: Check out repository
+ uses: actions/checkout@v3
+
+ - name: Create tag
+ uses: actions/github-script@v6
+ with:
+ script: |
+ github.rest.git.createRef({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ ref: 'refs/tags/${{ github.event.inputs.version }}',
+ sha: context.sha
+ })
+
+ - name: Install oc
+ uses: redhat-actions/openshift-tools-installer@v1
+ with:
+ oc: 4
+
+ # https://github.com/redhat-actions/oc-login#readme
+ - uses: actions/checkout@v3
+ - name: Tag in OpenShift
+ run: |
+ set -eux
+ # Login to OpenShift and select project
+ oc login --token=${{ env.OPENSHIFT_TOKEN }} --server=${{ env.OPENSHIFT_SERVER }}
+ oc project ${{ env.OPENSHIFT_NAMESPACE }}
+
+ oc tag ${{ env.NAMESPACE }}-dev/${{ env.REPO_NAME }}-${{ env.BRANCH }}:latest ${{ env.NAMESPACE }}-dev/${{ env.REPO_NAME }}-${{ env.BRANCH }}:${{ github.event.inputs.version }}
diff --git a/Dockerfile b/Dockerfile
index c56f59d2..857d4250 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3-jdk-11 as build
+FROM artifacts.developer.gov.bc.ca/docker-remote/maven:3.8.5-openjdk-17 as build
WORKDIR /workspace/app
COPY api/pom.xml .
@@ -6,7 +6,7 @@ COPY api/src src
RUN mvn package -DskipTests
RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
-FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:11-jdk
+FROM artifacts.developer.gov.bc.ca/docker-remote/openjdk:17.0.2-jdk-oracle
RUN useradd -ms /bin/bash spring
RUN mkdir -p /logs
RUN chown -R spring:spring /logs
diff --git a/api/pom.xml b/api/pom.xml
index 7126854d..d5679202 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -16,30 +16,30 @@
src/main/resources/**,src/main/java/ca/bc/gov/educ/penreg/api/endpoint/**,src/main/java/ca/bc/gov/educ/penreg/api/config/**,
src/main/java/ca/bc/gov/educ/penreg/api/mappers/**,src/main/java/ca/bc/gov/educ/penreg/api/exception/**,src/main/java/ca/bc/gov/educ/penreg/api/model/**,src/main/java/ca/bc/gov/educ/penreg/api/struct/**
- 11
+ 17
- 3.8.0
+ 3.10.1
${java.version}
${java.version}
- 1.4.1.Final
+ 1.5.3.Final
4.20.0
- 1.5.2
+ 1.6.15
2.11.0
21.3.0.0
- 30.1.1-jre
+ 32.0.0-jre
0.7.3
4.0.4
0.15
4.0.3
3.1.6
- 3.15.1
+ 3.21.1
2.17.1
org.springframework.boot
spring-boot-starter-parent
- 2.4.3
+ 3.0.2
@@ -120,8 +120,8 @@
commons-lang3
- javax.persistence
- javax.persistence-api
+ jakarta.persistence
+ jakarta.persistence-api
org.springframework.boot
@@ -136,13 +136,8 @@
org.springdoc
- springdoc-openapi-webmvc-core
- ${springdoc.version}
-
-
- org.springdoc
- springdoc-openapi-ui
- ${springdoc.version}
+ springdoc-openapi-starter-webmvc-ui
+ 2.0.4
org.mapstruct
@@ -272,7 +267,7 @@
org.jacoco
jacoco-maven-plugin
- 0.8.4
+ 0.8.8
org.hibernate.orm.tooling
@@ -323,11 +318,6 @@
${java.version}
${java.version}
-
- org.mapstruct
- mapstruct-processor
- ${org.mapstruct.version}
-
org.projectlombok
lombok
@@ -338,6 +328,11 @@
lombok-mapstruct-binding
0.2.0
+
+ org.mapstruct
+ mapstruct-processor
+ ${org.mapstruct.version}
+
org.springframework
spring-context-indexer
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/PenRegBatchApiApplication.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/PenRegBatchApiApplication.java
index ec182749..d4e31221 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/PenRegBatchApiApplication.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/PenRegBatchApiApplication.java
@@ -14,11 +14,11 @@
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
-import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
import org.springframework.transaction.PlatformTransactionManager;
/**
@@ -27,7 +27,6 @@
* @author OM
*/
@SpringBootApplication
-@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableCaching
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "1s")
@@ -73,7 +72,7 @@ public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
*/
@Configuration
static
- class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
+ class WebSecurityConfiguration {
/**
* Instantiates a new Web security configuration.
@@ -81,25 +80,21 @@ class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
*/
public WebSecurityConfiguration() {
super();
- SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
- /**
- * Configure paths to be excluded from security.
- *
- * @param web the web
- */
- @Override
- public void configure(final WebSecurity web) {
- web.ignoring()
- .antMatchers("/v3/api-docs/**", "/actuator/health", "/actuator/metrics/**", "/actuator/prometheus", "/swagger-ui/**");
- }
-
- @Override
- protected void configure(final HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .anyRequest().authenticated().and()
- .oauth2ResourceServer().jwt();
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ http
+ .csrf(AbstractHttpConfigurer::disable)
+ .authorizeHttpRequests(auth -> auth
+ .requestMatchers("/v3/api-docs/**",
+ "/actuator/health", "/actuator/prometheus", "/actuator/**",
+ "/swagger-ui/**").permitAll()
+ .anyRequest().authenticated()
+ )
+ .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
+ return http.build();
}
}
}
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/adapter/CustomRequestBodyAdviceAdapter.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/adapter/CustomRequestBodyAdviceAdapter.java
index 159b2ef4..25576399 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/adapter/CustomRequestBodyAdviceAdapter.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/adapter/CustomRequestBodyAdviceAdapter.java
@@ -1,5 +1,7 @@
package ca.bc.gov.educ.penreg.api.adapter;
+import jakarta.servlet.http.HttpServletRequest;
+import java.lang.reflect.Type;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
@@ -7,9 +9,6 @@
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
-import javax.servlet.http.HttpServletRequest;
-import java.lang.reflect.Type;
-
@ControllerAdvice
public class CustomRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/PenRequestBatchFileDecorator.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/PenRequestBatchFileDecorator.java
index 963156a2..3dbe9a41 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/PenRequestBatchFileDecorator.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/PenRequestBatchFileDecorator.java
@@ -1,5 +1,8 @@
package ca.bc.gov.educ.penreg.api.batch.mappers;
+import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStatusCodes.LOADED;
+import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchTypeCode.SCHOOL;
+
import ca.bc.gov.educ.penreg.api.batch.struct.BatchFile;
import ca.bc.gov.educ.penreg.api.batch.struct.StudentDetails;
import ca.bc.gov.educ.penreg.api.constants.MinistryPRBSourceCodes;
@@ -8,14 +11,10 @@
import ca.bc.gov.educ.penreg.api.model.v1.PENWebBlobEntity;
import ca.bc.gov.educ.penreg.api.model.v1.PenRequestBatchEntity;
import ca.bc.gov.educ.penreg.api.model.v1.PenRequestBatchStudentEntity;
+import java.time.LocalDateTime;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
-import java.time.LocalDateTime;
-
-import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStatusCodes.LOADED;
-import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchTypeCode.SCHOOL;
-
/**
* The type Pen request batch file decorator.
*/
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/UUIDMapper.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/UUIDMapper.java
index bb9952e8..eb810ffa 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/UUIDMapper.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/mappers/UUIDMapper.java
@@ -1,8 +1,7 @@
package ca.bc.gov.educ.penreg.api.batch.mappers;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.UUID;
+import org.apache.commons.lang3.StringUtils;
/**
* The type Uuid mapper.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchProcessor.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchProcessor.java
index e0b970a6..e1d99001 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchProcessor.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchProcessor.java
@@ -1,5 +1,36 @@
package ca.bc.gov.educ.penreg.api.batch.processor;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.DUPLICATE_BATCH_FILE_PSI;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.HELD_BACK_FOR_SFAS;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.HELD_BACK_FOR_SIZE;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_MINCODE_HEADER;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_MINCODE_SCHOOL_CLOSED;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_TRAILER;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_TRAILER_STUDENT_COUNT;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_TRANSACTION_CODE_STUDENT_DETAILS;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.BIRTH_DATE;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.ENROLLED_GRADE_CODE;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.GENDER;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.HEADER;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.LEGAL_GIVEN_NAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.LEGAL_MIDDLE_NAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.LEGAL_SURNAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.LOCAL_STUDENT_ID;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.PEN;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.POSTAL_CODE;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.PRODUCT_ID;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.PRODUCT_NAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.STUDENT_COUNT;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.TRAILER;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.TRANSACTION_CODE;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.UNUSED;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.UNUSED_SECOND;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.USUAL_GIVEN_NAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.USUAL_MIDDLE_NAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.USUAL_SURNAME;
+import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.VENDOR_NAME;
+import static lombok.AccessLevel.PRIVATE;
+
import ca.bc.gov.educ.penreg.api.batch.exception.FileError;
import ca.bc.gov.educ.penreg.api.batch.exception.FileUnProcessableException;
import ca.bc.gov.educ.penreg.api.batch.mappers.PenRequestBatchFileMapper;
@@ -21,6 +52,23 @@
import ca.bc.gov.educ.penreg.api.service.PenCoordinatorService;
import ca.bc.gov.educ.penreg.api.struct.School;
import com.google.common.base.Stopwatch;
+import java.io.ByteArrayInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@@ -34,21 +82,6 @@
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
-import java.io.*;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.*;
-import static ca.bc.gov.educ.penreg.api.constants.BatchFileConstants.*;
-import static lombok.AccessLevel.PRIVATE;
-
/**
* The Pen reg batch processor.
*
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchStudentRecordsProcessor.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchStudentRecordsProcessor.java
index a300cbcb..dbabd046 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchStudentRecordsProcessor.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/processor/PenRegBatchStudentRecordsProcessor.java
@@ -1,5 +1,8 @@
package ca.bc.gov.educ.penreg.api.batch.processor;
+import static ca.bc.gov.educ.penreg.api.constants.SagaTopicsEnum.PEN_REQUEST_BATCH_API_TOPIC;
+import static lombok.AccessLevel.PRIVATE;
+
import ca.bc.gov.educ.penreg.api.batch.service.PenRequestBatchFileService;
import ca.bc.gov.educ.penreg.api.constants.EventOutcome;
import ca.bc.gov.educ.penreg.api.constants.EventType;
@@ -8,6 +11,9 @@
import ca.bc.gov.educ.penreg.api.struct.Event;
import ca.bc.gov.educ.penreg.api.struct.PenRequestBatchStudentSagaData;
import ca.bc.gov.educ.penreg.api.util.JsonUtil;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@@ -17,13 +23,6 @@
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import static ca.bc.gov.educ.penreg.api.constants.SagaTopicsEnum.PEN_REQUEST_BATCH_API_TOPIC;
-import static lombok.AccessLevel.PRIVATE;
-
/**
* The type Pen reg batch student records processor.
*/
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/schedulers/PenRegBatchScheduler.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/schedulers/PenRegBatchScheduler.java
index 8912c851..6f098c83 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/schedulers/PenRegBatchScheduler.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/schedulers/PenRegBatchScheduler.java
@@ -1,8 +1,12 @@
package ca.bc.gov.educ.penreg.api.batch.schedulers;
+import static lombok.AccessLevel.PRIVATE;
+
import ca.bc.gov.educ.penreg.api.batch.processor.PenRegBatchProcessor;
import ca.bc.gov.educ.penreg.api.batch.service.PenRequestBatchFileService;
import ca.bc.gov.educ.penreg.api.model.v1.PENWebBlobEntity;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@@ -15,11 +19,6 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import static lombok.AccessLevel.PRIVATE;
-
/**
* The type Pen reg batch scheduler.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PSIDuplicateFileCheckService.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PSIDuplicateFileCheckService.java
index db2d0a0b..2d065aa5 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PSIDuplicateFileCheckService.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PSIDuplicateFileCheckService.java
@@ -4,13 +4,12 @@
import ca.bc.gov.educ.penreg.api.model.v1.PENWebBlobEntity;
import ca.bc.gov.educ.penreg.api.repository.PenWebBlobRepository;
import com.google.common.base.Stopwatch;
-import lombok.extern.slf4j.Slf4j;
-import lombok.val;
-import org.springframework.stereotype.Service;
-
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
+import org.springframework.stereotype.Service;
/**
* this class is responsible to mark the file duplicate based on below.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PenRequestBatchFileService.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PenRequestBatchFileService.java
index f8da8636..877518cf 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PenRequestBatchFileService.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/service/PenRequestBatchFileService.java
@@ -1,5 +1,8 @@
package ca.bc.gov.educ.penreg.api.batch.service;
+import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchProcessTypeCodes.FLAT_FILE;
+import static lombok.AccessLevel.PRIVATE;
+
import ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStatusCodes;
import ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStudentStatusCodes;
import ca.bc.gov.educ.penreg.api.model.v1.PENWebBlobEntity;
@@ -9,6 +12,9 @@
import ca.bc.gov.educ.penreg.api.service.PenRequestBatchService;
import ca.bc.gov.educ.penreg.api.service.PenRequestBatchStudentService;
import com.google.common.base.Stopwatch;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@@ -20,13 +26,6 @@
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-import static ca.bc.gov.educ.penreg.api.constants.PenRequestBatchProcessTypeCodes.FLAT_FILE;
-import static lombok.AccessLevel.PRIVATE;
-
/**
* The type Pen request batch file service.
*
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/struct/BatchFile.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/struct/BatchFile.java
index fccdf8e4..2f5d09da 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/struct/BatchFile.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/struct/BatchFile.java
@@ -1,9 +1,8 @@
package ca.bc.gov.educ.penreg.api.batch.struct;
-import lombok.Data;
-
import java.util.ArrayList;
import java.util.List;
+import lombok.Data;
/**
* The type Batch file.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/validator/PenRequestBatchFileValidator.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/validator/PenRequestBatchFileValidator.java
index b6e0a048..32035a84 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/validator/PenRequestBatchFileValidator.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/batch/validator/PenRequestBatchFileValidator.java
@@ -1,5 +1,12 @@
package ca.bc.gov.educ.penreg.api.batch.validator;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.HELD_BACK_FOR_SFAS;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.HELD_BACK_FOR_SIZE;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_MINCODE_HEADER;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_MINCODE_SCHOOL_CLOSED;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.INVALID_ROW_LENGTH;
+import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.STUDENT_COUNT_MISMATCH;
+
import ca.bc.gov.educ.penreg.api.batch.exception.FileError;
import ca.bc.gov.educ.penreg.api.batch.exception.FileUnProcessableException;
import ca.bc.gov.educ.penreg.api.batch.struct.BatchFile;
@@ -7,6 +14,10 @@
import ca.bc.gov.educ.penreg.api.properties.ApplicationProperties;
import ca.bc.gov.educ.penreg.api.rest.RestUtils;
import ca.bc.gov.educ.penreg.api.struct.School;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import net.sf.flatpack.DataError;
import net.sf.flatpack.DataSet;
@@ -15,13 +26,6 @@
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.Optional;
-
-import static ca.bc.gov.educ.penreg.api.batch.exception.FileError.*;
-
/**
* this class is responsible to validate the batch file that was uploaded.
*/
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/config/AsyncConfiguration.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/config/AsyncConfiguration.java
index d3bdfffd..667d1a55 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/config/AsyncConfiguration.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/config/AsyncConfiguration.java
@@ -2,6 +2,8 @@
import ca.bc.gov.educ.penreg.api.properties.ApplicationProperties;
import ca.bc.gov.educ.penreg.api.util.ThreadFactoryBuilder;
+import java.time.Duration;
+import java.util.concurrent.Executor;
import org.jboss.threads.EnhancedQueueExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@@ -9,9 +11,6 @@
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableAsync;
-import java.time.Duration;
-import java.util.concurrent.Executor;
-
@Configuration
@EnableAsync
@Profile("!test")
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/config/RequestResponseInterceptor.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/config/RequestResponseInterceptor.java
index ac645bad..3c6e1c2e 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/config/RequestResponseInterceptor.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/config/RequestResponseInterceptor.java
@@ -2,16 +2,15 @@
import ca.bc.gov.educ.penreg.api.helpers.LogHelper;
import ca.bc.gov.educ.penreg.api.properties.ApplicationProperties;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.time.Instant;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.time.Instant;
-
@Component
@Slf4j
public class RequestResponseInterceptor implements AsyncHandlerInterceptor {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/PenRequestBatchStudentStatusCodes.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/PenRequestBatchStudentStatusCodes.java
index 309f790b..a86739d2 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/PenRequestBatchStudentStatusCodes.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/PenRequestBatchStudentStatusCodes.java
@@ -1,9 +1,8 @@
package ca.bc.gov.educ.penreg.api.constants;
-import lombok.Getter;
-
import java.util.HashMap;
import java.util.Map;
+import lombok.Getter;
/**
* The enum Pen request batch student status codes.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/StudentDemogCode.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/StudentDemogCode.java
index f8f5f8a5..fd731355 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/StudentDemogCode.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/constants/StudentDemogCode.java
@@ -1,9 +1,8 @@
package ca.bc.gov.educ.penreg.api.constants;
-import lombok.Getter;
-
import java.util.HashMap;
import java.util.Map;
+import lombok.Getter;
@Getter
public enum StudentDemogCode {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PaginatedController.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PaginatedController.java
index 7eed6c8e..0e4c290c 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PaginatedController.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PaginatedController.java
@@ -11,13 +11,12 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.List;
+import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
-import java.util.List;
-import java.util.Map;
-
public class PaginatedController {
/**
* Gets sort criteria.
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchAPIController.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchAPIController.java
index 11e71864..5974c55b 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchAPIController.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchAPIController.java
@@ -1,5 +1,8 @@
package ca.bc.gov.educ.penreg.api.controller.v1;
+import static lombok.AccessLevel.PRIVATE;
+import static org.springframework.http.HttpStatus.BAD_REQUEST;
+
import ca.bc.gov.educ.penreg.api.constants.PenRequestBatchProcessTypeCodes;
import ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStatusCodes;
import ca.bc.gov.educ.penreg.api.constants.PenRequestBatchStudentStatusCodes;
@@ -36,6 +39,13 @@
import ca.bc.gov.educ.penreg.api.util.JsonUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@@ -49,14 +59,6 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-import static lombok.AccessLevel.PRIVATE;
-import static org.springframework.http.HttpStatus.BAD_REQUEST;
-
/**
* Student controller
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchHistoryAPIController.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchHistoryAPIController.java
index d3bea05e..3b671aa1 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchHistoryAPIController.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchHistoryAPIController.java
@@ -1,5 +1,7 @@
package ca.bc.gov.educ.penreg.api.controller.v1;
+import static lombok.AccessLevel.PRIVATE;
+
import ca.bc.gov.educ.penreg.api.endpoint.v1.PenRequestBatchHistoryAPIEndpoint;
import ca.bc.gov.educ.penreg.api.exception.InvalidParameterException;
import ca.bc.gov.educ.penreg.api.filter.Associations;
@@ -7,10 +9,14 @@
import ca.bc.gov.educ.penreg.api.mappers.v1.PenRequestBatchHistoryMapper;
import ca.bc.gov.educ.penreg.api.model.v1.PenRequestBatchHistoryEntity;
import ca.bc.gov.educ.penreg.api.service.PenRequestBatchHistoryService;
-import ca.bc.gov.educ.penreg.api.struct.v1.*;
+import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchHistorySearch;
+import ca.bc.gov.educ.penreg.api.struct.v1.Search;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -20,12 +26,6 @@
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.bind.annotation.RestController;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-import static lombok.AccessLevel.PRIVATE;
-
/**
* Student controller
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchSagaController.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchSagaController.java
index 12153224..69e14c65 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchSagaController.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchSagaController.java
@@ -1,5 +1,13 @@
package ca.bc.gov.educ.penreg.api.controller.v1;
+import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.PEN_REQUEST_BATCH_ARCHIVE_AND_RETURN_SAGA;
+import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.PEN_REQUEST_BATCH_NEW_PEN_PROCESSING_SAGA;
+import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.PEN_REQUEST_BATCH_REPOST_REPORTS_SAGA;
+import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.PEN_REQUEST_BATCH_USER_MATCH_PROCESSING_SAGA;
+import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.PEN_REQUEST_BATCH_USER_UNMATCH_PROCESSING_SAGA;
+import static lombok.AccessLevel.PRIVATE;
+import static org.springframework.http.HttpStatus.BAD_REQUEST;
+
import ca.bc.gov.educ.penreg.api.constants.SagaEnum;
import ca.bc.gov.educ.penreg.api.constants.SagaStatusEnum;
import ca.bc.gov.educ.penreg.api.endpoint.v1.PenRequestBatchSagaEndpoint;
@@ -20,6 +28,14 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
@@ -34,15 +50,6 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-import static ca.bc.gov.educ.penreg.api.constants.SagaEnum.*;
-import static lombok.AccessLevel.PRIVATE;
-import static org.springframework.http.HttpStatus.BAD_REQUEST;
-
@RestController
@Slf4j
public class PenRequestBatchSagaController extends PaginatedController implements PenRequestBatchSagaEndpoint {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchStudentInfoRequestMacroController.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchStudentInfoRequestMacroController.java
index 96e24d84..5ce41cc2 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchStudentInfoRequestMacroController.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/controller/v1/PenRequestBatchStudentInfoRequestMacroController.java
@@ -1,5 +1,8 @@
package ca.bc.gov.educ.penreg.api.controller.v1;
+import static lombok.AccessLevel.PRIVATE;
+import static org.springframework.http.HttpStatus.BAD_REQUEST;
+
import ca.bc.gov.educ.penreg.api.endpoint.v1.PenRequestBatchStudentInfoRequestMacroEndpoint;
import ca.bc.gov.educ.penreg.api.exception.EntityNotFoundException;
import ca.bc.gov.educ.penreg.api.exception.InvalidPayloadException;
@@ -9,20 +12,16 @@
import ca.bc.gov.educ.penreg.api.service.PenRequestBatchStudentInfoRequestMacroService;
import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchStudentInfoRequestMacro;
import ca.bc.gov.educ.penreg.api.validator.PenRequestBatchStudentInfoRequestMacroPayloadValidator;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-import static lombok.AccessLevel.PRIVATE;
-import static org.springframework.http.HttpStatus.BAD_REQUEST;
-
@RestController
@Slf4j
public class PenRequestBatchStudentInfoRequestMacroController implements PenRequestBatchStudentInfoRequestMacroEndpoint {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchAPIEndpoint.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchAPIEndpoint.java
index 266431bb..ac8fbfda 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchAPIEndpoint.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchAPIEndpoint.java
@@ -1,5 +1,7 @@
package ca.bc.gov.educ.penreg.api.endpoint.v1;
+import static org.springframework.http.HttpStatus.CREATED;
+
import ca.bc.gov.educ.penreg.api.struct.PenRequestBatchStats;
import ca.bc.gov.educ.penreg.api.struct.v1.*;
import ca.bc.gov.educ.penreg.api.struct.v1.external.PenRequest;
@@ -15,6 +17,9 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -23,12 +28,6 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-
-import static org.springframework.http.HttpStatus.CREATED;
-
/**
* The interface Pen reg api endpoint.
*/
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchHistoryAPIEndpoint.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchHistoryAPIEndpoint.java
index a09639d3..32f9766b 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchHistoryAPIEndpoint.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchHistoryAPIEndpoint.java
@@ -3,14 +3,12 @@
import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatch;
import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchHistorySearch;
import ca.bc.gov.educ.penreg.api.struct.v1.Search;
-import io.swagger.v3.oas.annotations.OpenAPIDefinition;
-import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
+import java.util.concurrent.CompletableFuture;
import org.springframework.data.domain.Page;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
@@ -18,8 +16,6 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
-import java.util.concurrent.CompletableFuture;
-
/**
* The interface Pen reg api endpoint.
*/
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchSagaEndpoint.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchSagaEndpoint.java
index 9df8ba78..f843fc15 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchSagaEndpoint.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchSagaEndpoint.java
@@ -1,14 +1,20 @@
package ca.bc.gov.educ.penreg.api.endpoint.v1;
-import ca.bc.gov.educ.penreg.api.struct.v1.SagaEvent;
import ca.bc.gov.educ.penreg.api.struct.PenRequestBatchUnmatchSagaData;
import ca.bc.gov.educ.penreg.api.struct.PenRequestBatchUserActionsSagaData;
-import ca.bc.gov.educ.penreg.api.struct.v1.*;
+import ca.bc.gov.educ.penreg.api.struct.v1.ArchiveAndReturnSagaResponse;
+import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchArchiveAndReturnAllSagaData;
+import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchRepostReportsFilesSagaData;
+import ca.bc.gov.educ.penreg.api.struct.v1.Saga;
+import ca.bc.gov.educ.penreg.api.struct.v1.SagaEvent;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -16,10 +22,6 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-
@RequestMapping("/api/v1/pen-request-batch-saga")
public interface PenRequestBatchSagaEndpoint {
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchStudentInfoRequestMacroEndpoint.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchStudentInfoRequestMacroEndpoint.java
index 066fa8c4..9473075c 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchStudentInfoRequestMacroEndpoint.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/endpoint/v1/PenRequestBatchStudentInfoRequestMacroEndpoint.java
@@ -1,17 +1,16 @@
package ca.bc.gov.educ.penreg.api.endpoint.v1;
+import static org.springframework.http.HttpStatus.CREATED;
+
import ca.bc.gov.educ.penreg.api.struct.v1.PenRequestBatchStudentInfoRequestMacro;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import java.util.List;
+import java.util.UUID;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.util.List;
-import java.util.UUID;
-
-import static org.springframework.http.HttpStatus.CREATED;
-
@RequestMapping("/api/v1/pen-request-batch-macro")
public interface PenRequestBatchStudentInfoRequestMacroEndpoint {
@GetMapping
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/EntityNotFoundException.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/EntityNotFoundException.java
index d900bfe3..abb148a6 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/EntityNotFoundException.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/EntityNotFoundException.java
@@ -1,11 +1,10 @@
package ca.bc.gov.educ.penreg.api.exception;
-import lombok.NoArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
/**
* EntityNotFoundException to provide more details in error description
diff --git a/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/RestExceptionHandler.java b/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/RestExceptionHandler.java
index 073391ca..f6a6aa08 100644
--- a/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/RestExceptionHandler.java
+++ b/api/src/main/java/ca/bc/gov/educ/penreg/api/exception/RestExceptionHandler.java
@@ -1,12 +1,15 @@
package ca.bc.gov.educ.penreg.api.exception;
+import static org.springframework.http.HttpStatus.BAD_REQUEST;
+import static org.springframework.http.HttpStatus.NOT_FOUND;
+
import ca.bc.gov.educ.penreg.api.exception.errors.ApiError;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
+import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.MethodArgumentNotValidException;
@@ -15,9 +18,6 @@
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
-import static org.springframework.http.HttpStatus.BAD_REQUEST;
-import static org.springframework.http.HttpStatus.NOT_FOUND;
-
/**
* The type Rest exception handler.
*/
@@ -40,7 +40,7 @@ public class RestExceptionHandler extends ResponseEntityExceptionHandler {
* @return the response entity
*/
@Override
- protected ResponseEntity