From 3f336eeb4b2311fd8de9afb4fc99d211e19d55a0 Mon Sep 17 00:00:00 2001 From: CDR Open Source Date: Tue, 7 Jul 2026 01:05:59 +0000 Subject: [PATCH] v4.0.5 release --- .azuredevops/pipelines/build-v2.yml | 41 ++++++++++-- .azuredevops/pipelines/code-scanning.yml | 7 +- .azuredevops/pipelines/dependabot.yml | 7 +- CHANGELOG.md | 7 ++ .../CDR.DataHolder.Banking.Domain.csproj | 4 ++ .../CDR.DataHolder.Banking.Repository.csproj | 4 ++ .../Infrastructure/MappingProfile.cs | 23 +++++-- ...lder.Banking.Resource.API.UnitTests.csproj | 4 ++ .../Business/MappingProfile.cs | 24 ++++--- ...CDR.DataHolder.Banking.Resource.API.csproj | 4 ++ ...lder.Banking.Tests.IntegrationTests.csproj | 4 ++ .../Business/MappingProfile.cs | 34 ++++++---- .../CDR.DataHolder.Common.API.csproj | 6 +- Source/Directory.Build.props | 2 +- Source/Directory.Packages.props | 64 +++++++++---------- ...ocker-compose.IntegrationTests.Banking.yml | 2 +- ...docker-compose.IntegrationTests.Energy.yml | 2 +- Source/Dockerfile | 17 +++-- Source/Dockerfile.integration-tests | 4 +- .../CDR.DataHolder.Energy.Domain.csproj | 4 ++ .../CDR.DataHolder.Energy.Repository.csproj | 4 ++ .../Infrastructure/MappingProfile.cs | 32 +++++++--- ...older.Energy.Resource.API.UnitTests.csproj | 4 ++ .../Business/MappingProfile.cs | 28 +++++--- .../CDR.DataHolder.Energy.Resource.API.csproj | 4 ++ ...older.Energy.Tests.IntegrationTests.csproj | 4 ++ .../CDR.DataHolder.Admin.API.csproj | 4 ++ .../CDR.DataHolder.Manage.API.csproj | 4 ++ .../CDR.DataHolder.Public.API.csproj | 4 ++ ....DataHolder.Shared.API.Gateway.mTLS.csproj | 4 ++ ...Shared.API.Infrastructure.UnitTests.csproj | 4 ++ ...ataHolder.Shared.API.Infrastructure.csproj | 6 +- .../CDR.DataHolder.Shared.Business.csproj | 4 ++ .../CDR.DataHolder.Shared.Repository.csproj | 4 ++ Source/run-integration-tests.ps1 | 2 +- Source/supervisord.conf | 8 ++- 36 files changed, 278 insertions(+), 106 deletions(-) diff --git a/.azuredevops/pipelines/build-v2.yml b/.azuredevops/pipelines/build-v2.yml index cee140e..2465774 100644 --- a/.azuredevops/pipelines/build-v2.yml +++ b/.azuredevops/pipelines/build-v2.yml @@ -21,6 +21,12 @@ resources: include: - develop - main + + - repository: shared-code-scanning + type: git + name: Common/shared-code-scanning + ref: refs/heads/main + trigger: none trigger: - develop @@ -34,16 +40,26 @@ parameters: variables: - group: artifacts +- group: PT-Pipeline-Common - name: baseSourceDirectory value: $(Build.SourcesDirectory)/sb-mock-data-holder/Source pool: - vmImage: ubuntu-latest + name: mdp-mgmt-shared + demands: + - ImageOverride -equals $(PipelineHostLinuxImage) jobs: - job: Build timeoutInMinutes: 120 steps: + + - script: | + echo "Cleaning auth-server folder in temp" + ls $(Agent.BuildDirectory)/s/sb-mock-data-holder/Source/DockerCompose/_temp/mock-data-holder-* 2>/dev/null || "No matching folders found" + sudo rm -rf $(Agent.BuildDirectory)/s/sb-mock-data-holder/Source/DockerCompose/_temp/mock-data-holder-* 2> /dev/null + displayName: Clean temp auth-server folders + condition: always() ################################################################################################### # Checkout repositories @@ -113,16 +129,24 @@ jobs: $authServerBranch = "" $AuthServerFeatureBranch = "$(AuthServerFeatureBranch)" $SourcebranchName = "$(Build.SourceBranch)" -replace 'refs/heads/', '' - + if ($SourcebranchName -match "releases/") { $authServerBranch = "$(AuthServerReleaseBranchName)" $branchRef = "refs/heads/$authServerBranch" echo "Release Branch detected. Using $branchRef." } elseif ($SourcebranchName -eq "main" -or $branchName -eq "develop") { - $authServerBranch = $branchName - $branchRef = "$(Build.SourceBranch)" - echo "Main or Develop Branch detected. Using $branchRef." + if ($AuthServerFeatureBranch -ne "") { + $authServerBranch = $AuthServerFeatureBranch + $branchRef = "refs/heads/$authServerBranch" + echo "Feature Branch variable exists. Using $branchRef." + } + else + { + $authServerBranch = $branchName + $branchRef = "$(Build.SourceBranch)" + echo "Main or Develop Branch detected. Using $branchRef." + } } elseif ($AuthServerFeatureBranch -ne "") { $authServerBranch = $AuthServerFeatureBranch @@ -166,6 +190,11 @@ jobs: docker build --file $(baseSourceDirectory)/Dockerfile --target Banking -t mock-data-holder:latest $(baseSourceDirectory) displayName: Create Banking Image condition: always() + + - template: templates/scan-image.yml@shared-code-scanning + parameters: + Repository: mock-data-holder + Tag: latest - script: | docker build --file $(baseSourceDirectory)/Dockerfile --target Energy -t mock-data-holder-energy:latest $(baseSourceDirectory) @@ -329,7 +358,7 @@ jobs: - task: PublishPipelineArtifact@1 displayName: Publish container images inputs: - path: $(Build.ArtifactStagingDirectory) + path: $(Build.ArtifactStagingDirectory)/mock-data-holder.image.tar artifact: Container Images ################################################################################################### diff --git a/.azuredevops/pipelines/code-scanning.yml b/.azuredevops/pipelines/code-scanning.yml index ea3fe11..1fb2be5 100644 --- a/.azuredevops/pipelines/code-scanning.yml +++ b/.azuredevops/pipelines/code-scanning.yml @@ -17,8 +17,13 @@ schedules: # Disable standard CI build trigger: none +variables: +- group: PT-Pipeline-Common + pool: - vmImage: 'ubuntu-latest' + name: mdp-mgmt-shared + demands: + - ImageOverride -equals $(PipelineHostLinuxImage) extends: template: pipeline-templates/code-scanning.yml@shared-code-scanning \ No newline at end of file diff --git a/.azuredevops/pipelines/dependabot.yml b/.azuredevops/pipelines/dependabot.yml index 983bf4e..ba24281 100644 --- a/.azuredevops/pipelines/dependabot.yml +++ b/.azuredevops/pipelines/dependabot.yml @@ -6,11 +6,16 @@ schedules: - refs/heads/develop always: true +variables: +- group: PT-Pipeline-Common + jobs: - job: dependabot displayName: Dependabot pool: - vmImage: ubuntu-latest + name: mdp-mgmt-shared + demands: + - ImageOverride -equals $(PipelineHostLinuxImage) steps: - task: CmdLine@2 displayName: clone dependabot repo diff --git a/CHANGELOG.md b/CHANGELOG.md index c454e91..01f1112 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [4.0.5] - 2026-07-08 +### Changed +- Updated NuGet packages + +## [4.0.4] - 2026-03-18 +### Changed +- Rebuild project to fix vulnerabilities in base image ## [4.0.3] - 2025-12-10 ### Changed diff --git a/Source/Banking/CDR.DataHolder.Banking.Domain/CDR.DataHolder.Banking.Domain.csproj b/Source/Banking/CDR.DataHolder.Banking.Domain/CDR.DataHolder.Banking.Domain.csproj index 066b7b1..6c454a0 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Domain/CDR.DataHolder.Banking.Domain.csproj +++ b/Source/Banking/CDR.DataHolder.Banking.Domain/CDR.DataHolder.Banking.Domain.csproj @@ -22,4 +22,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Source/Banking/CDR.DataHolder.Banking.Repository/CDR.DataHolder.Banking.Repository.csproj b/Source/Banking/CDR.DataHolder.Banking.Repository/CDR.DataHolder.Banking.Repository.csproj index 80272f3..9206224 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Repository/CDR.DataHolder.Banking.Repository.csproj +++ b/Source/Banking/CDR.DataHolder.Banking.Repository/CDR.DataHolder.Banking.Repository.csproj @@ -26,6 +26,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Banking/CDR.DataHolder.Banking.Repository/Infrastructure/MappingProfile.cs b/Source/Banking/CDR.DataHolder.Banking.Repository/Infrastructure/MappingProfile.cs index e421d4d..4a0831a 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Repository/Infrastructure/MappingProfile.cs +++ b/Source/Banking/CDR.DataHolder.Banking.Repository/Infrastructure/MappingProfile.cs @@ -6,13 +6,17 @@ namespace CDR.DataHolder.Banking.Repository.Infrastructure { public class MappingProfile : Profile { + private const int AutoMapperMaxDepth = 32; + public MappingProfile() { CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember( @@ -22,7 +26,8 @@ public MappingProfile() .ForMember(dest => dest.CustomerId, source => source.MapFrom(s => s.Customer.CustomerId)) .ForMember(dest => dest.LoginId, source => source.MapFrom(s => s.Customer.LoginId)) .ForMember(dest => dest.CustomerUType, source => source.MapFrom(s => s.Customer.CustomerUType)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember( @@ -32,19 +37,23 @@ public MappingProfile() .ForMember(dest => dest.CustomerId, source => source.MapFrom(s => s.Customer.CustomerId)) .ForMember(dest => dest.LoginId, source => source.MapFrom(s => s.Customer.LoginId)) .ForMember(dest => dest.CustomerUType, source => source.MapFrom(s => s.Customer.CustomerUType)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.Accounts, source => source.MapFrom(source => source.Accounts)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .IncludeMembers(source => source.Person, source => source) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .IncludeMembers(source => source.Organisation) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); } } } diff --git a/Source/Banking/CDR.DataHolder.Banking.Resource.API.UnitTests/CDR.DataHolder.Banking.Resource.API.UnitTests.csproj b/Source/Banking/CDR.DataHolder.Banking.Resource.API.UnitTests/CDR.DataHolder.Banking.Resource.API.UnitTests.csproj index 3d11eba..79f8e95 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Resource.API.UnitTests/CDR.DataHolder.Banking.Resource.API.UnitTests.csproj +++ b/Source/Banking/CDR.DataHolder.Banking.Resource.API.UnitTests/CDR.DataHolder.Banking.Resource.API.UnitTests.csproj @@ -70,4 +70,8 @@ Always + + + + \ No newline at end of file diff --git a/Source/Banking/CDR.DataHolder.Banking.Resource.API/Business/MappingProfile.cs b/Source/Banking/CDR.DataHolder.Banking.Resource.API/Business/MappingProfile.cs index 8900baa..af86ad6 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Resource.API/Business/MappingProfile.cs +++ b/Source/Banking/CDR.DataHolder.Banking.Resource.API/Business/MappingProfile.cs @@ -9,37 +9,45 @@ namespace CDR.DataHolder.Banking.Resource.API.Business { public class MappingProfile : Profile { + private const int AutoMapperMaxDepth = 32; + public MappingProfile() { - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(d => d.Type, s => s.MapFrom(src => src.TransactionType)) - .ForMember(d => d.Amount, s => s.MapFrom(src => src.Amount.ToString("F2"))); + .ForMember(d => d.Amount, s => s.MapFrom(src => src.Amount.ToString("F2"))) + .MaxDepth(AutoMapperMaxDepth); CreateMap() - .ForMember(d => d.Transactions, s => s.MapFrom(src => src)); + .ForMember(d => d.Transactions, s => s.MapFrom(src => src)) + .MaxDepth(AutoMapperMaxDepth); CreateMap, PageModel>() .ForMember(d => d.Meta, s => s.MapFrom(src => new MetaPaginated { TotalRecords = src.TotalRecords, TotalPages = src.TotalPages })) - .ForMember(d => d.Data, s => s.MapFrom(src => src.Data)); + .ForMember(d => d.Data, s => s.MapFrom(src => src.Data)) + .MaxDepth(AutoMapperMaxDepth); CreateMap(typeof(Shared.Domain.ValueObjects.Page<>), typeof(MetaPaginated)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.MaskedNumber, source => source.MapFrom(source => source.MaskedName)) .ForMember(dest => dest.CreationDate, source => source.MapFrom(source => source.CreationDate.HasValue ? source.CreationDate.Value.ToString("yyyy-MM-dd") : null)) .ForMember(dest => dest.IsOwned, source => source.MapFrom(source => true)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap, ResponseBankingAccountListV2>() .ForPath(dest => dest.Data.Accounts, source => source.MapFrom(source => source.Data)) .ForMember(dest => dest.Meta, source => source.MapFrom(source => source)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); } } } diff --git a/Source/Banking/CDR.DataHolder.Banking.Resource.API/CDR.DataHolder.Banking.Resource.API.csproj b/Source/Banking/CDR.DataHolder.Banking.Resource.API/CDR.DataHolder.Banking.Resource.API.csproj index f55501b..06c907a 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Resource.API/CDR.DataHolder.Banking.Resource.API.csproj +++ b/Source/Banking/CDR.DataHolder.Banking.Resource.API/CDR.DataHolder.Banking.Resource.API.csproj @@ -41,6 +41,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Banking/CDR.DataHolder.Banking.Tests.IntegrationTests/CDR.DataHolder.Banking.Tests.IntegrationTests.csproj b/Source/Banking/CDR.DataHolder.Banking.Tests.IntegrationTests/CDR.DataHolder.Banking.Tests.IntegrationTests.csproj index c244144..9ad1c05 100644 --- a/Source/Banking/CDR.DataHolder.Banking.Tests.IntegrationTests/CDR.DataHolder.Banking.Tests.IntegrationTests.csproj +++ b/Source/Banking/CDR.DataHolder.Banking.Tests.IntegrationTests/CDR.DataHolder.Banking.Tests.IntegrationTests.csproj @@ -70,6 +70,10 @@ + + + + Always diff --git a/Source/Common/CDR.DataHolder.Common.API/Business/MappingProfile.cs b/Source/Common/CDR.DataHolder.Common.API/Business/MappingProfile.cs index e3f681b..a2b8836 100644 --- a/Source/Common/CDR.DataHolder.Common.API/Business/MappingProfile.cs +++ b/Source/Common/CDR.DataHolder.Common.API/Business/MappingProfile.cs @@ -7,57 +7,67 @@ namespace CDR.DataHolder.Common.API.Business { public class MappingProfile : Profile { + private const int AutoMapperMaxDepth = 32; + public MappingProfile() { // Mappings for banking industry - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); // Mapping from Person to CustomerModel CreateMap() .ForMember(dest => dest.Person, source => source.MapFrom(source => source)) - .ForMember(dest => dest.Organisation, opt => opt.Ignore()); + .ForMember(dest => dest.Organisation, opt => opt.Ignore()) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Organisation to CustomerModel CreateMap() .ForMember(dest => dest.Organisation, source => source.MapFrom(source => source)) - .ForMember(dest => dest.Person, opt => opt.Ignore()); + .ForMember(dest => dest.Person, opt => opt.Ignore()) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Person to ResponseCommonCustomer CreateMap() .IgnoreAllMembers() - .ForMember(dest => dest.Data, source => source.MapFrom(source => source)); + .ForMember(dest => dest.Data, source => source.MapFrom(source => source)) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Organisation to ResponseCommonCustomer CreateMap() .IgnoreAllMembers() - .ForMember(dest => dest.Data, source => source.MapFrom(source => source)); + .ForMember(dest => dest.Data, source => source.MapFrom(source => source)) + .MaxDepth(AutoMapperMaxDepth); // Mappings for energy industry - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); // Mapping from Person to CustomerModel CreateMap() .ForMember(dest => dest.Person, source => source.MapFrom(source => source)) - .ForMember(dest => dest.Organisation, opt => opt.Ignore()); + .ForMember(dest => dest.Organisation, opt => opt.Ignore()) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Organisation to CustomerModel CreateMap() .ForMember(dest => dest.Organisation, source => source.MapFrom(source => source)) - .ForMember(dest => dest.Person, opt => opt.Ignore()); + .ForMember(dest => dest.Person, opt => opt.Ignore()) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Person to ResponseCommonCustomer CreateMap() .IgnoreAllMembers() - .ForMember(dest => dest.Data, source => source.MapFrom(source => source)); + .ForMember(dest => dest.Data, source => source.MapFrom(source => source)) + .MaxDepth(AutoMapperMaxDepth); // Mapping from Organisation to ResponseCommonCustomer CreateMap() .IgnoreAllMembers() - .ForMember(dest => dest.Data, source => source.MapFrom(source => source)); + .ForMember(dest => dest.Data, source => source.MapFrom(source => source)) + .MaxDepth(AutoMapperMaxDepth); } } } diff --git a/Source/Common/CDR.DataHolder.Common.API/CDR.DataHolder.Common.API.csproj b/Source/Common/CDR.DataHolder.Common.API/CDR.DataHolder.Common.API.csproj index b28fe58..9984bd8 100644 --- a/Source/Common/CDR.DataHolder.Common.API/CDR.DataHolder.Common.API.csproj +++ b/Source/Common/CDR.DataHolder.Common.API/CDR.DataHolder.Common.API.csproj @@ -24,6 +24,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + @@ -33,5 +37,5 @@ Always - + \ No newline at end of file diff --git a/Source/Directory.Build.props b/Source/Directory.Build.props index b36ad64..15af89e 100644 --- a/Source/Directory.Build.props +++ b/Source/Directory.Build.props @@ -1,7 +1,7 @@ net8.0 - 4.0.3 + 4.0.5 true true true diff --git a/Source/Directory.Packages.props b/Source/Directory.Packages.props index 6e409f2..bd885c0 100644 --- a/Source/Directory.Packages.props +++ b/Source/Directory.Packages.props @@ -5,50 +5,50 @@ - - - - + + + + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + - - - + + + - + - - - + + + - - - + + + - + \ No newline at end of file diff --git a/Source/DockerCompose/docker-compose.IntegrationTests.Banking.yml b/Source/DockerCompose/docker-compose.IntegrationTests.Banking.yml index b7d7e03..f5c8e5f 100644 --- a/Source/DockerCompose/docker-compose.IntegrationTests.Banking.yml +++ b/Source/DockerCompose/docker-compose.IntegrationTests.Banking.yml @@ -30,7 +30,7 @@ services: extra_hosts: - "mock-data-holder-integration-tests:host-gateway" healthcheck: - test: ((wget --no-check-certificate --no-verbose --spider https://localhost:8005/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:8001/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:3000)) || exit 1 + test: ((wget --no-check-certificate --no-verbose --spider https://localhost:8005/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:8001/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:3000/ui)) || exit 1 timeout: 5s interval: 5s retries: 50 diff --git a/Source/DockerCompose/docker-compose.IntegrationTests.Energy.yml b/Source/DockerCompose/docker-compose.IntegrationTests.Energy.yml index 3291588..1292e76 100644 --- a/Source/DockerCompose/docker-compose.IntegrationTests.Energy.yml +++ b/Source/DockerCompose/docker-compose.IntegrationTests.Energy.yml @@ -30,7 +30,7 @@ services: extra_hosts: - "mock-data-holder-energy-integration-tests:host-gateway" healthcheck: - test: ((wget --no-check-certificate --no-verbose --spider https://localhost:8105/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:8101/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:3100)) || exit 1 + test: ((wget --no-check-certificate --no-verbose --spider https://localhost:8105/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:8101/health) && (wget --no-check-certificate --no-verbose --spider https://localhost:3100/ui)) || exit 1 timeout: 5s interval: 5s retries: 50 diff --git a/Source/Dockerfile b/Source/Dockerfile index 0b2e045..bd60a9f 100644 --- a/Source/Dockerfile +++ b/Source/Dockerfile @@ -5,10 +5,11 @@ FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base # Install nodejs, npm and live-server, which are needed by the auth UI -RUN apt-get update -RUN apt-get install -y nodejs -RUN apt-get install -y npm -RUN apt-get install -y nginx +RUN apt-get update && apt-get install -y --no-install-recommends \ + nodejs \ + npm \ + nginx \ + && rm -rf /var/lib/apt/lists/* WORKDIR /app EXPOSE 8001 @@ -19,17 +20,15 @@ ENV ASPNETCORE_ENVIRONMENT=Release ############################################################################### # Build CdrAuthServer UI layer ############################################################################### -FROM node:20-alpine AS ui-build +FROM node:24-alpine AS ui-build WORKDIR /app ARG target_environment=production ENV PATH /app/node_modules/.bin:$PATH -RUN npm install react-scripts@latest -g COPY ./cdr-auth-server/Source/CdrAuthServer.UI/package.json package.json COPY ./cdr-auth-server/Source/CdrAuthServer.UI/package-lock.json package-lock.json -COPY ./cdr-auth-server/Source/CdrAuthServer.UI/craco.config.js craco.config.js -COPY ./cdr-auth-server/Source/CdrAuthServer.UI/.env.${target_environment} .env.local +COPY ./cdr-auth-server/Source/CdrAuthServer.UI/.env.${target_environment} .env.${target_environment} RUN npm ci COPY ./cdr-auth-server/Source/CdrAuthServer.UI/. . @@ -117,7 +116,7 @@ FROM base AS final WORKDIR /app # Auth UI ##################################################################### -COPY --from=ui-build /app/build ./cdrauthserver-ui +COPY --from=ui-build /app/build /usr/share/nginx/html/ui # Copy build files to nginx output folder. COPY --from=ui-build /app/build /usr/share/nginx/html/ui diff --git a/Source/Dockerfile.integration-tests b/Source/Dockerfile.integration-tests index 99cc6f0..837f935 100644 --- a/Source/Dockerfile.integration-tests +++ b/Source/Dockerfile.integration-tests @@ -37,7 +37,7 @@ ARG FEED_URI ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS="{\"endpointCredentials\": [{\"endpoint\":\"${FEED_URI}\", \"username\":\"docker\", \"password\":\"${FEED_ACCESSTOKEN}\"}]}" RUN echo $VSS_NUGET_EXTERNAL_FEED_ENDPOINTS -RUN dotnet restore -RUN dotnet build --configuration Release +RUN dotnet restore -p:NuGetAudit=false +RUN dotnet build --configuration Release --no-restore ENTRYPOINT dotnet test --configuration Release --no-build --logger "trx;verbosity=detailed;LogFileName=results.trx;" --results-directory /testresults diff --git a/Source/Energy/CDR.DataHolder.Energy.Domain/CDR.DataHolder.Energy.Domain.csproj b/Source/Energy/CDR.DataHolder.Energy.Domain/CDR.DataHolder.Energy.Domain.csproj index 066b7b1..6c454a0 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Domain/CDR.DataHolder.Energy.Domain.csproj +++ b/Source/Energy/CDR.DataHolder.Energy.Domain/CDR.DataHolder.Energy.Domain.csproj @@ -22,4 +22,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Source/Energy/CDR.DataHolder.Energy.Repository/CDR.DataHolder.Energy.Repository.csproj b/Source/Energy/CDR.DataHolder.Energy.Repository/CDR.DataHolder.Energy.Repository.csproj index 32a89f5..f81edd1 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Repository/CDR.DataHolder.Energy.Repository.csproj +++ b/Source/Energy/CDR.DataHolder.Energy.Repository/CDR.DataHolder.Energy.Repository.csproj @@ -31,6 +31,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Energy/CDR.DataHolder.Energy.Repository/Infrastructure/MappingProfile.cs b/Source/Energy/CDR.DataHolder.Energy.Repository/Infrastructure/MappingProfile.cs index d264773..d98afc9 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Repository/Infrastructure/MappingProfile.cs +++ b/Source/Energy/CDR.DataHolder.Energy.Repository/Infrastructure/MappingProfile.cs @@ -7,28 +7,35 @@ namespace CDR.DataHolder.Energy.Repository.Infrastructure { public class MappingProfile : Profile { + private const int AutoMapperMaxDepth = 32; + public MappingProfile() { CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.StartDate, source => source.MapFrom(source => source.StartDate.HasValue ? source.StartDate.Value.ToString("yyyy-MM-dd") : null)) .ForMember(dest => dest.EndDate, source => source.MapFrom(source => source.EndDate.HasValue ? source.EndDate.Value.ToString("yyyy-MM-dd") : null)) .ForMember(dest => dest.Amount, source => source.MapFrom(source => string.IsNullOrEmpty(source.Amount) ? null : decimal.Parse(source.Amount).ToString("F2"))) .ForMember(dest => dest.Percentage, source => source.MapFrom(source => string.IsNullOrEmpty(source.Percentage) ? null : decimal.Parse(source.Percentage).ToString("F2"))) .ForMember(dest => dest.AppliedTo, source => source.MapFrom(source => string.IsNullOrEmpty(source.AppliedTo) ? Array.Empty() : source.AppliedTo.Split(',', StringSplitOptions.RemoveEmptyEntries))) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.StartDate, source => source.MapFrom(source => source.StartDate.ToString("yyyy-MM-dd"))) .ForMember(dest => dest.EndDate, source => source.MapFrom(source => source.EndDate.HasValue ? source.EndDate.Value.ToString("yyyy-MM-dd") : null)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.Plans, source => source.MapFrom(source => source.AccountPlans)) .ForMember(dest => dest.Concessions, source => source.MapFrom(source => source.AccountConcessions)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember( @@ -38,7 +45,8 @@ public MappingProfile() .ForMember(dest => dest.CustomerId, source => source.MapFrom(s => s.Customer.CustomerId)) .ForMember(dest => dest.LoginId, source => source.MapFrom(s => s.Customer.LoginId)) .ForMember(dest => dest.CustomerUType, source => source.MapFrom(s => s.Customer.CustomerUType)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember( @@ -48,19 +56,23 @@ public MappingProfile() .ForMember(dest => dest.CustomerId, source => source.MapFrom(s => s.Customer.CustomerId)) .ForMember(dest => dest.LoginId, source => source.MapFrom(s => s.Customer.LoginId)) .ForMember(dest => dest.CustomerUType, source => source.MapFrom(s => s.Customer.CustomerUType)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.Accounts, source => source.MapFrom(source => source.Accounts)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .IncludeMembers(source => source.Person, source => source) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .IncludeMembers(source => source.Organisation) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); } } } diff --git a/Source/Energy/CDR.DataHolder.Energy.Resource.API.UnitTests/CDR.DataHolder.Energy.Resource.API.UnitTests.csproj b/Source/Energy/CDR.DataHolder.Energy.Resource.API.UnitTests/CDR.DataHolder.Energy.Resource.API.UnitTests.csproj index 4537232..eb0b586 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Resource.API.UnitTests/CDR.DataHolder.Energy.Resource.API.UnitTests.csproj +++ b/Source/Energy/CDR.DataHolder.Energy.Resource.API.UnitTests/CDR.DataHolder.Energy.Resource.API.UnitTests.csproj @@ -63,6 +63,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Energy/CDR.DataHolder.Energy.Resource.API/Business/MappingProfile.cs b/Source/Energy/CDR.DataHolder.Energy.Resource.API/Business/MappingProfile.cs index 3f69856..582e0c4 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Resource.API/Business/MappingProfile.cs +++ b/Source/Energy/CDR.DataHolder.Energy.Resource.API/Business/MappingProfile.cs @@ -11,42 +11,52 @@ namespace CDR.DataHolder.Energy.Resource.API.Business { public class MappingProfile : Profile { + private const int AutoMapperMaxDepth = 32; + public MappingProfile() { - CreateMap(); + CreateMap().MaxDepth(AutoMapperMaxDepth); CreateMap(typeof(Page<>), typeof(MetaPaginated)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.ServicePointIds, source => source.MapFrom(source => source.ServicePoints == null ? Array.Empty() : source.ServicePoints.Select(sp => sp.ServicePointId))) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForMember(dest => dest.CreationDate, source => source.MapFrom(source => source.CreationDate == null ? string.Empty : source.CreationDate.Value.ToString("yyyy-MM-dd"))) .ForMember(dest => dest.Plans, source => source.MapFrom(source => source.Plans)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .IncludeBase() .ForMember(dest => dest.OpenStatus, source => source.MapFrom(source => source.OpenStatus)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap, EnergyAccountListResponse>() .ForPath(dest => dest.Data.Accounts, source => source.MapFrom(source => source.Data)) .ForMember(dest => dest.Meta, source => source.MapFrom(source => source)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap, EnergyAccountListResponse>() .ForPath(dest => dest.Data.Accounts, source => source.MapFrom(source => source.Data)) .ForMember(dest => dest.Meta, source => source.MapFrom(source => source)) - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); CreateMap() .ForPath(dest => dest.Data.Concessions, source => source.MapFrom(source => source)); CreateMap() - .ReverseMap(); + .ReverseMap() + .MaxDepth(AutoMapperMaxDepth); } } } diff --git a/Source/Energy/CDR.DataHolder.Energy.Resource.API/CDR.DataHolder.Energy.Resource.API.csproj b/Source/Energy/CDR.DataHolder.Energy.Resource.API/CDR.DataHolder.Energy.Resource.API.csproj index d714eb6..7e25a5f 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Resource.API/CDR.DataHolder.Energy.Resource.API.csproj +++ b/Source/Energy/CDR.DataHolder.Energy.Resource.API/CDR.DataHolder.Energy.Resource.API.csproj @@ -45,6 +45,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Energy/CDR.DataHolder.Energy.Tests.IntegrationTests/CDR.DataHolder.Energy.Tests.IntegrationTests.csproj b/Source/Energy/CDR.DataHolder.Energy.Tests.IntegrationTests/CDR.DataHolder.Energy.Tests.IntegrationTests.csproj index 5d2f87b..2b36b07 100644 --- a/Source/Energy/CDR.DataHolder.Energy.Tests.IntegrationTests/CDR.DataHolder.Energy.Tests.IntegrationTests.csproj +++ b/Source/Energy/CDR.DataHolder.Energy.Tests.IntegrationTests/CDR.DataHolder.Energy.Tests.IntegrationTests.csproj @@ -59,6 +59,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Admin.API/CDR.DataHolder.Admin.API.csproj b/Source/Shared/CDR.DataHolder.Admin.API/CDR.DataHolder.Admin.API.csproj index b5fc86a..5b405a8 100644 --- a/Source/Shared/CDR.DataHolder.Admin.API/CDR.DataHolder.Admin.API.csproj +++ b/Source/Shared/CDR.DataHolder.Admin.API/CDR.DataHolder.Admin.API.csproj @@ -31,6 +31,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Manage.API/CDR.DataHolder.Manage.API.csproj b/Source/Shared/CDR.DataHolder.Manage.API/CDR.DataHolder.Manage.API.csproj index 2858e08..05d35b0 100644 --- a/Source/Shared/CDR.DataHolder.Manage.API/CDR.DataHolder.Manage.API.csproj +++ b/Source/Shared/CDR.DataHolder.Manage.API/CDR.DataHolder.Manage.API.csproj @@ -25,6 +25,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Public.API/CDR.DataHolder.Public.API.csproj b/Source/Shared/CDR.DataHolder.Public.API/CDR.DataHolder.Public.API.csproj index a2cf821..b8f0011 100644 --- a/Source/Shared/CDR.DataHolder.Public.API/CDR.DataHolder.Public.API.csproj +++ b/Source/Shared/CDR.DataHolder.Public.API/CDR.DataHolder.Public.API.csproj @@ -31,6 +31,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Shared.API.Gateway.mTLS/CDR.DataHolder.Shared.API.Gateway.mTLS.csproj b/Source/Shared/CDR.DataHolder.Shared.API.Gateway.mTLS/CDR.DataHolder.Shared.API.Gateway.mTLS.csproj index 384d77c..0883573 100644 --- a/Source/Shared/CDR.DataHolder.Shared.API.Gateway.mTLS/CDR.DataHolder.Shared.API.Gateway.mTLS.csproj +++ b/Source/Shared/CDR.DataHolder.Shared.API.Gateway.mTLS/CDR.DataHolder.Shared.API.Gateway.mTLS.csproj @@ -36,6 +36,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure.UnitTests/CDR.DataHolder.Shared.API.Infrastructure.UnitTests.csproj b/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure.UnitTests/CDR.DataHolder.Shared.API.Infrastructure.UnitTests.csproj index c50f5f6..4f89ae2 100644 --- a/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure.UnitTests/CDR.DataHolder.Shared.API.Infrastructure.UnitTests.csproj +++ b/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure.UnitTests/CDR.DataHolder.Shared.API.Infrastructure.UnitTests.csproj @@ -44,6 +44,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure/CDR.DataHolder.Shared.API.Infrastructure.csproj b/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure/CDR.DataHolder.Shared.API.Infrastructure.csproj index 49eb7bb..f9447c3 100644 --- a/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure/CDR.DataHolder.Shared.API.Infrastructure.csproj +++ b/Source/Shared/CDR.DataHolder.Shared.API.Infrastructure/CDR.DataHolder.Shared.API.Infrastructure.csproj @@ -25,9 +25,13 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + - + \ No newline at end of file diff --git a/Source/Shared/CDR.DataHolder.Shared.Business/CDR.DataHolder.Shared.Business.csproj b/Source/Shared/CDR.DataHolder.Shared.Business/CDR.DataHolder.Shared.Business.csproj index bb1d327..99b85ee 100644 --- a/Source/Shared/CDR.DataHolder.Shared.Business/CDR.DataHolder.Shared.Business.csproj +++ b/Source/Shared/CDR.DataHolder.Shared.Business/CDR.DataHolder.Shared.Business.csproj @@ -20,6 +20,10 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/Source/Shared/CDR.DataHolder.Shared.Repository/CDR.DataHolder.Shared.Repository.csproj b/Source/Shared/CDR.DataHolder.Shared.Repository/CDR.DataHolder.Shared.Repository.csproj index 95d07a9..0d1c96d 100644 --- a/Source/Shared/CDR.DataHolder.Shared.Repository/CDR.DataHolder.Shared.Repository.csproj +++ b/Source/Shared/CDR.DataHolder.Shared.Repository/CDR.DataHolder.Shared.Repository.csproj @@ -25,4 +25,8 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + + + + \ No newline at end of file diff --git a/Source/run-integration-tests.ps1 b/Source/run-integration-tests.ps1 index 8330dad..0edfc0a 100644 --- a/Source/run-integration-tests.ps1 +++ b/Source/run-integration-tests.ps1 @@ -10,7 +10,7 @@ Write-Output "⚠ WARNING: Integration tests for MockDataHolder will use the exi Write-Output "***********************************************************" # Run integration tests -docker compose -f docker-compose.IntegrationTests.yml up --build --abort-on-container-exit --exit-code-from mock-data-holder-integration-tests +docker compose -f DockerCompose\docker-compose.IntegrationTests.Banking.yml up --build --abort-on-container-exit --exit-code-from mock-data-holder-integration-tests $_lastExitCode = $LASTEXITCODE # Stop containers diff --git a/Source/supervisord.conf b/Source/supervisord.conf index 3179947..e781c54 100644 --- a/Source/supervisord.conf +++ b/Source/supervisord.conf @@ -59,6 +59,7 @@ directory=/app/gateway-mtls command=/usr/bin/dotnet /app/gateway-mtls/CDR.DataHolder.Shared.API.Gateway.mTLS.dll [program:CDR.DataHolder.CDRAuthServer] +priority=10 # stdout_logfile=/usr/bin/stdout stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 @@ -75,16 +76,17 @@ command=bash /app/wait-until-manage-healthy-then-start.sh /app/cdrauthserver/Cdr # Inject REACT_APP_* environment variables into env.js [program:CdrAuthServer-UI-InjectReactEnvironment] +priority=1 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 -# directory=/app/cdrauthserver-ui directory=/usr/share/nginx/html/ui -command=npx --yes react-inject-env set -d . +command=npx --yes react-inject-env set -d /usr/share/nginx/html/ui [program:CdrAuthServer-UI] +priority=5 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 -directory=/usr/share/nginx +directory=/usr/share/nginx/html/ui command=nginx -g "daemon off;" autostart=true autorestart=true