diff --git a/.github/workflows/deploy_newprd.yml b/.github/workflows/deploy_newprd.yml index 663dbde1c..a433709fb 100644 --- a/.github/workflows/deploy_newprd.yml +++ b/.github/workflows/deploy_newprd.yml @@ -1,6 +1,6 @@ -name: Manual New Production Deploy +name: Manual Production Deploy -concurrency: Manual New Production Deploy +concurrency: Manual Production Deploy on: workflow_dispatch: @@ -12,8 +12,8 @@ on: jobs: deploy_to_production_start_slack: if: github.repository_owner == 'Informatievlaanderen' - name: Deploy to new production started - environment: newprd + name: Deploy to production started + environment: prd runs-on: ubuntu-latest steps: @@ -25,7 +25,7 @@ jobs: uses: slackapi/slack-github-action@v1.23.0 with: channel-id: '#team-dinosaur-dev' - slack-message: Deployment of address-registry to new production has started + slack-message: Deployment of address-registry to production has started env: SLACK_BOT_TOKEN: ${{ secrets.VBR_SLACK_BOT_TOKEN }} SLACK_CHANNEL: ${{ secrets.VBR_NOTIFIER_CHANNEL_NAME }} @@ -34,7 +34,7 @@ jobs: deploy_to_production: if: github.repository_owner == 'Informatievlaanderen' needs: [ deploy_to_production_start_slack ] - name: Deploy to New Production + name: Deploy to Production runs-on: ubuntu-latest strategy: matrix: @@ -79,7 +79,7 @@ jobs: deploy_lambda_to_production: if: github.repository_owner == 'Informatievlaanderen' needs: [deploy_to_production] - name: Deploy lambda to new production + name: Deploy lambda to production runs-on: ubuntu-latest steps: @@ -114,7 +114,7 @@ jobs: deploy_to_production_finish_slack: if: github.repository_owner == 'Informatievlaanderen' needs: [ deploy_lambda_to_production ] - name: Deploy to new production finished + name: Deploy to production finished runs-on: ubuntu-latest steps: @@ -126,7 +126,7 @@ jobs: uses: slackapi/slack-github-action@v1.23.0 with: channel-id: '#team-dinosaur-dev' - slack-message: Deployment of address-registry to new production has finished + slack-message: Deployment of address-registry to production has finished env: SLACK_BOT_TOKEN: ${{ secrets.VBR_SLACK_BOT_TOKEN }} SLACK_CHANNEL: ${{ secrets.VBR_NOTIFIER_CHANNEL_NAME }} diff --git a/.github/workflows/deploy_prd.yml b/.github/workflows/deploy_prd.yml deleted file mode 100644 index 953123340..000000000 --- a/.github/workflows/deploy_prd.yml +++ /dev/null @@ -1,123 +0,0 @@ -name: Manual Production Deploy - -on: - workflow_dispatch: - inputs: - version: - description: 'Version' - required: true - -jobs: - deploy_to_production_start_slack: - if: github.repository_owner == 'Informatievlaanderen' - name: Deploy to production started - environment: prd - runs-on: ubuntu-latest - - steps: - - name: Parse repository name - run: echo REPOSITORY_NAME=$(echo ""$GITHUB_REPOSITORY"" | awk -F / '{print $2}' | sed -e ""s/:refs//"") >> $GITHUB_ENV - shell: bash - - - name: Notify deployment started - uses: slackapi/slack-github-action@v1.23.0 - with: - channel-id: '#team-dinosaur-dev' - slack-message: Deployment of address-registry to production has started - env: - SLACK_BOT_TOKEN: ${{ secrets.VBR_SLACK_BOT_TOKEN }} - SLACK_CHANNEL: ${{ secrets.VBR_NOTIFIER_CHANNEL_NAME }} - REPOSITORY_NAME: ${{ env.REPOSITORY_NAME }} - - deploy_to_production: - if: github.repository_owner == 'Informatievlaanderen' - needs: [ deploy_to_production_start_slack ] - name: Deploy to Production - runs-on: ubuntu-latest - strategy: - matrix: - services: [ - 'address-registry-api' - , 'address-registry-import-api' - , 'address-registry-cache-warmer' - , 'address-registry-projections' - ] - - steps: - - name: CD services - env: - BUILD_URL: ${{ secrets.VBR_AWS_BUILD_API }}/${{matrix.services}} - STATUS_URL: ${{ secrets.VBR_AWS_BUILD_STATUS_API }}/${{matrix.services}} - uses: informatievlaanderen/awscurl-polling-action/polling-action@main - with: - environment: prd - version: ${{ github.event.inputs.version }} - status-url: $STATUS_URL - deploy-url: $BUILD_URL - access-key: ${{ secrets.VBR_AWS_BUILD_USER_ACCESS_KEY_ID }} - secret-key: ${{ secrets.VBR_AWS_BUILD_USER_SECRET_ACCESS_KEY }} - region: eu-west-1 - interval: 2 - - - name: output CD services - shell: bash - run: | - echo build-uuid: ${{ steps.awscurl-polling-action.outputs.build-uuid }} - echo Status: ${{ steps.awscurl-polling-action.outputs.status }} - echo ${{ steps.awscurl-polling-action.outputs.final-message }} - - deploy_lambda_to_production: - if: github.repository_owner == 'Informatievlaanderen' - needs: [deploy_to_production] - name: Deploy lambda to production - runs-on: ubuntu-latest - - steps: - - name: CD Lambda(s) Configure credentials - uses: aws-actions/configure-aws-credentials@v1-node16 - with: - aws-access-key-id: ${{ secrets.VBR_AWS_ACCESS_KEY_ID_PRD }} - aws-secret-access-key: ${{ secrets.VBR_AWS_SECRET_ACCESS_KEY_PRD }} - aws-region: ${{ secrets.VBR_AWS_REGION_PRD }} - - - name: Prepare Lambda(s) - shell: bash - run: | - echo aws s3 cp s3://s3-vbr-prd-basisregisters-lam-ar-sqsbackofficehandlerfunction/$VERSION/lambda.zip s3://s3-vbr-prd-basisregisters-lam-ar-sqsbackofficehandlerfunction/lambda.zip --copy-props none - aws s3 cp s3://s3-vbr-prd-basisregisters-lam-ar-sqsbackofficehandlerfunction/$VERSION/lambda.zip s3://s3-vbr-prd-basisregisters-lam-ar-sqsbackofficehandlerfunction/lambda.zip --copy-props none - env: - VERSION: ${{ github.event.inputs.version }} - - - name: Promote Lambda(s) - shell: bash - run: | - echo pulling awscurl docker image - docker pull ghcr.io/okigan/awscurl:latest - echo docker run --rm okigan/awscurl --access_key $ACCESS_KEY_ID --secret_key $SECRET_ACCESS_KEY_ID --region $REGION -X POST -d '{ "functionName": "sr-sqsbackofficehandlerfunction", "project": "basisregisters", "domain": "basisregisters" }' $PROMOTEURL/prd - docker run --rm okigan/awscurl --access_key $ACCESS_KEY_ID --secret_key $SECRET_ACCESS_KEY_ID --region $REGION -X POST -d '{ "functionName": "sr-sqsbackofficehandlerfunction", "project": "basisregisters", "domain": "basisregisters" }' $PROMOTEURL/prd - env: - ACCESS_KEY_ID: ${{ secrets.VBR_AWS_ACCESS_KEY_ID_TST }} - SECRET_ACCESS_KEY_ID: ${{ secrets.VBR_AWS_SECRET_ACCESS_KEY_TST }} - REGION: ${{ secrets.VBR_AWS_REGION_PRD }} - PROMOTEURL: ${{ secrets.VBR_AWS_PROMOTE_LAMBDA_BASEURL }} - - deploy_to_production_finish_slack: - if: github.repository_owner == 'Informatievlaanderen' - needs: [ deploy_lambda_to_production ] - name: Deploy to production finished - runs-on: ubuntu-latest - - steps: - - name: Parse repository name - run: echo REPOSITORY_NAME=$(echo ""$GITHUB_REPOSITORY"" | awk -F / '{print $2}' | sed -e ""s/:refs//"") >> $GITHUB_ENV - shell: bash - - - name: Notify deployment finished - uses: slackapi/slack-github-action@v1.23.0 - with: - channel-id: '#team-dinosaur-dev' - slack-message: Deployment of address-registry to production has finished - env: - SLACK_BOT_TOKEN: ${{ secrets.VBR_SLACK_BOT_TOKEN }} - SLACK_CHANNEL: ${{ secrets.VBR_NOTIFIER_CHANNEL_NAME }} - REPOSITORY_NAME: ${{ env.REPOSITORY_NAME }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 09dd952f9..907adbfeb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -98,21 +98,6 @@ jobs: semver: ${{ needs.set-release-version.outputs.version }} secrets: inherit - build-api-crab-import: - name: Build Api CrabImport - uses: Informatievlaanderen/build-pipeline/.github/workflows/build-image.yml@main - needs: [ set-release-version ] - if: ${{ (github.repository_owner == 'Informatievlaanderen') && (needs.set-release-version.outputs.version != 'none') }} - with: - registry: address-registry - build-target: Containerize_ApiCrabImport - image-file: ar-api-crab-import-image.tar - image-name: api-crab-import - test-project: AddressRegistry.Tests - build-project: AddressRegistry.Api.CrabImport - semver: ${{ needs.set-release-version.outputs.version }} - secrets: inherit - build-api-extract: name: Build Api Extract uses: Informatievlaanderen/build-pipeline/.github/workflows/build-image.yml@main @@ -353,18 +338,6 @@ jobs: semver: ${{ needs.set-release-version.outputs.version }} secrets: inherit - pack-api-crab-import: - name: Pack Api CrabImport - uses: Informatievlaanderen/build-pipeline/.github/workflows/pack.yml@main - needs: [ set-release-version ] - if: ${{ (github.repository_owner == 'Informatievlaanderen') && (needs.set-release-version.outputs.version != 'none') }} - with: - pack-file: Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport - test-project: AddressRegistry.Tests - build-project: AddressRegistry.Api.CrabImport - semver: ${{ needs.set-release-version.outputs.version }} - secrets: inherit - build-lambda-backoffice: name: Build Lambda uses: Informatievlaanderen/build-pipeline/.github/workflows/build-lambda.yml@main @@ -387,12 +360,10 @@ jobs: pack-api-legacy, pack-api-oslo, pack-api-extract, - pack-api-crab-import, build-api-backoffice, build-api-legacy, build-api-oslo, build-api-extract, - build-api-crab-import, build-projector, build-projections-backoffice, build-projections-syndication, @@ -492,13 +463,6 @@ jobs: name: nuget-Be.Vlaanderen.Basisregisters.AddressRegistry.Api.Extract-${{ needs.set-release-version.outputs.version }} path: dist/nuget/ - - name: Download NuGet Api CrabImport - uses: actions/download-artifact@v3 - continue-on-error: false - with: - name: nuget-Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport-${{ needs.set-release-version.outputs.version }} - path: dist/nuget/ - - name: Run Semantic Release shell: bash run: npx semantic-release @@ -660,12 +624,6 @@ jobs: name: nuget-Be.Vlaanderen.Basisregisters.AddressRegistry.Api.Extract-${{ needs.release.outputs.version }} path: ~/ - - name: Download NuGet package api-crab-import - uses: actions/download-artifact@v3 - with: - name: nuget-Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport-${{ needs.release.outputs.version }} - path: ~/ - - name: Publish packages to NuGet shell: bash run: | @@ -674,7 +632,6 @@ jobs: dotnet nuget push ~/Be.Vlaanderen.Basisregisters.AddressRegistry.Api.Legacy.$SEMVER.nupkg --source nuget.org --api-key $NUGET_API_KEY dotnet nuget push ~/Be.Vlaanderen.Basisregisters.AddressRegistry.Api.Oslo.$SEMVER.nupkg --source nuget.org --api-key $NUGET_API_KEY dotnet nuget push ~/Be.Vlaanderen.Basisregisters.AddressRegistry.Api.Extract.$SEMVER.nupkg --source nuget.org --api-key $NUGET_API_KEY - dotnet nuget push ~/Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport.$SEMVER.nupkg --source nuget.org --api-key $NUGET_API_KEY env: SEMVER: ${{ needs.release.outputs.version }} WORKSPACE: ${{ github.workspace }} @@ -752,7 +709,6 @@ jobs: 'api-backoffice' , 'api-legacy' , 'api-oslo' - , 'api-crab-import' , 'api-extract' , 'projector' , 'projections-syndication' @@ -816,7 +772,6 @@ jobs: 'api-backoffice' , 'api-legacy' , 'api-oslo' - , 'api-crab-import' , 'api-extract' , 'projector' , 'projections-syndication' @@ -882,7 +837,6 @@ jobs: 'api-backoffice' , 'api-legacy' , 'api-oslo' - , 'api-crab-import' , 'api-extract' , 'projector' , 'projections-syndication' @@ -944,7 +898,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - image: ['api-backoffice', 'api-legacy', 'api-oslo', 'api-crab-import', 'api-extract', 'projector', 'projections-syndication', 'projections-backoffice', 'consumer', 'consumer-read-municipality', 'consumer-read-streetname', 'producer', 'producer-snapshot-oslo', 'migrator-address', 'cache-warmer'] + image: ['api-backoffice', 'api-legacy', 'api-oslo', 'api-extract', 'projector', 'projections-syndication', 'projections-backoffice', 'consumer', 'consumer-read-municipality', 'consumer-read-streetname', 'producer', 'producer-snapshot-oslo', 'migrator-address', 'cache-warmer'] steps: - name: Configure AWS credentials (Production) uses: aws-actions/configure-aws-credentials@v1-node16 @@ -1017,7 +971,6 @@ jobs: matrix: services: [ 'address-registry-api' - , 'address-registry-import-api' , 'address-registry-projections' , 'address-registry-producer' , 'address-registry-producer-snapshot-oslo' diff --git a/AddressRegistry.sln b/AddressRegistry.sln index 052b9e5a4..cd285f8f3 100755 --- a/AddressRegistry.sln +++ b/AddressRegistry.sln @@ -15,8 +15,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AddressRegistry.Api.Legacy" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AddressRegistry.Tests", "test\AddressRegistry.Tests\AddressRegistry.Tests.csproj", "{069988CD-6F06-4691-BFF1-85F42E34B22B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AddressRegistry.Api.CrabImport", "src\AddressRegistry.Api.CrabImport\AddressRegistry.Api.CrabImport.csproj", "{0D5C4B45-1E03-4082-A0E2-746F99E027F1}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{BEF78ECA-728A-41DD-9E07-B0CD2A13F57B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AddressRegistry.Structurizr", "docs\AddressRegistry.Structurizr\AddressRegistry.Structurizr.csproj", "{D07110B5-ED7D-461E-A7D3-91E8C4250C52}" @@ -142,18 +140,6 @@ Global {069988CD-6F06-4691-BFF1-85F42E34B22B}.Release|x64.Build.0 = Release|Any CPU {069988CD-6F06-4691-BFF1-85F42E34B22B}.Release|x86.ActiveCfg = Release|Any CPU {069988CD-6F06-4691-BFF1-85F42E34B22B}.Release|x86.Build.0 = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|x64.ActiveCfg = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|x64.Build.0 = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|x86.ActiveCfg = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Debug|x86.Build.0 = Debug|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|Any CPU.Build.0 = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|x64.ActiveCfg = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|x64.Build.0 = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|x86.ActiveCfg = Release|Any CPU - {0D5C4B45-1E03-4082-A0E2-746F99E027F1}.Release|x86.Build.0 = Release|Any CPU {D07110B5-ED7D-461E-A7D3-91E8C4250C52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D07110B5-ED7D-461E-A7D3-91E8C4250C52}.Debug|Any CPU.Build.0 = Debug|Any CPU {D07110B5-ED7D-461E-A7D3-91E8C4250C52}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -439,7 +425,6 @@ Global {939A09F3-1280-4843-9D85-92171D79AE26} = {C2F8FF63-7A48-4179-A720-86206C42F496} {645F2544-778B-4078-BEEF-D5EDC1F0B2FA} = {C2F8FF63-7A48-4179-A720-86206C42F496} {069988CD-6F06-4691-BFF1-85F42E34B22B} = {8EA18457-86E2-4D2D-AC9E-2552FDC9676F} - {0D5C4B45-1E03-4082-A0E2-746F99E027F1} = {C2F8FF63-7A48-4179-A720-86206C42F496} {D07110B5-ED7D-461E-A7D3-91E8C4250C52} = {BEF78ECA-728A-41DD-9E07-B0CD2A13F57B} {31625324-A2D0-4E79-BDB3-4F5D15885C4A} = {C2F8FF63-7A48-4179-A720-86206C42F496} {471B8365-62B4-499F-9303-9D9AF01E55AF} = {C2F8FF63-7A48-4179-A720-86206C42F496} diff --git a/CHANGELOG.md b/CHANGELOG.md index ddd0340db..b6a4dbce5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +# [3.105.0](https://github.com/informatievlaanderen/address-registry/compare/v3.104.0...v3.105.0) (2023-12-05) + + +### Bug Fixes + +* add AddressDetailWithParent projection to projector ([b6b994c](https://github.com/informatievlaanderen/address-registry/commit/b6b994cfe1f167306befa8dfbea7624ba4c01229)) +* add addressmatch extensions ([a5d1030](https://github.com/informatievlaanderen/address-registry/commit/a5d1030216eec244ae1da0a0faf95fb9c618cde8)) +* versiontimestamp parsing in ksql integrationdb stream ([002469a](https://github.com/informatievlaanderen/address-registry/commit/002469aa0c5e2e4d6ddb45502cb3f6c993341bd8)) +* wms labeltype by duplicating projection (V2) ([56ca872](https://github.com/informatievlaanderen/address-registry/commit/56ca872123992bed19582f2f00de6578b81c9a8a)) + + +### Features + +* add integrationdb ksql scripts ([65064ec](https://github.com/informatievlaanderen/address-registry/commit/65064ecbc1cb1d4ce78f754a9da371120d861682)) +* add StreetNameWasRenamed event ([79cd967](https://github.com/informatievlaanderen/address-registry/commit/79cd967708b1623190f7e99affabde88a22ffbda)) +* consume rename streetname - readdress ([00d4f8e](https://github.com/informatievlaanderen/address-registry/commit/00d4f8e259146d4668268a7ea849be85ecca96ae)) +* consume rename streetname - retire and reject ([ff4f214](https://github.com/informatievlaanderen/address-registry/commit/ff4f214b9a863c6d24f71b06cc901c27e3c2f2a2)) +* use IdempotentCommandHandler in streetname consumer ([9b85e4b](https://github.com/informatievlaanderen/address-registry/commit/9b85e4b9a3d19cdb8be1e3116a37164a3d8e9783)) + + +### Performance Improvements + +* **adresmatch:** various performance improvements ([6123621](https://github.com/informatievlaanderen/address-registry/commit/61236217a0ae946c4aeca35ec9d205786c396d92)) + # [3.104.0](https://github.com/informatievlaanderen/address-registry/compare/v3.103.1...v3.104.0) (2023-11-07) diff --git a/build.fsx b/build.fsx index 04ab78585..5fae901fd 100755 --- a/build.fsx +++ b/build.fsx @@ -61,7 +61,6 @@ Target.create "Publish_Solution" (fun _ -> "AddressRegistry.Api.Legacy" "AddressRegistry.Api.Oslo" "AddressRegistry.Api.Extract" - "AddressRegistry.Api.CrabImport" "AddressRegistry.Api.BackOffice" "AddressRegistry.Api.BackOffice.Abstractions" "AddressRegistry.Api.BackOffice.Handlers.Lambda" @@ -93,7 +92,6 @@ Target.create "Pack_Solution" (fun _ -> "AddressRegistry.Api.Legacy" "AddressRegistry.Api.Oslo" "AddressRegistry.Api.Extract" - "AddressRegistry.Api.CrabImport" "AddressRegistry.Api.BackOffice" "AddressRegistry.Api.BackOffice.Abstractions" ] |> List.iter pack) @@ -103,7 +101,6 @@ Target.create "Containerize_ApiLegacy" (fun _ -> containerize "AddressRegistry.A Target.create "Containerize_ApiOslo" (fun _ -> containerize "AddressRegistry.Api.Oslo" "api-oslo") Target.create "Containerize_ApiExtract" (fun _ -> containerize "AddressRegistry.Api.Extract" "api-extract") Target.create "Containerize_ApiBackOffice" (fun _ -> containerize "AddressRegistry.Api.BackOffice" "api-backoffice") -Target.create "Containerize_ApiCrabImport" (fun _ -> containerize "AddressRegistry.Api.CrabImport" "api-crab-import") Target.create "Containerize_Consumer" (fun _ -> containerize "AddressRegistry.Consumer" "consumer") Target.create "Containerize_ConsumerMunicipality" (fun _ -> containerize "AddressRegistry.Consumer.Read.Municipality" "consumer-read-municipality") Target.create "Containerize_ConsumerStreetName" (fun _ -> containerize "AddressRegistry.Consumer.Read.StreetName" "consumer-read-streetname") @@ -155,7 +152,6 @@ Target.create "Containerize" ignore //==> "Containerize_ApiOslo" //==> "Containerize_ApiExtract" //==> "Containerize_ApiBackOffice" - //==> "Containerize_ApiCrabImport" //==> "Containerize_Consumer" //==> "Containerize_ConsumerMunicipality" //==> "Containerize_ConsumerStreetName" diff --git a/package-lock.json b/package-lock.json index 391a0739e..1eadaad59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "address-registry", - "version": "3.104.0", + "version": "3.105.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "address-registry", - "version": "3.104.0", + "version": "3.105.0", "license": "EUPL-1.2", "devDependencies": { "@commitlint/cli": "16.2.3", diff --git a/package.json b/package.json index 9daaea31c..0f4e47bae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "address-registry", - "version": "3.104.0", + "version": "3.105.0", "description": "Authentic base registry containing all addresses of Flanders.", "author": "Basisregisters Vlaanderen", "license": "EUPL-1.2", diff --git a/paket.dependencies b/paket.dependencies index 5792f5c3d..fa6e00aef 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -32,14 +32,14 @@ nuget GeoJSON.NET 1.2.19 nuget Be.Vlaanderen.Basisregisters.Build.Pipeline 6.0.5 nuget Be.Vlaanderen.Basisregisters.Testing.Infrastructure.Events 3.0.0 content: true, copy_content_to_output_dir: always, copy_local: true -nuget Be.Vlaanderen.Basisregisters.AggregateSource 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.ExplicitRouting 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore.Autofac 8.2.0 -nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit 8.2.0 -nuget Be.vlaanderen.basisregisters.snapshotverifier 8.2.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.ExplicitRouting 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore.Autofac 8.3.0 +nuget Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit 8.3.0 +nuget Be.vlaanderen.basisregisters.snapshotverifier 8.3.0 nuget Be.Vlaanderen.Basisregisters.Api 20.0.0 @@ -48,9 +48,9 @@ nuget Be.Vlaanderen.Basisregisters.Auth.AcmIdm 1.4.0 nuget Be.Vlaanderen.Basisregisters.Aws.DistributedMutex 3.0.0 nuget Be.Vlaanderen.Basisregisters.Aws.Lambda 3.0.3 -nuget Be.Vlaanderen.Basisregisters.CommandHandling 8.2.0 -nuget Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency 8.2.0 -nuget Be.Vlaanderen.Basisregisters.CommandHandling.SqlStreamStore 8.2.0 +nuget Be.Vlaanderen.Basisregisters.CommandHandling 8.3.0 +nuget Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency 8.3.0 +nuget Be.Vlaanderen.Basisregisters.CommandHandling.SqlStreamStore 8.3.0 nuget Be.Vlaanderen.Basisregisters.EventHandling 4.2.3 nuget Be.Vlaanderen.Basisregisters.EventHandling.Autofac 4.2.3 @@ -72,15 +72,15 @@ nuget Be.Vlaanderen.Basisregisters.DataDog.Tracing.SqlStreamStore 5.0.3 nuget Be.Vlaanderen.Basisregisters.Crab 3.0.0 nuget Be.Vlaanderen.Basisregisters.Crab.Autofac 3.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Common 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Contracts 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Edit 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Import 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Legacy 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Oslo 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Extracts 19.0.0 -nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm 19.0.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Common 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Contracts 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Edit 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Import 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Legacy 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Oslo 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Extracts 20.6.0 +nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm 20.6.0 nuget Be.Vlaanderen.Basisregisters.MessageHandling.AwsSqs.Simple 4.8.3 nuget Be.Vlaanderen.Basisregisters.MessageHandling.Kafka.Producer 4.8.3 diff --git a/paket.lock b/paket.lock index 2b8ea7d45..644838e7d 100644 --- a/paket.lock +++ b/paket.lock @@ -45,44 +45,44 @@ NUGET System.Security.Cryptography.ProtectedData (>= 4.5) System.Text.Json (>= 4.6) System.Threading.Tasks.Extensions (>= 4.5.4) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) Be.Vlaanderen.Basisregisters.Utilities.HashCodeCalculator (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Utilities.ToStringBuilder (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) NodaTime (>= 3.0.10) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.ExplicitRouting (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.ExplicitRouting (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.EventHandling (>= 4.2.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) SqlStreamStore (>= 1.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac (8.2) + Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac (8.3) Autofac.Extensions.DependencyInjection (>= 7.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) SqlStreamStore (>= 1.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) SqlStreamStore.MsSql (>= 1.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) CompareNETObjects (>= 4.81) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.CSharp (>= 4.7) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.CommandHandling (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.CommandHandling (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.EventHandling (>= 4.2.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) SqlStreamStore (>= 1.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore.Autofac (8.2) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore.Autofac (8.3) Autofac.Extensions.DependencyInjection (>= 7.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore.Autofac (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.CommandHandling (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource.Testing (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Logging (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) xunit (>= 2.4.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Api (20.0) @@ -216,17 +216,19 @@ NUGET Fake.IO.FileSystem (>= 5.22) Fake.JavaScript.Npm (>= 5.22) Newtonsoft.Json (>= 13.0.1) - Be.Vlaanderen.Basisregisters.CommandHandling (8.2) - Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency (8.2) + Be.Vlaanderen.Basisregisters.CommandHandling (8.3) + Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency (8.3) + Be.Vlaanderen.Basisregisters.CommandHandling (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Converters.Timestamp (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Data.SqlClient (>= 4.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.EntityFrameworkCore.SqlServer (>= 6.0.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Configuration (>= 6.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Options.ConfigurationExtensions (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.CommandHandling.SqlStreamStore (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.CommandHandling (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.CommandHandling.SqlStreamStore (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.CommandHandling (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.EventHandling (>= 4.2.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Generators.Guid.Deterministic (>= 3.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) SqlStreamStore (>= 1.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) @@ -281,18 +283,20 @@ NUGET Autofac.Extensions.DependencyInjection (>= 7.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.EventHandling (4.2.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Generators.Guid.Deterministic (3.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Common (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Common (20.6) Be.Vlaanderen.Basisregisters.AggregateSource (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.CommandHandling (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + NetTopologySuite (>= 2.4) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) NodaTime (>= 3.0.10) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Contracts (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Contracts (20.6) Be.Vlaanderen.Basisregisters.AggregateSource (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) NodaTime (>= 3.0.10) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Edit (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Edit (20.6) NetTopologySuite (>= 2.4) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Extracts (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Extracts (20.6) Be.Vlaanderen.Basisregisters.Api (>= 20.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Shaperon (>= 9.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Import (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Import (20.6) Autofac (>= 6.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.CommandHandling (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) @@ -308,27 +312,28 @@ NUGET Serilog.Extensions.Logging (>= 3.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Serilog.Sinks.Email (>= 2.4) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) System.Threading.Tasks.Dataflow (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Legacy (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Legacy (20.6) + Be.Vlaanderen.Basisregisters.GrAr.Common (20.6) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Utilities.Rfc3339DateTimeOffset (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Oslo (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Oslo (20.6) Be.Vlaanderen.Basisregisters.AspNetCore.Mvc.Formatters.Json (>= 4.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Common (19.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.GrAr.Common (20.6) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Utilities.Rfc3339DateTimeOffset (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Configuration (>= 6.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Http.Polly (>= 6.0.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Newtonsoft.Json (>= 13.0.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Provenance (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Provenance (20.6) Be.Vlaanderen.Basisregisters.CommandHandling (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Crab (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Common (19.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.GrAr.Common (20.6) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.CSharp (>= 4.7) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm (19.0) + Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm (20.6) Be.Vlaanderen.Basisregisters.Auth.AcmIdm (>= 1.4) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.CommandHandling (>= 8.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Crab (>= 3.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Common (19.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) - Be.Vlaanderen.Basisregisters.GrAr.Provenance (19.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.GrAr.Common (20.6) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.Vlaanderen.Basisregisters.GrAr.Provenance (20.6) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.CSharp (>= 4.7) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.MessageHandling.AwsSqs.Simple (4.8.3) AWSSDK.Core (>= 3.7.106.8) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) @@ -420,8 +425,8 @@ NUGET System.Configuration.ConfigurationManager (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) System.Threading.Tasks.Dataflow (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Be.Vlaanderen.Basisregisters.Shaperon (9.0.1) - Be.vlaanderen.basisregisters.snapshotverifier (8.2) - Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.2) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + Be.vlaanderen.basisregisters.snapshotverifier (8.3) + Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (8.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) CompareNETObjects (>= 4.81) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Dapper (>= 2.0.123) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.Extensions.Hosting (>= 6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) diff --git a/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Function.cs b/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Function.cs index 37a1ef4e6..29502d4b7 100644 --- a/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Function.cs +++ b/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Function.cs @@ -1,6 +1,7 @@ using Amazon.Lambda.Core; +using Amazon.Lambda.Serialization.Json; -[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] +[assembly: LambdaSerializer(typeof(JsonSerializer))] namespace AddressRegistry.Api.BackOffice.Handlers.Lambda { @@ -13,7 +14,6 @@ namespace AddressRegistry.Api.BackOffice.Handlers.Lambda using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.DataDog.Tracing.Autofac; using Be.Vlaanderen.Basisregisters.EventHandling; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Infrastructure; using Consumer.Read.Municipality.Infrastructure.Modules; using Infrastructure; @@ -25,6 +25,8 @@ namespace AddressRegistry.Api.BackOffice.Handlers.Lambda using Newtonsoft.Json; using Projections.Syndication; using TicketingService.Proxy.HttpProxy; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; + using IIdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IIdempotentCommandHandler; public class Function : FunctionBase { diff --git a/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Handlers/ReaddressLambdaHandler.cs b/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Handlers/ReaddressLambdaHandler.cs index c67e6b9ae..79000645f 100644 --- a/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Handlers/ReaddressLambdaHandler.cs +++ b/src/AddressRegistry.Api.BackOffice.Handlers.Lambda/Handlers/ReaddressLambdaHandler.cs @@ -96,14 +96,14 @@ await IdempotentCommandHandler.Dispatch( .Where(x => x.StreetNamePersistentLocalId != readdressCommand.DestinationStreetNamePersistentLocalId) .GroupBy(x => x.StreetNamePersistentLocalId)) { - await using var scope = _lifetimeScope.BeginLifetimeScope(); - - var streetNames = scope.Resolve(); - var streetName = await streetNames.GetAsync( - new StreetNameStreamId(readdressCommand.DestinationStreetNamePersistentLocalId), cancellationToken); - foreach (var (_, addressPersistentLocalId) in addressesByStreetName) { + await using var scope = _lifetimeScope.BeginLifetimeScope(); + + var streetNames = scope.Resolve(); + var streetName = await streetNames.GetAsync( + new StreetNameStreamId(readdressCommand.DestinationStreetNamePersistentLocalId), cancellationToken); + try { var houseNumber = addressesToReaddress @@ -111,7 +111,7 @@ await IdempotentCommandHandler.Dispatch( .DestinationHouseNumber; var destinationAddress = streetName.StreetNameAddresses.FindActiveParentByHouseNumber(HouseNumber.Create(houseNumber)); - var destinationBoxNumbers = destinationAddress.Children + var destinationBoxNumbers = destinationAddress!.Children .Where(x => x.IsActive) .Select(x => new BoxNumberAddressPersistentLocalId(x.BoxNumber!, x.AddressPersistentLocalId)) .ToList(); @@ -146,7 +146,7 @@ await _backOfficeContext.AddIdempotentAddressStreetNameIdRelation( cancellationToken); } - // Only etags for house number addresses are returned as they were not part of the original request. + // Only etags for house number addresses are returned and NOT box number addresses as the latter were not part of the original request. // An additional argument is because in case of an IdempotencyException, // we no longer know which destination box number was rejected or retired in the scope of this command or previously. foreach (var (streetNamePersistentLocalId, addressPersistentLocalId) in addressesUpdated.Distinct()) diff --git a/src/AddressRegistry.Api.CrabImport/AddressRegistry.Api.CrabImport.csproj b/src/AddressRegistry.Api.CrabImport/AddressRegistry.Api.CrabImport.csproj deleted file mode 100755 index a9220e103..000000000 --- a/src/AddressRegistry.Api.CrabImport/AddressRegistry.Api.CrabImport.csproj +++ /dev/null @@ -1,38 +0,0 @@ - - - - - true - false - - - - bin\Debug\net6.0\AddressRegistry.Api.CrabImport.xml - 1701;1702;1705;1591 - TRACE;DEBUG;NETCOREAPP;NET6_0 - - - bin\Release\net6.0\AddressRegistry.Api.CrabImport.xml - 1701;1702;1705;1591 - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AddressRegistry.Api.CrabImport/CrabImport/AddressMatchController.cs b/src/AddressRegistry.Api.CrabImport/CrabImport/AddressMatchController.cs deleted file mode 100644 index 71db411bf..000000000 --- a/src/AddressRegistry.Api.CrabImport/CrabImport/AddressMatchController.cs +++ /dev/null @@ -1,179 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.CrabImport -{ - using AddressRegistry.Infrastructure; - using Be.Vlaanderen.Basisregisters.Api; - using CsvHelper.Configuration; - using Dapper; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.Logging; - using System; - using System.Data; - using System.Globalization; - using Microsoft.Data.SqlClient; - using System.IO; - using System.IO.Compression; - using System.Text; - using System.Threading; - using System.Threading.Tasks; - using Projections.Legacy.AddressMatch; - - [ApiVersion("1.0")] - [AdvertiseApiVersions("1.0")] - [ApiRoute("addressmatch")] - [ApiExplorerSettings(GroupName = "AddressMatch")] - public class AddressMatchController : ApiController - { - private readonly string _filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", DateTime.Today.ToString("yyyyMMdd")); - private const string RrStreetNamesFileName = "RRStreetNames.csv"; - private const string KadStreetNamesFileName = "KadStreetNames.csv"; - private const string RrAddressesFileName = "RRAddresses.csv"; - private readonly CsvConfiguration _csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture) { Encoding = Encoding.UTF8, Delimiter = ";" }; - - [HttpPost, DisableRequestSizeLimit] - public async Task Post( - [FromServices] ILogger logger, - [FromServices] IConfiguration configuration, - [FromForm] IFormFile file, - CancellationToken cancellationToken = default) - { - await SaveFile(file, cancellationToken); - - ZipFile.ExtractToDirectory(Path.Combine(_filePath, file.FileName), _filePath, true); - - var connectionString = configuration.GetConnectionString("LegacyProjectionsAdmin"); - - using (var connection = new SqlConnection(connectionString)) - { - connection.Open(); - var transaction = connection.BeginTransaction(); - try - { - await connection.ExecuteAsync($@" - TRUNCATE TABLE [{Schema.Legacy}].[{RRStreetName.TableName}]; - TRUNCATE TABLE [{Schema.Legacy}].[{KadStreetName.TableName}]; - TRUNCATE TABLE [{Schema.Legacy}].[{RRAddress.TableName}];", - transaction: transaction); - - ImportRrStreetNames(connection, transaction); - ImportKadStreetNames(connection, transaction); - ImportRrAddresses(connection, transaction); - transaction.Commit(); - } - catch - { - transaction.Rollback(); - } - } - - return Ok(); - } - - private void ImportRrStreetNames(SqlConnection connection, SqlTransaction transaction) - { - var destinationTableName = $"{Schema.Legacy}.{RRStreetName.TableName}"; - var dataTable = new DataTable(); - dataTable.Columns.Add(nameof(RRStreetName.StreetNameId), typeof(int)); - dataTable.Columns.Add(nameof(RRStreetName.StreetName), typeof(string)); - dataTable.Columns[nameof(RRStreetName.StreetName)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(RRStreetName.StreetCode), typeof(string)); - dataTable.Columns[nameof(RRStreetName.StreetCode)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(RRStreetName.PostalCode), typeof(string)); - dataTable.Columns[nameof(RRStreetName.PostalCode)].AllowDBNull = true; - - ExtractAndTransform(RrStreetNamesFileName, dataTable); - Load(connection, transaction, destinationTableName, dataTable); - } - - private void ImportKadStreetNames(SqlConnection connection, SqlTransaction transaction) - { - var destinationTableName = $"{Schema.Legacy}.{KadStreetName.TableName}"; - var dataTable = new DataTable(); - dataTable.Columns.Add(nameof(KadStreetName.StreetNameId), typeof(int)); - - dataTable.Columns.Add(nameof(KadStreetName.KadStreetNameCode), typeof(string)); - dataTable.Columns[nameof(KadStreetName.KadStreetNameCode)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(KadStreetName.NisCode), typeof(string)); - dataTable.Columns[nameof(KadStreetName.NisCode)].AllowDBNull = true; - - ExtractAndTransform(KadStreetNamesFileName, dataTable); - Load(connection, transaction, destinationTableName, dataTable); - } - - private void ImportRrAddresses(SqlConnection connection, SqlTransaction transaction) - { - var destinationTableName = $"{Schema.Legacy}.{RRAddress.TableName}"; - var dataTable = new DataTable(); - dataTable.Columns.Add(nameof(RRAddress.AddressId), typeof(int)); - dataTable.Columns.Add(nameof(RRAddress.AddressType), typeof(string)); - - dataTable.Columns.Add(nameof(RRAddress.RRHouseNumber), typeof(string)); - dataTable.Columns[nameof(RRAddress.RRHouseNumber)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(RRAddress.RRIndex), typeof(string)); - dataTable.Columns[nameof(RRAddress.RRIndex)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(RRAddress.StreetCode), typeof(string)); - dataTable.Columns[nameof(RRAddress.StreetCode)].AllowDBNull = true; - - dataTable.Columns.Add(nameof(RRAddress.PostalCode), typeof(string)); - dataTable.Columns[nameof(RRAddress.PostalCode)].AllowDBNull = true; - - ExtractAndTransform(RrAddressesFileName, dataTable); - Load(connection, transaction, destinationTableName, dataTable); - } - - private static void Load( - SqlConnection connection, - SqlTransaction transaction, - string destinationTableName, - DataTable dataTable) - { - using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction)) - { - bulkCopy.BulkCopyTimeout = 600; - bulkCopy.DestinationTableName = destinationTableName; - bulkCopy.WriteToServer(dataTable); - } - } - - private void ExtractAndTransform(string fileName, DataTable dataTable) - { - using (var stream = new StreamReader(Path.Combine(_filePath, fileName))) - using (var reader = new CsvHelper.CsvReader(stream, _csvConfiguration)) - { - reader.Read(); - reader.ReadHeader(); - - while (reader.Read()) - { - var row = dataTable.NewRow(); - foreach (DataColumn column in dataTable.Columns) - { - var value = reader.GetField(column.DataType, column.ColumnName); - - if (value is string stringValue && stringValue == string.Empty) - row[column.ColumnName] = null; - else - row[column.ColumnName] = value; - } - - dataTable.Rows.Add(row); - } - } - } - - private async Task SaveFile(IFormFile file, CancellationToken cancellationToken) - { - var path = Path.Combine(_filePath, file.FileName); - Directory.CreateDirectory(_filePath); - - using (var fileStream = new FileStream(path, FileMode.Create)) - await file.CopyToAsync(fileStream, cancellationToken); - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/CrabImport/CrabImportController.cs b/src/AddressRegistry.Api.CrabImport/CrabImport/CrabImportController.cs deleted file mode 100755 index cfc8e8274..000000000 --- a/src/AddressRegistry.Api.CrabImport/CrabImport/CrabImportController.cs +++ /dev/null @@ -1,161 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.CrabImport -{ - using System; - using Dasync.Collections; - using System.Collections.Concurrent; - using System.Collections.Generic; - using System.Diagnostics; - using System.Linq; - using System.Security.Claims; - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Be.Vlaanderen.Basisregisters.AspNetCore.Mvc.Middleware; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Api; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Processing; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Processing.Api.Messages; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Processing.CrabImport; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Extensions.Logging; - using Requests; - using Swashbuckle.AspNetCore.Filters; - using ProblemDetails = Be.Vlaanderen.Basisregisters.BasicApiProblem.ProblemDetails; - - [ApiVersion("1.0")] - [AdvertiseApiVersions("1.0")] - [ApiRoute("crabimport")] - [ApiExplorerSettings(GroupName = "CRAB Import")] - public class CrabImportController : ApiController - { - private const string AggregateMessageTemplate = "Preparing to process commands for {AggregateCount} aggregates."; - private const string CommandMessageTemplate = "Handled {CommandCount} commands in {Elapsed:0.0000} ms"; - private const string BatchMessageTemplate = "Handled {AggregateCount} aggregates ({CommandCount} commands) in {Elapsed:0.0000} ms"; - private static double GetElapsedMilliseconds(long start, long stop) => (stop - start) * 1000 / (double)Stopwatch.Frequency; - - /// - /// Import een CRAB item. - /// - /// - /// - /// - /// - /// Als het verzoek aanvaard is. - /// Als het verzoek ongeldige data bevat. - /// Als er een interne fout is opgetreden. - /// - [HttpPost] - [ProducesResponseType(typeof(void), StatusCodes.Status202Accepted)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status500InternalServerError)] - [SwaggerRequestExample(typeof(RegisterCrabImportRequest), typeof(RegisterCrabImportRequestExample))] - [SwaggerResponseExample(StatusCodes.Status202Accepted, typeof(RegisterCrabImportResponseExamples))] - [SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BadRequestResponseExamples))] - [SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(InternalServerErrorResponseExamples))] - public async Task Post( - [FromServices] IdempotentCommandHandlerModule bus, - [FromServices] ILogger logger, - [FromBody] List registerCrabImportList, - CancellationToken cancellationToken = default) - { - if (!ModelState.IsValid) - return BadRequest(ModelState); - - var tags = new ConcurrentBag(); - - var start = Stopwatch.GetTimestamp(); - logger.LogDebug(AggregateMessageTemplate, registerCrabImportList.Count); - - await registerCrabImportList.ParallelForEachAsync(async registerCrabImports => - { - var startCommands = Stopwatch.GetTimestamp(); - - try - { - var commandsPerCommandId = registerCrabImports - .Select(RegisterCrabImportRequestMapping.Map) - .Distinct(new LambdaEqualityComparer(x => (string)x.CreateCommandId().ToString())) - .ToDictionary(x => (Guid?)x.CreateCommandId(), x => x); - - var tag = await bus - .IdempotentCommandHandlerDispatchBatch( - commandsPerCommandId, - GetMetadata(), - cancellationToken); - - tags.Add(tag); - } - catch - { - var x = registerCrabImports.Select(RegisterCrabImportRequestMapping.Map).ToList(); - Console.WriteLine($"Boom, {x.First()}"); - throw; - } - - var elapsedCommandsMs = GetElapsedMilliseconds(startCommands, Stopwatch.GetTimestamp()); - logger.LogDebug(CommandMessageTemplate, registerCrabImports.Length, elapsedCommandsMs); - }, - cancellationToken: cancellationToken, - maxDegreeOfParallelism: 0); - - logger.LogDebug( - BatchMessageTemplate, - registerCrabImportList.Count, - registerCrabImportList.SelectMany(x => x).Count(), - GetElapsedMilliseconds(start, Stopwatch.GetTimestamp())); - - return Accepted(tags.Any() ? tags.Max() : null); - } - - private IDictionary GetMetadata() - { - string FindClaimValue(string claimName) => User?.FindFirst(claimName)?.Value; - - return new Dictionary - { - { "FirstName", FindClaimValue(ClaimTypes.GivenName) }, - { "LastName", FindClaimValue(ClaimTypes.Name) }, - { "Ip", FindClaimValue(AddRemoteIpAddressMiddleware.UrnBasisregistersVlaanderenIp) }, - { "UserId", FindClaimValue("urn:be:vlaanderen:addressregistry:acmid") }, - { "CorrelationId", FindClaimValue(AddCorrelationIdMiddleware.UrnBasisregistersVlaanderenCorrelationId) } - }; - } - - [HttpGet("batch/{feed}")] - public IActionResult GetBatchStatus( - [FromServices] CrabImportContext context, - [FromRoute] string feed) - { - var status = context.LastBatchFor((ImportFeed)feed); - return Ok(status); - } - - [HttpPost("batch")] - public IActionResult SetBatchStatus( - [FromServices] CrabImportContext context, - [FromBody] BatchStatusUpdate batchStatus) - { - context.SetCurrent(batchStatus); - context.SaveChanges(); - - return Ok(); - } - - [HttpGet("status/{feed}")] - public IActionResult GetStatus( - [FromServices] CrabImportContext context, - [FromRoute] string feed) - => Ok(context.StatusFor((ImportFeed)feed)); - - [HttpGet("status")] - public IActionResult GetStatus( - [FromServices] CrabImportContext context) - => Ok(context.StatusForAllFeeds()); - } - - public class RegisterCrabImportResponseExamples : IExamplesProvider - { - public object GetExamples() => new { }; - } -} diff --git a/src/AddressRegistry.Api.CrabImport/CrabImport/IdempotentCommandHandlerModuleProcessor.cs b/src/AddressRegistry.Api.CrabImport/CrabImport/IdempotentCommandHandlerModuleProcessor.cs deleted file mode 100755 index 94b466f82..000000000 --- a/src/AddressRegistry.Api.CrabImport/CrabImport/IdempotentCommandHandlerModuleProcessor.cs +++ /dev/null @@ -1,145 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.CrabImport -{ - using Address; - using Address.Commands.Crab; - using Be.Vlaanderen.Basisregisters.AggregateSource; - using Be.Vlaanderen.Basisregisters.CommandHandling; - using Be.Vlaanderen.Basisregisters.EventHandling; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Api; - using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using SqlStreamStore; - using System; - using System.Collections.Generic; - using System.Threading; - using System.Threading.Tasks; - - public class IdempotentCommandHandlerModuleProcessor : IIdempotentCommandHandlerModuleProcessor - { - private readonly ConcurrentUnitOfWork _concurrentUnitOfWork; - private readonly CrabAddressCommandHandlerModule _crabAddressCommandHandlerModule; - private readonly Func _provenanceFactory; - private readonly Func _getAddresses; - private readonly Func _addressPersistentLocalIdProvenanceFactory; - - public IdempotentCommandHandlerModuleProcessor( - Func getAddresses, - ConcurrentUnitOfWork concurrentUnitOfWork, - IPersistentLocalIdGenerator persistentLocalIdGenerator, - Func getStreamStore, - EventMapping eventMapping, - EventSerializer eventSerializer, - AddressProvenanceFactory addressProvenanceFactory, - CrabAddressProvenanceFactory crabProvenanceFactory, - AddressLegacyProvenanceFactory legacyProvenanceFactory, - AddressPersistentLocalIdentifierProvenanceFactory addressPersistentLocalIdentifierProvenanceFactory) - { - _getAddresses = getAddresses; - _concurrentUnitOfWork = concurrentUnitOfWork; - _provenanceFactory = crabProvenanceFactory.CreateFrom; - _addressPersistentLocalIdProvenanceFactory = addressPersistentLocalIdentifierProvenanceFactory.CreateFrom; - - _crabAddressCommandHandlerModule = new CrabAddressCommandHandlerModule( - _getAddresses, - () => concurrentUnitOfWork, - persistentLocalIdGenerator, - getStreamStore, - eventMapping, - eventSerializer, - addressProvenanceFactory, - crabProvenanceFactory, - legacyProvenanceFactory, - addressPersistentLocalIdentifierProvenanceFactory); - } - - public async Task Process( - dynamic commandToProcess, - IDictionary metadata, - int currentPosition, - CancellationToken cancellationToken = default) - { - switch (commandToProcess) - { - case ImportHouseNumberFromCrab command: - var commandHouseNumberMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportHouseNumberFromCrab(_getAddresses, commandHouseNumberMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandHouseNumberMessage, _provenanceFactory, currentPosition); - return commandHouseNumberMessage; - - case ImportHouseNumberStatusFromCrab command: - var commandHouseNumberStatusMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportHouseNumberStatusFromCrab(_getAddresses, commandHouseNumberStatusMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandHouseNumberStatusMessage, _provenanceFactory, currentPosition); - return commandHouseNumberStatusMessage; - - case ImportHouseNumberPositionFromCrab command: - var commandHouseNumberPositionMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportHouseNumberPositionFromCrab(_getAddresses, commandHouseNumberPositionMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandHouseNumberPositionMessage, _provenanceFactory, currentPosition); - return commandHouseNumberPositionMessage; - - case ImportHouseNumberMailCantonFromCrab command: - var commandHouseNumberMailCantonMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportHouseNumberMailCantonFromCrab(_getAddresses, commandHouseNumberMailCantonMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandHouseNumberMailCantonMessage, _provenanceFactory, currentPosition); - return commandHouseNumberMailCantonMessage; - - case ImportHouseNumberSubaddressFromCrab command: - var commandHouseNumberSubaddressMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportHouseNumberSubaddressFromCrab(_getAddresses, commandHouseNumberSubaddressMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandHouseNumberSubaddressMessage, _provenanceFactory, currentPosition); - return commandHouseNumberSubaddressMessage; - - case ImportSubaddressFromCrab command: - var commandSubaddressMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportSubaddressFromCrab(_getAddresses, commandSubaddressMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandSubaddressMessage, _provenanceFactory, currentPosition); - return commandSubaddressMessage; - - case ImportSubaddressStatusFromCrab command: - var commandSubaddressStatusMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportSubaddressStatusFromCrab(_getAddresses, commandSubaddressStatusMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandSubaddressStatusMessage, _provenanceFactory, currentPosition); - return commandSubaddressStatusMessage; - - case ImportSubaddressPositionFromCrab command: - var commandSubaddressPositionMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportSubaddressPositionFromCrab(_getAddresses, commandSubaddressPositionMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandSubaddressPositionMessage, _provenanceFactory, currentPosition); - return commandSubaddressPositionMessage; - - case ImportSubaddressMailCantonFromCrab command: - var commandSubaddressMailCantonMessage = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.ImportSubaddressMailCantonFromCrab(_getAddresses, commandSubaddressMailCantonMessage, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandSubaddressMailCantonMessage, _provenanceFactory, currentPosition); - return commandSubaddressMailCantonMessage; - - case AssignPersistentLocalIdForCrabHouseNumberId command: - var commandAssignPersistentLocalIdForCrabHouseNumberId = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.AssignPersistentLocalIdForCrabHouseNumberId(_getAddresses, commandAssignPersistentLocalIdForCrabHouseNumberId, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandAssignPersistentLocalIdForCrabHouseNumberId, _addressPersistentLocalIdProvenanceFactory, currentPosition); - return commandAssignPersistentLocalIdForCrabHouseNumberId; - - case AssignPersistentLocalIdForCrabSubaddressId command: - var commandAssignPersistentLocalIdForCrabSubaddressId = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.AssignPersistentLocalIdForCrabSubaddressId(_getAddresses, commandAssignPersistentLocalIdForCrabSubaddressId, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandAssignPersistentLocalIdForCrabSubaddressId, _addressPersistentLocalIdProvenanceFactory, currentPosition); - return commandAssignPersistentLocalIdForCrabSubaddressId; - - case RequestPersistentLocalIdForCrabHouseNumberId command: - var commandRequestPersistentLocalIdForCrabHouseNumberId = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.RequestPersistentLocalIdForCrabHouseNumberId(_getAddresses, commandRequestPersistentLocalIdForCrabHouseNumberId, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandRequestPersistentLocalIdForCrabHouseNumberId, _addressPersistentLocalIdProvenanceFactory, currentPosition); - return commandRequestPersistentLocalIdForCrabHouseNumberId; - - case RequestPersistentLocalIdForCrabSubaddressId command: - var commandRequestPersistentLocalIdForCrabSubaddressId = new CommandMessage(command.CreateCommandId(), command, metadata); - await _crabAddressCommandHandlerModule.RequestPersistentLocalIdForCrabSubaddressId(_getAddresses, commandRequestPersistentLocalIdForCrabSubaddressId, cancellationToken); - AddProvenancePipe.AddProvenance(() => _concurrentUnitOfWork, commandRequestPersistentLocalIdForCrabSubaddressId, _addressPersistentLocalIdProvenanceFactory, currentPosition); - return commandRequestPersistentLocalIdForCrabSubaddressId; - - default: - throw new NotImplementedException("Command to import is not recognized"); - } - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/CrabImport/LambdaEqualityComparer.cs b/src/AddressRegistry.Api.CrabImport/CrabImport/LambdaEqualityComparer.cs deleted file mode 100755 index ac68d5a98..000000000 --- a/src/AddressRegistry.Api.CrabImport/CrabImport/LambdaEqualityComparer.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.CrabImport -{ - using System; - using System.Collections.Generic; - - /// - /// - /// Allow IEqualityComparer to be configured within a lambda expression. - /// From https://stackoverflow.com/questions/98033/wrap-a-delegate-in-an-iequalitycomparer - /// - /// - public class LambdaEqualityComparer : IEqualityComparer - { - private readonly Func _comparer; - private readonly Func _hash; - - /// - /// - /// Simplest constructor, provide a conversion to string for type T to use as a comparison key (GetHashCode() and Equals(). - /// https://stackoverflow.com/questions/98033/wrap-a-delegate-in-an-iequalitycomparer, user "orip" - /// - /// - public LambdaEqualityComparer(Func toString) - : this((t1, t2) => toString(t1) == toString(t2), t => toString(t).GetHashCode()) - { - } - - /// - /// - /// Constructor. Assumes T.GetHashCode() is accurate. - /// - /// - public LambdaEqualityComparer(Func comparer) - : this(comparer, t => t.GetHashCode()) - { - } - - /// - /// Constructor, provide a equality comparer and a hash. - /// - /// - /// - public LambdaEqualityComparer(Func comparer, Func hash) - { - _comparer = comparer; - _hash = hash; - } - - public bool Equals(T x, T y) => _comparer(x, y); - - public int GetHashCode(T obj) => _hash(obj); - } -} diff --git a/src/AddressRegistry.Api.CrabImport/CrabImport/Requests/RegisterCrabImportRequest.cs b/src/AddressRegistry.Api.CrabImport/CrabImport/Requests/RegisterCrabImportRequest.cs deleted file mode 100755 index a547642b2..000000000 --- a/src/AddressRegistry.Api.CrabImport/CrabImport/Requests/RegisterCrabImportRequest.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.CrabImport.Requests -{ - using System.ComponentModel.DataAnnotations; - using Newtonsoft.Json; - using Swashbuckle.AspNetCore.Filters; - - public class RegisterCrabImportRequest - { - /// Type van het CRAB item. - [Required] - public string Type { get; set; } - - /// Het CRAB item. - [Required] - public string CrabItem { get; set; } - } - - public class RegisterCrabImportRequestExample : IExamplesProvider - { - public RegisterCrabImportRequest GetExamples() - { - return new RegisterCrabImportRequest - { - Type = "AddressRegistry.Address.Commands.ImportHouseNumberFromCrab", - CrabItem = "{}" - }; - } - } - - public static class RegisterCrabImportRequestMapping - { - public static dynamic Map(RegisterCrabImportRequest message) - { - var assembly = typeof(AddressRegistry.Address.Address).Assembly; - var type = assembly.GetType(message.Type); - - return JsonConvert.DeserializeObject(message.CrabItem, type); - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Dockerfile b/src/AddressRegistry.Api.CrabImport/Dockerfile deleted file mode 100644 index f28380b9a..000000000 --- a/src/AddressRegistry.Api.CrabImport/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM mcr.microsoft.com/dotnet/runtime-deps:6.0.3 - -# create group & user -RUN addgroup --gid 1000 --system app && adduser --uid 1000 -system app --gid 1000 - -# create work dir and set permissions as WORKDIR sets permissions as root -RUN mkdir /app && chown -R app:app /app -WORKDIR /app - -LABEL maintainer "Digitaal Vlaanderen " -LABEL registry="address-registry" - -COPY / /app -WORKDIR /app - -RUN apt-get update && \ - apt-get install curl jq -y && \ - chmod +x ./init.sh - -EXPOSE 5000/tcp -ENV ASPNETCORE_URLS http://*:5000 - -# switch to created user -USER app - -ENTRYPOINT ["./init.sh"] diff --git a/src/AddressRegistry.Api.CrabImport/Infrastructure/Configuration/AddNoCacheHeadersMiddleware.cs b/src/AddressRegistry.Api.CrabImport/Infrastructure/Configuration/AddNoCacheHeadersMiddleware.cs deleted file mode 100755 index cfe684c1f..000000000 --- a/src/AddressRegistry.Api.CrabImport/Infrastructure/Configuration/AddNoCacheHeadersMiddleware.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.Infrastructure.Configuration -{ - using System.Threading.Tasks; - using Microsoft.AspNetCore.Http; - using Microsoft.Net.Http.Headers; - - /// - /// Add headers to the response to prevent any caching. - /// - public class AddNoCacheHeadersMiddleware - { - private readonly RequestDelegate _next; - - public AddNoCacheHeadersMiddleware(RequestDelegate next) => _next = next; - - public Task Invoke(HttpContext context) - { - context.Response.Headers.Add(HeaderNames.CacheControl, "no-store, no-cache, must-revalidate"); - context.Response.Headers.Add(HeaderNames.Pragma, "no-cache"); - context.Response.Headers.Add(HeaderNames.Expires, "0"); - - return _next(context); - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Infrastructure/EmptyController.cs b/src/AddressRegistry.Api.CrabImport/Infrastructure/EmptyController.cs deleted file mode 100755 index a5075ac85..000000000 --- a/src/AddressRegistry.Api.CrabImport/Infrastructure/EmptyController.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.Infrastructure -{ - using System.Reflection; - using Be.Vlaanderen.Basisregisters.Api; - using Microsoft.AspNetCore.Mvc; - using Microsoft.Net.Http.Headers; - - [ApiVersionNeutral] - [Route("")] - public class EmptyController : ApiController - { - [HttpGet] - [ApiExplorerSettings(IgnoreApi = true)] - public IActionResult Get() - => Request.Headers[HeaderNames.Accept].ToString().Contains("text/html") - ? (IActionResult)new RedirectResult("/docs") - : new OkObjectResult($"Welcome to the Basisregisters Vlaanderen Address Api {Assembly.GetEntryAssembly().GetVersionText()}."); - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Infrastructure/Modules/ApiModule.cs b/src/AddressRegistry.Api.CrabImport/Infrastructure/Modules/ApiModule.cs deleted file mode 100755 index b2817c99e..000000000 --- a/src/AddressRegistry.Api.CrabImport/Infrastructure/Modules/ApiModule.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.Infrastructure.Modules -{ - using AddressRegistry.Infrastructure; - using AddressRegistry.Infrastructure.Modules; - using Autofac; - using Autofac.Extensions.DependencyInjection; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; - using Be.Vlaanderen.Basisregisters.DataDog.Tracing.Microsoft; - using Be.Vlaanderen.Basisregisters.DependencyInjection; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Api; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Processing.CrabImport; - using Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Autofac; - using CrabImport; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Logging; - using Projections.Legacy; - - public class ApiModule : Module - { - private readonly IConfiguration _configuration; - private readonly IServiceCollection _services; - private readonly ILoggerFactory _loggerFactory; - - public ApiModule( - IConfiguration configuration, - IServiceCollection services, - ILoggerFactory loggerFactory) - { - _configuration = configuration; - _services = services; - _loggerFactory = loggerFactory; - } - - protected override void Load(ContainerBuilder builder) - { - _services.RegisterModule(new DataDogModule(_configuration)); - - builder - .RegisterModule(new LegacyModule(_configuration, _services, _loggerFactory)) - .RegisterModule(new EnvelopeModule()) - .RegisterModule(new LegacyCommandHandlingModule(_configuration)) - .RegisterModule(new SequenceModule(_configuration, _services, _loggerFactory)); - - _services.ConfigureIdempotency( - _configuration.GetSection(IdempotencyConfiguration.Section).Get().ConnectionString, - new IdempotencyMigrationsTableInfo(Schema.Import), - new IdempotencyTableInfo(Schema.Import), - _loggerFactory); - - builder - .RegisterType() - .AsSelf(); - - builder - .RegisterType() - .As(); - - builder - .RegisterType() - .AsSelf(); - - builder - .RegisterType() - .AsSelf(); - - _services.ConfigureCrabImport( - _configuration.GetConnectionString("CrabImport"), - Schema.Import, - _loggerFactory); - - builder.Populate(_services); - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Infrastructure/Program.cs b/src/AddressRegistry.Api.CrabImport/Infrastructure/Program.cs deleted file mode 100755 index 8fc304a78..000000000 --- a/src/AddressRegistry.Api.CrabImport/Infrastructure/Program.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.Infrastructure -{ - using Be.Vlaanderen.Basisregisters.Api; - using Microsoft.AspNetCore.Hosting; - - public static class Program - { - public static void Main(string[] args) => CreateWebHostBuilder(args).Build().Run(); - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) - => new WebHostBuilder() - .UseDefaultForApi( - new ProgramOptions - { - Hosting = - { - HttpPort = 5000 - }, - Logging = - { - WriteTextToConsole = false, - WriteJsonToConsole = false - }, - Runtime = - { - CommandLineArgs = args - } - }); - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Infrastructure/Startup.cs b/src/AddressRegistry.Api.CrabImport/Infrastructure/Startup.cs deleted file mode 100755 index 8b960f4b6..000000000 --- a/src/AddressRegistry.Api.CrabImport/Infrastructure/Startup.cs +++ /dev/null @@ -1,201 +0,0 @@ -namespace AddressRegistry.Api.CrabImport.Infrastructure -{ - using Autofac; - using Autofac.Extensions.DependencyInjection; - using Be.Vlaanderen.Basisregisters.Api; - using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; - using Be.Vlaanderen.Basisregisters.DataDog.Tracing.Microsoft; - using Configuration; - using Microsoft.AspNetCore.Builder; - using Microsoft.AspNetCore.Hosting; - using Microsoft.AspNetCore.Mvc.ApiExplorer; - using Microsoft.Extensions.Configuration; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Diagnostics.HealthChecks; - using Microsoft.Extensions.Logging; - using Microsoft.Extensions.Hosting; - using Modules; - using SqlStreamStore; - using System; - using System.IO; - using System.Linq; - using System.Reflection; - using System.Threading; - using Be.Vlaanderen.Basisregisters.GrAr.Import.Processing.CrabImport; - using Microsoft.Extensions.FileProviders; - using Microsoft.OpenApi.Models; - using Projections.Legacy; - - /// Represents the startup process for the application. - public class Startup - { - private const string DatabaseTag = "db"; - - private IContainer _applicationContainer; - - private readonly IConfiguration _configuration; - private readonly ILoggerFactory _loggerFactory; - - public Startup( - IConfiguration configuration, - ILoggerFactory loggerFactory) - { - _configuration = configuration; - _loggerFactory = loggerFactory; - } - - /// Configures services for the application. - /// The collection of services to configure the application with. - public IServiceProvider ConfigureServices(IServiceCollection services) - { - var baseUrl = _configuration.GetValue("BaseUrl"); - var baseUrlForExceptions = baseUrl.EndsWith("/") - ? baseUrl.Substring(0, baseUrl.Length - 1) - : baseUrl; - - services - .ConfigureDefaultForApi(new StartupConfigureOptions - { - Cors = - { - Origins = _configuration - .GetSection("Cors") - .GetChildren() - .Select(c => c.Value) - .ToArray() - }, - Server = - { - BaseUrl = baseUrlForExceptions - }, - Swagger = - { - ApiInfo = (provider, description) => new OpenApiInfo - { - Version = description.ApiVersion.ToString(), - Title = "Basisregisters Vlaanderen Address Registry API", - Description = GetApiLeadingText(description), - Contact = new OpenApiContact - { - Name = "Digitaal Vlaanderen", - Email = "digitaal.vlaanderen@vlaanderen.be", - Url = new Uri("https://legacy.basisregisters.vlaanderen") - } - }, - XmlCommentPaths = new[] {typeof(Startup).GetTypeInfo().Assembly.GetName().Name} - }, - MiddlewareHooks = - { - FluentValidation = fv => fv.RegisterValidatorsFromAssemblyContaining(), - - AfterHealthChecks = health => - { - var connectionStrings = _configuration - .GetSection("ConnectionStrings") - .GetChildren(); - - foreach (var connectionString in connectionStrings) - health.AddSqlServer( - connectionString.Value, - name: $"sqlserver-{connectionString.Key.ToLowerInvariant()}", - tags: new[] { DatabaseTag, "sql", "sqlserver" }); - } - } - }) - .AddSingleton(new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"))); - - var containerBuilder = new ContainerBuilder(); - containerBuilder.RegisterModule(new ApiModule(_configuration, services, _loggerFactory)); - _applicationContainer = containerBuilder.Build(); - - return new AutofacServiceProvider(_applicationContainer); - } - - public void Configure( - IServiceProvider serviceProvider, - IApplicationBuilder app, - IWebHostEnvironment env, - IHostApplicationLifetime appLifetime, - ILoggerFactory loggerFactory, - IApiVersionDescriptionProvider apiVersionProvider, - MsSqlStreamStore streamStore, - ApiDataDogToggle datadogToggle, - ApiDebugDataDogToggle debugDataDogToggle, - HealthCheckService healthCheckService) - { - StartupHelpers.EnsureSqlStreamStoreSchema(streamStore, loggerFactory); - - app - .UseDataDog(new DataDogOptions - { - Common = - { - ServiceProvider = serviceProvider, - LoggerFactory = loggerFactory - }, - Toggles = - { - Enable = datadogToggle, - Debug = debugDataDogToggle - }, - Tracing = - { - ServiceName = _configuration["DataDog:ServiceName"], - } - }) - - .UseDefaultForApi(new StartupUseOptions - { - Common = - { - ApplicationContainer = _applicationContainer, - ServiceProvider = serviceProvider, - HostingEnvironment = env, - ApplicationLifetime = appLifetime, - LoggerFactory = loggerFactory, - }, - Api = - { - VersionProvider = apiVersionProvider, - Info = groupName => $"Basisregisters Vlaanderen - Address Registry API {groupName}", - CSharpClientOptions = - { - ClassName = "AddressRegistryCrabImport", - Namespace = "Be.Vlaanderen.Basisregisters" - }, - TypeScriptClientOptions = - { - ClassName = "AddressRegistryCrabImport" - } - }, - Server = - { - PoweredByName = "Vlaamse overheid - Basisregisters Vlaanderen", - ServerName = "Digitaal Vlaanderen" - }, - MiddlewareHooks = - { - AfterMiddleware = x => x.UseMiddleware(), - } - }); - - app.UseIdempotencyDatabaseMigrations() - .UseCrabImportMigrations(); - - AddressRegistry.Infrastructure.MigrationsHelper.Run( - _configuration.GetConnectionString("Sequences"), - serviceProvider.GetService()); - - new LegacyContextMigrationFactory() - .CreateMigrator(_configuration, _loggerFactory) - .MigrateAsync(new CancellationToken()) - .GetAwaiter() - .GetResult(); - - StartupHelpers.CheckDatabases(healthCheckService, DatabaseTag, loggerFactory).GetAwaiter().GetResult(); - } - - private static string GetApiLeadingText(ApiVersionDescription description) - => $"Momenteel leest u de documentatie voor versie {description.ApiVersion} van de Basisregisters Vlaanderen Address Registry API{string.Format(description.IsDeprecated ? ", **deze API versie is niet meer ondersteund * *." : ".")}"; - } -} diff --git a/src/AddressRegistry.Api.CrabImport/Properties/AssemblyInfo.cs b/src/AddressRegistry.Api.CrabImport/Properties/AssemblyInfo.cs deleted file mode 100644 index 47181b160..000000000 --- a/src/AddressRegistry.Api.CrabImport/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyDescription("AddressRegistry CrabImport API")] - -[assembly: ComVisible(false)] -[assembly: Guid("4ded0d34-7aa5-42be-a5da-ce32c48908b2")] diff --git a/src/AddressRegistry.Api.CrabImport/Properties/launchSettings.json b/src/AddressRegistry.Api.CrabImport/Properties/launchSettings.json deleted file mode 100755 index 8de6ae8a9..000000000 --- a/src/AddressRegistry.Api.CrabImport/Properties/launchSettings.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:13215/", - "sslPort": 0 - } - }, - "profiles": { - "AddressRegistry.Api.CrabImport": { - "commandName": "Project", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:5000/" - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/appsettings.json b/src/AddressRegistry.Api.CrabImport/appsettings.json deleted file mode 100755 index b0f07101e..000000000 --- a/src/AddressRegistry.Api.CrabImport/appsettings.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "ConnectionStrings": { - "Events": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;", - "LegacyProjections": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;", - "LegacyProjectionsAdmin": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;", - "Sequences": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;", - "CrabImport": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;" - }, - - "Idempotency": { - "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;" - }, - - "DataDog": { - "ServiceName": "address-registry-dev", - "Enabled": true, - "Debug": false - }, - - "BaseUrl": "https://api.staging-basisregisters.vlaanderen/", - - "Cors": [ - "http://localhost:3000", - "http://localhost:5000" - ], - - "Serilog": { - "MinimumLevel": { - "Default": "Information" - }, - "WriteTo": [ - { - "Name": "Console", - "Args": { - "formatter": "Serilog.Formatting.Compact.RenderedCompactJsonFormatter, Serilog.Formatting.Compact" - } - } - ], - "Properties": { - "Application": "AddressRegistry - CrabImport API", - "ContainerId": "REPLACE_CONTAINERID" - } - } -} diff --git a/src/AddressRegistry.Api.CrabImport/init.sh b/src/AddressRegistry.Api.CrabImport/init.sh deleted file mode 100755 index 157864d6e..000000000 --- a/src/AddressRegistry.Api.CrabImport/init.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -CT=import - -curl -s http://169.254.170.2/v2/metadata > metadata -cat metadata - -CONTAINERID=$(cat metadata | jq -r ".Containers[] | select(.Labels[\"com.amazonaws.ecs.container-name\"] | startswith(\"basisregisters-\") and endswith(\"-$CT\")) | .DockerId") -echo CONTAINERID = $CONTAINERID - -sed -i "s/REPLACE_CONTAINERID/$CONTAINERID/g" appsettings.json - -./AddressRegistry.Api.CrabImport diff --git a/src/AddressRegistry.Api.CrabImport/paket.references b/src/AddressRegistry.Api.CrabImport/paket.references deleted file mode 100755 index 4156ba852..000000000 --- a/src/AddressRegistry.Api.CrabImport/paket.references +++ /dev/null @@ -1,14 +0,0 @@ -AspNetCore.HealthChecks.SqlServer - -Be.Vlaanderen.Basisregisters.Api -Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency -Be.Vlaanderen.Basisregisters.EventHandling.Autofac -Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Autofac -Be.Vlaanderen.Basisregisters.GrAr.Import - -AsyncEnumerator -CsvHelper -Dapper - -SourceLink.Embed.AllSourceFiles -SourceLink.Copy.PdbFiles diff --git a/src/AddressRegistry.Api.CrabImport/paket.template b/src/AddressRegistry.Api.CrabImport/paket.template deleted file mode 100755 index 1043076f4..000000000 --- a/src/AddressRegistry.Api.CrabImport/paket.template +++ /dev/null @@ -1,24 +0,0 @@ -type file -version 1.0.0 - -id Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport -title Be.Vlaanderen.Basisregisters.AddressRegistry.Api.CrabImport - -authors Basisregisters.Vlaanderen -owners Vlaamse overheid -copyright Copyright (c) Vlaamse overheid -requireLicenseAcceptance false -projectUrl https://vlaanderen.be/informatie-vlaanderen -iconUrl https://raw.githubusercontent.com/Informatievlaanderen/build-pipeline/master/logo.png -licenseUrl https://opensource.org/licenses/EUPL-1.2 - -description Address Registry. - -files - AddressRegistry.Api.CrabImport.dll => lib\net6.0 - AddressRegistry.Api.CrabImport.pdb => lib\net6.0 - AddressRegistry.Api.CrabImport.xml => lib\net6.0 - AddressRegistry.Api.CrabImport.xml => content - - AddressRegistry.dll => lib\net6.0 - AddressRegistry.pdb => lib\net6.0 diff --git a/src/AddressRegistry.Api.Extract/Extracts/AddressRegistryExtractBuilder.cs b/src/AddressRegistry.Api.Extract/Extracts/AddressRegistryExtractBuilder.cs index 9db669141..8161df438 100755 --- a/src/AddressRegistry.Api.Extract/Extracts/AddressRegistryExtractBuilder.cs +++ b/src/AddressRegistry.Api.Extract/Extracts/AddressRegistryExtractBuilder.cs @@ -13,108 +13,9 @@ namespace AddressRegistry.Api.Extract.Extracts using Microsoft.EntityFrameworkCore; using Projections.Extract; using Projections.Extract.AddressExtract; - using Projections.Syndication; public static class AddressRegistryExtractBuilder { - public static IEnumerable CreateAddressFiles(ExtractContext context, SyndicationContext syndicationContext) - { - var extractItems = context - .AddressExtract - .AsNoTracking() - .Where(m => m.Complete) - .OrderBy(m => m.AddressPersistentLocalId); - - var addressProjectionState = context - .ProjectionStates - .AsNoTracking() - .Single(m => m.Name == typeof(AddressExtractProjection).FullName); - var extractMetadata = new Dictionary - { - { ExtractMetadataKeys.LatestEventId, addressProjectionState.Position.ToString()} - }; - - var cachedMunicipalities = syndicationContext.MunicipalityLatestItems.AsNoTracking().ToList(); - var cachedStreetNames = syndicationContext.StreetNameLatestItems.AsNoTracking().ToList(); - - byte[] TransformRecord(AddressExtractItem r) - { - var item = new AddressDbaseRecord(); - item.FromBytes(r.DbaseRecord, DbfFileWriter.Encoding); - - // update streetname, municipality - var streetName = cachedStreetNames.First(x => x.StreetNameId == r.StreetNameId); - var municipality = cachedMunicipalities.First(x => x.NisCode == streetName.NisCode); - - item.straatnmid.Value = streetName.PersistentLocalId; - - switch (municipality.PrimaryLanguage) - { - default: - item.gemeentenm.Value = municipality.NameDutch; - item.straatnm.Value = streetName.NameDutch; - break; - - case Taal.FR: - item.gemeentenm.Value = municipality.NameFrench; - item.straatnm.Value = streetName.NameFrench; - break; - - case Taal.DE: - item.gemeentenm.Value = municipality.NameGerman; - item.straatnm.Value = streetName.NameGerman; - break; - - case Taal.EN: - item.gemeentenm.Value = municipality.NameEnglish; - item.straatnm.Value = streetName.NameEnglish; - break; - } - - return item.ToBytes(DbfFileWriter.Encoding); - } - - yield return ExtractBuilder.CreateDbfFile( - ExtractFileNames.Address, - new AddressDbaseSchema(), - extractItems, - extractItems.Count, - TransformRecord); - - yield return ExtractBuilder.CreateMetadataDbfFile( - ExtractFileNames.Address, - extractMetadata); - - var boundingBox = new BoundingBox3D( - extractItems.Where(x => x.MinimumX > 0).Min(record => record.MinimumX), - extractItems.Where(x => x.MinimumY > 0).Min(record => record.MinimumY), - extractItems.Where(x => x.MaximumX > 0).Max(record => record.MaximumX), - extractItems.Where(x => x.MaximumY > 0).Max(record => record.MaximumY), - 0, - 0, - double.NegativeInfinity, - double.PositiveInfinity); - - yield return ExtractBuilder.CreateShapeFile( - ExtractFileNames.Address, - ShapeType.Point, - extractItems.Select(x => x.ShapeRecordContent), - ShapeContent.Read, - extractItems.Select(x => x.ShapeRecordContentLength), - boundingBox); - - yield return ExtractBuilder.CreateShapeIndexFile( - ExtractFileNames.Address, - ShapeType.Point, - extractItems.Select(x => x.ShapeRecordContentLength), - extractItems.Count, - boundingBox); - - yield return ExtractBuilder.CreateProjectedCoordinateSystemFile( - ExtractFileNames.Address, - ProjectedCoordinateSystem.Belge_Lambert_1972); - } - public static IEnumerable CreateAddressFilesV2( ExtractContext context, StreetNameConsumerContext streetNameConsumerContext, diff --git a/src/AddressRegistry.Api.Extract/Extracts/ExtractController.cs b/src/AddressRegistry.Api.Extract/Extracts/ExtractController.cs index 74cb41abf..b1cf42a3c 100755 --- a/src/AddressRegistry.Api.Extract/Extracts/ExtractController.cs +++ b/src/AddressRegistry.Api.Extract/Extracts/ExtractController.cs @@ -1,20 +1,19 @@ namespace AddressRegistry.Api.Extract.Extracts { - using Be.Vlaanderen.Basisregisters.Api; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Microsoft.AspNetCore.Http; - using Microsoft.AspNetCore.Mvc; - using Projections.Extract; - using Responses; - using Swashbuckle.AspNetCore.Filters; using System.Threading; using System.Threading.Tasks; + using Be.Vlaanderen.Basisregisters.Api; + using Be.Vlaanderen.Basisregisters.Api.Exceptions; using Be.Vlaanderen.Basisregisters.Api.Extract; using Consumer.Read.Municipality; using Consumer.Read.StreetName; - using Infrastructure.FeatureToggles; + using Microsoft.AspNetCore.Http; + using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; + using Projections.Extract; using Projections.Syndication; + using Responses; + using Swashbuckle.AspNetCore.Filters; using ProblemDetails = Be.Vlaanderen.Basisregisters.BasicApiProblem.ProblemDetails; [ApiVersion("1.0")] @@ -27,7 +26,6 @@ public class ExtractController : ApiController /// Vraag een dump van het volledige register op. /// /// - /// /// /// /// @@ -41,24 +39,14 @@ public class ExtractController : ApiController [SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(InternalServerErrorResponseExamples))] public async Task Get( [FromServices] ExtractContext context, - [FromServices] UseExtractV2Toggle useExtractV2Toggle, [FromServices] SyndicationContext syndicationContext, [FromServices] MunicipalityConsumerContext municipalityConsumerContext, [FromServices] StreetNameConsumerContext streetNameConsumerContext, CancellationToken cancellationToken = default) { - if (useExtractV2Toggle.FeatureEnabled) - { - return new IsolationExtractArchive(ExtractFileNames.GetAddressZip(), context) - { - AddressRegistryExtractBuilder.CreateAddressFilesV2(context, streetNameConsumerContext, municipalityConsumerContext) - } - .CreateFileCallbackResult(cancellationToken); - } - return new IsolationExtractArchive(ExtractFileNames.GetAddressZip(), context) { - AddressRegistryExtractBuilder.CreateAddressFiles(context, syndicationContext) + AddressRegistryExtractBuilder.CreateAddressFilesV2(context, streetNameConsumerContext, municipalityConsumerContext) } .CreateFileCallbackResult(cancellationToken); } diff --git a/src/AddressRegistry.Api.Extract/Infrastructure/Configuration/FeatureToggleOptions.cs b/src/AddressRegistry.Api.Extract/Infrastructure/Configuration/FeatureToggleOptions.cs deleted file mode 100644 index 219264d18..000000000 --- a/src/AddressRegistry.Api.Extract/Infrastructure/Configuration/FeatureToggleOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace AddressRegistry.Api.Extract.Infrastructure.Configuration -{ - public class FeatureToggleOptions - { - public const string ConfigurationKey = "FeatureToggles"; - public bool UseExtractV2 { get; set; } - } -} diff --git a/src/AddressRegistry.Api.Extract/Infrastructure/FeatureToggles/UseExtractV2Toggle.cs b/src/AddressRegistry.Api.Extract/Infrastructure/FeatureToggles/UseExtractV2Toggle.cs deleted file mode 100644 index 55b6735d9..000000000 --- a/src/AddressRegistry.Api.Extract/Infrastructure/FeatureToggles/UseExtractV2Toggle.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace AddressRegistry.Api.Extract.Infrastructure.FeatureToggles -{ - using FeatureToggle; - - public class UseExtractV2Toggle : IFeatureToggle - { - public bool FeatureEnabled { get; } - - public UseExtractV2Toggle(bool featureEnabled) - { - FeatureEnabled = featureEnabled; - } - } -} diff --git a/src/AddressRegistry.Api.Extract/Infrastructure/Startup.cs b/src/AddressRegistry.Api.Extract/Infrastructure/Startup.cs index a83da3582..c00d09d52 100755 --- a/src/AddressRegistry.Api.Extract/Infrastructure/Startup.cs +++ b/src/AddressRegistry.Api.Extract/Infrastructure/Startup.cs @@ -1,5 +1,8 @@ namespace AddressRegistry.Api.Extract.Infrastructure { + using System; + using System.Linq; + using System.Reflection; using Autofac; using Autofac.Extensions.DependencyInjection; using Be.Vlaanderen.Basisregisters.Api; @@ -11,16 +14,10 @@ namespace AddressRegistry.Api.Extract.Infrastructure using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; - using Microsoft.Extensions.Logging; using Microsoft.Extensions.Hosting; - using Modules; - using System; - using System.Linq; - using System.Reflection; - - using FeatureToggles; - using Microsoft.Extensions.Options; + using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; + using Modules; /// Represents the startup process for the application. public class Startup @@ -97,11 +94,7 @@ public IServiceProvider ConfigureServices(IServiceCollection services) tags: new[] { DatabaseTag, "sql", "sqlserver" }); } } - }) - .Configure(_configuration.GetSection(FeatureToggleOptions.ConfigurationKey)) - .AddSingleton(c => - new UseExtractV2Toggle(c.GetRequiredService>().Value.UseExtractV2)); - + }); var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterModule(new ApiModule(_configuration, services, _loggerFactory)); diff --git a/src/AddressRegistry.Api.Extract/appsettings.json b/src/AddressRegistry.Api.Extract/appsettings.json index d4ccaa852..0165860cf 100755 --- a/src/AddressRegistry.Api.Extract/appsettings.json +++ b/src/AddressRegistry.Api.Extract/appsettings.json @@ -15,10 +15,6 @@ "ServiceName": "AddressRegistry Extract" }, - "FeatureToggles": { - "UseExtractV2": false - }, - "BaseUrl": "https://api.staging-basisregisters.vlaanderen/", "Serilog": { diff --git a/src/AddressRegistry.Api.Legacy/Address/AddressMapper.cs b/src/AddressRegistry.Api.Legacy/Address/AddressMapper.cs index e46eadb30..4dce2aacb 100755 --- a/src/AddressRegistry.Api.Legacy/Address/AddressMapper.cs +++ b/src/AddressRegistry.Api.Legacy/Address/AddressMapper.cs @@ -1,6 +1,7 @@ namespace AddressRegistry.Api.Legacy.Address { using System.Collections.Generic; + using Be.Vlaanderen.Basisregisters.GrAr.Common.SpatialTools.GeometryCoordinates; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; using Be.Vlaanderen.Basisregisters.GrAr.Legacy.SpatialTools; @@ -16,24 +17,6 @@ namespace AddressRegistry.Api.Legacy.Address public static class AddressMapper { - public static VolledigAdres? GetVolledigAdres(AddressListViewItem addressListViewItem) - { - if (string.IsNullOrEmpty(addressListViewItem.StreetNamePersistentLocalId) - || string.IsNullOrEmpty(addressListViewItem.NisCode)) - { - return null; - } - - var defaultMunicipalityName = addressListViewItem.DefaultMunicipalityName; - return new VolledigAdres( - addressListViewItem.DefaultStreetNameName.Value, - addressListViewItem.HouseNumber, - addressListViewItem.BoxNumber, - addressListViewItem.PostalCode, - defaultMunicipalityName.Value, - defaultMunicipalityName.Key); - } - public static VolledigAdres? GetVolledigAdres(AddressListViewItemV2 addressListViewItem) { if (string.IsNullOrEmpty(addressListViewItem.NisCode)) @@ -86,19 +69,6 @@ public static class AddressMapper defaultMunicipalityName.Key); } - public static VolledigAdres GetVolledigAdres(string houseNumber, string boxNumber, string postalCode, StreetNameBosaItem streetName, MunicipalityBosaItem municipality) - { - var defaultMunicipalityName = GetDefaultMunicipalityName(municipality); - - return new VolledigAdres( - GetDefaultStreetNameName(streetName, municipality.PrimaryLanguage).Value, - houseNumber, - boxNumber, - postalCode, - defaultMunicipalityName.Value, - defaultMunicipalityName.Key); - } - public static VolledigAdres GetVolledigAdres( string houseNumber, string? boxNumber, @@ -193,18 +163,6 @@ public static AdresStatus ConvertFromAddressStatus(AddressStatus? status) }; } - public static AddressStatus? ConvertFromAdresStatus(AdresStatus? status) - { - return status switch - { - null => null, - AdresStatus.Voorgesteld => AddressStatus.Proposed, - AdresStatus.Gehistoreerd => AddressStatus.Retired, - AdresStatus.Afgekeurd => AddressStatus.Rejected, - _ => AddressStatus.Current - }; - } - public static AddressRegistry.StreetName.AddressStatus? ConvertFromAdresStatusV2(AdresStatus? status) { return status switch @@ -239,17 +197,6 @@ public static AdresStatus ConvertFromAddressStatus(AddressStatus? status) }; } - public static KeyValuePair GetDefaultMunicipalityName(MunicipalityBosaItem municipality) - { - return municipality.PrimaryLanguage switch - { - Taal.FR => new KeyValuePair(Taal.FR, municipality.NameFrench), - Taal.DE => new KeyValuePair(Taal.DE, municipality.NameGerman), - Taal.EN => new KeyValuePair(Taal.EN, municipality.NameEnglish), - _ => new KeyValuePair(Taal.NL, municipality.NameDutch) - }; - } - public static KeyValuePair GetDefaultStreetNameName(Projections.Syndication.StreetName.StreetNameLatestItem streetName, Taal? taal) { return taal switch @@ -261,17 +208,6 @@ public static AdresStatus ConvertFromAddressStatus(AddressStatus? status) }; } - public static KeyValuePair GetDefaultStreetNameName(Projections.Syndication.StreetName.StreetNameLatestItem streetName, MunicipalityLanguage municipalityLanguage) - { - return municipalityLanguage switch - { - MunicipalityLanguage.French => new KeyValuePair(Taal.FR, streetName.NameFrench), - MunicipalityLanguage.German => new KeyValuePair(Taal.DE, streetName.NameGerman), - MunicipalityLanguage.English => new KeyValuePair(Taal.EN, streetName.NameEnglish), - _ => new KeyValuePair(Taal.NL, streetName.NameDutch) - }; - } - public static KeyValuePair GetDefaultStreetNameName( StreetNameLatestItem streetName, MunicipalityLanguage? municipalityLanguage) @@ -320,28 +256,6 @@ public static AdresStatus ConvertFromAddressStatus(AddressStatus? status) }; } - public static KeyValuePair GetDefaultStreetNameName(StreetNameBosaItem streetName, Taal? taal) - { - return taal switch - { - Taal.FR => new KeyValuePair(Taal.FR, streetName.NameFrench), - Taal.DE => new KeyValuePair(Taal.DE, streetName.NameGerman), - Taal.EN => new KeyValuePair(Taal.EN, streetName.NameEnglish), - _ => new KeyValuePair(Taal.NL, streetName.NameDutch) - }; - } - - public static KeyValuePair GetDefaultStreetNameName(StreetNameBosaItem streetNameBosaItem, MunicipalityLanguage municipalityLanguage) - { - return municipalityLanguage switch - { - MunicipalityLanguage.French => new KeyValuePair(Taal.FR, streetNameBosaItem.NameFrench), - MunicipalityLanguage.German => new KeyValuePair(Taal.DE, streetNameBosaItem.NameGerman), - MunicipalityLanguage.English => new KeyValuePair(Taal.EN, streetNameBosaItem.NameEnglish), - _ => new KeyValuePair(Taal.NL, streetNameBosaItem.NameDutch) - }; - } - public static KeyValuePair GetDefaultStreetNameName( Consumer.Read.StreetName.Projections.StreetNameBosaItem streetName, MunicipalityLanguage? municipalityLanguage) diff --git a/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaHandler.cs b/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaHandler.cs deleted file mode 100644 index 0a3256a62..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.Bosa -{ - using System.Threading; - using System.Threading.Tasks; - using Infrastructure.Options; - using MediatR; - using Microsoft.Extensions.Options; - - public sealed class AddressBosaHandler : IRequestHandler - { - private readonly AddressBosaContext _bosaContext; - private readonly IOptions _responseOptions; - - public AddressBosaHandler( - AddressBosaContext bosaContext, - IOptions responseOptions) - { - _bosaContext = bosaContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressBosaRequest request, CancellationToken cancellationToken) - { - var query = new AddressBosaQuery(_bosaContext, _responseOptions.Value); - return await query.Filter(request); - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaQuery.cs b/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaQuery.cs deleted file mode 100644 index 575dd1517..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/Bosa/AddressBosaQuery.cs +++ /dev/null @@ -1,391 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.Bosa -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Threading.Tasks; - using AddressRegistry.Projections.Legacy.AddressDetail; - using AddressRegistry.Projections.Syndication.StreetName; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Bosa; - using Be.Vlaanderen.Basisregisters.Utilities; - using Infrastructure.Options; - using Microsoft.EntityFrameworkCore; - using Projections.Syndication.Municipality; - - public class AddressBosaQuery - { - private readonly AddressBosaContext _context; - private readonly ResponseOptions _responseOptions; - - public AddressBosaQuery( - AddressBosaContext context, - ResponseOptions responseOptions) - { - _context = context; - _responseOptions = responseOptions; - } - - public async Task Filter(AddressBosaRequest filter) - { - var addressesQuery = _context.AddressDetail.AsNoTracking().OrderBy(x => x.PersistentLocalId).Where(x => x.Complete && !x.Removed); - var streetNamesQuery = _context.StreetNameBosaItems.AsNoTracking().Where(x => x.IsComplete); - var municipalitiesQuery = _context.MunicipalityBosaItems.AsNoTracking(); - - if (filter.IsOnlyAdresIdRequested && int.TryParse(filter.AdresCode?.ObjectId, out var adresId)) - { - addressesQuery = addressesQuery - .Where(a => a.PersistentLocalId == adresId) - .ToList() - .AsQueryable(); - - var address = addressesQuery.FirstOrDefault(); - if (address == null) - return new AddressBosaResponse { Adressen = new List() }; - - streetNamesQuery = (await streetNamesQuery - .Where(x => x.StreetNameId == address.StreetNameId) - .ToListAsync()) - .AsQueryable(); - - var streetName = streetNamesQuery.FirstOrDefault(); - - municipalitiesQuery = (await municipalitiesQuery - .Where(x => x.NisCode == streetName.NisCode) - .ToListAsync()) - .AsQueryable(); - } - - var gemeenteCodeVersieId = filter?.GemeenteCode?.VersieId == null ? null : new Rfc3339SerializableDateTimeOffset(filter.GemeenteCode.VersieId.Value).ToString(); - - var filteredMunicipalities = FilterMunicipalities( - filter?.GemeenteCode?.ObjectId, - gemeenteCodeVersieId, - filter?.Gemeentenaam?.Spelling, - filter?.Gemeentenaam?.Taal, - filter?.Gemeentenaam?.SearchType ?? BosaSearchType.Bevat, - municipalitiesQuery); - - var straatnaamCodeVersieId = filter?.StraatnaamCode?.VersieId == null ? null : new Rfc3339SerializableDateTimeOffset(filter.StraatnaamCode.VersieId.Value).ToString(); - var filteredStreetNames = FilterStreetNames( - filter?.StraatnaamCode?.ObjectId, - straatnaamCodeVersieId, - filter?.Straatnaam?.Spelling, - filter?.Straatnaam?.Taal, - filter?.Straatnaam?.SearchType ?? BosaSearchType.Bevat, - streetNamesQuery, - filteredMunicipalities); - - var filteredAddresses = - FilterAddresses( - filter?.AdresCode?.ObjectId, - filter?.AdresCode?.VersieId, - filter?.Huisnummer, - filter?.Busnummer, - filter?.AdresStatus, - filter?.PostCode?.ObjectId, - addressesQuery, - filteredStreetNames) - .OrderBy(x => x.PersistentLocalId); - - var municipalities = filteredMunicipalities.Select(x => new { x.NisCode, x.Version }).ToList(); - var streetNames = filteredStreetNames.Select(x => new { x.StreetNameId, x.PersistentLocalId, x.Version, x.NisCode }).ToList(); - - var topFilteredAddresses = filteredAddresses - .Take(1001) - .ToList(); - - var postalCodesInAddresses = filteredAddresses.Select(x => x.PostalCode).Distinct().ToList(); - - var postalCodes = _context - .PostalInfoLatestItems - .AsNoTracking() - .Where(y => postalCodesInAddresses.Contains(y.PostalCode)) - .ToList(); - - var addresses = topFilteredAddresses - .Select(x => - { - var streetName = streetNames.First(y => y.StreetNameId == x.StreetNameId); - var municipality = municipalities.First(y => y.NisCode == streetName.NisCode); - - var postalCode = postalCodes - .First(y => y.PostalCode == x.PostalCode); - - return new AddressBosaResponseItem( - _responseOptions.PostInfoNaamruimte, - _responseOptions.GemeenteNaamruimte, - _responseOptions.StraatNaamNaamruimte, - _responseOptions.Naamruimte, - x.PersistentLocalId.Value, - AddressMapper.ConvertFromAddressStatus(x.Status), - x.HouseNumber, - x.BoxNumber, - x.OfficiallyAssigned, - AddressMapper.GetAddressPoint(x.Position), - AddressMapper.ConvertFromGeometryMethod(x.PositionMethod), - AddressMapper.ConvertFromGeometrySpecification(x.PositionSpecification), - x.VersionTimestamp.ToBelgianDateTimeOffset(), - streetName.PersistentLocalId, - streetName.Version, - municipality.NisCode, - municipality.Version, - x.PostalCode, - postalCode.Version); - }) - .ToList(); - - return new AddressBosaResponse - { - Adressen = addresses - }; - } - - private static IQueryable FilterAddresses( - string persistentLocalId, - DateTimeOffset? version, - string houseNumber, - string boxNumber, - AdresStatus? status, - string postalCode, - IQueryable addresses, - IQueryable streetNames) - { - var filtered = addresses.Join(streetNames, - address => address.StreetNameId, - streetName => streetName.StreetNameId, - (address, street) => address); - - if (!string.IsNullOrEmpty(persistentLocalId)) - { - if (int.TryParse(persistentLocalId, out var addressId)) - filtered = filtered.Where(x => x.PersistentLocalId == addressId); - else - return Enumerable.Empty().AsQueryable(); - } - - if (!string.IsNullOrEmpty(houseNumber)) - filtered = filtered.Where(x => x.HouseNumber.StartsWith(houseNumber)); - - if (!string.IsNullOrEmpty(boxNumber)) - filtered = filtered.Where(x => x.BoxNumber.StartsWith(boxNumber)); - - if (status.HasValue) - { - var mappedStatus = AddressMapper.ConvertFromAdresStatus(status); - filtered = filtered.Where(x => x.Status == mappedStatus); - } - - if (!string.IsNullOrEmpty(postalCode)) - filtered = filtered.Where(x => x.PostalCode == postalCode); - - if (version.HasValue) - filtered = filtered.Where(x => x.VersionTimestampAsDateTimeOffset == version); - - return filtered; - } - - // https://github.com/Informatievlaanderen/streetname-registry/blob/550a2398077140993d6e60029a1b831c193fb0ad/src/StreetNameRegistry.Api.Legacy/StreetName/Query/StreetNameBosaQuery.cs#L38 - private static IQueryable FilterStreetNames( - string persistentLocalId, - string version, - string streetName, - Taal? language, - BosaSearchType searchType, - IQueryable streetNames, - IQueryable filteredMunicipalities) - { - var filtered = streetNames.Join( - filteredMunicipalities, - street => street.NisCode, - municipality => municipality.NisCode, - (street, municipality) => street); - - if (!string.IsNullOrEmpty(persistentLocalId)) - filtered = filtered.Where(m => m.PersistentLocalId == persistentLocalId); - - if (!string.IsNullOrEmpty(version)) - filtered = filtered.Where(m => m.Version == version); - - if (!string.IsNullOrEmpty(streetName)) - filtered = CompareStreetNameByCompareType( - filtered, - streetName, - language, - searchType == BosaSearchType.Bevat); - else if (language.HasValue) - filtered = ApplyStreetNameLanguageFilter(filtered, language.Value); - - return filtered; - } - - private static IQueryable ApplyStreetNameLanguageFilter(IQueryable query, Taal language) - { - switch (language) - { - default: - case Taal.NL: - return query.Where(m => m.NameDutchSearch != null); - - case Taal.FR: - return query.Where(m => m.NameFrenchSearch != null); - - case Taal.DE: - return query.Where(m => m.NameGermanSearch != null); - - case Taal.EN: - return query.Where(m => m.NameEnglishSearch != null); - } - } - - private static IQueryable CompareStreetNameByCompareType( - IQueryable query, - string searchValue, - Taal? language, - bool isContainsFilter) - { - var containsValue = searchValue.SanitizeForBosaSearch(); - if (!language.HasValue) - { - return isContainsFilter - ? query.Where(i => - EF.Functions.Like(i.NameDutchSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameFrenchSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameEnglishSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameGermanSearch, $"%{containsValue}%")) - : query.Where(i => - i.NameDutch.Equals(searchValue) || - i.NameFrench.Equals(searchValue) || - i.NameGerman.Equals(searchValue) || - i.NameEnglish.Equals(searchValue)); - } - - switch (language.Value) - { - default: - case Taal.NL: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameDutchSearch, $"%{containsValue}%")) - : query.Where(i => i.NameDutch.Equals(searchValue)); - - case Taal.FR: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameFrenchSearch, $"%{containsValue}%")) - : query.Where(i => i.NameFrench.Equals(searchValue)); - - case Taal.DE: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameGermanSearch, $"%{containsValue}%")) - : query.Where(i => i.NameGerman.Equals(searchValue)); - - case Taal.EN: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameEnglishSearch, $"%{containsValue}%")) - : query.Where(i => i.NameEnglish.Equals(searchValue)); - } - } - - // https://github.com/Informatievlaanderen/municipality-registry/blob/054e52fffe13bb4a09f80bf36d221d34ab0aacaa/src/MunicipalityRegistry.Api.Legacy/Municipality/Query/MunicipalityBosaQuery.cs#L83 - private static IQueryable FilterMunicipalities( - string nisCode, - string version, - string municipalityName, - Taal? language, - BosaSearchType searchType, - IQueryable municipalities) - { - var filtered = municipalities.Where(x => x.IsFlemishRegion); - - if (!string.IsNullOrEmpty(nisCode)) - filtered = filtered.Where(m => m.NisCode == nisCode); - - if (!string.IsNullOrEmpty(version)) - filtered = filtered.Where(m => m.Version == version); - - if (string.IsNullOrEmpty(municipalityName)) - { - if (language.HasValue) - filtered = ApplyMunicipalityLanguageFilter(filtered, language.Value); - - return filtered; - } - - filtered = CompareMunicipalityByCompareType(filtered, - municipalityName, - language, - searchType == BosaSearchType.Bevat); - - return filtered; - } - - private static IQueryable ApplyMunicipalityLanguageFilter( - IQueryable query, - Taal language) - { - switch (language) - { - default: - case Taal.NL: - return query.Where(m => m.NameDutchSearch != null); - - case Taal.FR: - return query.Where(m => m.NameFrenchSearch != null); - - case Taal.DE: - return query.Where(m => m.NameGermanSearch != null); - - case Taal.EN: - return query.Where(m => m.NameEnglishSearch != null); - } - } - - private static IQueryable CompareMunicipalityByCompareType( - IQueryable query, - string searchValue, - Taal? language, - bool isContainsFilter) - { - var containsValue = searchValue.SanitizeForBosaSearch(); - if (!language.HasValue) - { - return isContainsFilter - ? query.Where(i => - EF.Functions.Like(i.NameDutchSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameFrenchSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameGermanSearch, $"%{containsValue}%") || - EF.Functions.Like(i.NameEnglishSearch, $"%{containsValue}%")) - : query.Where(i => - i.NameDutch.Equals(searchValue) || - i.NameFrench.Equals(searchValue) || - i.NameGerman.Equals(searchValue) || - i.NameEnglish.Equals(searchValue)); - } - - switch (language.Value) - { - default: - case Taal.NL: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameDutchSearch, $"%{containsValue}%")) - : query.Where(i => i.NameDutch.Equals(searchValue)); - - case Taal.FR: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameFrenchSearch, $"%{containsValue}%")) - : query.Where(i => i.NameFrench.Equals(searchValue)); - - case Taal.DE: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameGermanSearch, $"%{containsValue}%")) - : query.Where(i => i.NameGerman.Equals(searchValue)); - - case Taal.EN: - return isContainsFilter - ? query.Where(i => EF.Functions.Like(i.NameEnglishSearch, $"%{containsValue}%")) - : query.Where(i => i.NameEnglish.Equals(searchValue)); - } - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/BosaRepresentation/AddressRepresentationBosaHandler.cs b/src/AddressRegistry.Api.Legacy/Address/BosaRepresentation/AddressRepresentationBosaHandler.cs deleted file mode 100644 index 1931bd42b..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/BosaRepresentation/AddressRepresentationBosaHandler.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.BosaRepresentation -{ - using System.Collections.Generic; - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using FluentValidation; - using Infrastructure.Options; - using MediatR; - using Microsoft.AspNetCore.Http; - using Microsoft.EntityFrameworkCore; - using Microsoft.Extensions.Options; - using Projections.Legacy; - using Projections.Syndication; - - public sealed class AddressRepresentationBosaHandler : IRequestHandler - { - private readonly LegacyContext _legacyContext; - private readonly SyndicationContext _syndicationContext; - private readonly IOptions _responseOptions; - - public AddressRepresentationBosaHandler( - LegacyContext legacyContext, - SyndicationContext syndicationContext, - IOptions responseOptions) - { - _legacyContext = legacyContext; - _syndicationContext = syndicationContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressRepresentationBosaRequest request, CancellationToken cancellationToken) - { - if (string.IsNullOrEmpty(request?.AdresCode?.ObjectId) || !int.TryParse(request.AdresCode.ObjectId, out var addressId)) - { - throw new ValidationException("Valid objectId is required"); - } - - var address = await _legacyContext - .AddressDetail - .FirstOrDefaultAsync(x => x.PersistentLocalId == addressId, cancellationToken); - - if (address == null) - { - throw new ApiException("Onbestaand adres.", StatusCodes.Status404NotFound); - } - - var streetName = await _syndicationContext - .StreetNameBosaItems - .FirstOrDefaultAsync(x => x.StreetNameId == address.StreetNameId, cancellationToken); - - var municipality = await _syndicationContext - .MunicipalityBosaItems - .FirstOrDefaultAsync(x => x.NisCode == streetName.NisCode, cancellationToken); - - var response = new AddressRepresentationBosaResponse - { - Identificator = new AdresIdentificator(_responseOptions.Value.Naamruimte, address.PersistentLocalId.ToString(), address.VersionTimestamp.ToBelgianDateTimeOffset()) - }; - - if (!request.Taal.HasValue || request.Taal.Value == municipality.PrimaryLanguage) - { - response.AdresVoorstellingen = new List - { - new AddressRepresentationBosa( - municipality.PrimaryLanguage.Value, - address.HouseNumber, - address.BoxNumber, - AddressMapper.GetVolledigAdres(address.HouseNumber, address.BoxNumber, address.PostalCode, streetName, municipality).GeografischeNaam.Spelling, - AddressMapper.GetDefaultMunicipalityName(municipality).Value, - AddressMapper.GetDefaultStreetNameName(streetName, municipality.PrimaryLanguage).Value, - address.PostalCode) - }; - } - - return response; - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountHandler.cs b/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountHandler.cs deleted file mode 100644 index 0b9793eea..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountHandler.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.Count -{ - using System; - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using List; - using MediatR; - using Microsoft.EntityFrameworkCore; - using Projections.Legacy; - - public sealed record AddressCountRequest( - FilteringHeader Filtering, - SortingHeader Sorting, - IPaginationRequest Pagination) : IRequest; - - public sealed class AddressCountHandler : IRequestHandler - { - private readonly LegacyContext _legacyContext; - private readonly AddressQueryContext _addressQueryContext; - - public AddressCountHandler( - LegacyContext legacyContext, - AddressQueryContext addressQueryContext) - { - _legacyContext = legacyContext; - _addressQueryContext = addressQueryContext; - } - - public async Task Handle(AddressCountRequest request, CancellationToken cancellationToken) - { - return new TotaalAantalResponse - { - Aantal = request.Filtering.ShouldFilter - ? await new AddressListQuery(_addressQueryContext) - .Fetch(request.Filtering, request.Sorting, request.Pagination) - .Items - .CountAsync(cancellationToken) - : Convert.ToInt32(_legacyContext - .AddressListViewCount - .First() - .Count) - }; - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountRequest.cs b/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountRequest.cs new file mode 100644 index 000000000..2510d32d2 --- /dev/null +++ b/src/AddressRegistry.Api.Legacy/Address/Count/AddressCountRequest.cs @@ -0,0 +1,14 @@ +namespace AddressRegistry.Api.Legacy.Address.Count +{ + using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; + using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; + using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy; + using List; + using MediatR; + + public sealed record AddressCountRequest( + FilteringHeader Filtering, + SortingHeader Sorting, + IPaginationRequest Pagination) : IRequest; +} diff --git a/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailHandler.cs b/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailHandler.cs deleted file mode 100644 index 70c371cae..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailHandler.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.Detail -{ - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Infrastructure.Options; - using MediatR; - using Microsoft.AspNetCore.Http; - using Microsoft.EntityFrameworkCore; - using Microsoft.Extensions.Options; - using Projections.Legacy; - using Projections.Syndication; - - public sealed record AddressDetailRequest(int PersistentLocalId) : IRequest; - - public sealed class AddressDetailHandler : IRequestHandler - { - private readonly LegacyContext _legacyContext; - private readonly SyndicationContext _syndicationContext; - private readonly IOptions _responseOptions; - - public AddressDetailHandler( - LegacyContext legacyContext, - SyndicationContext syndicationContext, - IOptions responseOptions) - { - _legacyContext = legacyContext; - _syndicationContext = syndicationContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressDetailRequest request, CancellationToken cancellationToken) - { - var address = await _legacyContext - .AddressDetail - .AsNoTracking() - .SingleOrDefaultAsync(item => item.PersistentLocalId == request.PersistentLocalId, cancellationToken); - - if (address is not null && address.Removed) - { - throw new ApiException("Adres werd verwijderd.", StatusCodes.Status410Gone); - } - - if (address is null || !address.Complete) - { - throw new ApiException("Onbestaand adres.", StatusCodes.Status404NotFound); - } - - var streetName = await _syndicationContext.StreetNameLatestItems.FindAsync(new object[] { address.StreetNameId }, cancellationToken); - var municipality = await _syndicationContext.MunicipalityLatestItems.FirstAsync(m => m.NisCode == streetName.NisCode, cancellationToken); - var defaultMunicipalityName = AddressMapper.GetDefaultMunicipalityName(municipality); - var defaultStreetName = AddressMapper.GetDefaultStreetNameName(streetName, municipality.PrimaryLanguage); - var defaultHomonymAddition = AddressMapper.GetDefaultHomonymAddition(streetName, municipality.PrimaryLanguage); - - var gemeente = new AdresDetailGemeente( - municipality.NisCode, - string.Format(_responseOptions.Value.GemeenteDetailUrl, municipality.NisCode), - new GeografischeNaam(defaultMunicipalityName.Value, defaultMunicipalityName.Key)); - - var straat = new AdresDetailStraatnaam( - streetName.PersistentLocalId, - string.Format(_responseOptions.Value.StraatnaamDetailUrl, streetName.PersistentLocalId), - new GeografischeNaam(defaultStreetName.Value, defaultStreetName.Key)); - - var postInfo = string.IsNullOrEmpty(address.PostalCode) - ? null - : new AdresDetailPostinfo( - address.PostalCode, - string.Format(_responseOptions.Value.PostInfoDetailUrl, address.PostalCode)); - - var homoniemToevoeging = defaultHomonymAddition == null - ? null - : new HomoniemToevoeging(new GeografischeNaam(defaultHomonymAddition.Value.Value, defaultHomonymAddition.Value.Key)); - - return new AddressDetailResponse( - _responseOptions.Value.Naamruimte, - address.PersistentLocalId.ToString(), - address.HouseNumber, - address.BoxNumber, - gemeente, - straat, - homoniemToevoeging, - postInfo, - AddressMapper.GetAddressPoint(address.Position), - AddressMapper.ConvertFromGeometryMethod(address.PositionMethod), - AddressMapper.ConvertFromGeometrySpecification(address.PositionSpecification), - AddressMapper.ConvertFromAddressStatus(address.Status), - defaultStreetName.Key, - address.OfficiallyAssigned, - address.VersionTimestamp.ToBelgianDateTimeOffset()); - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailRequest.cs b/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailRequest.cs new file mode 100644 index 000000000..626573e87 --- /dev/null +++ b/src/AddressRegistry.Api.Legacy/Address/Detail/AddressDetailRequest.cs @@ -0,0 +1,6 @@ +namespace AddressRegistry.Api.Legacy.Address.Detail +{ + using MediatR; + + public sealed record AddressDetailRequest(int PersistentLocalId) : IRequest; +} diff --git a/src/AddressRegistry.Api.Legacy/Address/List/AddressListHandler.cs b/src/AddressRegistry.Api.Legacy/Address/List/AddressListHandler.cs deleted file mode 100644 index f83b3d358..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/List/AddressListHandler.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.List -{ - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using Address; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Infrastructure.Options; - using MediatR; - using Microsoft.EntityFrameworkCore; - using Microsoft.Extensions.Options; - - public sealed record AddressListRequest( - FilteringHeader Filtering, - SortingHeader Sorting, - IPaginationRequest Pagination) : IRequest; - - public sealed class AddressListHandler : IRequestHandler - { - private readonly AddressQueryContext _addressQueryContext; - private readonly IOptions _responseOptions; - - public AddressListHandler( - AddressQueryContext addressQueryContext, - IOptions responseOptions) - { - _addressQueryContext = addressQueryContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressListRequest request, CancellationToken cancellationToken) - { - var pagedAddresses = new AddressListQuery(_addressQueryContext) - .Fetch(request.Filtering, request.Sorting, request.Pagination); - - var addresses = await pagedAddresses.Items - .ToListAsync(cancellationToken); - - var addressListItemResponses = addresses - .Select(address => new AddressListItemResponse( - address.PersistentLocalId, - _responseOptions.Value.Naamruimte, - _responseOptions.Value.DetailUrl, - address.HouseNumber, - address.BoxNumber, - AddressMapper.GetVolledigAdres(address), - AddressMapper.ConvertFromAddressStatus(address.Status), - address.VersionTimestampAsInstant.ToBelgianDateTimeOffset())) - .ToList(); - - return new AddressListResponse - { - Adressen = addressListItemResponses, - Volgende = pagedAddresses.PaginationInfo.BuildNextUri(addressListItemResponses.Count, _responseOptions.Value.VolgendeUrl), - Sorting = pagedAddresses.Sorting, - Pagination = pagedAddresses.PaginationInfo - }; - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/List/AddressListQuery.cs b/src/AddressRegistry.Api.Legacy/Address/List/AddressListQuery.cs deleted file mode 100644 index ee310760d..000000000 --- a/src/AddressRegistry.Api.Legacy/Address/List/AddressListQuery.cs +++ /dev/null @@ -1,148 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Address.List -{ - using System; - using System.Collections.Generic; - using System.Linq; - using AddressRegistry.Projections.Legacy.AddressList; - using Be.Vlaanderen.Basisregisters.Api.Search; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Convertors; - using Microsoft.EntityFrameworkCore; - - public class AddressListQuery : Query - { - private readonly AddressQueryContext _context; - - protected override ISorting Sorting => new AddressSorting(); - - public AddressListQuery(AddressQueryContext context) - { - _context = context; - } - - protected override IQueryable Filter(FilteringHeader filtering) - { - var addresses = _context - .AddressListView - .AsNoTracking() - .OrderBy(x => x.PersistentLocalId) - .AsQueryable(); - - if (!filtering.ShouldFilter) - { - return addresses; - } - - if (!string.IsNullOrEmpty(filtering.Filter.BoxNumber)) - { - var unescapedBoxNumber = Uri.UnescapeDataString(filtering.Filter.BoxNumber); - addresses = addresses.Where(a => a.BoxNumber == unescapedBoxNumber); - } - - if (!string.IsNullOrEmpty(filtering.Filter.HouseNumber)) - { - var unescapedHouseNumber = Uri.UnescapeDataString(filtering.Filter.HouseNumber); - addresses = addresses.Where(a => a.HouseNumber == unescapedHouseNumber); - } - - if (!string.IsNullOrEmpty(filtering.Filter.PostalCode)) - { - addresses = addresses.Where(a => a.PostalCode == filtering.Filter.PostalCode); - } - - if (!string.IsNullOrEmpty(filtering.Filter.Status)) - { - if (Enum.TryParse(typeof(AdresStatus), filtering.Filter.Status, true, out var status)) - { - var addressStatus = AddressStatusExtensions.ConvertFromAdresStatus((AdresStatus)status); - addresses = addresses.Where(a => a.Status.HasValue && a.Status.Value == addressStatus); - } - else - { - //have to filter on EF cannot return new List<>().AsQueryable() cause non-EF provider does not support .CountAsync() - addresses = addresses.Where(m => m.Status.HasValue && (int)m.Status.Value == -1); - } - } - - if (!string.IsNullOrEmpty(filtering.Filter.NisCode)) - { - addresses = addresses.Where(x => x.NisCode == filtering.Filter.NisCode); - } - - if (!string.IsNullOrEmpty(filtering.Filter.MunicipalityName)) - { - var searchName = filtering.Filter.MunicipalityName.RemoveDiacritics(); - - addresses = addresses.Where(m => - m.MunicipalityNameDutchSearch == searchName || - m.MunicipalityNameFrenchSearch == searchName || - m.MunicipalityNameGermanSearch == searchName || - m.MunicipalityNameEnglishSearch == searchName); - } - - if (!string.IsNullOrEmpty(filtering.Filter.StreetName)) - { - var searchName = filtering.Filter.StreetName.RemoveDiacritics(); - - addresses = addresses.Where(s => - s.StreetNameDutchSearch == searchName || - s.StreetNameFrenchSearch == searchName || - s.StreetNameGermanSearch == searchName || - s.StreetNameEnglishSearch == searchName); - } - - if (!string.IsNullOrEmpty(filtering.Filter.HomonymAddition)) - { - addresses = addresses.Where(s => - s.HomonymAdditionDutch == filtering.Filter.HomonymAddition || - s.HomonymAdditionFrench == filtering.Filter.HomonymAddition || - s.HomonymAdditionGerman == filtering.Filter.HomonymAddition || - s.HomonymAdditionEnglish == filtering.Filter.HomonymAddition); - } - - if (!string.IsNullOrEmpty(filtering.Filter.StreetNameId)) - { - if (int.TryParse(filtering.Filter.StreetNameId, out _)) - { - addresses = addresses.Where(x => x.StreetNamePersistentLocalId == filtering.Filter.StreetNameId); - } - else - { - // don't bother sending to sql, no results will be returned - return new List().AsQueryable(); - } - } - - return addresses; - } - } - - internal class AddressSorting : ISorting - { - public IEnumerable SortableFields { get; } = new[] - { - nameof(AddressListItem.BoxNumber), - nameof(AddressListItem.HouseNumber), - nameof(AddressListItem.PostalCode), - nameof(AddressListItem.PersistentLocalId) - }; - - public SortingHeader DefaultSortingHeader { get; } = new SortingHeader(nameof(AddressListItem.PersistentLocalId), SortOrder.Ascending); - } - - public class AddressFilter - { - public string BoxNumber { get; set; } - public string HouseNumber { get; set; } - public string PostalCode { get; set; } - public string MunicipalityName { get; set; } - public string StreetName { get; set; } - public string HomonymAddition { get; set; } - public string Status { get; set; } - public string? NisCode { get; set; } - public string? StreetNameId { get; set; } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Address/List/AddressListQueryV2.cs b/src/AddressRegistry.Api.Legacy/Address/List/AddressListQueryV2.cs index 408fa5969..eebe1e345 100644 --- a/src/AddressRegistry.Api.Legacy/Address/List/AddressListQueryV2.cs +++ b/src/AddressRegistry.Api.Legacy/Address/List/AddressListQueryV2.cs @@ -133,4 +133,17 @@ internal class AddressSortingV2 : ISorting public SortingHeader DefaultSortingHeader { get; } = new SortingHeader(nameof(AddressListItemV2.AddressPersistentLocalId), SortOrder.Ascending); } + + public class AddressFilter + { + public string BoxNumber { get; set; } + public string HouseNumber { get; set; } + public string PostalCode { get; set; } + public string MunicipalityName { get; set; } + public string StreetName { get; set; } + public string HomonymAddition { get; set; } + public string Status { get; set; } + public string? NisCode { get; set; } + public string? StreetNameId { get; set; } + } } diff --git a/src/AddressRegistry.Api.Legacy/Address/List/AddressListRequest.cs b/src/AddressRegistry.Api.Legacy/Address/List/AddressListRequest.cs new file mode 100644 index 000000000..1d43e9b17 --- /dev/null +++ b/src/AddressRegistry.Api.Legacy/Address/List/AddressListRequest.cs @@ -0,0 +1,12 @@ +namespace AddressRegistry.Api.Legacy.Address.List +{ + using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; + using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; + using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; + using MediatR; + + public sealed record AddressListRequest( + FilteringHeader Filtering, + SortingHeader Sorting, + IPaginationRequest Pagination) : IRequest; +} diff --git a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationByPersistentLocalIdHandler.cs b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationByPersistentLocalIdHandler.cs index ca0071a38..64888ac7c 100644 --- a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationByPersistentLocalIdHandler.cs +++ b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationByPersistentLocalIdHandler.cs @@ -1,6 +1,5 @@ namespace AddressRegistry.Api.Legacy.Address.Sync { - using System; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -9,7 +8,6 @@ namespace AddressRegistry.Api.Legacy.Address.Sync using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; using Infrastructure.Options; using MediatR; - using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using Projections.Legacy; diff --git a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationPersistentLocalIdQuery.cs b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationPersistentLocalIdQuery.cs index a4942b3cd..bbdb88b15 100644 --- a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationPersistentLocalIdQuery.cs +++ b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationPersistentLocalIdQuery.cs @@ -4,16 +4,12 @@ namespace AddressRegistry.Api.Legacy.Address.Sync using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; - using AddressRegistry.Address; - using AddressRegistry.Projections.Legacy; - using AddressRegistry.Projections.Legacy.AddressSyndication; using Be.Vlaanderen.Basisregisters.Api.Search; using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Microsoft.EntityFrameworkCore; - using NodaTime; - using StreetName; + using Projections.Legacy; + using Projections.Legacy.AddressSyndication; public class AddressSyndicationPersistentLocalIdQuery : Query { diff --git a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationQuery.cs b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationQuery.cs index fbb1748e6..ce70d8ae0 100644 --- a/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationQuery.cs +++ b/src/AddressRegistry.Api.Legacy/Address/Sync/AddressSyndicationQuery.cs @@ -4,14 +4,14 @@ namespace AddressRegistry.Api.Legacy.Address.Sync using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; - using AddressRegistry.Projections.Legacy; - using AddressRegistry.Projections.Legacy.AddressSyndication; using Be.Vlaanderen.Basisregisters.Api.Search; using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Microsoft.EntityFrameworkCore; using NodaTime; + using Projections.Legacy; + using Projections.Legacy.AddressSyndication; using StreetName; public class AddressSyndicationQueryResult diff --git a/src/AddressRegistry.Api.Legacy/Convertors/AddressStatusExtensions.cs b/src/AddressRegistry.Api.Legacy/Convertors/AddressStatusExtensions.cs deleted file mode 100644 index 5422f0659..000000000 --- a/src/AddressRegistry.Api.Legacy/Convertors/AddressStatusExtensions.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Convertors -{ - using System; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using AddressRegistry.Address; - - public static class AddressStatusExtensions - { - public static AdresStatus? ConvertFromAddressStatus(this AddressStatus? status) - => status == null ? (AdresStatus?)null : ConvertFromAddressStatus(status.Value); - - public static AdresStatus ConvertFromAddressStatus(this AddressStatus status) - { - switch (status) - { - case AddressStatus.Proposed: - return AdresStatus.Voorgesteld; - - case AddressStatus.Current: - return AdresStatus.InGebruik; - - case AddressStatus.Retired: - return AdresStatus.Gehistoreerd; - - case AddressStatus.Rejected: - return AdresStatus.Afgekeurd; - - default: - throw new ArgumentOutOfRangeException(nameof(status), status, null); - } - } - - public static AddressStatus ConvertFromAdresStatus(this AdresStatus status) - { - switch (status) - { - case AdresStatus.Voorgesteld: - return AddressStatus.Proposed; - - case AdresStatus.InGebruik: - return AddressStatus.Current; - - case AdresStatus.Gehistoreerd: - return AddressStatus.Retired; - - case AdresStatus.Afgekeurd: - return AddressStatus.Rejected; - - default: - throw new ArgumentOutOfRangeException(nameof(status), status, null); - } - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Infrastructure/Configuration/FeatureToggleOptions.cs b/src/AddressRegistry.Api.Legacy/Infrastructure/Configuration/FeatureToggleOptions.cs deleted file mode 100644 index 9bf1149b2..000000000 --- a/src/AddressRegistry.Api.Legacy/Infrastructure/Configuration/FeatureToggleOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Infrastructure.Configuration -{ - public class FeatureToggleOptions - { - public const string ConfigurationKey = "FeatureToggles"; - public bool UseProjectionsV2 { get; set; } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs b/src/AddressRegistry.Api.Legacy/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs deleted file mode 100644 index 9613f883d..000000000 --- a/src/AddressRegistry.Api.Legacy/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace AddressRegistry.Api.Legacy.Infrastructure.FeatureToggles -{ - using FeatureToggle; - - public class UseProjectionsV2Toggle : IFeatureToggle - { - public bool FeatureEnabled { get; } - - public UseProjectionsV2Toggle(bool featureEnabled) - { - FeatureEnabled = featureEnabled; - } - } -} diff --git a/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/ApiModule.cs b/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/ApiModule.cs index a973be5c0..20240f307 100755 --- a/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/ApiModule.cs +++ b/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/ApiModule.cs @@ -3,7 +3,6 @@ namespace AddressRegistry.Api.Legacy.Infrastructure.Modules using System; using Address; using Address.Bosa; - using AddressMatch; using AddressMatch.V1; using AddressMatch.V1.Matching; using AddressMatch.V2; diff --git a/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/MediatRModule.cs b/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/MediatRModule.cs index c17d583ad..74e981e3c 100644 --- a/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/MediatRModule.cs +++ b/src/AddressRegistry.Api.Legacy/Infrastructure/Modules/MediatRModule.cs @@ -7,25 +7,20 @@ namespace AddressRegistry.Api.Legacy.Infrastructure.Modules using Address.Detail; using Address.List; using Address.Sync; - using AddressMatch; + using AddressMatch.Requests; + using AddressMatch.Responses; using AddressMatch.V1; using AddressMatch.V1.Matching; - using AddressMatch.V2; - using AddressRegistry.Api.Legacy.AddressMatch.Requests; - using AddressRegistry.Api.Legacy.AddressMatch.Responses; using Autofac; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Consumer.Read.Municipality; using Consumer.Read.StreetName; using CrabHouseNumber; using CrabSubaddress; - using FeatureToggles; using MediatR; using Microsoft.Extensions.Options; using Options; using Projections.Legacy; - using Projections.Syndication; - using Module = Autofac.Module; public sealed class MediatRModule : Module { @@ -56,92 +51,34 @@ protected override void Load(ContainerBuilder builder) .AsImplementedInterfaces() .InstancePerLifetimeScope(); - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressListHandlerV2( - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressListHandler( - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressDetailHandlerV2( - c.Resolve(), - c.Resolve(), - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressDetailHandler( - c.Resolve(), - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); - - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressCountHandlerV2( - c.Resolve(), - c.Resolve()); - } - - return (IRequestHandler) - new AddressCountHandler( - c.Resolve(), - c.Resolve()); - }).InstancePerLifetimeScope(); - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressBosaHandlerV2( - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressBosaHandler( - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressRepresentationBosaHandlerV2( - c.Resolve(), - c.Resolve(), - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressRepresentationBosaHandler( - c.Resolve(), - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); + builder.Register(c => (IRequestHandler) + new AddressListHandlerV2( + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressDetailHandlerV2( + c.Resolve(), + c.Resolve(), + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressCountHandlerV2( + c.Resolve(), + c.Resolve())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressBosaHandlerV2( + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressRepresentationBosaHandlerV2( + c.Resolve(), + c.Resolve(), + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); builder.Register(c => { @@ -158,7 +95,7 @@ protected override void Load(ContainerBuilder builder) return (IRequestHandler) new AddressMatchHandler( c.Resolve(), - c.Resolve(), + c.Resolve(), c.Resolve(), c.Resolve(), c.Resolve>()); diff --git a/src/AddressRegistry.Api.Legacy/Infrastructure/Startup.cs b/src/AddressRegistry.Api.Legacy/Infrastructure/Startup.cs index d82a16b33..c06e8bc0b 100755 --- a/src/AddressRegistry.Api.Legacy/Infrastructure/Startup.cs +++ b/src/AddressRegistry.Api.Legacy/Infrastructure/Startup.cs @@ -1,5 +1,8 @@ namespace AddressRegistry.Api.Legacy.Infrastructure { + using System; + using System.Linq; + using System.Reflection; using Autofac; using Autofac.Extensions.DependencyInjection; using Be.Vlaanderen.Basisregisters.Api; @@ -11,17 +14,11 @@ namespace AddressRegistry.Api.Legacy.Infrastructure using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; - using Microsoft.Extensions.Logging; using Microsoft.Extensions.Hosting; + using Microsoft.Extensions.Logging; + using Microsoft.OpenApi.Models; using Modules; using Options; - using System; - using System.Linq; - using System.Reflection; - - using FeatureToggles; - using Microsoft.Extensions.Options; - using Microsoft.OpenApi.Models; /// Represents the startup process for the application. public class Startup @@ -100,9 +97,6 @@ public IServiceProvider ConfigureServices(IServiceCollection services) } }) .Configure(_configuration) - .Configure(_configuration.GetSection(FeatureToggleOptions.ConfigurationKey)) - .AddSingleton(c => - new UseProjectionsV2Toggle(c.GetService>()!.Value.UseProjectionsV2)) .AddMemoryCache(); var containerBuilder = new ContainerBuilder(); diff --git a/src/AddressRegistry.Api.Legacy/appsettings.json b/src/AddressRegistry.Api.Legacy/appsettings.json index 7799f216f..978f1a773 100755 --- a/src/AddressRegistry.Api.Legacy/appsettings.json +++ b/src/AddressRegistry.Api.Legacy/appsettings.json @@ -16,10 +16,6 @@ "BaseUrl": "https://api.staging-basisregisters.vlaanderen/", - "FeatureToggles": { - "UseProjectionsV2": false - }, - "Syndication": { "Category": "https://data.vlaanderen.be/ns/adres", "Id": "https://legacy.staging-basisregisters.vlaanderen/v1/feeds/adressen.atom", diff --git a/src/AddressRegistry.Api.Oslo/Address/AddressMapper.cs b/src/AddressRegistry.Api.Oslo/Address/AddressMapper.cs index 44a370106..c84632f37 100755 --- a/src/AddressRegistry.Api.Oslo/Address/AddressMapper.cs +++ b/src/AddressRegistry.Api.Oslo/Address/AddressMapper.cs @@ -4,6 +4,7 @@ namespace AddressRegistry.Api.Oslo.Address using System.Text; using System.Xml; using AddressRegistry.Address; + using Be.Vlaanderen.Basisregisters.GrAr.Common.SpatialTools.GeometryCoordinates; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; using Be.Vlaanderen.Basisregisters.GrAr.Legacy.SpatialTools; @@ -17,24 +18,6 @@ namespace AddressRegistry.Api.Oslo.Address public static class AddressMapper { - public static VolledigAdres? GetVolledigAdres(AddressListViewItem addressListViewItem) - { - if (string.IsNullOrEmpty(addressListViewItem.StreetNamePersistentLocalId) - || string.IsNullOrEmpty(addressListViewItem.NisCode)) - { - return null; - } - - var defaultMunicipalityName = addressListViewItem.DefaultMunicipalityName; - return new VolledigAdres( - addressListViewItem.DefaultStreetNameName.Value, - addressListViewItem.HouseNumber, - addressListViewItem.BoxNumber, - addressListViewItem.PostalCode, - defaultMunicipalityName.Value, - defaultMunicipalityName.Key); - } - public static VolledigAdres? GetVolledigAdres(AddressListViewItemV2 addressListViewItem) { if (string.IsNullOrEmpty(addressListViewItem.NisCode)) diff --git a/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountOsloHandler.cs b/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountOsloHandler.cs deleted file mode 100644 index 007539849..000000000 --- a/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountOsloHandler.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Address.Count -{ - using System; - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using List; - using MediatR; - using Microsoft.EntityFrameworkCore; - using Projections.Legacy; - - public sealed record AddressCountRequest( - FilteringHeader Filtering, - SortingHeader Sorting, - IPaginationRequest Pagination) : IRequest; - - public sealed class AddressCountOsloHandler : IRequestHandler - { - private readonly LegacyContext _legacyContext; - private readonly AddressQueryContext _addressQueryContext; - - public AddressCountOsloHandler( - LegacyContext legacyContext, - AddressQueryContext addressQueryContext) - { - _legacyContext = legacyContext; - _addressQueryContext = addressQueryContext; - } - - public async Task Handle(AddressCountRequest request, CancellationToken cancellationToken) - { - return new TotaalAantalResponse - { - Aantal = request.Filtering.ShouldFilter - ? await new AddressListOsloQuery(_addressQueryContext) - .Fetch(request.Filtering, request.Sorting, request.Pagination) - .Items - .CountAsync(cancellationToken) - : Convert.ToInt32(_legacyContext - .AddressListViewCount - .First() - .Count) - }; - } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountRequest.cs b/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountRequest.cs new file mode 100644 index 000000000..5c6893333 --- /dev/null +++ b/src/AddressRegistry.Api.Oslo/Address/Count/AddressCountRequest.cs @@ -0,0 +1,14 @@ +namespace AddressRegistry.Api.Oslo.Address.Count +{ + using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; + using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; + using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy; + using List; + using MediatR; + + public sealed record AddressCountRequest( + FilteringHeader Filtering, + SortingHeader Sorting, + IPaginationRequest Pagination) : IRequest; +} diff --git a/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloHandler.cs b/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloHandler.cs deleted file mode 100644 index b25bc8761..000000000 --- a/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloHandler.cs +++ /dev/null @@ -1,95 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Address.Detail -{ - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Exceptions; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Infrastructure.Options; - using MediatR; - using Microsoft.AspNetCore.Http; - using Microsoft.EntityFrameworkCore; - using Microsoft.Extensions.Options; - using Projections.Legacy; - using Projections.Syndication; - - public sealed record AddressDetailOsloRequest(int PersistentLocalId) : IRequest; - - public sealed class AddressDetailOsloHandler : IRequestHandler - { - private readonly LegacyContext _legacyContext; - private readonly SyndicationContext _syndicationContext; - private readonly IOptions _responseOptions; - - public AddressDetailOsloHandler( - LegacyContext legacyContext, - SyndicationContext syndicationContext, - IOptions responseOptions) - { - _legacyContext = legacyContext; - _syndicationContext = syndicationContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressDetailOsloRequest request, CancellationToken cancellationToken) - { - var address = await _legacyContext - .AddressDetail - .AsNoTracking() - .SingleOrDefaultAsync(item => item.PersistentLocalId == request.PersistentLocalId, cancellationToken); - - if (address is not null && address.Removed) - { - throw new ApiException("Adres werd verwijderd.", StatusCodes.Status410Gone); - } - - if (address is null || !address.Complete) - { - throw new ApiException("Onbestaand adres.", StatusCodes.Status404NotFound); - } - - var streetName = await _syndicationContext.StreetNameLatestItems.FindAsync(new object[] { address.StreetNameId }, cancellationToken); - var municipality = await _syndicationContext.MunicipalityLatestItems.FirstAsync(m => m.NisCode == streetName.NisCode, cancellationToken); - var defaultMunicipalityName = AddressMapper.GetDefaultMunicipalityName(municipality); - var defaultStreetName = AddressMapper.GetDefaultStreetNameName(streetName, municipality.PrimaryLanguage); - var defaultHomonymAddition = AddressMapper.GetDefaultHomonymAddition(streetName, municipality.PrimaryLanguage); - - var gemeente = new AdresDetailGemeente( - municipality.NisCode, - string.Format(_responseOptions.Value.GemeenteDetailUrl, municipality.NisCode), - new GeografischeNaam(defaultMunicipalityName.Value, defaultMunicipalityName.Key)); - - var straat = new AdresDetailStraatnaam( - streetName.PersistentLocalId, - string.Format(_responseOptions.Value.StraatnaamDetailUrl, streetName.PersistentLocalId), - new GeografischeNaam(defaultStreetName.Value, defaultStreetName.Key)); - - var postInfo = string.IsNullOrEmpty(address.PostalCode) - ? null - : new AdresDetailPostinfo( - address.PostalCode, - string.Format(_responseOptions.Value.PostInfoDetailUrl, address.PostalCode)); - - var homoniemToevoeging = defaultHomonymAddition == null - ? null - : new HomoniemToevoeging(new GeografischeNaam(defaultHomonymAddition.Value.Value, defaultHomonymAddition.Value.Key)); - - return new AddressDetailOsloResponse( - _responseOptions.Value.Naamruimte, - _responseOptions.Value.ContextUrlDetail, - address.PersistentLocalId.ToString(), - address.HouseNumber, - address.BoxNumber, - gemeente, - straat, - homoniemToevoeging, - postInfo, - AddressMapper.GetAddressPoint(address.Position, address.PositionMethod, address.PositionSpecification), - AddressMapper.ConvertFromAddressStatus(address.Status), - defaultStreetName.Key, - address.OfficiallyAssigned, - address.VersionTimestamp.ToBelgianDateTimeOffset()); - } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloRequest.cs b/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloRequest.cs new file mode 100644 index 000000000..52aff7e75 --- /dev/null +++ b/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloRequest.cs @@ -0,0 +1,6 @@ +namespace AddressRegistry.Api.Oslo.Address.Detail +{ + using MediatR; + + public sealed record AddressDetailOsloRequest(int PersistentLocalId) : IRequest; +} diff --git a/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloResponse.cs b/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloResponse.cs index 4f74abaf3..e00134ba7 100644 --- a/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloResponse.cs +++ b/src/AddressRegistry.Api.Oslo/Address/Detail/AddressDetailOsloResponse.cs @@ -3,6 +3,7 @@ namespace AddressRegistry.Api.Oslo.Address.Detail using System; using System.Runtime.Serialization; using Be.Vlaanderen.Basisregisters.Api.Exceptions; + using Be.Vlaanderen.Basisregisters.BasicApiProblem; using Be.Vlaanderen.Basisregisters.GrAr.Common; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; @@ -12,7 +13,6 @@ namespace AddressRegistry.Api.Oslo.Address.Detail using Microsoft.Extensions.Options; using Newtonsoft.Json; using Swashbuckle.AspNetCore.Filters; - using ProblemDetails = Be.Vlaanderen.Basisregisters.BasicApiProblem.ProblemDetails; [DataContract(Name = "AdresDetail", Namespace = "")] public class AddressDetailOsloResponse diff --git a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloHandler.cs b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloHandler.cs deleted file mode 100644 index 40d01369c..000000000 --- a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloHandler.cs +++ /dev/null @@ -1,63 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Address.List -{ - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Infrastructure.Options; - using MediatR; - using Microsoft.EntityFrameworkCore; - using Microsoft.Extensions.Options; - - public sealed record AddressListOsloRequest( - FilteringHeader Filtering, - SortingHeader Sorting, - IPaginationRequest Pagination) : IRequest; - - public sealed class AddressListOsloHandler : IRequestHandler - { - private readonly AddressQueryContext _addressQueryContext; - private readonly IOptions _responseOptions; - - public AddressListOsloHandler( - AddressQueryContext addressQueryContext, - IOptions responseOptions) - { - _addressQueryContext = addressQueryContext; - _responseOptions = responseOptions; - } - - public async Task Handle(AddressListOsloRequest request, CancellationToken cancellationToken) - { - var pagedAddresses = new AddressListOsloQuery(_addressQueryContext) - .Fetch(request.Filtering, request.Sorting, request.Pagination); - - var addresses = await pagedAddresses.Items - .ToListAsync(cancellationToken); - - var addressListItemResponses = addresses - .Select(address => new AddressListItemOsloResponse( - address.PersistentLocalId, - _responseOptions.Value.Naamruimte, - _responseOptions.Value.DetailUrl, - address.HouseNumber, - address.BoxNumber, - AddressMapper.GetVolledigAdres(address), - AddressMapper.ConvertFromAddressStatus(address.Status), - address.VersionTimestampAsInstant.ToBelgianDateTimeOffset())) - .ToList(); - - return new AddressListOsloResponse - { - Adressen = addressListItemResponses, - Volgende = pagedAddresses.PaginationInfo.BuildNextUri(addressListItemResponses.Count, _responseOptions.Value.VolgendeUrl), - Context = _responseOptions.Value.ContextUrlList, - Sorting = pagedAddresses.Sorting, - Pagination = pagedAddresses.PaginationInfo - }; - } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQuery.cs b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQuery.cs deleted file mode 100644 index 721595bfe..000000000 --- a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQuery.cs +++ /dev/null @@ -1,148 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Address.List -{ - using System; - using System.Collections.Generic; - using System.Linq; - using Be.Vlaanderen.Basisregisters.Api.Search; - using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; - using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; - using Be.Vlaanderen.Basisregisters.GrAr.Common; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Convertors; - using Microsoft.EntityFrameworkCore; - using Projections.Legacy.AddressList; - - public class AddressListOsloQuery : Query - { - private readonly AddressQueryContext _context; - - protected override ISorting Sorting => new AddressSorting(); - - public AddressListOsloQuery(AddressQueryContext context) - { - _context = context; - } - - protected override IQueryable Filter(FilteringHeader filtering) - { - var addresses = _context - .AddressListView - .AsNoTracking() - .OrderBy(x => x.PersistentLocalId) - .AsQueryable(); - - if (!filtering.ShouldFilter) - { - return addresses; - } - - if (!string.IsNullOrEmpty(filtering.Filter.BoxNumber)) - { - var unescapedBoxNumber = Uri.UnescapeDataString(filtering.Filter.BoxNumber); - addresses = addresses.Where(a => a.BoxNumber == unescapedBoxNumber); - } - - if (!string.IsNullOrEmpty(filtering.Filter.HouseNumber)) - { - var unescapedHouseNumber = Uri.UnescapeDataString(filtering.Filter.HouseNumber); - addresses = addresses.Where(a => a.HouseNumber == unescapedHouseNumber); - } - - if (!string.IsNullOrEmpty(filtering.Filter.PostalCode)) - { - addresses = addresses.Where(a => a.PostalCode == filtering.Filter.PostalCode); - } - - if (!string.IsNullOrEmpty(filtering.Filter.Status)) - { - if (Enum.TryParse(typeof(AdresStatus), filtering.Filter.Status, true, out var status)) - { - var addressStatus = AddressStatusExtensions.ConvertFromAdresStatus((AdresStatus)status); - addresses = addresses.Where(a => a.Status.HasValue && a.Status.Value == addressStatus); - } - else - { - //have to filter on EF cannot return new List<>().AsQueryable() cause non-EF provider does not support .CountAsync() - addresses = addresses.Where(m => m.Status.HasValue && (int)m.Status.Value == -1); - } - } - - if (!string.IsNullOrEmpty(filtering.Filter.NisCode)) - { - addresses = addresses.Where(x => x.NisCode == filtering.Filter.NisCode); - } - - if (!string.IsNullOrEmpty(filtering.Filter.MunicipalityName)) - { - var searchName = filtering.Filter.MunicipalityName.RemoveDiacritics(); - - addresses = addresses.Where(m => - m.MunicipalityNameDutchSearch == searchName || - m.MunicipalityNameFrenchSearch == searchName || - m.MunicipalityNameGermanSearch == searchName || - m.MunicipalityNameEnglishSearch == searchName); - } - - if (!string.IsNullOrEmpty(filtering.Filter.StreetName)) - { - var searchName = filtering.Filter.StreetName.RemoveDiacritics(); - - addresses = addresses.Where(s => - s.StreetNameDutchSearch == searchName || - s.StreetNameFrenchSearch == searchName || - s.StreetNameGermanSearch == searchName || - s.StreetNameEnglishSearch == searchName); - } - - if (!string.IsNullOrEmpty(filtering.Filter.HomonymAddition)) - { - addresses = addresses.Where(s => - s.HomonymAdditionDutch == filtering.Filter.HomonymAddition || - s.HomonymAdditionFrench == filtering.Filter.HomonymAddition || - s.HomonymAdditionGerman == filtering.Filter.HomonymAddition || - s.HomonymAdditionEnglish == filtering.Filter.HomonymAddition); - } - - if (!string.IsNullOrEmpty(filtering.Filter.StreetNameId)) - { - if (int.TryParse(filtering.Filter.StreetNameId, out _)) - { - addresses = addresses.Where(x => x.StreetNamePersistentLocalId == filtering.Filter.StreetNameId); - } - else - { - // don't bother sending to sql, no results will be returned - return new List().AsQueryable(); - } - } - - return addresses; - } - } - - internal class AddressSorting : ISorting - { - public IEnumerable SortableFields { get; } = new[] - { - nameof(AddressListItem.BoxNumber), - nameof(AddressListItem.HouseNumber), - nameof(AddressListItem.PostalCode), - nameof(AddressListItem.PersistentLocalId) - }; - - public SortingHeader DefaultSortingHeader { get; } = new SortingHeader(nameof(AddressListItem.PersistentLocalId), SortOrder.Ascending); - } - - public class AddressFilter - { - public string BoxNumber { get; set; } - public string HouseNumber { get; set; } - public string PostalCode { get; set; } - public string MunicipalityName { get; set; } - public string StreetName { get; set; } - public string HomonymAddition { get; set; } - public string Status { get; set; } - public string? NisCode { get; set; } - public string? StreetNameId { get; set; } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQueryV2.cs b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQueryV2.cs index 0639040f6..07f91c878 100644 --- a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQueryV2.cs +++ b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloQueryV2.cs @@ -131,4 +131,17 @@ internal class AddressSortingV2 : ISorting public SortingHeader DefaultSortingHeader { get; } = new SortingHeader(nameof(AddressListItemV2.AddressPersistentLocalId), SortOrder.Ascending); } + + public class AddressFilter + { + public string BoxNumber { get; set; } + public string HouseNumber { get; set; } + public string PostalCode { get; set; } + public string MunicipalityName { get; set; } + public string StreetName { get; set; } + public string HomonymAddition { get; set; } + public string Status { get; set; } + public string? NisCode { get; set; } + public string? StreetNameId { get; set; } + } } diff --git a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloRequest.cs b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloRequest.cs new file mode 100644 index 000000000..b696f8ac1 --- /dev/null +++ b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloRequest.cs @@ -0,0 +1,12 @@ +namespace AddressRegistry.Api.Oslo.Address.List +{ + using Be.Vlaanderen.Basisregisters.Api.Search.Filtering; + using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; + using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; + using MediatR; + + public sealed record AddressListOsloRequest( + FilteringHeader Filtering, + SortingHeader Sorting, + IPaginationRequest Pagination) : IRequest; +} diff --git a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloResponse.cs b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloResponse.cs index e2044d00d..249ad98af 100644 --- a/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloResponse.cs +++ b/src/AddressRegistry.Api.Oslo/Address/List/AddressListOsloResponse.cs @@ -1,17 +1,17 @@ namespace AddressRegistry.Api.Oslo.Address.List { - using Be.Vlaanderen.Basisregisters.GrAr.Legacy; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using Infrastructure.Options; - using Microsoft.Extensions.Options; - using Swashbuckle.AspNetCore.Filters; using System; using System.Collections.Generic; using System.Runtime.Serialization; using Be.Vlaanderen.Basisregisters.Api.Search.Pagination; using Be.Vlaanderen.Basisregisters.Api.Search.Sorting; using Be.Vlaanderen.Basisregisters.GrAr.Common; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; + using Infrastructure.Options; + using Microsoft.Extensions.Options; using Newtonsoft.Json; + using Swashbuckle.AspNetCore.Filters; [DataContract(Name = "AdresCollectie", Namespace = "")] public class AddressListOsloResponse diff --git a/src/AddressRegistry.Api.Oslo/Convertors/AddressStatus.cs b/src/AddressRegistry.Api.Oslo/Convertors/AddressStatus.cs deleted file mode 100755 index 4637aa4dd..000000000 --- a/src/AddressRegistry.Api.Oslo/Convertors/AddressStatus.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Convertors -{ - using System; - using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; - using AddressRegistry.Address; - - public static class AddressStatusExtensions - { - public static AddressStatus ConvertFromAdresStatus(this AdresStatus status) - { - switch (status) - { - case AdresStatus.Voorgesteld: - return AddressStatus.Proposed; - - case AdresStatus.InGebruik: - return AddressStatus.Current; - - case AdresStatus.Gehistoreerd: - return AddressStatus.Retired; - - case AdresStatus.Afgekeurd: - return AddressStatus.Rejected; - - default: - throw new ArgumentOutOfRangeException(nameof(status), status, null); - } - } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Infrastructure/Configuration/FeatureToggleOptions.cs b/src/AddressRegistry.Api.Oslo/Infrastructure/Configuration/FeatureToggleOptions.cs deleted file mode 100644 index 41cd35dfe..000000000 --- a/src/AddressRegistry.Api.Oslo/Infrastructure/Configuration/FeatureToggleOptions.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Infrastructure.Configuration -{ - public class FeatureToggleOptions - { - public const string ConfigurationKey = "FeatureToggles"; - public bool UseProjectionsV2 { get; set; } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs b/src/AddressRegistry.Api.Oslo/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs deleted file mode 100644 index 36e5d0e22..000000000 --- a/src/AddressRegistry.Api.Oslo/Infrastructure/FeatureToggles/UseProjectionsV2Toggle.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace AddressRegistry.Api.Oslo.Infrastructure.FeatureToggles -{ - using FeatureToggle; - - public class UseProjectionsV2Toggle : IFeatureToggle - { - public bool FeatureEnabled { get; } - - public UseProjectionsV2Toggle(bool featureEnabled) - { - FeatureEnabled = featureEnabled; - } - } -} diff --git a/src/AddressRegistry.Api.Oslo/Infrastructure/Modules/MediatRModule.cs b/src/AddressRegistry.Api.Oslo/Infrastructure/Modules/MediatRModule.cs index dc17cd048..702d68dc1 100644 --- a/src/AddressRegistry.Api.Oslo/Infrastructure/Modules/MediatRModule.cs +++ b/src/AddressRegistry.Api.Oslo/Infrastructure/Modules/MediatRModule.cs @@ -6,20 +6,16 @@ namespace AddressRegistry.Api.Oslo.Infrastructure.Modules using Address.List; using AddressMatch.Requests; using AddressMatch.Responses; - using AddressMatch.V1; - using AddressMatch.V1.Matching; using AddressMatch.V2; + using AddressMatch.V2.Matching; using Autofac; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Consumer.Read.Municipality; using Consumer.Read.StreetName; - using FeatureToggles; using MediatR; using Microsoft.Extensions.Options; using Options; using Projections.Legacy; - using Projections.Syndication; - using ILatestQueries = AddressMatch.V2.Matching.ILatestQueries; public sealed class MediatRModule : Module { @@ -30,76 +26,27 @@ protected override void Load(ContainerBuilder builder) .As() .InstancePerLifetimeScope(); - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressListOsloHandlerV2( - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressListOsloHandler( - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressDetailOsloHandlerV2( - c.Resolve(), - c.Resolve(), - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressDetailOsloHandler( - c.Resolve(), - c.Resolve(), - c.Resolve>()); - }).InstancePerLifetimeScope(); - - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressCountOsloHandlerV2( - c.Resolve(), - c.Resolve()); - } - - return(IRequestHandler) - new AddressCountOsloHandler( - c.Resolve(), - c.Resolve()); - }).InstancePerLifetimeScope(); - - - builder.Register(c => - { - if (c.Resolve().FeatureEnabled) - { - return (IRequestHandler) - new AddressMatchHandlerV2( - c.Resolve(), - c.Resolve>()); - } - - return (IRequestHandler) - new AddressMatchHandler( - c.Resolve(), - c.Resolve(), - c.Resolve>()); - - }).InstancePerLifetimeScope(); + builder.Register(c => (IRequestHandler) + new AddressListOsloHandlerV2( + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressDetailOsloHandlerV2( + c.Resolve(), + c.Resolve(), + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressCountOsloHandlerV2( + c.Resolve(), + c.Resolve())).InstancePerLifetimeScope(); + + builder.Register(c => (IRequestHandler) + new AddressMatchHandlerV2( + c.Resolve(), + c.Resolve>())).InstancePerLifetimeScope(); } } } diff --git a/src/AddressRegistry.Api.Oslo/Infrastructure/Startup.cs b/src/AddressRegistry.Api.Oslo/Infrastructure/Startup.cs index 9cb72b1f1..64f448ce1 100755 --- a/src/AddressRegistry.Api.Oslo/Infrastructure/Startup.cs +++ b/src/AddressRegistry.Api.Oslo/Infrastructure/Startup.cs @@ -1,5 +1,8 @@ namespace AddressRegistry.Api.Oslo.Infrastructure { + using System; + using System.Linq; + using System.Reflection; using Autofac; using Autofac.Extensions.DependencyInjection; using Be.Vlaanderen.Basisregisters.Api; @@ -11,16 +14,11 @@ namespace AddressRegistry.Api.Oslo.Infrastructure using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; - using Microsoft.Extensions.Logging; using Microsoft.Extensions.Hosting; + using Microsoft.Extensions.Logging; + using Microsoft.OpenApi.Models; using Modules; using Options; - using System; - using System.Linq; - using System.Reflection; - using FeatureToggles; - using Microsoft.Extensions.Options; - using Microsoft.OpenApi.Models; /// Represents the startup process for the application. public class Startup @@ -101,9 +99,6 @@ public IServiceProvider ConfigureServices(IServiceCollection services) } }) .Configure(_configuration) - .Configure(_configuration.GetSection(FeatureToggleOptions.ConfigurationKey)) - .AddSingleton(c => - new UseProjectionsV2Toggle(c.GetRequiredService>().Value.UseProjectionsV2)) .AddMemoryCache(); var containerBuilder = new ContainerBuilder(); diff --git a/src/AddressRegistry.Api.Oslo/appsettings.json b/src/AddressRegistry.Api.Oslo/appsettings.json index 8e2166032..0552c727d 100755 --- a/src/AddressRegistry.Api.Oslo/appsettings.json +++ b/src/AddressRegistry.Api.Oslo/appsettings.json @@ -14,10 +14,6 @@ "BaseUrl": "https://api.staging-basisregisters.vlaanderen/", - "FeatureToggles": { - "UseProjectionsV2": false - }, - "Naamruimte": "https://data.vlaanderen.be/id/adres", "PostInfoNaamruimte": "https://data.vlaanderen.be/id/postinfo", "GemeenteNaamruimte": "https://data.vlaanderen.be/id/gemeente", diff --git a/src/AddressRegistry.Consumer.Read.Municipality/Projections/MunicipalityBosaItemProjections.cs b/src/AddressRegistry.Consumer.Read.Municipality/Projections/MunicipalityBosaItemProjections.cs index dd394b67a..dff4aa9df 100644 --- a/src/AddressRegistry.Consumer.Read.Municipality/Projections/MunicipalityBosaItemProjections.cs +++ b/src/AddressRegistry.Consumer.Read.Municipality/Projections/MunicipalityBosaItemProjections.cs @@ -10,6 +10,7 @@ namespace AddressRegistry.Consumer.Read.Municipality.Projections using Be.Vlaanderen.Basisregisters.ProjectionHandling.Connector; using Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor; using NodaTime.Text; + using RegionFilter = Be.Vlaanderen.Basisregisters.GrAr.Common.RegionFilter; public class MunicipalityBosaItemProjections : ConnectedProjection { diff --git a/src/AddressRegistry.Consumer/AddressRegistry.Consumer.csproj b/src/AddressRegistry.Consumer/AddressRegistry.Consumer.csproj index e83a150c9..fc7787e45 100644 --- a/src/AddressRegistry.Consumer/AddressRegistry.Consumer.csproj +++ b/src/AddressRegistry.Consumer/AddressRegistry.Consumer.csproj @@ -17,6 +17,7 @@ + diff --git a/src/AddressRegistry.Consumer/Infrastructure/Program.cs b/src/AddressRegistry.Consumer/Infrastructure/Program.cs index 6c62ce0aa..4cda1a9ee 100644 --- a/src/AddressRegistry.Consumer/Infrastructure/Program.cs +++ b/src/AddressRegistry.Consumer/Infrastructure/Program.cs @@ -26,6 +26,7 @@ namespace AddressRegistry.Consumer.Infrastructure using System.IO; using System.Threading; using System.Threading.Tasks; + using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; public sealed class Program { @@ -99,6 +100,15 @@ public static async Task Main(string[] args) sqlServerOptions.EnableRetryOnFailure(); sqlServerOptions.MigrationsHistoryTable(MigrationTables.ConsumerProjections, Schema.ConsumerProjections); })); + + services.ConfigureIdempotency( + hostContext.Configuration + .GetSection(IdempotencyConfiguration.Section) + .Get() + .ConnectionString!, + new IdempotencyMigrationsTableInfo(Schema.Import), + new IdempotencyTableInfo(Schema.Import), + loggerFactory); }) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer((hostContext, containerBuilder) => @@ -133,6 +143,11 @@ public static async Task Main(string[] args) return consumerOptions; }); + containerBuilder.RegisterType() + .As() + .AsSelf() + .InstancePerLifetimeScope(); + containerBuilder .RegisterType>() .As>() diff --git a/src/AddressRegistry.Consumer/Projections/CommandHandler.cs b/src/AddressRegistry.Consumer/Projections/CommandHandler.cs index 2d24f4370..d65848f40 100644 --- a/src/AddressRegistry.Consumer/Projections/CommandHandler.cs +++ b/src/AddressRegistry.Consumer/Projections/CommandHandler.cs @@ -1,9 +1,10 @@ namespace AddressRegistry.Consumer.Projections { + using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Autofac; - using Be.Vlaanderen.Basisregisters.CommandHandling; + using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Microsoft.Extensions.Logging; @@ -25,8 +26,12 @@ public virtual async Task Handle(T command, CancellationToken cancellationTok await using var scope = _container.BeginLifetimeScope(); - var resolver = scope.Resolve(); - _ = await resolver.Dispatch(command.CreateCommandId(), command, cancellationToken:cancellationToken); + var resolver = scope.Resolve(); + _ = await resolver.Dispatch( + command.CreateCommandId(), + command, + new Dictionary(), + cancellationToken:cancellationToken); _logger.LogDebug($"Handled {command.GetType().FullName}"); } diff --git a/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs b/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs index f5510e1f2..b726ea01b 100644 --- a/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs +++ b/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs @@ -9,8 +9,6 @@ namespace AddressRegistry.Consumer.Projections using Be.Vlaanderen.Basisregisters.ProjectionHandling.Connector; using NodaTime; using Contracts = Be.Vlaanderen.Basisregisters.GrAr.Contracts.Common; - using Provenance = Be.Vlaanderen.Basisregisters.GrAr.Provenance.Provenance; - using StreetNameId = AddressRegistry.StreetName.StreetNameId; /// /// Here we handle the streetname events which impact the state of the streetname aggregate. @@ -99,6 +97,16 @@ public static IHasCommandProvenance GetCommand(IQueueMessage message) ); } + if (type == typeof(StreetNameWasRenamed)) + { + var msg = (StreetNameWasRenamed)message; + return new RenameStreetName( + new StreetNamePersistentLocalId(msg.PersistentLocalId), + new StreetNamePersistentLocalId(msg.DestinationPersistentLocalId), + FromProvenance(msg.Provenance) + ); + } + if (type == typeof(StreetNameWasCorrectedFromRetiredToCurrent)) { var msg = (StreetNameWasCorrectedFromRetiredToCurrent)message; @@ -160,6 +168,23 @@ await commandHandler.Handle( await commandHandler.Handle(command, ct); }); + When(async (commandHandler, message, ct) => + { + var renameStreetName = new RenameStreetName( + new StreetNamePersistentLocalId(message.PersistentLocalId), + new StreetNamePersistentLocalId(message.DestinationPersistentLocalId), + FromProvenance(message.Provenance)); + + await commandHandler.Handle(renameStreetName, ct); + + var retireStreetNameBecauseOfRename = new RetireStreetNameBecauseOfRename( + new StreetNamePersistentLocalId(message.PersistentLocalId), + new StreetNamePersistentLocalId(message.DestinationPersistentLocalId), + FromProvenance(message.Provenance)); + + await commandHandler.Handle(retireStreetNameBecauseOfRename, ct); + }); + When(async (commandHandler, message, ct) => { var command = GetCommand(message); diff --git a/src/AddressRegistry.Consumer/appsettings.json b/src/AddressRegistry.Consumer/appsettings.json index e954ce7ea..deef73d0b 100644 --- a/src/AddressRegistry.Consumer/appsettings.json +++ b/src/AddressRegistry.Consumer/appsettings.json @@ -8,6 +8,10 @@ "Sequences": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;TrustServerCertificate=True;" }, + "Idempotency": { + "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;" + }, + "DataDog": { "Enabled": true, "Debug": false, diff --git a/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs b/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs index 4ec747e2e..1aa9f146f 100644 --- a/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs +++ b/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs @@ -246,27 +246,6 @@ public static Contracts.AddressWasCorrectedFromRejectedToProposed ToContract(thi message.AddressPersistentLocalId, message.Provenance.ToContract()); - public static Contracts.MigratedStreetNameWasImported ToContract(this StreetNameAggregate.MigratedStreetNameWasImported message) => - new Contracts.MigratedStreetNameWasImported( - message.StreetNameId.ToString("D"), - message.StreetNamePersistentLocalId, - message.MunicipalityId.ToString("D"), - message.NisCode, - message.StreetNameStatus.ToString(), - message.Provenance.ToContract()); - - public static Contracts.StreetNameWasApproved ToContract(this StreetNameAggregate.StreetNameWasApproved message) => - new Contracts.StreetNameWasApproved(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - - public static Contracts.StreetNameWasRetired ToContract(this StreetNameAggregate.StreetNameWasRetired message) => - new Contracts.StreetNameWasRetired(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - - public static Contracts.StreetNameWasImported ToContract(this StreetNameAggregate.StreetNameWasImported message) => - new Contracts.StreetNameWasImported(message.StreetNamePersistentLocalId, message.MunicipalityId.ToString("D"), message.StreetNameStatus.ToString(), message.Provenance.ToContract()); - - public static Contracts.StreetNameWasRemoved ToContract(this StreetNameAggregate.StreetNameWasRemoved message) => - new Contracts.StreetNameWasRemoved(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - public static Contracts.AddressRegularizationWasCorrected ToContract(this StreetNameAggregate.AddressRegularizationWasCorrected message) => new Contracts.AddressRegularizationWasCorrected(message.StreetNamePersistentLocalId, message.AddressPersistentLocalId, message.Provenance.ToContract()); diff --git a/src/AddressRegistry.Projections.Syndication/Municipality/MunicipalityBosaProjections.cs b/src/AddressRegistry.Projections.Syndication/Municipality/MunicipalityBosaProjections.cs index 0cb9afaf2..406999adb 100755 --- a/src/AddressRegistry.Projections.Syndication/Municipality/MunicipalityBosaProjections.cs +++ b/src/AddressRegistry.Projections.Syndication/Municipality/MunicipalityBosaProjections.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Projections.Syndication.Municipality using Be.Vlaanderen.Basisregisters.GrAr.Common; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; using Be.Vlaanderen.Basisregisters.ProjectionHandling.Syndication; + using RegionFilter = Be.Vlaanderen.Basisregisters.GrAr.Common.RegionFilter; public class MunicipalityBosaProjections : AtomEntryProjectionHandlerModule, SyndicationContext> { diff --git a/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2.cs b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2.cs new file mode 100644 index 000000000..36b6e5b9f --- /dev/null +++ b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2.cs @@ -0,0 +1,138 @@ +namespace AddressRegistry.Projections.Wms.AddressWmsItemV2 +{ + using System; + using AddressRegistry.Infrastructure; + using Be.Vlaanderen.Basisregisters.GrAr.Common; + using Be.Vlaanderen.Basisregisters.Utilities; + using Microsoft.EntityFrameworkCore; + using Microsoft.EntityFrameworkCore.Metadata.Builders; + using NetTopologySuite.Geometries; + using NodaTime; + + public class AddressWmsItemV2 + { + protected AddressWmsItemV2() + { } + + public AddressWmsItemV2( + int addressPersistentLocalId, + int? parentAddressPersistentLocalId, + int streetNamePersistentLocalId, + string? postalCode, + string houseNumber, + string? boxNumber, + string status, + bool officiallyAssigned, + Point position, + string positionMethod, + string positionSpecification, + bool removed, + Instant versionTimestamp) + { + AddressPersistentLocalId = addressPersistentLocalId; + ParentAddressPersistentLocalId = parentAddressPersistentLocalId; + StreetNamePersistentLocalId = streetNamePersistentLocalId; + PostalCode = postalCode; + HouseNumber = houseNumber; + BoxNumber = boxNumber; + LabelType = string.IsNullOrWhiteSpace(boxNumber) + ? WmsAddressLabelType.HouseNumberWithoutBoxes + : WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; + Status = status; + OfficiallyAssigned = officiallyAssigned; + SetPosition(position); + PositionMethod = positionMethod; + PositionSpecification = positionSpecification; + Removed = removed; + VersionTimestamp = versionTimestamp; + } + + public int AddressPersistentLocalId { get; set; } + public int? ParentAddressPersistentLocalId { get; set; } + public int StreetNamePersistentLocalId { get; set; } + public string? PostalCode { get; set; } + public string HouseNumber { get; set; } + public string? HouseNumberLabel { get; private set; } + public int? HouseNumberLabelLength { get; private set; } + public WmsAddressLabelType LabelType { get; set; } + + public string? BoxNumber { get; set; } + public string Status { get; set; } + public bool OfficiallyAssigned { get; set; } + public Point Position { get; private set; } + public double PositionX { get; private set; } + public double PositionY { get; private set; } + + public string PositionMethod { get; set; } + public string PositionSpecification { get; set; } + + public bool Removed { get; set; } + + public DateTimeOffset VersionTimestampAsDateTimeOffset { get; private set; } + + public Instant VersionTimestamp + { + get => Instant.FromDateTimeOffset(VersionTimestampAsDateTimeOffset); + set + { + VersionTimestampAsDateTimeOffset = value.ToDateTimeOffset(); + VersionAsString = new Rfc3339SerializableDateTimeOffset(value.ToBelgianDateTimeOffset()).ToString(); + } + } + + public string? VersionAsString { get; protected set; } + + public void SetHouseNumberLabel(string? label) + { + HouseNumberLabel = label; + HouseNumberLabelLength = label?.Length; + } + + public void SetPosition(Point position) + { + Position = position; + PositionX = position.X; + PositionY = position.Y; + } + } + + public class AddressWmsItemV2Configuration : IEntityTypeConfiguration + { + internal const string TableName = "AddressWmsV2"; + + public void Configure(EntityTypeBuilder b) + { + b.ToTable(TableName, Schema.Wms) + .HasKey(p => p.AddressPersistentLocalId) + .IsClustered(); + + b.Property(x => x.AddressPersistentLocalId) + .ValueGeneratedNever(); + + b.Property(p => p.VersionTimestampAsDateTimeOffset) + .HasColumnName("VersionTimestamp"); + + b.Ignore(x => x.VersionTimestamp); + + b.Property(p => p.StreetNamePersistentLocalId); + b.Property(p => p.ParentAddressPersistentLocalId); + b.Property(p => p.PostalCode); + b.Property(p => p.HouseNumber); + b.Property(p => p.BoxNumber); + b.Property(p => p.OfficiallyAssigned); + b.Property(p => p.Position).HasColumnType("sys.geometry"); + b.Property(p => p.PositionSpecification); + b.Property(p => p.PositionMethod); + b.Property(p => p.Status); + b.Property(p => p.Removed); + b.Property(p => p.VersionAsString); + + b.HasIndex(p => p.ParentAddressPersistentLocalId); + b.HasIndex(p => p.Status); + b.HasIndex(p => p.StreetNamePersistentLocalId); + + b.HasIndex(p => new { p.PositionX, p.PositionY, p.Removed, p.Status }) + .IncludeProperties(x => x.StreetNamePersistentLocalId); + } + } +} diff --git a/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Extensions.cs b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Extensions.cs new file mode 100644 index 000000000..eff938208 --- /dev/null +++ b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Extensions.cs @@ -0,0 +1,167 @@ +// ReSharper disable CompareOfFloatsByEqualityOperator + +namespace AddressRegistry.Projections.Wms.AddressWmsItemV2 +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading; + using System.Threading.Tasks; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.Connector; + using Microsoft.EntityFrameworkCore; + + public static class AddressWmsItemV2Extensions + { + public static async Task FindAndUpdateAddressDetailV2(this WmsContext context, + int addressPersistentLocalId, + Action updateAddressAction, + CancellationToken ct, + bool updateHouseNumberLabelsBeforeAddressUpdate = false, + bool updateHouseNumberLabelsAfterAddressUpdate = false, + bool allowUpdateRemovedAddress = false) + { + var address = await context.FindAddressDetailV2(addressPersistentLocalId, ct, allowUpdateRemovedAddress); + + if (updateHouseNumberLabelsBeforeAddressUpdate) + { + await context.UpdateHouseNumberLabelsV2(address, ct); + } + + updateAddressAction(address); + + if (updateHouseNumberLabelsAfterAddressUpdate) + { + await context.UpdateHouseNumberLabelsV2(address, ct, includeAddressInUpdate: true); + } + } + + public static async Task FindAddressDetailV2( + this WmsContext context, + int addressPersistentLocalId, + CancellationToken ct, + bool allowRemovedAddress = false) + { + // NOTE: We cannot depend on SQL computed columns when facing with bulk insert that needs to perform queries. + var address = await context.AddressWmsItemsV2.FindAsync(addressPersistentLocalId, cancellationToken: ct); + + if (address == null) + { + throw DatabaseItemNotFound(addressPersistentLocalId); + } + + // exclude soft deleted entries, unless allowed + if (!address.Removed || allowRemovedAddress) + { + return address; + } + + throw DatabaseItemNotFound(addressPersistentLocalId); + } + + public static async Task UpdateHouseNumberLabelsV2(this WmsContext context, + AddressWmsItemV2 address, + CancellationToken ct, + bool includeAddressInUpdate = false) + { + var addressesWithSharedPosition = await context.FindAddressesWithSharedPosition( + address.AddressPersistentLocalId, + address.Position, + address.Status, + ct); + + if (includeAddressInUpdate) + { + addressesWithSharedPosition.Add(address); + } + + var label = addressesWithSharedPosition.CalculateHouseNumberLabel(); + + foreach (var item in addressesWithSharedPosition) + { + item.SetHouseNumberLabel(label); + } + } + + private static async Task> FindAddressesWithSharedPosition( + this WmsContext context, + int addressPersistentLocalId, + NetTopologySuite.Geometries.Point position, + string? status, + CancellationToken ct) + { + var localItems = context + .AddressWmsItemsV2 + .Local + .Where(i => i.PositionX == position.X + && i.PositionY == position.Y + && i.AddressPersistentLocalId != addressPersistentLocalId + && i.Status == status + && !i.Removed) + .ToList(); + + var dbItems = await context.AddressWmsItemsV2 + .Where(i => i.PositionX == position.X + && i.PositionY == position.Y + && i.AddressPersistentLocalId != addressPersistentLocalId + && i.Status == status + && !i.Removed) + .ToListAsync(ct); + + // We need to verify that the AddressWmsItemV2 retrieved from the DB is not already in the local cache. + // If it is already in the local cache, but not in the localItems list, then its position or status was updated and is no longer shared. + // An example: + // context.AddressWmsItemsV2.Local (local cache) contains items: A, B, C and D + // localItems returns: A, B and C + // dbItems returns: A and D + // This implies that D was updated but not yet persisted to the database, but was updated in memory only. + // Because localItems didn't return D, its position (or status) didn't match the specified position. + var verifiedDbItems = new List(); + foreach (var dbItem in dbItems) + { + if (localItems.Any(x => x.AddressPersistentLocalId == dbItem.AddressPersistentLocalId)) + { + continue; + } + + if (context.AddressWmsItemsV2.Local.Any(x => + x.AddressPersistentLocalId == dbItem.AddressPersistentLocalId)) + { + continue; + } + + verifiedDbItems.Add(dbItem); + } + + var union = localItems + .Union(verifiedDbItems) + .ToList(); + + return union; + } + + private static string? CalculateHouseNumberLabel(this IEnumerable addresses) + { + var houseNumberComparer = new HouseNumberComparer(); + + var orderedAddresses = addresses + .Where(i => !i.Removed) + .OrderBy(i => i.HouseNumber, houseNumberComparer) + .ToList(); + + if (!orderedAddresses.Any()) + { + return null; + } + + var smallestNumber = orderedAddresses.First().HouseNumber; + var highestNumber = orderedAddresses.Last().HouseNumber; + + return smallestNumber != highestNumber + ? $"{smallestNumber}-{highestNumber}" + : smallestNumber; + } + + private static ProjectionItemNotFoundException DatabaseItemNotFound(int addressPersistentLocalId) => + new ProjectionItemNotFoundException(addressPersistentLocalId.ToString()); + } +} diff --git a/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Projections.cs b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Projections.cs new file mode 100644 index 000000000..985acdb1a --- /dev/null +++ b/src/AddressRegistry.Projections.Wms/AddressWmsItemV2/AddressWmsItemV2Projections.cs @@ -0,0 +1,774 @@ +namespace AddressRegistry.Projections.Wms.AddressWmsItemV2 +{ + using System; + using AddressRegistry.StreetName.Events; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy; + using Be.Vlaanderen.Basisregisters.GrAr.Legacy.Adres; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.Connector; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore; + using Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor; + using NetTopologySuite.Geometries; + using NetTopologySuite.IO; + using NodaTime; + using AddressStatus = StreetName.AddressStatus; + using GeometryMethod = StreetName.GeometryMethod; + using GeometrySpecification = StreetName.GeometrySpecification; + + [ConnectedProjectionName("WMS adressen")] + [ConnectedProjectionDescription("Projectie die de adressen data voor het WMS adressenregister voorziet.")] + public class AddressWmsItemV2Projections : ConnectedProjection + { + public static readonly string AdresStatusInGebruik = AdresStatus.InGebruik.ToString(); + public static readonly string AdresStatusGehistoreerd = AdresStatus.Gehistoreerd.ToString(); + public static readonly string AdresStatusVoorgesteld = AdresStatus.Voorgesteld.ToString(); + public static readonly string AdresStatusAfgekeurd = AdresStatus.Afgekeurd.ToString(); + + private readonly WKBReader _wkbReader; + + public AddressWmsItemV2Projections(WKBReader wkbReader) + { + _wkbReader = wkbReader; + // StreetName + When>(async (context, message, ct) => + { + foreach (var addressPersistentLocalId in message.Message.AddressPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + addressPersistentLocalId, + address => { UpdateVersionTimestampIfNewer(address, message.Message.Provenance.Timestamp); }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false, + allowUpdateRemovedAddress: true); + } + }); + + When>(async (context, message, ct) => + { + foreach (var addressPersistentLocalId in message.Message.AddressPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + addressPersistentLocalId, + address => { UpdateVersionTimestampIfNewer(address, message.Message.Provenance.Timestamp); }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false, + allowUpdateRemovedAddress: true); + } + }); + + When>(async (context, message, ct) => + { + foreach (var addressPersistentLocalId in message.Message.AddressPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + addressPersistentLocalId, + address => { UpdateVersionTimestampIfNewer(address, message.Message.Provenance.Timestamp); }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false, + allowUpdateRemovedAddress: true); + } + }); + + // Address + When>(async (context, message, ct) => + { + var addressWmsItem = new AddressWmsItemV2( + message.Message.AddressPersistentLocalId, + message.Message.ParentPersistentLocalId, + message.Message.StreetNamePersistentLocalId, + message.Message.PostalCode, + message.Message.HouseNumber, + message.Message.BoxNumber, + MapStatus(message.Message.Status), + message.Message.OfficiallyAssigned, + ParsePosition(message.Message.ExtendedWkbGeometry), + ConvertGeometryMethodToString(message.Message.GeometryMethod), + ConvertGeometrySpecificationToString(message.Message.GeometrySpecification), + message.Message.IsRemoved, + message.Message.Provenance.Timestamp); + + await context.UpdateHouseNumberLabelsV2(addressWmsItem, ct, includeAddressInUpdate: true); + + await context + .AddressWmsItemsV2 + .AddAsync(addressWmsItem, ct); + + if (message.Message.ParentPersistentLocalId.HasValue) + { + var parent = await context.FindAddressDetailV2(message.Message.ParentPersistentLocalId.Value, ct); + if (parent.Position == addressWmsItem.Position) + { + await context.FindAndUpdateAddressDetailV2( + message.Message.ParentPersistentLocalId.Value, + address => { address.LabelType = WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false); + } + } + }); + + When>(async (context, message, ct) => + { + var addressWmsItem = new AddressWmsItemV2( + message.Message.AddressPersistentLocalId, + message.Message.ParentPersistentLocalId, + message.Message.StreetNamePersistentLocalId, + message.Message.PostalCode, + message.Message.HouseNumber, + message.Message.BoxNumber, + MapStatus(AddressStatus.Proposed), + officiallyAssigned: true, + ParsePosition(message.Message.ExtendedWkbGeometry), + ConvertGeometryMethodToString(message.Message.GeometryMethod), + ConvertGeometrySpecificationToString(message.Message.GeometrySpecification), + removed: false, + message.Message.Provenance.Timestamp); + + await context.UpdateHouseNumberLabelsV2(addressWmsItem, ct, includeAddressInUpdate: true); + + await context + .AddressWmsItemsV2 + .AddAsync(addressWmsItem, ct); + + if (message.Message.ParentPersistentLocalId.HasValue) + { + var parent = await context.FindAddressDetailV2(message.Message.ParentPersistentLocalId.Value, ct); + if (parent.Position == addressWmsItem.Position) + { + await context.FindAndUpdateAddressDetailV2( + message.Message.ParentPersistentLocalId.Value, + address => { address.LabelType = WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false); + } + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Current); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Proposed); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Proposed); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Retired); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Proposed); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.OfficiallyAssigned = false; + address.Status = MapStatus(AddressStatus.Current); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.OfficiallyAssigned = true; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Retired); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Retired); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Retired); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Current); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.PostalCode = message.Message.PostalCode; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + + foreach (var boxNumberPersistentLocalId in message.Message.BoxNumberPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + boxNumberPersistentLocalId, + address => + { + address.PostalCode = message.Message.PostalCode; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.PostalCode = message.Message.PostalCode; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + + foreach (var boxNumberPersistentLocalId in message.Message.BoxNumberPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + boxNumberPersistentLocalId, + address => + { + address.PostalCode = message.Message.PostalCode; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.HouseNumber = message.Message.HouseNumber; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsAfterAddressUpdate: true); + + foreach (var boxNumberPersistentLocalId in message.Message.BoxNumberPersistentLocalIds) + { + await context.FindAndUpdateAddressDetailV2( + boxNumberPersistentLocalId, + address => + { + address.HouseNumber = message.Message.HouseNumber; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsAfterAddressUpdate: true); + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.BoxNumber = message.Message.BoxNumber; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.PositionMethod = ConvertGeometryMethodToString(message.Message.GeometryMethod); + address.PositionSpecification = ConvertGeometrySpecificationToString(message.Message.GeometrySpecification); + address.SetPosition(ParsePosition(message.Message.ExtendedWkbGeometry)); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true, + allowUpdateRemovedAddress: true); + + var wmsItemV2 = await context.FindAddressDetailV2(message.Message.AddressPersistentLocalId, ct); + + if (wmsItemV2.ParentAddressPersistentLocalId.HasValue) + { + var parent = await context.FindAddressDetailV2(wmsItemV2.ParentAddressPersistentLocalId.Value, ct); + if (parent.Position == wmsItemV2.Position) + { + await context.FindAndUpdateAddressDetailV2( + wmsItemV2.ParentAddressPersistentLocalId.Value, + address => { address.LabelType = WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false); + } + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.PositionMethod = ConvertGeometryMethodToString(message.Message.GeometryMethod); + address.PositionSpecification = ConvertGeometrySpecificationToString(message.Message.GeometrySpecification); + address.SetPosition(ParsePosition(message.Message.ExtendedWkbGeometry)); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true, + allowUpdateRemovedAddress: true); + + var wmsItemV2 = await context.FindAddressDetailV2(message.Message.AddressPersistentLocalId, ct); + + if (wmsItemV2.ParentAddressPersistentLocalId.HasValue) + { + var parent = await context.FindAddressDetailV2(wmsItemV2.ParentAddressPersistentLocalId.Value, ct); + if (parent.Position == wmsItemV2.Position) + { + await context.FindAndUpdateAddressDetailV2( + wmsItemV2.ParentAddressPersistentLocalId.Value, + address => { address.LabelType = WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false); + } + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(message.Message.ReaddressedHouseNumber.SourceStatus); + address.HouseNumber = message.Message.ReaddressedHouseNumber.DestinationHouseNumber; + address.PostalCode = message.Message.ReaddressedHouseNumber.SourcePostalCode; + address.OfficiallyAssigned = message.Message.ReaddressedHouseNumber.SourceIsOfficiallyAssigned; + address.PositionMethod = ConvertGeometryMethodToString(message.Message.ReaddressedHouseNumber.SourceGeometryMethod); + address.PositionSpecification = + ConvertGeometrySpecificationToString(message.Message.ReaddressedHouseNumber.SourceGeometrySpecification); + address.SetPosition(ParsePosition(message.Message.ReaddressedHouseNumber.SourceExtendedWkbGeometry)); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + + foreach (var readdressedBoxNumber in message.Message.ReaddressedBoxNumbers) + { + await context.FindAndUpdateAddressDetailV2( + readdressedBoxNumber.DestinationAddressPersistentLocalId, + address => + { + address.Status = MapStatus(readdressedBoxNumber.SourceStatus); + address.HouseNumber = readdressedBoxNumber.DestinationHouseNumber; + address.BoxNumber = readdressedBoxNumber.SourceBoxNumber; + address.PostalCode = readdressedBoxNumber.SourcePostalCode; + address.OfficiallyAssigned = readdressedBoxNumber.SourceIsOfficiallyAssigned; + address.PositionMethod = ConvertGeometryMethodToString(readdressedBoxNumber.SourceGeometryMethod); + address.PositionSpecification = ConvertGeometrySpecificationToString(readdressedBoxNumber.SourceGeometrySpecification); + address.SetPosition(ParsePosition(readdressedBoxNumber.SourceExtendedWkbGeometry)); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + } + }); + + When>(async (context, message, ct) => + { + var addressWmsItem = new AddressWmsItemV2( + message.Message.AddressPersistentLocalId, + message.Message.ParentPersistentLocalId, + message.Message.StreetNamePersistentLocalId, + message.Message.PostalCode, + message.Message.HouseNumber, + message.Message.BoxNumber, + MapStatus(AddressStatus.Proposed), + officiallyAssigned: true, + ParsePosition(message.Message.ExtendedWkbGeometry), + ConvertGeometryMethodToString(message.Message.GeometryMethod), + ConvertGeometrySpecificationToString(message.Message.GeometrySpecification), + removed: false, + message.Message.Provenance.Timestamp); + + await context.UpdateHouseNumberLabelsV2(addressWmsItem, ct, includeAddressInUpdate: true); + + await context + .AddressWmsItemsV2 + .AddAsync(addressWmsItem, ct); + + if (message.Message.ParentPersistentLocalId.HasValue) + { + var parent = await context.FindAddressDetailV2(message.Message.ParentPersistentLocalId.Value, ct); + if (parent.Position == addressWmsItem.Position) + { + await context.FindAndUpdateAddressDetailV2( + message.Message.ParentPersistentLocalId.Value, + address => { address.LabelType = WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition; }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, + updateHouseNumberLabelsAfterAddressUpdate: false); + } + } + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Rejected); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Status = MapStatus(AddressStatus.Retired); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + updateHouseNumberLabelsAfterAddressUpdate: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Removed = true; + address.SetHouseNumberLabel(null); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + allowUpdateRemovedAddress: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Removed = true; + address.SetHouseNumberLabel(null); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + allowUpdateRemovedAddress: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.Removed = true; + address.SetHouseNumberLabel(null); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: true, + allowUpdateRemovedAddress: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.OfficiallyAssigned = false; + address.Status = MapStatus(AddressStatus.Current); + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, // TODO: review + allowUpdateRemovedAddress: true); + }); + + When>(async (context, message, ct) => + { + await context.FindAndUpdateAddressDetailV2( + message.Message.AddressPersistentLocalId, + address => + { + address.OfficiallyAssigned = true; + UpdateVersionTimestamp(address, message.Message.Provenance.Timestamp); + }, + ct, + updateHouseNumberLabelsBeforeAddressUpdate: false, // TODO: review + allowUpdateRemovedAddress: true); + }); + } + + private static void UpdateVersionTimestamp(AddressWmsItemV2 addressWmsItem, Instant versionTimestamp) + => addressWmsItem.VersionTimestamp = versionTimestamp; + + private static void UpdateVersionTimestampIfNewer(AddressWmsItemV2 addressWmsItem, Instant versionTimestamp) + { + if (versionTimestamp > addressWmsItem.VersionTimestamp) + { + addressWmsItem.VersionTimestamp = versionTimestamp; + } + } + + public static string MapStatus(AddressStatus status) + { + return status switch + { + AddressStatus.Proposed => AdresStatusVoorgesteld, + AddressStatus.Current => AdresStatusInGebruik, + AddressStatus.Retired => AdresStatusGehistoreerd, + AddressStatus.Rejected => AdresStatusAfgekeurd, + _ => throw new ArgumentOutOfRangeException(nameof(status), status, null) + }; + } + + private Point ParsePosition(string extendedWkbGeometry) + => (Point)_wkbReader.Read(extendedWkbGeometry.ToByteArray()); + + public static string ConvertGeometryMethodToString(GeometryMethod method) => + MapGeometryMethodToPositieGeometrieMethode(method) + .ToString() + .Replace("Geinterpoleerd", "Geïnterpoleerd"); + + private static PositieGeometrieMethode MapGeometryMethodToPositieGeometrieMethode( + GeometryMethod geometryMethod) + { + return geometryMethod switch + { + GeometryMethod.Interpolated => PositieGeometrieMethode.Geinterpoleerd, + GeometryMethod.AppointedByAdministrator => PositieGeometrieMethode.AangeduidDoorBeheerder, + GeometryMethod.DerivedFromObject => PositieGeometrieMethode.AfgeleidVanObject, + _ => throw new ArgumentOutOfRangeException(nameof(geometryMethod), geometryMethod, null) + }; + } + + public static string ConvertGeometrySpecificationToString(GeometrySpecification specification) => + MapGeometrySpecificationToPositieSpecificatie(specification).ToString(); + + private static PositieSpecificatie MapGeometrySpecificationToPositieSpecificatie( + GeometrySpecification geometrySpecification) + { + return geometrySpecification switch + { + GeometrySpecification.Municipality => PositieSpecificatie.Gemeente, + GeometrySpecification.Street => PositieSpecificatie.Straat, + GeometrySpecification.Parcel => PositieSpecificatie.Perceel, + GeometrySpecification.Lot => PositieSpecificatie.Lot, + GeometrySpecification.Stand => PositieSpecificatie.Standplaats, + GeometrySpecification.Berth => PositieSpecificatie.Ligplaats, + GeometrySpecification.Building => PositieSpecificatie.Gebouw, + GeometrySpecification.BuildingUnit => PositieSpecificatie.Gebouweenheid, + GeometrySpecification.Entry => PositieSpecificatie.Ingang, + GeometrySpecification.RoadSegment => PositieSpecificatie.Wegsegment, + _ => throw new ArgumentOutOfRangeException(nameof(geometrySpecification), geometrySpecification, null) + }; + } + } +} diff --git a/src/AddressRegistry.Projections.Wms/WmsContext.cs b/src/AddressRegistry.Projections.Wms/WmsContext.cs index 73ecd10e7..daf61b33b 100755 --- a/src/AddressRegistry.Projections.Wms/WmsContext.cs +++ b/src/AddressRegistry.Projections.Wms/WmsContext.cs @@ -12,6 +12,8 @@ public class WmsContext : RunnerDbContext public DbSet AddressDetail { get; set; } public DbSet AddressWmsItems { get; set; } + public DbSet AddressWmsItemsV2 { get; set; } + public DbSet Get() where T : class, new() { if (typeof(T) == typeof(AddressDetailItem)) diff --git a/src/AddressRegistry.Projector/Infrastructure/Modules/ApiModule.cs b/src/AddressRegistry.Projector/Infrastructure/Modules/ApiModule.cs index c79e120d9..b8fc0acf9 100755 --- a/src/AddressRegistry.Projector/Infrastructure/Modules/ApiModule.cs +++ b/src/AddressRegistry.Projector/Infrastructure/Modules/ApiModule.cs @@ -1,6 +1,5 @@ namespace AddressRegistry.Projector.Infrastructure.Modules { - using System; using AddressRegistry.Infrastructure; using AddressRegistry.Projections.Extract; using AddressRegistry.Projections.Extract.AddressCrabHouseNumberIdExtract; @@ -16,7 +15,10 @@ namespace AddressRegistry.Projector.Infrastructure.Modules using AddressRegistry.Projections.Legacy.AddressSyndication; using AddressRegistry.Projections.Legacy.CrabIdToPersistentLocalId; using AddressRegistry.Projections.Wfs; + using AddressRegistry.Projections.Wfs.AddressWfs; using AddressRegistry.Projections.Wms; + using AddressRegistry.Projections.Wms.AddressWmsItem; + using AddressRegistry.Projections.Wms.AddressWmsItemV2; using Autofac; using Autofac.Extensions.DependencyInjection; using Be.Vlaanderen.Basisregisters.Api.Exceptions; @@ -37,13 +39,13 @@ namespace AddressRegistry.Projector.Infrastructure.Modules using Microsoft.Extensions.Options; using NetTopologySuite.IO; using SqlStreamStore; + using LastChangedListContextMigrationFactory = AddressRegistry.Projections.LastChangedList.LastChangedListContextMigrationFactory; public class ApiModule : Module { private readonly IConfiguration _configuration; private readonly IServiceCollection _services; private readonly ILoggerFactory _loggerFactory; - private readonly bool _useProjectionsV2; public ApiModule( IConfiguration configuration, @@ -53,7 +55,6 @@ public ApiModule( _configuration = configuration; _services = services; _loggerFactory = loggerFactory; - _useProjectionsV2 = Convert.ToBoolean(_configuration.GetSection(FeatureToggleOptions.ConfigurationKey)[nameof(FeatureToggleOptions.UseProjectionsV2)]); } protected override void Load(ContainerBuilder builder) @@ -83,22 +84,12 @@ private void RegisterProjectionSetup(ContainerBuilder builder) RegisterLastChangedProjections(builder); - if (_useProjectionsV2) - { - RegisterExtractProjectionsV2(builder); - RegisterLegacyProjectionsV2(builder); - RegisterWfsProjectionsV2(builder); - RegisterWmsProjectionsV2(builder); - // RegisterWfsProjections(builder); //TODO: Remove when Wfs has been filled in staging - // RegisterWmsProjections(builder); //TODO: Remove when Wms has been filled in staging - } - else - { - RegisterExtractProjections(builder); - RegisterLegacyProjections(builder); - RegisterWfsProjections(builder); - RegisterWmsProjections(builder); - } + RegisterExtractProjectionsV2(builder); + RegisterLegacyProjectionsV2(builder); + RegisterWfsProjectionsV2(builder); + RegisterWmsProjectionsV2(builder); + // RegisterWfsProjections(builder); //TODO: Remove when Wfs has been filled in staging + // RegisterWmsProjections(builder); //TODO: Remove when Wms has been filled in staging } private void RegisterExtractProjections(ContainerBuilder builder) @@ -114,7 +105,8 @@ private void RegisterExtractProjections(ContainerBuilder builder) _configuration, _loggerFactory) .RegisterProjections( - context => new AddressExtractProjection(context.Resolve>(), DbaseCodePage.Western_European_ANSI.ToEncoding(), new WKBReader()), + context => new AddressExtractProjection(context.Resolve>(), + DbaseCodePage.Western_European_ANSI.ToEncoding(), new WKBReader()), ConnectedProjectionSettings.Default) .RegisterProjections( context => new AddressCrabHouseNumberIdExtractProjection(DbaseCodePage.Western_European_ANSI.ToEncoding()), @@ -162,7 +154,7 @@ private void RegisterLastChangedProjections(ContainerBuilder builder) _loggerFactory)); builder - .RegisterProjectionMigrator( + .RegisterProjectionMigrator( _configuration, _loggerFactory) .RegisterProjectionMigrator( @@ -235,10 +227,9 @@ private void RegisterWfsProjections(ContainerBuilder builder) .RegisterProjectionMigrator( _configuration, _loggerFactory) - - .RegisterProjections(() => - new AddressRegistry.Projections.Wfs.AddressDetail.AddressDetailProjections(WKBReaderFactory.CreateForLegacy()), - wfsProjectionSettings); + .RegisterProjections(() => + new AddressRegistry.Projections.Wfs.AddressDetail.AddressDetailProjections(WKBReaderFactory.CreateForLegacy()), + wfsProjectionSettings); } private void RegisterWfsProjectionsV2(ContainerBuilder builder) @@ -258,9 +249,8 @@ private void RegisterWfsProjectionsV2(ContainerBuilder builder) .RegisterProjectionMigrator( _configuration, _loggerFactory) - - .RegisterProjections(() => - new AddressRegistry.Projections.Wfs.AddressWfs.AddressWfsProjections(WKBReaderFactory.CreateForLegacy()), + .RegisterProjections(() => + new AddressWfsProjections(WKBReaderFactory.CreateForLegacy()), wfsProjectionSettings); } @@ -281,10 +271,9 @@ private void RegisterWmsProjections(ContainerBuilder builder) .RegisterProjectionMigrator( _configuration, _loggerFactory) - - .RegisterProjections(() => - new AddressRegistry.Projections.Wms.AddressDetail.AddressDetailProjections(WKBReaderFactory.CreateForLegacy()), - wmsProjectionSettings); + .RegisterProjections(() => + new AddressRegistry.Projections.Wms.AddressDetail.AddressDetailProjections(WKBReaderFactory.CreateForLegacy()), + wmsProjectionSettings); } private void RegisterWmsProjectionsV2(ContainerBuilder builder) @@ -304,9 +293,11 @@ private void RegisterWmsProjectionsV2(ContainerBuilder builder) .RegisterProjectionMigrator( _configuration, _loggerFactory) - - .RegisterProjections(() => - new AddressRegistry.Projections.Wms.AddressWmsItem.AddressWmsItemProjections(WKBReaderFactory.CreateForLegacy()), + .RegisterProjections(() => + new AddressWmsItemProjections(WKBReaderFactory.CreateForLegacy()), + wmsProjectionSettings) + .RegisterProjections(() => + new AddressWmsItemV2Projections(WKBReaderFactory.CreateForLegacy()), wmsProjectionSettings); } } diff --git a/src/AddressRegistry.Projector/Infrastructure/Startup.cs b/src/AddressRegistry.Projector/Infrastructure/Startup.cs index bb018e9a3..d2e7052aa 100755 --- a/src/AddressRegistry.Projector/Infrastructure/Startup.cs +++ b/src/AddressRegistry.Projector/Infrastructure/Startup.cs @@ -1,10 +1,20 @@ namespace AddressRegistry.Projector.Infrastructure { + using System; + using System.Linq; + using System.Reflection; + using System.Threading; + using AddressRegistry.Infrastructure.Modules; + using AddressRegistry.Projections.Extract; + using AddressRegistry.Projections.Legacy; + using AddressRegistry.Projections.Wfs; + using AddressRegistry.Projections.Wms; using Autofac; using Autofac.Extensions.DependencyInjection; using Be.Vlaanderen.Basisregisters.Api; using Be.Vlaanderen.Basisregisters.DataDog.Tracing.Microsoft; using Be.Vlaanderen.Basisregisters.ProjectionHandling.LastChangedList; + using Be.Vlaanderen.Basisregisters.Projector.ConnectedProjections; using Configuration; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -12,21 +22,10 @@ namespace AddressRegistry.Projector.Infrastructure using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; - using Microsoft.Extensions.Logging; using Microsoft.Extensions.Hosting; - using Modules; - using AddressRegistry.Projections.Extract; - using AddressRegistry.Projections.Legacy; - using AddressRegistry.Projections.Wfs; - using AddressRegistry.Projections.Wms; - using System; - using System.Linq; - using System.Reflection; - using System.Threading; - using AddressRegistry.Infrastructure.Modules; - using Be.Vlaanderen.Basisregisters.Projector.ConnectedProjections; - using Microsoft.Extensions.Options; + using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; + using Modules; /// Represents the startup process for the application. public class Startup @@ -127,9 +126,7 @@ public IServiceProvider ConfigureServices(IServiceCollection services) } } }) - .Configure(_configuration.GetSection("Extract")) - .Configure(_configuration.GetSection(FeatureToggleOptions.ConfigurationKey)) - .AddSingleton(c => new UseProjectionsV2Toggle(c.GetRequiredService>().Value.UseProjectionsV2)); + .Configure(_configuration.GetSection("Extract")); var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterModule(new LoggingModule(_configuration, services)); diff --git a/src/AddressRegistry.Projector/Infrastructure/UseProjectionsV2Toggle.cs b/src/AddressRegistry.Projector/Infrastructure/UseProjectionsV2Toggle.cs deleted file mode 100644 index 021d9ed4f..000000000 --- a/src/AddressRegistry.Projector/Infrastructure/UseProjectionsV2Toggle.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace AddressRegistry.Projector.Infrastructure -{ - using FeatureToggle; - - public class FeatureToggleOptions - { - public const string ConfigurationKey = "FeatureToggles"; - public bool UseProjectionsV2 { get; set; } - } - - public class UseProjectionsV2Toggle : IFeatureToggle - { - public bool FeatureEnabled { get; } - - public UseProjectionsV2Toggle(bool featureEnabled) - { - FeatureEnabled = featureEnabled; - } - } -} diff --git a/src/AddressRegistry.Projector/appsettings.json b/src/AddressRegistry.Projector/appsettings.json index df05d8cfe..39b849760 100755 --- a/src/AddressRegistry.Projector/appsettings.json +++ b/src/AddressRegistry.Projector/appsettings.json @@ -17,10 +17,6 @@ "ConsumerStreetName": "Server=(localdb)\\mssqllocaldb;Database=EFProviders.InMemory.AddressRegistry;Trusted_Connection=True;TrustServerCertificate=True;" }, - "FeatureToggles": { - "UseProjectionsV2": false - }, - "DataDog": { "Enabled": true, "Debug": false, diff --git a/src/AddressRegistry/Address/Address.cs b/src/AddressRegistry/Address/Address.cs index 6eb70aad3..c8216c63d 100755 --- a/src/AddressRegistry/Address/Address.cs +++ b/src/AddressRegistry/Address/Address.cs @@ -16,6 +16,7 @@ namespace AddressRegistry.Address using Exceptions; using StreetName.Commands; + [Obsolete("This is a legacy class and should not be used anymore.")] public partial class Address : AggregateRootEntity { public static readonly Func
Factory = () => new Address(); diff --git a/src/AddressRegistry/Address/AddressPersistentLocalIdentifierProvenanceFactory.cs b/src/AddressRegistry/Address/AddressPersistentLocalIdentifierProvenanceFactory.cs index 9a0a17e46..723147c0e 100644 --- a/src/AddressRegistry/Address/AddressPersistentLocalIdentifierProvenanceFactory.cs +++ b/src/AddressRegistry/Address/AddressPersistentLocalIdentifierProvenanceFactory.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using NodaTime; + [Obsolete("This is a legacy class and should not be used anymore.")] public class AddressPersistentLocalIdentifierProvenanceFactory : IProvenanceFactory
{ private static readonly List AllowedTypes = new List diff --git a/src/AddressRegistry/Address/AddressProvenanceFactory.cs b/src/AddressRegistry/Address/AddressProvenanceFactory.cs index df9906302..8af7806e2 100755 --- a/src/AddressRegistry/Address/AddressProvenanceFactory.cs +++ b/src/AddressRegistry/Address/AddressProvenanceFactory.cs @@ -4,10 +4,11 @@ namespace AddressRegistry.Address using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using NodaTime; + [Obsolete("This is a legacy class and should not be used anymore.")] public class AddressProvenanceFactory : IProvenanceFactory
{ // TODO: Do we introduce an IHasProvenance? - public bool CanCreateFrom() => true; + public bool CanCreateFrom() => true; public Provenance CreateFrom( object provenanceHolder, diff --git a/src/AddressRegistry/Address/Commands/AssignPersistentLocalIdToAddress.cs b/src/AddressRegistry/Address/Commands/AssignPersistentLocalIdToAddress.cs index 528583406..f7f1ce217 100644 --- a/src/AddressRegistry/Address/Commands/AssignPersistentLocalIdToAddress.cs +++ b/src/AddressRegistry/Address/Commands/AssignPersistentLocalIdToAddress.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Commands using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class AssignPersistentLocalIdToAddress { private static readonly Guid Namespace = new Guid("213d9961-c1fc-4e3a-b512-29d0221b34ab"); diff --git a/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabHouseNumberId.cs b/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabHouseNumberId.cs index a6a122802..71f46ed87 100644 --- a/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabHouseNumberId.cs +++ b/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabHouseNumberId.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Commands.Crab using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class AssignPersistentLocalIdForCrabHouseNumberId { private static readonly Guid Namespace = new Guid("8a3f242c-0166-4f86-9b66-9aa3be98c9ba"); diff --git a/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabSubaddressId.cs b/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabSubaddressId.cs index d34fce284..233e4dfea 100644 --- a/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabSubaddressId.cs +++ b/src/AddressRegistry/Address/Commands/Crab/AssignPersistentLocalIdForCrabSubaddressId.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Commands.Crab using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class AssignPersistentLocalIdForCrabSubaddressId { private static readonly Guid Namespace = new Guid("044b1a30-de76-4be0-88db-3711c26e7174"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberFromCrab.cs index 70f741a5b..4ac0c6697 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportHouseNumberFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("47ebb853-2da6-4702-b6ca-643449e406a5"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberMailCantonFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberMailCantonFromCrab.cs index 3b11803db..bad4dcc2d 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberMailCantonFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberMailCantonFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportHouseNumberMailCantonFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("e5b51368-bd12-4ddc-95f3-4eebc3610301"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberPositionFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberPositionFromCrab.cs index 90e73c821..d0a6b527c 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberPositionFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberPositionFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportHouseNumberPositionFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("3c920a6f-516c-4ea7-b347-80182125ccd2"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberStatusFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberStatusFromCrab.cs index c24a7859d..19f84d3d4 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberStatusFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberStatusFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportHouseNumberStatusFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("573f7b70-a413-452b-a73d-a8839d9d02cd"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberSubaddressFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberSubaddressFromCrab.cs index cee862ffa..8a04d43d0 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberSubaddressFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportHouseNumberSubaddressFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportHouseNumberSubaddressFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("29e91891-8e7e-4e22-91ab-3608f6802b2b"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressFromCrab.cs index 0945d4a47..68fb2a458 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportSubaddressFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("dee3cd1e-93d7-42dd-9366-aa0d026fb0e4"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressMailCantonFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressMailCantonFromCrab.cs index ef817e68b..7bf254b1d 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressMailCantonFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressMailCantonFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportSubaddressMailCantonFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("c917db9e-5d35-4c62-8f11-e33ea8b52b78"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressPositionFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressPositionFromCrab.cs index 13bc83a3f..c21a41b06 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressPositionFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressPositionFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportSubaddressPositionFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("3ce00426-6093-4845-bd56-5c1df125be0c"); diff --git a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressStatusFromCrab.cs b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressStatusFromCrab.cs index ccb63fa9a..125fc300a 100644 --- a/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressStatusFromCrab.cs +++ b/src/AddressRegistry/Address/Commands/Crab/ImportSubaddressStatusFromCrab.cs @@ -7,6 +7,7 @@ namespace AddressRegistry.Address.Commands.Crab using System.Collections.Generic; using AddressRegistry.Address.Crab; + [Obsolete("This is a legacy command and should not be used anymore.")] public class ImportSubaddressStatusFromCrab : BaseCrabCommand { private static readonly Guid Namespace = new Guid("219b9413-8a8b-462c-9e14-3c84047afd62"); diff --git a/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabHouseNumberId.cs b/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabHouseNumberId.cs index 39582899a..fb1a9a7f9 100644 --- a/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabHouseNumberId.cs +++ b/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabHouseNumberId.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Commands.Crab using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class RequestPersistentLocalIdForCrabHouseNumberId { private static readonly Guid Namespace = new Guid("e07178dc-249a-425b-84a5-d065af8a84cc"); diff --git a/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabSubaddressId.cs b/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabSubaddressId.cs index 3f360ed3d..96ba98c74 100644 --- a/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabSubaddressId.cs +++ b/src/AddressRegistry/Address/Commands/Crab/RequestPersistentLocalIdForCrabSubaddressId.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Commands.Crab using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class RequestPersistentLocalIdForCrabSubaddressId { private static readonly Guid Namespace = new Guid("652158db-2e78-423b-8b46-df0eceb9bd65"); diff --git a/src/AddressRegistry/Address/Commands/MarkAddressAsMigrated.cs b/src/AddressRegistry/Address/Commands/MarkAddressAsMigrated.cs index 39737e012..ac22b2c91 100644 --- a/src/AddressRegistry/Address/Commands/MarkAddressAsMigrated.cs +++ b/src/AddressRegistry/Address/Commands/MarkAddressAsMigrated.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Commands using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Be.Vlaanderen.Basisregisters.Utilities; + [Obsolete("This is a legacy command and should not be used anymore.")] public class MarkAddressAsMigrated : IHasCommandProvenance { private static readonly Guid Namespace = new Guid("1ac91a48-f860-4fe1-a4cd-10bf2daf8421"); diff --git a/src/AddressRegistry/Address/Commands/RegisterAddress.cs b/src/AddressRegistry/Address/Commands/RegisterAddress.cs index dea6001e3..803e0bc30 100755 --- a/src/AddressRegistry/Address/Commands/RegisterAddress.cs +++ b/src/AddressRegistry/Address/Commands/RegisterAddress.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Commands using System; using System.Collections.Generic; + [Obsolete("This is a legacy command and should not be used anymore.")] public class RegisterAddress { private static readonly Guid Namespace = new Guid("67f3e429-515e-47e1-bf44-d6c6970b88e7"); diff --git a/src/AddressRegistry/Address/CrabAddressCommandHandlerModule.cs b/src/AddressRegistry/Address/CrabAddressCommandHandlerModule.cs index d2f032b4b..ea3eaf35c 100644 --- a/src/AddressRegistry/Address/CrabAddressCommandHandlerModule.cs +++ b/src/AddressRegistry/Address/CrabAddressCommandHandlerModule.cs @@ -13,6 +13,7 @@ namespace AddressRegistry.Address using NodaTime; using SqlStreamStore; + [Obsolete("This is a legacy commandhandler and should not be used anymore.")] public sealed class CrabAddressCommandHandlerModule : CommandHandlerModule { private readonly IPersistentLocalIdGenerator _persistentLocalIdGenerator; diff --git a/src/AddressRegistry/Address/CrabAddressPositionComparer.cs b/src/AddressRegistry/Address/CrabAddressPositionComparer.cs index 8a6751466..9a8239c60 100755 --- a/src/AddressRegistry/Address/CrabAddressPositionComparer.cs +++ b/src/AddressRegistry/Address/CrabAddressPositionComparer.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.Crab; using System.Collections.Generic; + [Obsolete("This is a legacy class and should not be used anymore.")] public class CrabAddressPositionComparer : IComparer { private readonly Dictionary _addressPositionQualityByOrigins = new Dictionary diff --git a/src/AddressRegistry/Address/CrabAddressProvenanceFactory.cs b/src/AddressRegistry/Address/CrabAddressProvenanceFactory.cs index b30ee6b1c..f6b74e479 100644 --- a/src/AddressRegistry/Address/CrabAddressProvenanceFactory.cs +++ b/src/AddressRegistry/Address/CrabAddressProvenanceFactory.cs @@ -3,6 +3,7 @@ namespace AddressRegistry.Address using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using System; + [Obsolete("This is a legacy class and should not be used anymore.")] public class CrabAddressProvenanceFactory : CrabProvenanceFactory, IProvenanceFactory
{ public bool CanCreateFrom() => typeof(IHasCrabProvenance).IsAssignableFrom(typeof(TCommand)); diff --git a/src/AddressRegistry/Address/Events/AddressBecameComplete.cs b/src/AddressRegistry/Address/Events/AddressBecameComplete.cs index 3358f1213..ee5cd0649 100755 --- a/src/AddressRegistry/Address/Events/AddressBecameComplete.cs +++ b/src/AddressRegistry/Address/Events/AddressBecameComplete.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBecameComplete")] [EventDescription("Het adres voldoet aan het informatiemodel (wegens volledig).")] diff --git a/src/AddressRegistry/Address/Events/AddressBecameCurrent.cs b/src/AddressRegistry/Address/Events/AddressBecameCurrent.cs index 93ad45f61..372110b7d 100755 --- a/src/AddressRegistry/Address/Events/AddressBecameCurrent.cs +++ b/src/AddressRegistry/Address/Events/AddressBecameCurrent.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBecameCurrent")] [EventDescription("Het adres kreeg status 'in gebruik'.")] diff --git a/src/AddressRegistry/Address/Events/AddressBecameIncomplete.cs b/src/AddressRegistry/Address/Events/AddressBecameIncomplete.cs index b110096df..c120eb338 100755 --- a/src/AddressRegistry/Address/Events/AddressBecameIncomplete.cs +++ b/src/AddressRegistry/Address/Events/AddressBecameIncomplete.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBecameIncomplete")] [EventDescription("Het adres voldoet niet meer aan het informatiemodel (wegens niet volledig).")] diff --git a/src/AddressRegistry/Address/Events/AddressBecameNotOfficiallyAssigned.cs b/src/AddressRegistry/Address/Events/AddressBecameNotOfficiallyAssigned.cs index 213c885f0..c3ec0981a 100755 --- a/src/AddressRegistry/Address/Events/AddressBecameNotOfficiallyAssigned.cs +++ b/src/AddressRegistry/Address/Events/AddressBecameNotOfficiallyAssigned.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBecameNotOfficiallyAssigned")] [EventDescription("Het adres kreeg aanduiding 'niet officieel toegekend'.")] diff --git a/src/AddressRegistry/Address/Events/AddressBoxNumberWasChanged.cs b/src/AddressRegistry/Address/Events/AddressBoxNumberWasChanged.cs index 1bd2be820..4a4eabaeb 100755 --- a/src/AddressRegistry/Address/Events/AddressBoxNumberWasChanged.cs +++ b/src/AddressRegistry/Address/Events/AddressBoxNumberWasChanged.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBoxNumberWasChanged")] [EventDescription("Het busnummer van het adres werd gewijzigd.")] diff --git a/src/AddressRegistry/Address/Events/AddressBoxNumberWasCorrected.cs b/src/AddressRegistry/Address/Events/AddressBoxNumberWasCorrected.cs index 36929f297..a4eceaaa5 100755 --- a/src/AddressRegistry/Address/Events/AddressBoxNumberWasCorrected.cs +++ b/src/AddressRegistry/Address/Events/AddressBoxNumberWasCorrected.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBoxNumberWasCorrected")] [EventDescription("Het busnummer van het adres werd gecorrigeerd.")] diff --git a/src/AddressRegistry/Address/Events/AddressBoxNumberWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressBoxNumberWasRemoved.cs index 17056c9ca..20c5ff856 100755 --- a/src/AddressRegistry/Address/Events/AddressBoxNumberWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressBoxNumberWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressBoxNumberWasRemoved")] [EventDescription("Het busnummer van het adres werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressHouseNumberWasChanged.cs b/src/AddressRegistry/Address/Events/AddressHouseNumberWasChanged.cs index fd5b2f0ea..ac174e850 100755 --- a/src/AddressRegistry/Address/Events/AddressHouseNumberWasChanged.cs +++ b/src/AddressRegistry/Address/Events/AddressHouseNumberWasChanged.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressHouseNumberWasChanged")] [EventDescription("Het huisnummer van het adres werd gewijzigd.")] diff --git a/src/AddressRegistry/Address/Events/AddressHouseNumberWasCorrected.cs b/src/AddressRegistry/Address/Events/AddressHouseNumberWasCorrected.cs index ea6b6b25b..f46882a70 100755 --- a/src/AddressRegistry/Address/Events/AddressHouseNumberWasCorrected.cs +++ b/src/AddressRegistry/Address/Events/AddressHouseNumberWasCorrected.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressHouseNumberWasCorrected")] [EventDescription("Het huisnummer van het adres werd gecorrigeerd.")] diff --git a/src/AddressRegistry/Address/Events/AddressOfficialAssignmentWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressOfficialAssignmentWasRemoved.cs index 057778e4b..626816756 100755 --- a/src/AddressRegistry/Address/Events/AddressOfficialAssignmentWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressOfficialAssignmentWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressOfficialAssignmentWasRemoved")] [EventDescription("De aanduiding 'officieel toegekend' van het adres werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressPersistentLocalIdWasAssigned.cs b/src/AddressRegistry/Address/Events/AddressPersistentLocalIdWasAssigned.cs index 6908afe8b..b1ede5d32 100644 --- a/src/AddressRegistry/Address/Events/AddressPersistentLocalIdWasAssigned.cs +++ b/src/AddressRegistry/Address/Events/AddressPersistentLocalIdWasAssigned.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Events using System; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPersistentLocalIdentifierWasAssigned")] [EventDescription("Het adres kreeg een persistente lokale identificator toegekend.")] diff --git a/src/AddressRegistry/Address/Events/AddressPositionWasCorrected.cs b/src/AddressRegistry/Address/Events/AddressPositionWasCorrected.cs index 58e0c5b80..393f30548 100755 --- a/src/AddressRegistry/Address/Events/AddressPositionWasCorrected.cs +++ b/src/AddressRegistry/Address/Events/AddressPositionWasCorrected.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPositionWasCorrected")] [EventDescription("De adrespositie werd gecorrigeerd.")] diff --git a/src/AddressRegistry/Address/Events/AddressPositionWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressPositionWasRemoved.cs index 3eeaa5a83..256ae9065 100755 --- a/src/AddressRegistry/Address/Events/AddressPositionWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressPositionWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPositionWasRemoved")] [EventDescription("De adrespositie werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressPostalCodeWasChanged.cs b/src/AddressRegistry/Address/Events/AddressPostalCodeWasChanged.cs index a51e13c59..71e6a308c 100755 --- a/src/AddressRegistry/Address/Events/AddressPostalCodeWasChanged.cs +++ b/src/AddressRegistry/Address/Events/AddressPostalCodeWasChanged.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPostalCodeWasChanged")] [EventDescription("De postcode van het adres werd gewijzigd.")] diff --git a/src/AddressRegistry/Address/Events/AddressPostalCodeWasCorrected.cs b/src/AddressRegistry/Address/Events/AddressPostalCodeWasCorrected.cs index d36f51dd1..f342b1ae1 100755 --- a/src/AddressRegistry/Address/Events/AddressPostalCodeWasCorrected.cs +++ b/src/AddressRegistry/Address/Events/AddressPostalCodeWasCorrected.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPostalCodeWasCorrected")] [EventDescription("De postcode van het adres werd gecorrigeerd.")] diff --git a/src/AddressRegistry/Address/Events/AddressPostalCodeWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressPostalCodeWasRemoved.cs index 498833d87..a840b10d0 100755 --- a/src/AddressRegistry/Address/Events/AddressPostalCodeWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressPostalCodeWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressPostalCodeWasRemoved")] [EventDescription("De postcode van het adres werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressStatusWasCorrectedToRemoved.cs b/src/AddressRegistry/Address/Events/AddressStatusWasCorrectedToRemoved.cs index 092791b61..65ef898a3 100755 --- a/src/AddressRegistry/Address/Events/AddressStatusWasCorrectedToRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressStatusWasCorrectedToRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressStatusWasCorrectedToRemoved")] [EventDescription("De adresstatus werd verwijderd (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressStatusWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressStatusWasRemoved.cs index 43bb9c1c4..7d9aed196 100755 --- a/src/AddressRegistry/Address/Events/AddressStatusWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressStatusWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressStatusWasRemoved")] [EventDescription("De adresstatus werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressStreetNameWasChanged.cs b/src/AddressRegistry/Address/Events/AddressStreetNameWasChanged.cs index feac7c11c..8108baa4a 100755 --- a/src/AddressRegistry/Address/Events/AddressStreetNameWasChanged.cs +++ b/src/AddressRegistry/Address/Events/AddressStreetNameWasChanged.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressStreetNameWasChanged")] [EventDescription("Het adres werd aan een andere straatnaam toegekend.")] diff --git a/src/AddressRegistry/Address/Events/AddressStreetNameWasCorrected.cs b/src/AddressRegistry/Address/Events/AddressStreetNameWasCorrected.cs index 7f92ac314..809442dec 100755 --- a/src/AddressRegistry/Address/Events/AddressStreetNameWasCorrected.cs +++ b/src/AddressRegistry/Address/Events/AddressStreetNameWasCorrected.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressStreetNameWasCorrected")] [EventDescription("Het adres werd aan een andere straatnaam toegekend (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasCorrectedToCurrent.cs b/src/AddressRegistry/Address/Events/AddressWasCorrectedToCurrent.cs index 5b394b87d..63a1831ba 100755 --- a/src/AddressRegistry/Address/Events/AddressWasCorrectedToCurrent.cs +++ b/src/AddressRegistry/Address/Events/AddressWasCorrectedToCurrent.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasCorrectedToCurrent")] [EventDescription("Het adres kreeg status 'in gebruik' (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasCorrectedToNotOfficiallyAssigned.cs b/src/AddressRegistry/Address/Events/AddressWasCorrectedToNotOfficiallyAssigned.cs index fd571d88d..2d42b570c 100755 --- a/src/AddressRegistry/Address/Events/AddressWasCorrectedToNotOfficiallyAssigned.cs +++ b/src/AddressRegistry/Address/Events/AddressWasCorrectedToNotOfficiallyAssigned.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasCorrectedToNotOfficiallyAssigned")] [EventDescription("Het adres kreeg aanduiding 'niet officieel toegekend' (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasCorrectedToOfficiallyAssigned.cs b/src/AddressRegistry/Address/Events/AddressWasCorrectedToOfficiallyAssigned.cs index c17e0754a..d0893140b 100755 --- a/src/AddressRegistry/Address/Events/AddressWasCorrectedToOfficiallyAssigned.cs +++ b/src/AddressRegistry/Address/Events/AddressWasCorrectedToOfficiallyAssigned.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasCorrectedToOfficiallyAssigned")] [EventDescription("Het adres kreeg aanduiding 'officieel toegekend' (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasCorrectedToProposed.cs b/src/AddressRegistry/Address/Events/AddressWasCorrectedToProposed.cs index 55891e108..99191f0c4 100755 --- a/src/AddressRegistry/Address/Events/AddressWasCorrectedToProposed.cs +++ b/src/AddressRegistry/Address/Events/AddressWasCorrectedToProposed.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasCorrectedToProposed")] [EventDescription("Het adres kreeg status 'voorgesteld' (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasCorrectedToRetired.cs b/src/AddressRegistry/Address/Events/AddressWasCorrectedToRetired.cs index d4764bd6c..657182198 100755 --- a/src/AddressRegistry/Address/Events/AddressWasCorrectedToRetired.cs +++ b/src/AddressRegistry/Address/Events/AddressWasCorrectedToRetired.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasCorrectedToRetired")] [EventDescription("Het adres kreeg status 'gehistoreerd' (via correctie).")] diff --git a/src/AddressRegistry/Address/Events/AddressWasMigrated.cs b/src/AddressRegistry/Address/Events/AddressWasMigrated.cs index f3c7a338a..b66b76b9b 100644 --- a/src/AddressRegistry/Address/Events/AddressWasMigrated.cs +++ b/src/AddressRegistry/Address/Events/AddressWasMigrated.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Newtonsoft.Json; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasMigrated")] [EventDescription("Het adres werd gemigreerd.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasOfficiallyAssigned.cs b/src/AddressRegistry/Address/Events/AddressWasOfficiallyAssigned.cs index 6ca1933af..aebf8ea71 100755 --- a/src/AddressRegistry/Address/Events/AddressWasOfficiallyAssigned.cs +++ b/src/AddressRegistry/Address/Events/AddressWasOfficiallyAssigned.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasOfficiallyAssigned")] [EventDescription("Het adres kreeg aanduiding 'officieel toegekend'.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasPositioned.cs b/src/AddressRegistry/Address/Events/AddressWasPositioned.cs index ce117de70..91607a787 100755 --- a/src/AddressRegistry/Address/Events/AddressWasPositioned.cs +++ b/src/AddressRegistry/Address/Events/AddressWasPositioned.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasPositioned")] [EventDescription("De positie van het adres werd toegevoegd of gewijzigd.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasProposed.cs b/src/AddressRegistry/Address/Events/AddressWasProposed.cs index ac85cdaf5..4d2cea425 100755 --- a/src/AddressRegistry/Address/Events/AddressWasProposed.cs +++ b/src/AddressRegistry/Address/Events/AddressWasProposed.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasProposed")] [EventDescription("Het adres kreeg status 'voorgesteld'.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasRegistered.cs b/src/AddressRegistry/Address/Events/AddressWasRegistered.cs index 2a7468ce5..788ee6082 100755 --- a/src/AddressRegistry/Address/Events/AddressWasRegistered.cs +++ b/src/AddressRegistry/Address/Events/AddressWasRegistered.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using System; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasRegistered")] [EventDescription("Het adres werd aangemaakt in het register.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasRemoved.cs b/src/AddressRegistry/Address/Events/AddressWasRemoved.cs index e9a28eaed..0513d153f 100755 --- a/src/AddressRegistry/Address/Events/AddressWasRemoved.cs +++ b/src/AddressRegistry/Address/Events/AddressWasRemoved.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasRemoved")] [EventDescription("Het adres werd verwijderd.")] diff --git a/src/AddressRegistry/Address/Events/AddressWasRetired.cs b/src/AddressRegistry/Address/Events/AddressWasRetired.cs index 52d35356a..4ce776499 100755 --- a/src/AddressRegistry/Address/Events/AddressWasRetired.cs +++ b/src/AddressRegistry/Address/Events/AddressWasRetired.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address.Events using Newtonsoft.Json; using System; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventTags(EventTag.For.Sync)] [EventName("AddressWasRetired")] [EventDescription("Het adres kreeg status 'gehistoreerd'.")] diff --git a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberMailCantonWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberMailCantonWasImportedFromCrab.cs index 6cd554bb0..9fecf9524 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberMailCantonWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberMailCantonWasImportedFromCrab.cs @@ -1,42 +1,44 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressHouseNumberMailCantonWasImportedFromCrab")] [EventDescription("Legacy event om tblHuisNummer_postKanton en tblHuisNummer_postKanton_hist te importeren.")] public class AddressHouseNumberMailCantonWasImportedFromCrab : ICrabEvent, IHasCrabKey, IMessage { [EventPropertyDescription("CRAB-identificator van de relatie huisnummer-postkanton.")] public int HouseNumberMailCantonId { get; } - + [EventPropertyDescription("CRAB-identificator van het huisnummer.")] public int HouseNumberId { get; } - + [EventPropertyDescription("CRAB-identificator van het postkanton.")] public int MailCantonId { get; } - + [EventPropertyDescription("Postkantoncode.")] public string MailCantonCode { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } diff --git a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberPositionWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberPositionWasImportedFromCrab.cs index db63afa40..f688abb79 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberPositionWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberPositionWasImportedFromCrab.cs @@ -1,5 +1,6 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; @@ -7,40 +8,41 @@ namespace AddressRegistry.Address.Events.Crab using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressHouseNumberPositionWasImportedFromCrab")] [EventDescription("Legacy event om tblAdrespositie en tblAdrespositie_hist te importeren voor huisnummers.")] public class AddressHouseNumberPositionWasImportedFromCrab : ICrabEvent, IHasCrabPosition, IHasCrabKey, IMessage { [EventPropertyDescription("CRAB-identificator van de adrespositie.")] public int AddressPositionId { get; } - + [EventPropertyDescription("CRAB-identificator van het huisnummer.")] public int HouseNumberId { get; } - + [EventPropertyDescription("Adrespositie.")] public string AddressPosition { get; } - + [EventPropertyDescription("Herkomst van de adrespositie.")] public CrabAddressPositionOrigin AddressPositionOrigin { get; } - + [EventPropertyDescription("Aard van het adres waarvoor de positie werd aangemaakt.")] public string AddressNature { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } diff --git a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberStatusWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberStatusWasImportedFromCrab.cs index 94ce53064..cb256c474 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberStatusWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberStatusWasImportedFromCrab.cs @@ -1,39 +1,41 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressHouseNumberStatusWasImportedFromCrab")] [EventDescription("Legacy event om tblHuisnummerstatus en tblHuisnummerstatus_hist te importeren.")] public class AddressHouseNumberStatusWasImportedFromCrab : ICrabEvent, IHasCrabAddressStatus, IHasCrabKey, IMessage { [EventPropertyDescription("CRAB-identificator van de huisnummerstatus.")] public int HouseNumberStatusId { get; } - + [EventPropertyDescription("CRAB-identificator van het huisnummer.")] public int HouseNumberId { get; } - + [EventPropertyDescription("Huisnummerstatus.")] public CrabAddressStatus AddressStatus { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } diff --git a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberWasImportedFromCrab.cs index 7ae5c297a..91a2d96d1 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressHouseNumberWasImportedFromCrab.cs @@ -1,42 +1,44 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressHouseNumberWasImportedFromCrab")] [EventDescription("Legacy event om tblHuisnummer en tblHuisnummer_hist te importeren.")] public class AddressHouseNumberWasImportedFromCrab : IMessage { [EventPropertyDescription("CRAB-identificator van het huisnummer.")] public int HouseNumberId { get; } - + [EventPropertyDescription("CRAB-identificator van de straatnaam die deel uitmaakt van het adres.")] public int StreetNameId { get; } - + [EventPropertyDescription("Huisnummer van het adres.")] public string HouseNumber { get; } - + [EventPropertyDescription("GRB-notatie van het huisnummer.")] public string GrbNotation { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? Begin { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? End { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } diff --git a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressPositionWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressPositionWasImportedFromCrab.cs index 370b429b3..85fd531a6 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressPositionWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressPositionWasImportedFromCrab.cs @@ -1,5 +1,6 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; @@ -7,43 +8,44 @@ namespace AddressRegistry.Address.Events.Crab using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressSubaddressPositionWasImportedFromCrab")] [EventDescription("Legacy event om tblAdrespositie en tblAdrespositie_hist te importeren voor subadressen.")] public class AddressSubaddressPositionWasImportedFromCrab : ICrabEvent, IHasCrabPosition, IHasCrabKey, IMessage { [EventPropertyDescription("CRAB-identificator van de adrespositie.")] public int AddressPositionId { get; } - + [EventPropertyDescription("CRAB-identificator van het subadres (bus- of appartementsnummer).")] public int SubaddressId { get; } - + [EventPropertyDescription("Adrespositie.")] public string AddressPosition { get; } - + [EventPropertyDescription("Herkomst van de adrespositie.")] public CrabAddressPositionOrigin AddressPositionOrigin { get; } - + [EventPropertyDescription("Aard van het adres waarvoor de positie werd aangemaakt.")] public string AddressNature { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } - + [EventPropertyDescription("Unieke sleutel.")] public int Key => AddressPositionId; diff --git a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressStatusWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressStatusWasImportedFromCrab.cs index f2c03c07b..7e58d4036 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressStatusWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressStatusWasImportedFromCrab.cs @@ -1,42 +1,44 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressSubaddressStatusWasImportedFromCrab")] [EventDescription("Legacy event om tblSubadresstatus en tblSubadresstatus_hist te importeren.")] public class AddressSubaddressStatusWasImportedFromCrab : ICrabEvent, IHasCrabAddressStatus, IHasCrabKey, IMessage { [EventPropertyDescription("CRAB-identificator van de subadresstatus.")] public int SubaddressStatusId { get; } - + [EventPropertyDescription("CRAB-identificator van het subadres (bus- of appartementsnummer).")] public int SubaddressId { get; } - + [EventPropertyDescription("Subadresstatus.")] public CrabAddressStatus AddressStatus { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } - + [EventPropertyDescription("Unieke sleutel.")] public int Key => SubaddressStatusId; diff --git a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressWasImportedFromCrab.cs b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressWasImportedFromCrab.cs index 242a99d57..a940563d2 100755 --- a/src/AddressRegistry/Address/Events/Crab/AddressSubaddressWasImportedFromCrab.cs +++ b/src/AddressRegistry/Address/Events/Crab/AddressSubaddressWasImportedFromCrab.cs @@ -1,42 +1,44 @@ namespace AddressRegistry.Address.Events.Crab { + using System; using AddressRegistry.Address.Crab; using Be.Vlaanderen.Basisregisters.Crab; using Be.Vlaanderen.Basisregisters.EventHandling; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy event and should not be used anymore.")] [EventName("AddressSubaddressWasImportedFromCrab")] [EventDescription("Legacy event om tblSubAdres en tblSubAdres_hist te importeren.")] public class AddressSubaddressWasImportedFromCrab : IMessage { [EventPropertyDescription("CRAB-identificator van het subadres (bus- of appartementsnummer).")] public int SubaddressId { get; } - + [EventPropertyDescription("CRAB-identificator van het huisnummer.")] public int HouseNumberId { get; } - + [EventPropertyDescription("Aanduiding gebruikt voor het subadres.")] public string BoxNumber { get; } - + [EventPropertyDescription("Aard van het subadres.")] public string BoxNumberType { get; } - + [EventPropertyDescription("Datum waarop het object is ontstaan in werkelijkheid.")] public LocalDateTime? BeginDateTime { get; } - + [EventPropertyDescription("Datum waarop het object in werkelijkheid ophoudt te bestaan.")] public LocalDateTime? EndDateTime { get; } - - [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Tijdstip waarop het object werd ingevoerd in de databank.")] public Instant Timestamp { get; } - + [EventPropertyDescription("Operator door wie het object werd ingevoerd in de databank.")] public string Operator { get; } - - [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] + + [EventPropertyDescription("Bewerking waarmee het object werd ingevoerd in de databank.")] public CrabModification? Modification { get; } - + [EventPropertyDescription("Organisatie die het object heeft ingevoerd in de databank.")] public CrabOrganisation? Organisation { get; } diff --git a/src/AddressRegistry/Address/Exceptions/AddressRemovedException.cs b/src/AddressRegistry/Address/Exceptions/AddressRemovedException.cs index 262b11237..9b5e93e92 100644 --- a/src/AddressRegistry/Address/Exceptions/AddressRemovedException.cs +++ b/src/AddressRegistry/Address/Exceptions/AddressRemovedException.cs @@ -3,6 +3,7 @@ namespace AddressRegistry.Address.Exceptions using System; using System.Runtime.Serialization; + [Obsolete("This is a legacy class and should not be used anymore.")] [Serializable] public sealed class AddressRemovedException : AddressRegistryException { @@ -12,7 +13,7 @@ public AddressRemovedException() private AddressRemovedException(SerializationInfo info, StreamingContext context) : base(info, context) { } - + public AddressRemovedException(string message) : base(message) { } diff --git a/src/AddressRegistry/Address/IAddresses.cs b/src/AddressRegistry/Address/IAddresses.cs index 1277bf955..667bcd6b0 100755 --- a/src/AddressRegistry/Address/IAddresses.cs +++ b/src/AddressRegistry/Address/IAddresses.cs @@ -1,6 +1,8 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; + [Obsolete("This is a legacy interface and should not be used anymore.")] public interface IAddresses : IAsyncRepository { } } diff --git a/src/AddressRegistry/Address/ValueObjects/AddressGeometry.cs b/src/AddressRegistry/Address/ValueObjects/AddressGeometry.cs index 5b7d174e5..6147d39c9 100644 --- a/src/AddressRegistry/Address/ValueObjects/AddressGeometry.cs +++ b/src/AddressRegistry/Address/ValueObjects/AddressGeometry.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address { + using System; using System.Collections.Generic; using Be.Vlaanderen.Basisregisters.AggregateSource; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class AddressGeometry : ValueObject { public GeometryMethod GeometryMethod { get; } diff --git a/src/AddressRegistry/Address/ValueObjects/AddressId.cs b/src/AddressRegistry/Address/ValueObjects/AddressId.cs index a077c33e5..3aa850c4d 100644 --- a/src/AddressRegistry/Address/ValueObjects/AddressId.cs +++ b/src/AddressRegistry/Address/ValueObjects/AddressId.cs @@ -5,6 +5,7 @@ namespace AddressRegistry.Address using Be.Vlaanderen.Basisregisters.Crab; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class AddressId : GuidValueObject { public static AddressId CreateFor(CrabHouseNumberId crabHouseNumberId) diff --git a/src/AddressRegistry/Address/ValueObjects/AddressStatus.cs b/src/AddressRegistry/Address/ValueObjects/AddressStatus.cs index fc3d30373..0b1952423 100644 --- a/src/AddressRegistry/Address/ValueObjects/AddressStatus.cs +++ b/src/AddressRegistry/Address/ValueObjects/AddressStatus.cs @@ -2,6 +2,7 @@ namespace AddressRegistry.Address { using System; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public enum AddressStatus { Unknown = 0, diff --git a/src/AddressRegistry/Address/ValueObjects/BoxNumber.cs b/src/AddressRegistry/Address/ValueObjects/BoxNumber.cs index bfabd6152..1066ec409 100644 --- a/src/AddressRegistry/Address/ValueObjects/BoxNumber.cs +++ b/src/AddressRegistry/Address/ValueObjects/BoxNumber.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class BoxNumber : StringValueObject { public BoxNumber([JsonProperty("value")] string boxNumber) : base(boxNumber.RemoveUnicodeControlCharacters()) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressNature.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressNature.cs index ed2cd9091..cfeaff82f 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressNature.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressNature.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabAddressNature : StringValueObject { public CrabAddressNature([JsonProperty("value")] string addressNature) : base(addressNature) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressPositionId.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressPositionId.cs index cd3fefa76..88cf6d2fc 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressPositionId.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabAddressPositionId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabAddressPositionId : IntegerValueObject { public CrabAddressPositionId([JsonProperty("value")] int addressPositionId) : base(addressPositionId) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabBoxNumberType.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabBoxNumberType.cs index dd8ae1ec5..4765bd827 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabBoxNumberType.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabBoxNumberType.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabBoxNumberType : StringValueObject { public CrabBoxNumberType([JsonProperty("value")] string boxNumberType) : base(boxNumberType) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberMailCantonId.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberMailCantonId.cs index 722ada001..4f5dba519 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberMailCantonId.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberMailCantonId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabHouseNumberMailCantonId : IntegerValueObject { public CrabHouseNumberMailCantonId([JsonProperty("value")] int houseNumberMailCantonId) : base(houseNumberMailCantonId) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberStatusId.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberStatusId.cs index 904f531ef..65b4dc56d 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberStatusId.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabHouseNumberStatusId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabHouseNumberStatusId : IntegerValueObject { public CrabHouseNumberStatusId([JsonProperty("value")] int houseNumberStatusId) : base(houseNumberStatusId) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonCode.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonCode.cs index 438964881..5a3dfee1e 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonCode.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonCode.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabMailCantonCode : StringValueObject { public CrabMailCantonCode([JsonProperty("value")] string mailCantonCode) : base(mailCantonCode) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonId.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonId.cs index 8e6d35d63..17d089055 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonId.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabMailCantonId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabMailCantonId : IntegerValueObject { public CrabMailCantonId([JsonProperty("value")] int mailCantonId) : base(mailCantonId) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/CrabSubaddressStatusId.cs b/src/AddressRegistry/Address/ValueObjects/Crab/CrabSubaddressStatusId.cs index 58b9563f2..6a09d9d4a 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/CrabSubaddressStatusId.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/CrabSubaddressStatusId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class CrabSubaddressStatusId : IntegerValueObject { public CrabSubaddressStatusId([JsonProperty("value")] int subaddressStatusId) : base(subaddressStatusId) { } diff --git a/src/AddressRegistry/Address/ValueObjects/Crab/GrbNotation.cs b/src/AddressRegistry/Address/ValueObjects/Crab/GrbNotation.cs index 006d7b93b..3b96ff885 100644 --- a/src/AddressRegistry/Address/ValueObjects/Crab/GrbNotation.cs +++ b/src/AddressRegistry/Address/ValueObjects/Crab/GrbNotation.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address.Crab { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class GrbNotation : StringValueObject { public GrbNotation([JsonProperty("value")] string grbNotation) : base(grbNotation) { } diff --git a/src/AddressRegistry/Address/ValueObjects/GeometryMethod.cs b/src/AddressRegistry/Address/ValueObjects/GeometryMethod.cs index 9e7fd5cc2..5ffb39fea 100644 --- a/src/AddressRegistry/Address/ValueObjects/GeometryMethod.cs +++ b/src/AddressRegistry/Address/ValueObjects/GeometryMethod.cs @@ -1,5 +1,8 @@ namespace AddressRegistry.Address { + using System; + + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public enum GeometryMethod { AppointedByAdministrator = 1, diff --git a/src/AddressRegistry/Address/ValueObjects/GeometrySpecification.cs b/src/AddressRegistry/Address/ValueObjects/GeometrySpecification.cs index cc8896490..f6f0714fc 100644 --- a/src/AddressRegistry/Address/ValueObjects/GeometrySpecification.cs +++ b/src/AddressRegistry/Address/ValueObjects/GeometrySpecification.cs @@ -1,5 +1,8 @@ namespace AddressRegistry.Address { + using System; + + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public enum GeometrySpecification { Municipality = 1, diff --git a/src/AddressRegistry/Address/ValueObjects/HouseNumber.cs b/src/AddressRegistry/Address/ValueObjects/HouseNumber.cs index 391fb60c0..9ca995e07 100644 --- a/src/AddressRegistry/Address/ValueObjects/HouseNumber.cs +++ b/src/AddressRegistry/Address/ValueObjects/HouseNumber.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class HouseNumber : StringValueObject { public HouseNumber([JsonProperty("value")] string houseNumber) : base(houseNumber.RemoveUnicodeControlCharacters()) { } diff --git a/src/AddressRegistry/Address/ValueObjects/PersistentLocalIdAssignmentDate.cs b/src/AddressRegistry/Address/ValueObjects/PersistentLocalIdAssignmentDate.cs index a53dfc71a..e6454e84f 100644 --- a/src/AddressRegistry/Address/ValueObjects/PersistentLocalIdAssignmentDate.cs +++ b/src/AddressRegistry/Address/ValueObjects/PersistentLocalIdAssignmentDate.cs @@ -1,9 +1,11 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; using NodaTime; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class PersistentLocalIdAssignmentDate : InstantValueObject { public PersistentLocalIdAssignmentDate([JsonProperty("value")] Instant assignmentDate) : base(assignmentDate) { } diff --git a/src/AddressRegistry/Address/ValueObjects/PostalCode.cs b/src/AddressRegistry/Address/ValueObjects/PostalCode.cs index f3be99745..f7ec214fc 100644 --- a/src/AddressRegistry/Address/ValueObjects/PostalCode.cs +++ b/src/AddressRegistry/Address/ValueObjects/PostalCode.cs @@ -1,9 +1,11 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Be.Vlaanderen.Basisregisters.GrAr.Common.Oslo; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class PostalCode : StringValueObject { public static PostalCode CreateForPersistentId(IdentifierUri persistentId) diff --git a/src/AddressRegistry/Address/ValueObjects/SpatialReferenceSystemId.cs b/src/AddressRegistry/Address/ValueObjects/SpatialReferenceSystemId.cs index 7fd9c4359..510f1e778 100644 --- a/src/AddressRegistry/Address/ValueObjects/SpatialReferenceSystemId.cs +++ b/src/AddressRegistry/Address/ValueObjects/SpatialReferenceSystemId.cs @@ -1,8 +1,10 @@ namespace AddressRegistry.Address { + using System; using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class SpatialReferenceSystemId : IntegerValueObject { public static SpatialReferenceSystemId Lambert72 => new SpatialReferenceSystemId(31370); diff --git a/src/AddressRegistry/Address/ValueObjects/StreetNameId.cs b/src/AddressRegistry/Address/ValueObjects/StreetNameId.cs index f0d94918a..a10db0f42 100644 --- a/src/AddressRegistry/Address/ValueObjects/StreetNameId.cs +++ b/src/AddressRegistry/Address/ValueObjects/StreetNameId.cs @@ -6,6 +6,7 @@ namespace AddressRegistry.Address using Be.Vlaanderen.Basisregisters.GrAr.Common.Oslo; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class StreetNameId : GuidValueObject { private const string Prefix = "streetName"; diff --git a/src/AddressRegistry/Address/ValueObjects/WkbGeometry.cs b/src/AddressRegistry/Address/ValueObjects/WkbGeometry.cs index 7d4a02bd9..fbe4ca085 100644 --- a/src/AddressRegistry/Address/ValueObjects/WkbGeometry.cs +++ b/src/AddressRegistry/Address/ValueObjects/WkbGeometry.cs @@ -1,11 +1,13 @@ namespace AddressRegistry.Address { + using System; using System.Collections.Generic; using System.Linq; using Be.Vlaanderen.Basisregisters.AggregateSource; using Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor; using Newtonsoft.Json; + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class WkbGeometry : ByteArrayValueObject { public const int SridLambert72 = 31370; @@ -20,6 +22,7 @@ public WkbGeometry(string wkbBytesHex) : base(wkbBytesHex.ToByteArray()) { } protected override IEnumerable Reflect() => Value.Cast(); } + [Obsolete("This is a legacy valueobject and should not be used anymore.")] public class ExtendedWkbGeometry : ByteArrayValueObject { [JsonConstructor] diff --git a/src/AddressRegistry/Address/IPersistentLocalIdGenerator.cs b/src/AddressRegistry/IPersistentLocalIdGenerator.cs similarity index 78% rename from src/AddressRegistry/Address/IPersistentLocalIdGenerator.cs rename to src/AddressRegistry/IPersistentLocalIdGenerator.cs index 639f79b79..61d4d2b2d 100644 --- a/src/AddressRegistry/Address/IPersistentLocalIdGenerator.cs +++ b/src/AddressRegistry/IPersistentLocalIdGenerator.cs @@ -1,4 +1,4 @@ -namespace AddressRegistry.Address +namespace AddressRegistry { public interface IPersistentLocalIdGenerator { diff --git a/src/AddressRegistry/Address/ValueObjects/PersistentLocalId.cs b/src/AddressRegistry/PersistentLocalId.cs similarity index 89% rename from src/AddressRegistry/Address/ValueObjects/PersistentLocalId.cs rename to src/AddressRegistry/PersistentLocalId.cs index 64ed15e5e..acb57e3b8 100644 --- a/src/AddressRegistry/Address/ValueObjects/PersistentLocalId.cs +++ b/src/AddressRegistry/PersistentLocalId.cs @@ -1,4 +1,4 @@ -namespace AddressRegistry.Address +namespace AddressRegistry { using Be.Vlaanderen.Basisregisters.AggregateSource; using Newtonsoft.Json; diff --git a/src/AddressRegistry/StreetName/AddressCommandHandlerModule.cs b/src/AddressRegistry/StreetName/AddressCommandHandlerModule.cs index 38fef2f81..456da2b91 100644 --- a/src/AddressRegistry/StreetName/AddressCommandHandlerModule.cs +++ b/src/AddressRegistry/StreetName/AddressCommandHandlerModule.cs @@ -299,6 +299,23 @@ public AddressCommandHandlerModule( message.Command.ExecutionContext); }); + For() + .AddSqlStreamStore(getStreamStore, getUnitOfWork, eventMapping, eventSerializer, getSnapshotStore) + .AddEventHash(getUnitOfWork) + .AddProvenance(getUnitOfWork, provenanceFactory) + .Handle(async (message, ct) => + { + var destinationStreetNameStreamId = new StreetNameStreamId(message.Command.DestinationPersistentLocalId); + + var streetNames = getStreetNames(); + var destinationStreetName = await streetNames.GetAsync(destinationStreetNameStreamId, ct); + + destinationStreetName.Rename( + streetNames, + message.Command.PersistentLocalId, + lazyPersistentLocalIdGenerator.Value); + }); + For() .AddSqlStreamStore(getStreamStore, getUnitOfWork, eventMapping, eventSerializer, getSnapshotStore) .AddEventHash(getUnitOfWork) diff --git a/src/AddressRegistry/StreetName/Commands/MigrateAddressToStreetName.cs b/src/AddressRegistry/StreetName/Commands/MigrateAddressToStreetName.cs index 1431afbec..e6ebfdd55 100644 --- a/src/AddressRegistry/StreetName/Commands/MigrateAddressToStreetName.cs +++ b/src/AddressRegistry/StreetName/Commands/MigrateAddressToStreetName.cs @@ -2,10 +2,16 @@ namespace AddressRegistry.StreetName.Commands { using System; using System.Collections.Generic; - using AddressRegistry.StreetName; + using Address; using Be.Vlaanderen.Basisregisters.Generators.Guid; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Be.Vlaanderen.Basisregisters.Utilities; + using AddressGeometry = AddressRegistry.StreetName.AddressGeometry; + using AddressId = AddressRegistry.StreetName.AddressId; + using AddressStatus = AddressRegistry.StreetName.AddressStatus; + using BoxNumber = AddressRegistry.StreetName.BoxNumber; + using HouseNumber = AddressRegistry.StreetName.HouseNumber; + using PostalCode = AddressRegistry.StreetName.PostalCode; public class MigrateAddressToStreetName : IHasCommandProvenance { @@ -27,26 +33,26 @@ public class MigrateAddressToStreetName : IHasCommandProvenance public Provenance Provenance { get; } public MigrateAddressToStreetName( - Address.AddressId addressId, + AddressRegistry.Address.AddressId addressId, StreetNamePersistentLocalId streetNamePersistentLocalId, - Address.StreetNameId streetNameId, - Address.PersistentLocalId addressPersistentLocalId, - Address.AddressStatus status, - Address.HouseNumber houseNumber, - Address.BoxNumber? boxNumber, - Address.AddressGeometry geometry, + StreetNameId streetNameId, + PersistentLocalId addressPersistentLocalId, + AddressRegistry.Address.AddressStatus status, + AddressRegistry.Address.HouseNumber houseNumber, + AddressRegistry.Address.BoxNumber? boxNumber, + AddressRegistry.Address.AddressGeometry geometry, bool? officiallyAssigned, - Address.PostalCode? postalCode, + AddressRegistry.Address.PostalCode? postalCode, bool isComplete, bool isRemoved, - Address.AddressId? parentAddressId, + AddressRegistry.Address.AddressId? parentAddressId, Provenance provenance) { AddressId = new AddressId(addressId); StreetNamePersistentLocalId = streetNamePersistentLocalId; StreetNameId = new AddressStreetNameId(streetNameId); AddressPersistentLocalId = new AddressPersistentLocalId(addressPersistentLocalId); - Status = Address.AddressStatusHelpers.ToStreetNameAddressStatus(status); + Status = AddressStatusHelpers.ToStreetNameAddressStatus(status); HouseNumber = new HouseNumber(houseNumber); BoxNumber = boxNumber is null ? null : new BoxNumber(boxNumber); Geometry = new AddressGeometry(geometry.GeometryMethod, geometry.GeometrySpecification, geometry.Geometry); diff --git a/src/AddressRegistry/StreetName/Commands/RenameStreetName.cs b/src/AddressRegistry/StreetName/Commands/RenameStreetName.cs new file mode 100644 index 000000000..f851467b4 --- /dev/null +++ b/src/AddressRegistry/StreetName/Commands/RenameStreetName.cs @@ -0,0 +1,44 @@ +namespace AddressRegistry.StreetName.Commands +{ + using System; + using System.Collections.Generic; + using Be.Vlaanderen.Basisregisters.Generators.Guid; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Be.Vlaanderen.Basisregisters.Utilities; + + public class RenameStreetName : IHasCommandProvenance + { + private static readonly Guid Namespace = new Guid("7403446a-6422-4ce3-87fa-6b1a70e5196f"); + + public StreetNamePersistentLocalId PersistentLocalId { get; } + public StreetNamePersistentLocalId DestinationPersistentLocalId { get; } + public Provenance Provenance { get; } + + public RenameStreetName( + StreetNamePersistentLocalId persistentLocalId, + StreetNamePersistentLocalId destinationPersistentLocalId, + Provenance provenance) + { + PersistentLocalId = persistentLocalId; + DestinationPersistentLocalId = destinationPersistentLocalId; + Provenance = provenance; + } + + public Guid CreateCommandId() + => Deterministic.Create(Namespace, $"RenameStreetName-{ToString()}"); + + public override string? ToString() + => ToStringBuilder.ToString(IdentityFields()); + + private IEnumerable IdentityFields() + { + yield return PersistentLocalId; + yield return DestinationPersistentLocalId; + + foreach (var field in Provenance.GetIdentityFields()) + { + yield return field; + } + } + } +} diff --git a/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs b/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs new file mode 100644 index 000000000..df833d235 --- /dev/null +++ b/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs @@ -0,0 +1,45 @@ +namespace AddressRegistry.StreetName.Commands +{ + using System; + using System.Collections.Generic; + using Be.Vlaanderen.Basisregisters.Generators.Guid; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Be.Vlaanderen.Basisregisters.Utilities; + + public class RetireStreetNameBecauseOfRename : IHasCommandProvenance + { + private static readonly Guid Namespace = new Guid("32e8aabd-67fb-4b59-9071-de2b226f701b"); + + public StreetNamePersistentLocalId PersistentLocalId { get; } + public StreetNamePersistentLocalId DestinationPersistentLocalId { get; set; } + + public Provenance Provenance { get; } + + public RetireStreetNameBecauseOfRename( + StreetNamePersistentLocalId persistentLocalId, + StreetNamePersistentLocalId destinationPersistentLocalId, + Provenance provenance) + { + PersistentLocalId = persistentLocalId; + DestinationPersistentLocalId = destinationPersistentLocalId; + Provenance = provenance; + } + + public Guid CreateCommandId() + => Deterministic.Create(Namespace, $"RetireStreetNameBecauseOfRename-{ToString()}"); + + public override string? ToString() + => ToStringBuilder.ToString(IdentityFields()); + + private IEnumerable IdentityFields() + { + yield return PersistentLocalId; + yield return DestinationPersistentLocalId; + + foreach (var field in Provenance.GetIdentityFields()) + { + yield return field; + } + } + } +} diff --git a/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs b/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs new file mode 100644 index 000000000..d79e78eb2 --- /dev/null +++ b/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs @@ -0,0 +1,52 @@ +namespace AddressRegistry.StreetName.Events +{ + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + using Be.Vlaanderen.Basisregisters.EventHandling; + using Be.Vlaanderen.Basisregisters.GrAr.Common; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Newtonsoft.Json; + + [EventTags(Tag.StreetName)] + [EventName(EventName)] + [EventDescription("De straatnaam werd hernoemd.")] + public class StreetNameWasRenamed : IStreetNameEvent + { + public const string EventName = "StreetNameWasRenamed"; // BE CAREFUL CHANGING THIS!! + + public int StreetNamePersistentLocalId { get; } + public int DestinationStreetNamePersistentLocalId { get; } + public ProvenanceData Provenance { get; private set; } + + public StreetNameWasRenamed( + StreetNamePersistentLocalId streetNamePersistentLocalId, + StreetNamePersistentLocalId destinationStreetNamePersistentLocalId) + { + StreetNamePersistentLocalId = streetNamePersistentLocalId; + DestinationStreetNamePersistentLocalId = destinationStreetNamePersistentLocalId; + } + + [JsonConstructor] + private StreetNameWasRenamed( + int streetNamePersistentLocalId, + int destinationStreetNamePersistentLocalId, + ProvenanceData provenance) + : this( + new StreetNamePersistentLocalId(streetNamePersistentLocalId), + new StreetNamePersistentLocalId(destinationStreetNamePersistentLocalId)) + => ((ISetProvenance)this).SetProvenance(provenance.ToProvenance()); + + void ISetProvenance.SetProvenance(Provenance provenance) => Provenance = new ProvenanceData(provenance); + + public IEnumerable GetHashFields() + { + var fields = Provenance.GetHashFields().ToList(); + fields.Add(StreetNamePersistentLocalId.ToString(CultureInfo.InvariantCulture)); + fields.Add(DestinationStreetNamePersistentLocalId.ToString(CultureInfo.InvariantCulture)); + return fields; + } + + public string GetHash() => this.ToEventHash(EventName); + } +} diff --git a/src/AddressRegistry/StreetName/StreetName.cs b/src/AddressRegistry/StreetName/StreetName.cs index 641cbf119..9c1f40d2b 100644 --- a/src/AddressRegistry/StreetName/StreetName.cs +++ b/src/AddressRegistry/StreetName/StreetName.cs @@ -194,6 +194,16 @@ private static void RetireAddressesBecauseStreetNameWasRetired(IEnumerable ProposedStreetNameAddresses => - this.Where(x => !x.IsRemoved && x.Status == AddressStatus.Proposed); + this.Where(x => x is { IsRemoved: false, Status: AddressStatus.Proposed }); public IEnumerable CurrentStreetNameAddresses => - this.Where(x => !x.IsRemoved && x.Status == AddressStatus.Current); + this.Where(x => x is { IsRemoved: false, Status: AddressStatus.Current }); + + public IEnumerable ActiveHouseNumberAddresses => + ProposedStreetNameAddresses.Concat(CurrentStreetNameAddresses).Where(x => x.IsHouseNumberAddress); public bool HasPersistentLocalId(AddressPersistentLocalId addressPersistentLocalId) => _addressesByPersistentLocalId.ContainsKey(addressPersistentLocalId); diff --git a/src/AddressRegistry/StreetName/StreetNameCommandHandlerModule.cs b/src/AddressRegistry/StreetName/StreetNameCommandHandlerModule.cs index 8d879b06d..bece39fc7 100644 --- a/src/AddressRegistry/StreetName/StreetNameCommandHandlerModule.cs +++ b/src/AddressRegistry/StreetName/StreetNameCommandHandlerModule.cs @@ -190,6 +190,18 @@ public StreetNameCommandHandlerModule( streetName.CorrectStreetNameRetirement(); }); + + For() + .AddSqlStreamStore(getStreamStore, getUnitOfWork, eventMapping, eventSerializer, getSnapshotStore) + .AddEventHash(getUnitOfWork) + .AddProvenance(getUnitOfWork, provenanceFactory) + .Handle(async (message, ct) => + { + var streetNameStreamId = new StreetNameStreamId(message.Command.PersistentLocalId); + var streetName = await getStreetNames().GetAsync(streetNameStreamId, ct); + + streetName.RetireStreetNameBecauseOfRename(message.Command.DestinationPersistentLocalId); + }); } } } diff --git a/src/AddressRegistry/StreetName/StreetName_Address.cs b/src/AddressRegistry/StreetName/StreetName_Address.cs index 7f9827e13..f4a5fdad1 100644 --- a/src/AddressRegistry/StreetName/StreetName_Address.cs +++ b/src/AddressRegistry/StreetName/StreetName_Address.cs @@ -3,8 +3,10 @@ using System; using System.Collections.Generic; using System.Linq; + using Address; using Be.Vlaanderen.Basisregisters.AggregateSource; using Be.Vlaanderen.Basisregisters.GrAr.Legacy; + using Commands; using Events; using Exceptions; @@ -340,6 +342,21 @@ public void ChangeAddressPostalCode(AddressPersistentLocalId addressPersistentLo .ChangePostalCode(postalCode); } + public void Rename(IStreetNames streetNames, StreetNamePersistentLocalId sourceStreetNamePersistentLocalId, IPersistentLocalIdGenerator persistentLocalIdGenerator) + { + var sourceStreetName = streetNames + .GetAsync(new StreetNameStreamId(sourceStreetNamePersistentLocalId)) + .GetAwaiter().GetResult(); + + var readdressItem = sourceStreetName.StreetNameAddresses.ActiveHouseNumberAddresses + .Select(x => new ReaddressAddressItem( + sourceStreetNamePersistentLocalId, + x.AddressPersistentLocalId, + x.HouseNumber)); + + Readdress(streetNames, persistentLocalIdGenerator, readdressItem, new List(), new ReaddressExecutionContext()); + } + public string GetAddressHash(AddressPersistentLocalId addressPersistentLocalId) { var address = StreetNameAddresses.FindByPersistentLocalId(addressPersistentLocalId); diff --git a/src/AddressRegistry/StreetName/StreetName_Readdress.cs b/src/AddressRegistry/StreetName/StreetName_Readdress.cs index a45f8c361..bbd70d661 100644 --- a/src/AddressRegistry/StreetName/StreetName_Readdress.cs +++ b/src/AddressRegistry/StreetName/StreetName_Readdress.cs @@ -155,20 +155,6 @@ private void ProposeAddressBecauseOfReaddress( geometryPosition)); } - private void RejectAddressBecauseOfReaddress(AddressPersistentLocalId addressPersistentLocalId) - { - StreetNameAddresses - .GetNotRemovedByPersistentLocalId(addressPersistentLocalId) - .RejectBecauseOfReaddress(); - } - - private void RetireAddressBecauseOfReaddress(AddressPersistentLocalId addressPersistentLocalId) - { - StreetNameAddresses - .GetNotRemovedByPersistentLocalId(addressPersistentLocalId) - .RetireBecauseOfReaddress(); - } - private void RejectOrRetireAddresses(IEnumerable addresssToRejectOrRetireWithinStreetName) { foreach (var (_, addressPersistentLocalId) in addresssToRejectOrRetireWithinStreetName) @@ -211,5 +197,19 @@ public void RejectOrRetireAddressForReaddress(AddressPersistentLocalId addressPe RetireAddressBecauseOfReaddress(addressPersistentLocalId); } } + + private void RejectAddressBecauseOfReaddress(AddressPersistentLocalId addressPersistentLocalId) + { + StreetNameAddresses + .GetNotRemovedByPersistentLocalId(addressPersistentLocalId) + .RejectBecauseOfReaddress(); + } + + private void RetireAddressBecauseOfReaddress(AddressPersistentLocalId addressPersistentLocalId) + { + StreetNameAddresses + .GetNotRemovedByPersistentLocalId(addressPersistentLocalId) + .RetireBecauseOfReaddress(); + } } } diff --git a/src/AddressRegistry/StreetName/StreetName_State.cs b/src/AddressRegistry/StreetName/StreetName_State.cs index 2bdc5c6f7..fc38fcc9c 100644 --- a/src/AddressRegistry/StreetName/StreetName_State.cs +++ b/src/AddressRegistry/StreetName/StreetName_State.cs @@ -29,6 +29,7 @@ private StreetName() Register(When); Register(When); Register(When); + Register(When); Register(When); Register(When); Register(When); @@ -131,6 +132,11 @@ private void When(StreetNameWasRetired @event) Status = StreetNameStatus.Retired; } + private void When(StreetNameWasRenamed @event) + { + Status = StreetNameStatus.Retired; + } + private void When(StreetNameWasRemoved @event) { IsRemoved = true; diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/GivenInactiveStreetName.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/GivenInactiveStreetName.cs new file mode 100644 index 000000000..b6a011fb6 --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/GivenInactiveStreetName.cs @@ -0,0 +1,59 @@ +namespace AddressRegistry.Tests.AggregateTests.WhenRenamingStreetName +{ + using AutoFixture; + using Be.Vlaanderen.Basisregisters.AggregateSource.Testing; + using global::AutoFixture; + using StreetName; + using StreetName.Commands; + using StreetName.Events; + using StreetName.Exceptions; + using Xunit; + using Xunit.Abstractions; + + public class GivenInactiveStreetName : AddressRegistryTest + { + private readonly StreetNameStreamId _streamId; + + public GivenInactiveStreetName(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + Fixture.Customize(new InfrastructureCustomization()); + Fixture.Customize(new WithFixedStreetNamePersistentLocalId()); + Fixture.Customize(new WithFixedMunicipalityId()); + Fixture.Customize(new WithFixedValidHouseNumber()); + _streamId = Fixture.Create(); + } + + [Fact] + public void WithRemovedStreetName_ThenThrowsStreetNameIsRemovedException() + { + Assert(new Scenario() + .Given(_streamId, + Fixture.Create(), + Fixture.Create()) + .When(Fixture.Create()) + .Throws(new StreetNameIsRemovedException(Fixture.Create()))); + } + + [Fact] + public void WithRetiredStreetName_ThenThrowsStreetNameHasInvalidStatusException() + { + Assert(new Scenario() + .Given(_streamId, + Fixture.Create(), + Fixture.Create()) + .When(Fixture.Create()) + .Throws(new StreetNameHasInvalidStatusException())); + } + + [Fact] + public void WithRejectedStreetName_ThenThrowsStreetNameHasInvalidStatusException() + { + Assert(new Scenario() + .Given(_streamId, + Fixture.Create(), + Fixture.Create()) + .When(Fixture.Create()) + .Throws(new StreetNameHasInvalidStatusException())); + } + } +} diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/README.md b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/README.md new file mode 100644 index 000000000..74efbece3 --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/README.md @@ -0,0 +1,29 @@ +# Readdress test scenario's + +![test](../../../../assets/readdress/three-addresses-simple.png) + +### 1. Given Destination Address Does Not Exist + +The destination house number does not exist, then a new address with that house number will be proposed. + +### 2. Given Destination Address Exists + +#### 2.1 Active (proposed or current) + +Readdress to existing address. + +#### 2.2 Not Active (rejected, retired or removed) + +Propose new address and readdress. + +### 3. Given Source Address Has Box Number + +#### 3.1 When destination-address has no box numbers + +Then the source-address box numbers are proposed. + +#### 3.2 When destination-address already has this box number +Then the attributes of the source-address box number get copied on the existing destination-address box number while mainting its original identifier ie. readdressing. + +#### 3.3 When destination-address has its own boxnumber +Then it is rejected or retired depending on its status. diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasBoxNumbers.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasBoxNumbers.cs new file mode 100644 index 000000000..558bb8f07 --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasBoxNumbers.cs @@ -0,0 +1,275 @@ +namespace AddressRegistry.Tests.AggregateTests.WhenRenamingStreetName +{ + using System.Collections.Generic; + using Autofac; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.AggregateSource; + using Be.Vlaanderen.Basisregisters.AggregateSource.Snapshotting; + using Be.Vlaanderen.Basisregisters.AggregateSource.Testing; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using EventExtensions; + using global::AutoFixture; + using StreetName; + using StreetName.Commands; + using StreetName.DataStructures; + using StreetName.Events; + using Xunit; + using Xunit.Abstractions; + + public class SourceAddressHasBoxNumbers : AddressRegistryTest + { + private readonly StreetNameStreamId _sourceStreetNameStreamId; + private readonly StreetNameStreamId _destinationStreetNameStreamId; + + private readonly StreetNamePersistentLocalId _sourceStreetNamePersistentLocalId; + private readonly StreetNamePersistentLocalId _destinationStreetNamePersistentLocalId; + + public SourceAddressHasBoxNumbers(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + Fixture.Customize(new WithFixedHouseNumber()); + Fixture.Customize(new WithFixedPostalCode()); + Fixture.Customizations.Add(new WithUniqueInteger()); + + _sourceStreetNamePersistentLocalId = Fixture.Create(); + _destinationStreetNamePersistentLocalId = new StreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId + 1); + + _sourceStreetNameStreamId = new StreetNameStreamId(_sourceStreetNamePersistentLocalId); + _destinationStreetNameStreamId = new StreetNameStreamId(_destinationStreetNamePersistentLocalId); + } + + [Fact] + public void WithHouseNumberDoesNotExistOnDestinationStreetName_ThenBothHouseNumberAndBoxNumberWereProposed() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var boxNumberWasMigrated = Fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(houseNumberWasMigrated.AddressPersistentLocalId)) + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated, + boxNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + var destinationHouseNumberAddressPersistentLocalId = new AddressPersistentLocalId(1); // FakePersistentLocalIdGenerator starts with 1. + var destinationBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(2); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId)) + .When(command) + .Then(new[] + { + new Fact( + _destinationStreetNameStreamId, + CreateAddressWasProposedBecauseOfReaddress( + houseNumberWasMigrated, destinationHouseNumberAddressPersistentLocalId)), + new Fact( + _destinationStreetNameStreamId, + CreateAddressWasProposedBecauseOfReaddress( + boxNumberWasMigrated, destinationBoxNumberAddressPersistentLocalId, destinationHouseNumberAddressPersistentLocalId)), + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + destinationHouseNumberAddressPersistentLocalId, + CreateReaddressedDataFrom( + houseNumberWasMigrated, + destinationHouseNumberAddressPersistentLocalId, + true), + new List + { + CreateReaddressedDataFrom( + boxNumberWasMigrated, + destinationBoxNumberAddressPersistentLocalId, + true) + })) + })); + } + + [Fact] + public void WithHouseNumberExistsButWithoutBoxNumberOnDestinationStreetName_ThenBoxNumberIsProposed() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var boxNumberWasMigrated = Fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(houseNumberWasMigrated.AddressPersistentLocalId)) + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated, + boxNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + var destinationHouseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId), + destinationHouseNumberWasMigrated) + .When(command) + .Then(new[] + { + new Fact( + _destinationStreetNameStreamId, + CreateAddressWasProposedBecauseOfReaddress( + boxNumberWasMigrated, new AddressPersistentLocalId(1), new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId))), + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + CreateReaddressedDataFrom( + houseNumberWasMigrated, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + false), + new List + { + CreateReaddressedDataFrom( + boxNumberWasMigrated, + new AddressPersistentLocalId(1), + true) + })) + })); + } + + [Fact] + public void WithHouseNumberAndBoxNumberExistOnDestinationStreetName_ThenBothAreReaddressed() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var boxNumberWasMigrated = Fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(houseNumberWasMigrated.AddressPersistentLocalId)) + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated, + boxNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + var destinationHouseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + var destinationBoxNumberWasMigrated = Fixture.Create() + .AsBoxNumberAddress( + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + new BoxNumber(boxNumberWasMigrated.BoxNumber!)) + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId), + destinationHouseNumberWasMigrated, + destinationBoxNumberWasMigrated) + .When(command) + .Then(new[] + { + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + CreateReaddressedDataFrom( + houseNumberWasMigrated, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + false), + new List + { + CreateReaddressedDataFrom( + boxNumberWasMigrated, + new AddressPersistentLocalId(destinationBoxNumberWasMigrated.AddressPersistentLocalId), + false) + })) + })); + } + + private AddressWasProposedBecauseOfReaddress CreateAddressWasProposedBecauseOfReaddress( + AddressWasMigratedToStreetName sourceAddressWasMigrated, + AddressPersistentLocalId destinationAddressPersistentLocalId, + AddressPersistentLocalId? destinationParentAddressPersistentLocalId = null) + { + return new AddressWasProposedBecauseOfReaddress( + _destinationStreetNamePersistentLocalId, + destinationAddressPersistentLocalId, + new AddressPersistentLocalId(sourceAddressWasMigrated.AddressPersistentLocalId), + destinationParentAddressPersistentLocalId, + Fixture.Create(), + Fixture.Create(), + sourceAddressWasMigrated.BoxNumber != null ? new BoxNumber(sourceAddressWasMigrated.BoxNumber) : null, + sourceAddressWasMigrated.GeometryMethod, + sourceAddressWasMigrated.GeometrySpecification, + new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)); + } + + private ReaddressedAddressData CreateReaddressedDataFrom( + AddressWasMigratedToStreetName sourceAddressWasMigrated, + AddressPersistentLocalId destinationAddressPersistentLocalId, + bool isDestinationNewlyProposed) + { + return new ReaddressedAddressData( + new AddressPersistentLocalId(sourceAddressWasMigrated.AddressPersistentLocalId), + destinationAddressPersistentLocalId, + isDestinationNewlyProposed, + sourceAddressWasMigrated.Status, + Fixture.Create(), + sourceAddressWasMigrated.BoxNumber != null ? new BoxNumber(sourceAddressWasMigrated.BoxNumber) : null, + Fixture.Create(), + new AddressGeometry( + sourceAddressWasMigrated.GeometryMethod, + sourceAddressWasMigrated.GeometrySpecification, + new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)), + sourceAddressWasMigrated.OfficiallyAssigned); + } + } +} diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasNoBoxNumbers.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasNoBoxNumbers.cs new file mode 100644 index 000000000..4255b4614 --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/SourceAddressHasNoBoxNumbers.cs @@ -0,0 +1,228 @@ +namespace AddressRegistry.Tests.AggregateTests.WhenRenamingStreetName +{ + using System.Collections.Generic; + using Autofac; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.AggregateSource; + using Be.Vlaanderen.Basisregisters.AggregateSource.Snapshotting; + using Be.Vlaanderen.Basisregisters.AggregateSource.Testing; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using EventExtensions; + using global::AutoFixture; + using StreetName; + using StreetName.Commands; + using StreetName.DataStructures; + using StreetName.Events; + using Xunit; + using Xunit.Abstractions; + + public class SourceAddressHasNoBoxNumbers: AddressRegistryTest + { + private readonly StreetNameStreamId _sourceStreetNameStreamId; + private readonly StreetNameStreamId _destinationStreetNameStreamId; + + private readonly StreetNamePersistentLocalId _sourceStreetNamePersistentLocalId; + private readonly StreetNamePersistentLocalId _destinationStreetNamePersistentLocalId; + + public SourceAddressHasNoBoxNumbers(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + Fixture.Customize(new WithFixedHouseNumber()); + Fixture.Customize(new WithFixedPostalCode()); + Fixture.Customizations.Add(new WithUniqueInteger()); + + _sourceStreetNamePersistentLocalId = Fixture.Create(); + _destinationStreetNamePersistentLocalId = new StreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId + 1); + + _sourceStreetNameStreamId = new StreetNameStreamId(_sourceStreetNamePersistentLocalId); + _destinationStreetNameStreamId = new StreetNameStreamId(_destinationStreetNamePersistentLocalId); + } + + [Fact] + public void WithOnlySourceAddress_ThenSourceAddressWasProposed() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create().WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId)) + .When(command) + .Then(new[] + { + new Fact(_destinationStreetNameStreamId, + CreateAddressWasProposedBecauseOfReaddress( + houseNumberWasMigrated, new AddressPersistentLocalId(1))), + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(1), + CreateReaddressedDataFrom( + houseNumberWasMigrated, + new AddressPersistentLocalId(1), + true), + new List())) + })); + } + + [Fact] + public void WithAddressExistsOnDestinationStreetName_ThenSourceAddressWasReaddressed() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + var destinationHouseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create().WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId), + destinationHouseNumberWasMigrated) + .When(command) + .Then(new[] + { + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + CreateReaddressedDataFrom( + houseNumberWasMigrated, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + false), + new List())) + })); + } + + [Fact] + public void WithBoxNumberOnDestinationAddress_ThenBoxNumberIsRetired() + { + var houseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithStreetNamePersistentLocalId(_sourceStreetNamePersistentLocalId); + + var streetNames = Container.Resolve(); + var sourceStreetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sourceStreetName.Initialize(new List + { + new StreetNameWasImported(_sourceStreetNamePersistentLocalId, Fixture.Create(), StreetNameStatus.Current), + houseNumberWasMigrated + }); + + streetNames.Add(_sourceStreetNameStreamId, sourceStreetName); + + var command = new RenameStreetName( + _sourceStreetNamePersistentLocalId, + _destinationStreetNamePersistentLocalId, + Fixture.Create()); + + var destinationHouseNumberWasMigrated = Fixture.Create() + .AsHouseNumberAddress() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + var destinationBoxNumberWasMigrated = Fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId)) + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId); + + Assert(new Scenario() + .Given(_destinationStreetNameStreamId, + Fixture.Create() + .WithStreetNamePersistentLocalId(_destinationStreetNamePersistentLocalId), + destinationHouseNumberWasMigrated, + destinationBoxNumberWasMigrated) + .When(command) + .Then(new[] + { + new Fact( + _destinationStreetNameStreamId, + new AddressHouseNumberWasReaddressed( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + CreateReaddressedDataFrom( + houseNumberWasMigrated, + new AddressPersistentLocalId(destinationHouseNumberWasMigrated.AddressPersistentLocalId), + false), + new List())), + new Fact( + _destinationStreetNameStreamId, + new AddressWasRetiredBecauseOfReaddress( + _destinationStreetNamePersistentLocalId, + new AddressPersistentLocalId(destinationBoxNumberWasMigrated.AddressPersistentLocalId))) + })); + } + + private AddressWasProposedBecauseOfReaddress CreateAddressWasProposedBecauseOfReaddress( + AddressWasMigratedToStreetName sourceAddressWasMigrated, + AddressPersistentLocalId destinationAddressPersistentLocalId, + AddressPersistentLocalId? destinationParentAddressPersistentLocalId = null) + { + return new AddressWasProposedBecauseOfReaddress( + _destinationStreetNamePersistentLocalId, + destinationAddressPersistentLocalId, + new AddressPersistentLocalId(sourceAddressWasMigrated.AddressPersistentLocalId), + destinationParentAddressPersistentLocalId, + Fixture.Create(), + Fixture.Create(), + sourceAddressWasMigrated.BoxNumber != null ? new BoxNumber(sourceAddressWasMigrated.BoxNumber) : null, + sourceAddressWasMigrated.GeometryMethod, + sourceAddressWasMigrated.GeometrySpecification, + new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)); + } + + private ReaddressedAddressData CreateReaddressedDataFrom( + AddressWasMigratedToStreetName sourceAddressWasMigrated, + AddressPersistentLocalId destinationAddressPersistentLocalId, + bool isDestinationNewlyProposed) + { + return new ReaddressedAddressData( + new AddressPersistentLocalId(sourceAddressWasMigrated.AddressPersistentLocalId), + destinationAddressPersistentLocalId, + isDestinationNewlyProposed, + sourceAddressWasMigrated.Status, + Fixture.Create(), + sourceAddressWasMigrated.BoxNumber != null ? new BoxNumber(sourceAddressWasMigrated.BoxNumber) : null, + Fixture.Create(), + new AddressGeometry( + sourceAddressWasMigrated.GeometryMethod, + sourceAddressWasMigrated.GeometrySpecification, + new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)), + sourceAddressWasMigrated.OfficiallyAssigned); + } + } +} diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/StateCheck.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/StateCheck.cs new file mode 100644 index 000000000..fa840c58d --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRenamingStreetName/StateCheck.cs @@ -0,0 +1,234 @@ +// namespace AddressRegistry.Tests.AggregateTests.WhenRenamingStreetName +// { +// using System.Collections.Generic; +// using System.Linq; +// using AddressRegistry.Api.BackOffice.Abstractions; +// using AddressRegistry.StreetName; +// using AddressRegistry.StreetName.DataStructures; +// using AddressRegistry.StreetName.Events; +// using AddressRegistry.Tests.AutoFixture; +// using AddressRegistry.Tests.EventBuilders; +// using Be.Vlaanderen.Basisregisters.AggregateSource.Snapshotting; +// using Be.Vlaanderen.Basisregisters.GrAr.Provenance; +// using FluentAssertions; +// using global::AutoFixture; +// using Xunit; +// using Xunit.Abstractions; +// +// public class StateCheck : AddressRegistryTest +// { +// private readonly StreetNamePersistentLocalId _streetNamePersistentLocalId; +// +// public StateCheck(ITestOutputHelper testOutputHelper) : base(testOutputHelper) +// { +// Fixture.Customize(new WithFixedStreetNamePersistentLocalId()); +// +// _streetNamePersistentLocalId = Fixture.Create(); +// } +// +// [Fact] +// public void ThenValidState() +// { +// var sourceAddressPersistentLocalId = new AddressPersistentLocalId(100); +// var sourceAddressFirstBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(101); +// var sourceAddressSecondBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(102); +// +// var destinationAddressPersistentLocalId = new AddressPersistentLocalId(1); +// var destinationAddressFirstBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(2); +// var destinationAddressSecondBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(3); +// +// var postalCode = Fixture.Create(); +// var houseNumberEleven = new HouseNumber("11"); +// +// var sourceAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Proposed) +// .WithAddressPersistentLocalId(sourceAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .Build(); +// +// var sourceAddressFirstBoxNumberAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Proposed) +// .WithAddressPersistentLocalId(sourceAddressFirstBoxNumberAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .WithBoxNumber(new BoxNumber("A1"), sourceAddressPersistentLocalId) +// .Build(); +// +// var sourceAddressSecondBoxNumberAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Current) +// .WithAddressPersistentLocalId(sourceAddressSecondBoxNumberAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .WithBoxNumber(new BoxNumber("A2"), sourceAddressPersistentLocalId) +// .Build(); +// +// var destinationAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Proposed) +// .WithAddressPersistentLocalId(destinationAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .Build(); +// +// var destinationAddressFirstBoxNumberAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Proposed) +// .WithAddressPersistentLocalId(destinationAddressFirstBoxNumberAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .WithBoxNumber(new BoxNumber("A1"), destinationAddressPersistentLocalId) +// .Build(); +// +// var destinationAddressSecondBoxNumberAddressWasMigrated = new AddressWasMigratedToStreetNameBuilder(Fixture, AddressStatus.Current) +// .WithAddressPersistentLocalId(destinationAddressSecondBoxNumberAddressPersistentLocalId) +// .WithHouseNumber(houseNumberEleven) +// .WithPostalCode(postalCode) +// .WithAddressGeometry(new AddressGeometry( +// GeometryMethod.AppointedByAdministrator, +// GeometrySpecification.Entry, +// GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry())) +// .WithBoxNumber(new BoxNumber("A3"), destinationAddressPersistentLocalId) +// .Build(); +// +// // A2 +// var destinationFirstBoxNumberWasProposed = new AddressWasProposedBecauseOfReaddress( +// _streetNamePersistentLocalId, +// destinationAddressFirstBoxNumberAddressPersistentLocalId, +// sourceAddressFirstBoxNumberAddressPersistentLocalId, +// destinationAddressPersistentLocalId, +// new PostalCode(sourceAddressWasMigrated.PostalCode!), +// houseNumberEleven, +// new BoxNumber(sourceAddressSecondBoxNumberAddressWasMigrated.BoxNumber!), +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometryMethod, +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometrySpecification, +// new ExtendedWkbGeometry(sourceAddressFirstBoxNumberAddressWasMigrated.ExtendedWkbGeometry)); +// +// var destinationSecondBoxNumberWasRejected = new AddressWasRejectedBecauseOfReaddress( +// _streetNamePersistentLocalId, +// destinationAddressSecondBoxNumberAddressPersistentLocalId); +// +// var addressHouseNumberWasReaddressed = new AddressHouseNumberWasReaddressed( +// _streetNamePersistentLocalId, +// destinationAddressPersistentLocalId, +// readdressedHouseNumber: new ReaddressedAddressData( +// sourceAddressPersistentLocalId, +// destinationAddressPersistentLocalId, +// isDestinationNewlyProposed: true, +// sourceAddressWasMigrated.Status, +// houseNumberEleven, +// boxNumber: null, +// new PostalCode(sourceAddressWasMigrated.PostalCode!), +// new AddressGeometry( +// sourceAddressWasMigrated.GeometryMethod, +// sourceAddressWasMigrated.GeometrySpecification, +// new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)), +// sourceAddressWasMigrated.OfficiallyAssigned), +// readdressedBoxNumbers: new List +// { +// new ReaddressedAddressData( +// sourceAddressFirstBoxNumberAddressPersistentLocalId, +// destinationAddressFirstBoxNumberAddressPersistentLocalId, +// isDestinationNewlyProposed: false, +// sourceAddressFirstBoxNumberAddressWasMigrated.Status, +// houseNumberEleven, +// new BoxNumber(sourceAddressFirstBoxNumberAddressWasMigrated.BoxNumber!), //A1 +// new PostalCode(sourceAddressWasMigrated.PostalCode!), +// new AddressGeometry( +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometryMethod, +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometrySpecification, +// new ExtendedWkbGeometry(sourceAddressFirstBoxNumberAddressWasMigrated.ExtendedWkbGeometry)), +// sourceAddressFirstBoxNumberAddressWasMigrated.OfficiallyAssigned), +// new ReaddressedAddressData( +// sourceAddressFirstBoxNumberAddressPersistentLocalId, +// destinationAddressFirstBoxNumberAddressPersistentLocalId, +// isDestinationNewlyProposed: true, +// sourceAddressFirstBoxNumberAddressWasMigrated.Status, +// houseNumberEleven, +// new BoxNumber(sourceAddressSecondBoxNumberAddressWasMigrated.BoxNumber!), //A2 +// new PostalCode(sourceAddressWasMigrated.PostalCode!), +// new AddressGeometry( +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometryMethod, +// sourceAddressFirstBoxNumberAddressWasMigrated.GeometrySpecification, +// new ExtendedWkbGeometry(sourceAddressFirstBoxNumberAddressWasMigrated.ExtendedWkbGeometry)), +// sourceAddressFirstBoxNumberAddressWasMigrated.OfficiallyAssigned), +// }); +// ((ISetProvenance)addressHouseNumberWasReaddressed).SetProvenance(Fixture.Create()); +// +// var streetName = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); +// streetName.Initialize(new List +// { +// Fixture.Create(), +// sourceAddressWasMigrated, +// sourceAddressFirstBoxNumberAddressWasMigrated, +// sourceAddressSecondBoxNumberAddressWasMigrated, +// destinationHouseNumberAddressWasProposed, +// destinationFirstBoxNumberWasProposed, +// destinationSecondBoxNumberWasRejected, +// addressHouseNumberWasReaddressed +// }); +// +// var sourceAddress = streetName.StreetNameAddresses.SingleOrDefault(x => x.AddressPersistentLocalId == sourceAddressPersistentLocalId); +// sourceAddress.Should().NotBeNull(); +// sourceAddress!.Status.Should().Be(AddressStatus.Rejected); +// +// var sourceAddressFirstBoxNumberAddress = streetName.StreetNameAddresses.SingleOrDefault(x => x.AddressPersistentLocalId == sourceAddressFirstBoxNumberAddressPersistentLocalId); +// sourceAddressFirstBoxNumberAddress.Should().NotBeNull(); +// sourceAddressFirstBoxNumberAddress!.Status.Should().Be(AddressStatus.Rejected); +// +// var sourceAddressSecondBoxNumberAddress = streetName.StreetNameAddresses.SingleOrDefault(x => x.AddressPersistentLocalId == sourceAddressSecondBoxNumberAddressPersistentLocalId); +// sourceAddressSecondBoxNumberAddress.Should().NotBeNull(); +// sourceAddressSecondBoxNumberAddress!.Status.Should().Be(AddressStatus.Retired); +// +// var destinationAddress = streetName.StreetNameAddresses.FirstOrDefault(x => x.AddressPersistentLocalId == destinationAddressPersistentLocalId); +// destinationAddress.Should().NotBeNull(); +// destinationAddress!.HouseNumber.Should().Be(houseNumberEleven); +// destinationAddress.Status.Should().Be(sourceAddressWasMigrated.Status); +// destinationAddress.Geometry.GeometryMethod.Should().Be(sourceAddressWasMigrated.GeometryMethod); +// destinationAddress.Geometry.GeometrySpecification.Should().Be(sourceAddressWasMigrated.GeometrySpecification); +// destinationAddress.Geometry.Geometry.Should().Be(new ExtendedWkbGeometry(sourceAddressWasMigrated.ExtendedWkbGeometry)); +// destinationAddress.PostalCode.Should().Be(new PostalCode(sourceAddressWasMigrated.PostalCode!)); +// destinationAddress.IsOfficiallyAssigned.Should().Be(sourceAddressWasMigrated.OfficiallyAssigned); +// +// destinationAddress.Children.Should().HaveCount(2); +// var destinationAddressFirstBoxNumberAddress = destinationAddress.Children +// .SingleOrDefault(x => x.AddressPersistentLocalId == destinationAddressFirstBoxNumberAddressPersistentLocalId); +// destinationAddressFirstBoxNumberAddress.Should().NotBeNull(); +// destinationAddressFirstBoxNumberAddress!.HouseNumber.Should().Be(houseNumberEleven); +// destinationAddressFirstBoxNumberAddress.Status.Should().Be(sourceAddressFirstBoxNumberAddressWasMigrated.Status); +// destinationAddressFirstBoxNumberAddress.Geometry.GeometryMethod.Should().Be(sourceAddressFirstBoxNumberAddressWasMigrated.GeometryMethod); +// destinationAddressFirstBoxNumberAddress.Geometry.GeometrySpecification.Should().Be(sourceAddressFirstBoxNumberAddressWasMigrated.GeometrySpecification); +// destinationAddressFirstBoxNumberAddress.Geometry.Geometry.Should().Be(new ExtendedWkbGeometry(sourceAddressFirstBoxNumberAddressWasMigrated.ExtendedWkbGeometry)); +// destinationAddressFirstBoxNumberAddress.PostalCode.Should().Be(new PostalCode(sourceAddressFirstBoxNumberAddressWasMigrated.PostalCode!)); +// destinationAddressFirstBoxNumberAddress.IsOfficiallyAssigned.Should().Be(sourceAddressFirstBoxNumberAddressWasMigrated.OfficiallyAssigned); +// +// var destinationAddressSecondBoxNumberAddress = destinationAddress.Children +// .SingleOrDefault(x => x.AddressPersistentLocalId == destinationAddressSecondBoxNumberAddressPersistentLocalId); +// destinationAddressSecondBoxNumberAddress.Should().NotBeNull(); +// destinationAddressSecondBoxNumberAddress!.HouseNumber.Should().Be(houseNumberEleven); +// destinationAddressSecondBoxNumberAddress.Status.Should().Be(sourceAddressSecondBoxNumberAddressWasMigrated.Status); +// destinationAddressSecondBoxNumberAddress.Geometry.GeometryMethod.Should().Be(sourceAddressSecondBoxNumberAddressWasMigrated.GeometryMethod); +// destinationAddressSecondBoxNumberAddress.Geometry.GeometrySpecification.Should().Be(sourceAddressSecondBoxNumberAddressWasMigrated.GeometrySpecification); +// destinationAddressSecondBoxNumberAddress.Geometry.Geometry.Should().Be(new ExtendedWkbGeometry(sourceAddressSecondBoxNumberAddressWasMigrated.ExtendedWkbGeometry)); +// destinationAddressSecondBoxNumberAddress.PostalCode.Should().Be(new PostalCode(sourceAddressSecondBoxNumberAddressWasMigrated.PostalCode!)); +// destinationAddressSecondBoxNumberAddress.IsOfficiallyAssigned.Should().Be(sourceAddressSecondBoxNumberAddressWasMigrated.OfficiallyAssigned); +// +// destinationAddress.LastEventHash.Should().Be(addressHouseNumberWasReaddressed.GetHash()); +// destinationAddressFirstBoxNumberAddress.LastEventHash.Should().Be(addressHouseNumberWasReaddressed.GetHash()); +// destinationAddressSecondBoxNumberAddress.LastEventHash.Should().Be(addressHouseNumberWasReaddressed.GetHash()); +// } +// } +// } diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs new file mode 100644 index 000000000..80ee0d876 --- /dev/null +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs @@ -0,0 +1,124 @@ +namespace AddressRegistry.Tests.AggregateTests.WhenRetiringStreetNameBecauseOfRename +{ + using System.Collections.Generic; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.AggregateSource; + using Be.Vlaanderen.Basisregisters.AggregateSource.Snapshotting; + using Be.Vlaanderen.Basisregisters.AggregateSource.Testing; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using EventExtensions; + using FluentAssertions; + using global::AutoFixture; + using StreetName; + using StreetName.Commands; + using StreetName.Events; + using Xunit; + using Xunit.Abstractions; + + public class GivenStreetName : AddressRegistryTest + { + private readonly StreetNameStreamId _streamId; + + public GivenStreetName(ITestOutputHelper testOutputHelper) : base(testOutputHelper) + { + Fixture.Customize(new InfrastructureCustomization()); + Fixture.Customize(new WithFixedStreetNamePersistentLocalId()); + Fixture.Customizations.Add(new WithUniqueInteger()); + _streamId = Fixture.Create(); + } + + [Fact] + public void ThenAddressesWereRetiredOrRejectedAndStreetNameWasRetired() + { + var streetNamePersistentLocalId = Fixture.Create(); + + var command = new RetireStreetNameBecauseOfRename( + streetNamePersistentLocalId, + new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1), + Fixture.Create()); + + var streetNameWasImported = Fixture.Create() + .WithStatus(StreetNameStatus.Current); + + var proposedAddress = Fixture.Create() + .AsHouseNumberAddress(); + var currentAddress = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current); + + Assert(new Scenario() + .Given(_streamId, + streetNameWasImported, + proposedAddress, + currentAddress) + .When(command) + .Then( + new Fact(new StreetNameStreamId(command.PersistentLocalId), + new AddressWasRejectedBecauseOfReaddress(streetNamePersistentLocalId, + new AddressPersistentLocalId(proposedAddress.AddressPersistentLocalId))), + new Fact(new StreetNameStreamId(command.PersistentLocalId), + new AddressWasRetiredBecauseOfReaddress(streetNamePersistentLocalId, + new AddressPersistentLocalId(currentAddress.AddressPersistentLocalId))), + new Fact(new StreetNameStreamId(command.PersistentLocalId), + new StreetNameWasRenamed(streetNamePersistentLocalId, command.DestinationPersistentLocalId)))); + } + + [Fact] + public void WithInActiveAddresses_ThenStreetNameWasRetired() + { + var streetNamePersistentLocalId = Fixture.Create(); + + var command = new RetireStreetNameBecauseOfRename( + streetNamePersistentLocalId, + new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1), + Fixture.Create()); + + var streetNameWasImported = Fixture.Create() + .WithStatus(StreetNameStatus.Current); + + var retiredAddress = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Retired); + var rejectedAddress = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Rejected); + var removedAddress = Fixture.Create() + .AsHouseNumberAddress() + .WithStatus(AddressStatus.Current) + .WithRemoved(); + + Assert(new Scenario() + .Given(_streamId, + streetNameWasImported, + retiredAddress, + rejectedAddress, + removedAddress) + .When(command) + .Then(new Fact(new StreetNameStreamId(command.PersistentLocalId), + new StreetNameWasRenamed(streetNamePersistentLocalId, command.DestinationPersistentLocalId)))); + } + + [Fact] + public void StateCheck() + { + // Arrange + var streetNamePersistentLocalId = Fixture.Create(); + var destinationStreetNamePersistentLocalId = new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1); + + var migratedStreetNameWasImported = Fixture.Create() + .WithStatus(StreetNameStatus.Current); + + var sut = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sut.Initialize(new List + { + migratedStreetNameWasImported, + new StreetNameWasRenamed( + streetNamePersistentLocalId, + destinationStreetNamePersistentLocalId) + }); + + // Assert + sut.Status.Should().Be(StreetNameStatus.Retired); + } + } +} diff --git a/test/AddressRegistry.Tests/AutoFixture/WithFixedPostalCode.cs b/test/AddressRegistry.Tests/AutoFixture/WithFixedPostalCode.cs new file mode 100644 index 000000000..a2d8b4f7d --- /dev/null +++ b/test/AddressRegistry.Tests/AutoFixture/WithFixedPostalCode.cs @@ -0,0 +1,21 @@ +namespace AddressRegistry.Tests.AutoFixture +{ + using Address; + using global::AutoFixture; + using global::AutoFixture.Kernel; + + public class WithFixedPostalCode : ICustomization + { + public void Customize(IFixture fixture) + { + var postalCodeAsString = "9000"; + fixture.Customize(c => c.FromFactory(() => new PostalCode(postalCodeAsString))); + fixture.Customizations.Add( + new FilteringSpecimenBuilder( + new FixedBuilder(postalCodeAsString), + new ParameterSpecification( + typeof(string), + "postalCode"))); + } + } +} diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenApprovingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenApprovingAddress/GivenStreetNameExists.cs index ee7dee114..1d1fa3594 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenApprovingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenApprovingAddress/GivenStreetNameExists.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenApprovingAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPosition/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPosition/GivenStreetNameExists.cs index 81d24d7cb..4fea69534 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPosition/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPosition/GivenStreetNameExists.cs @@ -9,28 +9,28 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenChangingAddressPosition using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Edit.Contracts; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPostalCode/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPostalCode/GivenStreetNameExists.cs index e7e4b280e..f54ad9ef3 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPostalCode/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenChangingAddressPostalCode/GivenStreetNameExists.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenChangingAddressPostalCode using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressApproval/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressApproval/GivenStreetNameExists.cs index d13b13dfe..b7e2a499d 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressApproval/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressApproval/GivenStreetNameExists.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressApproval using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressBoxNumber/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressBoxNumber/GivenStreetNameExists.cs index 9ae074e10..2321547ac 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressBoxNumber/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressBoxNumber/GivenStreetNameExists.cs @@ -16,7 +16,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressBoxNumber using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -30,6 +29,7 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressBoxNumber using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressDeregulation/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressDeregulation/GivenStreetNameExists.cs index 267fa4fa1..ecaf1a7b6 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressDeregulation/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressDeregulation/GivenStreetNameExists.cs @@ -15,8 +15,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressDeregulat using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -31,6 +29,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressDeregulat using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressHouseNumber/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressHouseNumber/GivenStreetNameExists.cs index 58fcfdc55..cb91b0a9f 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressHouseNumber/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressHouseNumber/GivenStreetNameExists.cs @@ -9,26 +9,26 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressHouseNumb using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPosition/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPosition/GivenStreetNameExists.cs index 4264abd88..dd8756453 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPosition/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPosition/GivenStreetNameExists.cs @@ -9,28 +9,28 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressPosition using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Edit.Contracts; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPostalCode/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPostalCode/GivenStreetNameExists.cs index 3827f4c81..ad2bfb7f3 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPostalCode/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressPostalCode/GivenStreetNameExists.cs @@ -9,29 +9,29 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressPostalCod using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using AddressRegistry.Consumer.Read.Municipality.Projections; - using Projections.Syndication.PostalInfo; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; + using Consumer.Read.Municipality.Projections; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; + using Projections.Syndication.PostalInfo; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRegularization/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRegularization/GivenStreetNameExists.cs index c4950b755..e2f968169 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRegularization/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRegularization/GivenStreetNameExists.cs @@ -15,8 +15,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressRegulariz using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -31,6 +29,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressRegulariz using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRejection/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRejection/GivenStreetNameExists.cs index 11cd0cf21..3c2eae900 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRejection/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRejection/GivenStreetNameExists.cs @@ -15,8 +15,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressRejection using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -31,6 +29,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressRejection using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRetirement/WhenCorrectingAddressRetirement.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRetirement/WhenCorrectingAddressRetirement.cs index ea38c354b..034ccc9b8 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRetirement/WhenCorrectingAddressRetirement.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenCorrectingAddressRetirement/WhenCorrectingAddressRetirement.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenCorrectingAddressRetiremen using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class WhenRetiringAddress : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenDeregulatingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenDeregulatingAddress/GivenStreetNameExists.cs index e4b1b1ffc..a23d131a7 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenDeregulatingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenDeregulatingAddress/GivenStreetNameExists.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenDeregulatingAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenProposingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenProposingAddress/GivenStreetNameExists.cs index 8ad9cb1cd..1b778f2de 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenProposingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenProposingAddress/GivenStreetNameExists.cs @@ -16,7 +16,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenProposingAddress using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Edit.Contracts; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using Consumer.Read.Municipality.Projections; using FluentAssertions; @@ -32,6 +31,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenProposingAddress using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; + using IIdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IIdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenIdempotencyException.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenIdempotencyException.cs index 6212bcb9b..3610a7d63 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenIdempotencyException.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenIdempotencyException.cs @@ -16,7 +16,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenReaddress using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -26,6 +25,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenReaddress using StreetName.Commands; using Xunit; using Xunit.Abstractions; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; + using IIdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IIdempotentCommandHandler; public class GivenIdempotencyException : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenStreetNameExists.cs index 9abd825ef..8c431ff31 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenReaddress/GivenStreetNameExists.cs @@ -16,7 +16,6 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenReaddress using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; @@ -26,6 +25,8 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenReaddress using StreetName.Commands; using Xunit; using Xunit.Abstractions; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; + using IIdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IIdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { @@ -331,8 +332,17 @@ public async Task WithAddressesToRetireOutsideDestinationStreetName_ThenPersiste new HouseNumber("11"), new BoxNumber("A")); + var anotherProposedAddressOfSecondStreetName = ProposeAddress( + secondOtherStreetNamePersistentLocalId, + new AddressPersistentLocalId(7892), + new PostalCode("2018"), + Fixture.Create(), + new HouseNumber("9"), + null); + var destinationHouseNumber = "13"; var secondDestinationHouseNumber = "15"; + var thirdDestinationHouseNumber = "17"; var eTagResponses = new List(); @@ -360,6 +370,11 @@ await _fakeBackOfficeContext.AddIdempotentAddressStreetNameIdRelation( secondOtherStreetNamePersistentLocalId, CancellationToken.None); + await _fakeBackOfficeContext.AddIdempotentAddressStreetNameIdRelation( + anotherProposedAddressOfSecondStreetName.AddressPersistentLocalId, + secondOtherStreetNamePersistentLocalId, + CancellationToken.None); + // Act await sut.Handle(new ReaddressLambdaRequest(_streetNamePersistentLocalId, new ReaddressSqsRequest { @@ -377,12 +392,18 @@ await _fakeBackOfficeContext.AddIdempotentAddressStreetNameIdRelation( { BronAdresId = AddressPuriFor(proposedAddressOfSecondStreetName.AddressPersistentLocalId), DoelHuisnummer = secondDestinationHouseNumber + }, + new AddressToReaddressItem + { + BronAdresId = AddressPuriFor(anotherProposedAddressOfSecondStreetName.AddressPersistentLocalId), + DoelHuisnummer = thirdDestinationHouseNumber } }, OpheffenAdressen = new List() { AddressPuriFor(proposedAddressOfFirstStreetName.AddressPersistentLocalId), - AddressPuriFor(proposedAddressOfSecondStreetName.AddressPersistentLocalId) + AddressPuriFor(proposedAddressOfSecondStreetName.AddressPersistentLocalId), + AddressPuriFor(anotherProposedAddressOfSecondStreetName.AddressPersistentLocalId), } }, TicketId = Guid.NewGuid(), @@ -395,6 +416,7 @@ await _fakeBackOfficeContext.AddIdempotentAddressStreetNameIdRelation( var firstDestinationAddressPersistentLocalId = new AddressPersistentLocalId(1); // FakePersistentLocalIdGenerator starts always with id 1 var secondDestinationAddressPersistentLocalId = new AddressPersistentLocalId(2); var secondDestinationBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(3); + var thirdDestinationBoxNumberAddressPersistentLocalId = new AddressPersistentLocalId(4); _fakeBackOfficeContext.AddressPersistentIdStreetNamePersistentIds .FirstOrDefault(x => x.AddressPersistentLocalId == firstDestinationAddressPersistentLocalId) @@ -408,7 +430,11 @@ await _fakeBackOfficeContext.AddIdempotentAddressStreetNameIdRelation( .FirstOrDefault(x => x.AddressPersistentLocalId == secondDestinationBoxNumberAddressPersistentLocalId) .Should().NotBeNull(); - eTagResponses.Count.Should().Be(4); + _fakeBackOfficeContext.AddressPersistentIdStreetNamePersistentIds + .FirstOrDefault(x => x.AddressPersistentLocalId == thirdDestinationBoxNumberAddressPersistentLocalId) + .Should().NotBeNull(); + + eTagResponses.Count.Should().Be(6); var firstDestinationAddressEtagResponse = eTagResponses.FirstOrDefault(x => x.Location == string.Format(ConfigDetailUrl, firstDestinationAddressPersistentLocalId)); firstDestinationAddressEtagResponse.Should().NotBeNull(); var secondDestinationAddressEtagResponse = eTagResponses.FirstOrDefault(x => x.Location == string.Format(ConfigDetailUrl, secondDestinationAddressPersistentLocalId)); diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRegularizingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRegularizingAddress/GivenStreetNameExists.cs index 17e20656f..d660b4ab1 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRegularizingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRegularizingAddress/GivenStreetNameExists.cs @@ -9,28 +9,28 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenRegularizingAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Commands; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Commands; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRejectingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRejectingAddress/GivenStreetNameExists.cs index a9286f759..9db4c5479 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRejectingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRejectingAddress/GivenStreetNameExists.cs @@ -9,28 +9,28 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenRejectingAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Commands; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Commands; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRemovingAddress/GivenStreetNameExists.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRemovingAddress/GivenStreetNameExists.cs index f62ccdcc7..8ff978d0f 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRemovingAddress/GivenStreetNameExists.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRemovingAddress/GivenStreetNameExists.cs @@ -9,27 +9,27 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenRemovingAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Commands; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Commands; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class GivenStreetNameExists : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRetiringAddress/WhenRetiringAddress.cs b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRetiringAddress/WhenRetiringAddress.cs index fecce7e81..c4b94d733 100644 --- a/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRetiringAddress/WhenRetiringAddress.cs +++ b/test/AddressRegistry.Tests/BackOffice/Lambda/WhenRetiringAddress/WhenRetiringAddress.cs @@ -9,28 +9,28 @@ namespace AddressRegistry.Tests.BackOffice.Lambda.WhenRetiringAddress using AddressRegistry.Api.BackOffice.Abstractions.SqsRequests; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Handlers; using AddressRegistry.Api.BackOffice.Handlers.Lambda.Requests; - using StreetName; - using StreetName.Commands; - using StreetName.Exceptions; - using AutoFixture; - using AddressRegistry.Tests.BackOffice.Infrastructure; - using Infrastructure; using Autofac; + using AutoFixture; + using BackOffice.Infrastructure; using Be.Vlaanderen.Basisregisters.CommandHandling; using Be.Vlaanderen.Basisregisters.CommandHandling.Idempotency; using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Sqs.Exceptions; - using Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers; using Be.Vlaanderen.Basisregisters.Sqs.Responses; using FluentAssertions; using global::AutoFixture; + using Infrastructure; using Microsoft.Extensions.Configuration; using Moq; using SqlStreamStore; using SqlStreamStore.Streams; + using StreetName; + using StreetName.Commands; + using StreetName.Exceptions; using TicketingService.Abstractions; using Xunit; using Xunit.Abstractions; + using IdempotencyException = Be.Vlaanderen.Basisregisters.Sqs.Exceptions.IdempotencyException; + using IdempotentCommandHandler = Be.Vlaanderen.Basisregisters.Sqs.Lambda.Handlers.IdempotentCommandHandler; public class WhenRetiringAddress : BackOfficeLambdaTest { diff --git a/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasChangedExtensions.cs b/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasChangedExtensions.cs new file mode 100644 index 000000000..8ed22b9b1 --- /dev/null +++ b/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasChangedExtensions.cs @@ -0,0 +1,39 @@ +namespace AddressRegistry.Tests.EventExtensions +{ + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using StreetName; + using StreetName.Events; + + public static class AddressPositionWasChangedExtensions + { + public static AddressPositionWasChanged WithAddressPersistentLocalId( + this AddressPositionWasChanged @event, + AddressPersistentLocalId addressPersistentLocalId) + { + var newEvent = new AddressPositionWasChanged( + new StreetNamePersistentLocalId(@event.StreetNamePersistentLocalId), + addressPersistentLocalId, + @event.GeometryMethod, + @event.GeometrySpecification, + new ExtendedWkbGeometry(@event.ExtendedWkbGeometry)); + ((ISetProvenance)newEvent).SetProvenance(@event.Provenance.ToProvenance()); + + return newEvent; + } + + public static AddressPositionWasChanged WithExtendedWkbGeometry( + this AddressPositionWasChanged @event, + ExtendedWkbGeometry extendedWkbGeometry) + { + var newEvent = new AddressPositionWasChanged( + new StreetNamePersistentLocalId(@event.StreetNamePersistentLocalId), + new AddressPersistentLocalId(@event.AddressPersistentLocalId), + @event.GeometryMethod, + @event.GeometrySpecification, + extendedWkbGeometry); + ((ISetProvenance)newEvent).SetProvenance(@event.Provenance.ToProvenance()); + + return newEvent; + } + } +} diff --git a/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasCorrectedV2Extensions.cs b/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasCorrectedV2Extensions.cs new file mode 100644 index 000000000..e0dad60ea --- /dev/null +++ b/test/AddressRegistry.Tests/EventExtensions/AddressPositionWasCorrectedV2Extensions.cs @@ -0,0 +1,39 @@ +namespace AddressRegistry.Tests.EventExtensions +{ + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using StreetName; + using StreetName.Events; + + public static class AddressPositionWasCorrectedV2Extensions + { + public static AddressPositionWasCorrectedV2 WithAddressPersistentLocalId( + this AddressPositionWasCorrectedV2 @event, + AddressPersistentLocalId addressPersistentLocalId) + { + var newEvent = new AddressPositionWasCorrectedV2( + new StreetNamePersistentLocalId(@event.StreetNamePersistentLocalId), + addressPersistentLocalId, + @event.GeometryMethod, + @event.GeometrySpecification, + new ExtendedWkbGeometry(@event.ExtendedWkbGeometry)); + ((ISetProvenance)newEvent).SetProvenance(@event.Provenance.ToProvenance()); + + return newEvent; + } + + public static AddressPositionWasCorrectedV2 WithExtendedWkbGeometry( + this AddressPositionWasCorrectedV2 @event, + ExtendedWkbGeometry extendedWkbGeometry) + { + var newEvent = new AddressPositionWasCorrectedV2( + new StreetNamePersistentLocalId(@event.StreetNamePersistentLocalId), + new AddressPersistentLocalId(@event.AddressPersistentLocalId), + @event.GeometryMethod, + @event.GeometrySpecification, + extendedWkbGeometry); + ((ISetProvenance)newEvent).SetProvenance(@event.Provenance.ToProvenance()); + + return newEvent; + } + } +} diff --git a/test/AddressRegistry.Tests/GeometryHelpers.cs b/test/AddressRegistry.Tests/GeometryHelpers.cs index 57c1d18ef..45b969614 100644 --- a/test/AddressRegistry.Tests/GeometryHelpers.cs +++ b/test/AddressRegistry.Tests/GeometryHelpers.cs @@ -27,6 +27,10 @@ public static class GeometryHelpers "" + "103672.37 192046.71"; + public const string ThirdGmlPointGeometry = + "" + + "103673.37 192046.71"; + private static readonly WKBWriter WkbWriter = new WKBWriter { Strict = false, HandleSRID = true }; public static byte[] ExampleWkb { get; } public static byte[] ExampleExtendedWkb { get; } diff --git a/test/AddressRegistry.Tests/ProjectionTests/Consumer/StreetNameConsumerKafkaProjectionTests.cs b/test/AddressRegistry.Tests/ProjectionTests/Consumer/StreetNameConsumerKafkaProjectionTests.cs index b86124d69..1be6ca433 100644 --- a/test/AddressRegistry.Tests/ProjectionTests/Consumer/StreetNameConsumerKafkaProjectionTests.cs +++ b/test/AddressRegistry.Tests/ProjectionTests/Consumer/StreetNameConsumerKafkaProjectionTests.cs @@ -266,6 +266,33 @@ await Then(async _ => }); } + [Fact] + public async Task GivenStreetNameWasRenamed_ThenRenameAndRetireBecauseOfRenameStreetName() + { + var @event = new StreetNameWasRenamed( + Fixture.Create(), + Fixture.Create(), + Fixture.Create(), + new Provenance( + Instant.FromDateTimeOffset(DateTimeOffset.Now).ToString(), + Application.AddressRegistry.ToString(), + Modification.Update.ToString(), + Organisation.Aiv.ToString(), + "test")); + + Given(@event); + await Then(async _ => + { + _mockCommandHandler.Verify( + x => x.Handle(It.Is(x => x is RenameStreetName), CancellationToken.None), + Times.Once); + _mockCommandHandler.Verify( + x => x.Handle(It.Is(x => x is RetireStreetNameBecauseOfRename), CancellationToken.None), + Times.Once); + await Task.CompletedTask; + }); + } + [Fact] public async Task GivenStreetNameWasCorrectedFromRetiredToCurrent_ThenCorrectStreetNameRetirement() { diff --git a/test/AddressRegistry.Tests/ProjectionTests/Legacy/Wms/AddressWmsItemProjectionTests.cs b/test/AddressRegistry.Tests/ProjectionTests/Legacy/Wms/AddressWmsItemProjectionTests.cs index 24f7dba05..e5042ed14 100644 --- a/test/AddressRegistry.Tests/ProjectionTests/Legacy/Wms/AddressWmsItemProjectionTests.cs +++ b/test/AddressRegistry.Tests/ProjectionTests/Legacy/Wms/AddressWmsItemProjectionTests.cs @@ -2,6 +2,7 @@ namespace AddressRegistry.Tests.ProjectionTests.Legacy.Wms { using System.Collections.Generic; using System.Threading.Tasks; + using Address.Events; using AddressRegistry.StreetName; using AddressRegistry.StreetName.DataStructures; using AddressRegistry.StreetName.Events; diff --git a/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2HouseNumberLabelTests.cs b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2HouseNumberLabelTests.cs new file mode 100644 index 000000000..bc2ac6469 --- /dev/null +++ b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2HouseNumberLabelTests.cs @@ -0,0 +1,1257 @@ +namespace AddressRegistry.Tests.ProjectionTests.WmsV2 +{ + using System.Collections.Generic; + using System.Threading.Tasks; + using AddressRegistry.StreetName; + using AddressRegistry.StreetName.DataStructures; + using AddressRegistry.StreetName.Events; + using Api.BackOffice.Abstractions; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore; + using EventExtensions; + using FluentAssertions; + using global::AutoFixture; + using NetTopologySuite.IO; + using Projections.Wms.AddressWmsItemV2; + using Xunit; + + public class AddressWmsItemV2HouseNumberLabelTests : AddressWmsItemV2ProjectionTest + { + private readonly Fixture _fixture; + private readonly WKBReader _wkbReader; + + public AddressWmsItemV2HouseNumberLabelTests() + { + _fixture = new Fixture(); + _fixture.Customize(new WithFixedAddressPersistentLocalId()); + _fixture.Customize(new WithFixedStreetNamePersistentLocalId()); + _fixture.Customize(_ => new WithoutUnknownStreetNameAddressStatus()); + _fixture.Customize(new WithValidHouseNumber()); + _fixture.Customize(new WithExtendedWkbGeometry()); + _fixture.Customize(new InfrastructureCustomization()); + + _wkbReader = WKBReaderFactory.Create(); + } + + protected override AddressWmsItemV2Projections CreateProjection() + => new AddressWmsItemV2Projections(_wkbReader); + + private AddressWasMigratedToStreetName CreateAddressWasMigratedToStreetName( + AddressPersistentLocalId addressPersistentLocalId, + HouseNumber houseNumber, + AddressStatus addressStatus, + ExtendedWkbGeometry? position = null) + { + var @event = _fixture.Create() + .WithAddressPersistentLocalId(addressPersistentLocalId) + .WithParentAddressPersistentLocalId(null) + .WithHouseNumber(houseNumber) + .WithStatus(addressStatus) + .WithNotRemoved(); + + if (position is not null) + { + @event = @event.WithPosition(position); + } + + return @event; + } + + [Fact] + public async Task WhenAddressWasMigratedToStreetName() + { + var houseNumberOne = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(1), + new HouseNumber("1"), + AddressStatus.Proposed); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOne, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOne.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("1-3"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasProposedV2() + { + var houseNumberOne = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithParentAddressPersistentLocalId(null) + .WithHouseNumber(new HouseNumber("1")); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOne, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOne.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("1-3"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasApproved() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromApprovedToProposed() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasCorrectedFromApprovedToProposed = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasCorrectedFromApprovedToProposed, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("2"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(1); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromApprovedToProposedBecauseHouseNumberWasCorrected() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasCorrectedFromApprovedToProposed = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasCorrectedFromApprovedToProposed, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("2"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(1); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasRejected() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseHouseNumberWasRejected() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseHouseNumberWasRetired() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseStreetNameWasRejected() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseStreetNameWasRejected() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1"); + two!.HouseNumberLabel.Should().Be("2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(1); + two.HouseNumberLabelLength.Should().Be(1); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseStreetNameWasRetired() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasDeregulated() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasDeregulated = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasDeregulated, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromRejectedToProposed() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberOneWasCorrectedFromRejectedToProposed = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasCorrectedFromRejectedToProposed, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("2"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(1); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredV2() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Retired, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseHouseNumberWasRetired() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Retired, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseStreetNameWasRetired() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Retired, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromRetiredToCurrent() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberOneWasCorrectedFromRetiredToCurrent = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Retired, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasCorrectedFromRetiredToCurrent, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("2"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(1); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressHouseNumberWasCorrectedV2() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("4")); + var houseNumberOneWasCorrected = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasCorrected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("1-3"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressPositionWasChanged() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + + var originalPosition = houseNumberOneWasProposed.ExtendedWkbGeometry; + var newPosition = GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry(); + + var addressPositionWasChanged = new AddressPositionWasChanged( + _fixture.Create(), + _fixture.Create(), + GeometryMethod.AppointedByAdministrator, + GeometrySpecification.Building, + newPosition); + ((ISetProvenance)addressPositionWasChanged).SetProvenance(_fixture.Create()); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + newPosition); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(originalPosition)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(addressPositionWasChanged, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressPositionWasCorrectedV2() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + + var originalPosition = houseNumberOneWasProposed.ExtendedWkbGeometry; + var newPosition = GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry(); + + var addressPositionWasChanged = new AddressPositionWasCorrectedV2( + _fixture.Create(), + _fixture.Create(), + GeometryMethod.AppointedByAdministrator, + GeometrySpecification.Building, + newPosition); + ((ISetProvenance)addressPositionWasChanged).SetProvenance(_fixture.Create()); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + newPosition); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(originalPosition)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(addressPositionWasChanged, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressHouseNumberWasReaddressed() + { + var addressPersistentLocalId = _fixture.Create(); + var addressBoxNumberPersistentLocalId = new AddressPersistentLocalId(addressPersistentLocalId + 1); + var houseNumberThreeWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("3")) + .WithBoxNumber(null); + var boxNumberThreeWasProposed = _fixture.Create() + .WithAddressPersistentLocalId(addressBoxNumberPersistentLocalId) + .WithHouseNumber(new HouseNumber("3")) + .WithBoxNumber(new BoxNumber("A")) + .WithExtendedWkbGeometry(houseNumberThreeWasProposed.ExtendedWkbGeometry); + + var originalPosition = houseNumberThreeWasProposed.ExtendedWkbGeometry; + var newPosition = GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry(); + + var streetNameWasReaddressed = new AddressHouseNumberWasReaddressed( + _fixture.Create(), + addressPersistentLocalId, + new ReaddressedAddressData( + new AddressPersistentLocalId(addressPersistentLocalId + 10), + addressPersistentLocalId, + isDestinationNewlyProposed: true, + AddressStatus.Proposed, + new HouseNumber("3"), + boxNumber: null, + new PostalCode(houseNumberThreeWasProposed.PostalCode), + new AddressGeometry( + houseNumberThreeWasProposed.GeometryMethod, + houseNumberThreeWasProposed.GeometrySpecification, + newPosition), + sourceIsOfficiallyAssigned: true), + new List + { + new ReaddressedAddressData( + new AddressPersistentLocalId(addressPersistentLocalId + 11), + addressBoxNumberPersistentLocalId, + isDestinationNewlyProposed: true, + AddressStatus.Proposed, + new HouseNumber("3"), + new BoxNumber("A"), + new PostalCode(houseNumberThreeWasProposed.PostalCode), + new AddressGeometry( + houseNumberThreeWasProposed.GeometryMethod, + houseNumberThreeWasProposed.GeometrySpecification, + newPosition), + sourceIsOfficiallyAssigned: true) + }); + ((ISetProvenance)streetNameWasReaddressed).SetProvenance(_fixture.Create()); + + var houseNumberFiveWasMigrated = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(20), + new HouseNumber("5"), + AddressStatus.Proposed, + newPosition); + var houseNumberSevenWasMigrated = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(30), + new HouseNumber("7"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(originalPosition)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberThreeWasProposed, new Dictionary())), + new Envelope(new Envelope(boxNumberThreeWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberSevenWasMigrated, new Dictionary())), + new Envelope(new Envelope(houseNumberFiveWasMigrated, new Dictionary())), + new Envelope(new Envelope(streetNameWasReaddressed, new Dictionary()))) + .Then(async ct => + { + var houseNumberThree = await ct.AddressWmsItemsV2.FindAsync(houseNumberThreeWasProposed.AddressPersistentLocalId); + houseNumberThree.Should().NotBeNull(); + var houseNumberFive = await ct.AddressWmsItemsV2.FindAsync(houseNumberFiveWasMigrated.AddressPersistentLocalId); + houseNumberFive.Should().NotBeNull(); + var houseNumberSeven = await ct.AddressWmsItemsV2.FindAsync(houseNumberSevenWasMigrated.AddressPersistentLocalId); + houseNumberSeven.Should().NotBeNull(); + + houseNumberThree!.HouseNumberLabel.Should().Be("3-5"); + houseNumberFive!.HouseNumberLabel.Should().Be("3-5"); + houseNumberSeven!.HouseNumberLabel.Should().Be("7"); + houseNumberThree.HouseNumberLabelLength.Should().Be(3); + houseNumberFive.HouseNumberLabelLength.Should().Be(3); + houseNumberSeven.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasProposedBecauseOfReaddress() + { + var houseNumberOne = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithParentAddressPersistentLocalId(null) + .WithHouseNumber(new HouseNumber("1")); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOne.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOne, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOne.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-3"); + two!.HouseNumberLabel.Should().Be("1-3"); + three!.HouseNumberLabel.Should().Be("1-3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseOfReaddress() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRejected = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Rejected, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRejected, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseOfReaddress() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasApproved = _fixture.Create(); + var houseNumberOneWasRetired = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Retired, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Current, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasApproved, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRetired, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().Be("1-2"); + two!.HouseNumberLabel.Should().Be("1-2"); + three!.HouseNumberLabel.Should().Be("3"); + one.HouseNumberLabelLength.Should().Be(3); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(1); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedV2() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRemoved = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRemoved, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().BeNull(); + two!.HouseNumberLabel.Should().Be("2-3"); + three!.HouseNumberLabel.Should().Be("2-3"); + + one.HouseNumberLabelLength.Should().BeNull(); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedBecauseStreetNameWasRemoved() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRemoved = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRemoved, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().BeNull(); + two!.HouseNumberLabel.Should().Be("2-3"); + three!.HouseNumberLabel.Should().Be("2-3"); + + one.HouseNumberLabelLength.Should().BeNull(); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedBecauseHouseNumberWasRemoved() + { + var houseNumberOneWasProposed = _fixture.Create() + .WithHouseNumber(new HouseNumber("1")); + var houseNumberOneWasRemoved = _fixture.Create(); + var houseNumberTwo = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(2), + new HouseNumber("2"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + var houseNumberThree = CreateAddressWasMigratedToStreetName( + new AddressPersistentLocalId(3), + new HouseNumber("3"), + AddressStatus.Proposed, + new ExtendedWkbGeometry(houseNumberOneWasProposed.ExtendedWkbGeometry)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberOneWasProposed, new Dictionary())), + new Envelope(new Envelope(houseNumberThree, new Dictionary())), + new Envelope(new Envelope(houseNumberTwo, new Dictionary())), + new Envelope(new Envelope(houseNumberOneWasRemoved, new Dictionary()))) + .Then(async ct => + { + var one = await ct.AddressWmsItemsV2.FindAsync(houseNumberOneWasProposed.AddressPersistentLocalId); + one.Should().NotBeNull(); + var two = await ct.AddressWmsItemsV2.FindAsync(houseNumberTwo.AddressPersistentLocalId); + one.Should().NotBeNull(); + var three = await ct.AddressWmsItemsV2.FindAsync(houseNumberThree.AddressPersistentLocalId); + one.Should().NotBeNull(); + + one!.HouseNumberLabel.Should().BeNull(); + two!.HouseNumberLabel.Should().Be("2-3"); + three!.HouseNumberLabel.Should().Be("2-3"); + + one.HouseNumberLabelLength.Should().BeNull(); + two.HouseNumberLabelLength.Should().Be(3); + three.HouseNumberLabelLength.Should().Be(3); + }); + } + } +} diff --git a/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTest.cs b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTest.cs new file mode 100644 index 000000000..c99f507d3 --- /dev/null +++ b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTest.cs @@ -0,0 +1,30 @@ +namespace AddressRegistry.Tests.ProjectionTests.WmsV2 +{ + using System; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.Testing; + using Microsoft.EntityFrameworkCore; + using Projections.Wms; + using Projections.Wms.AddressWmsItemV2; + + public abstract class AddressWmsItemV2ProjectionTest + { + protected ConnectedProjectionTest Sut { get; } + + public AddressWmsItemV2ProjectionTest() + { + Sut = new ConnectedProjectionTest(CreateContext, CreateProjection); + } + + protected virtual WmsContext CreateContext() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .Options; + + return new WmsContext(options); + } + + protected abstract AddressWmsItemV2Projections CreateProjection(); + + } +} diff --git a/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTests.cs b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTests.cs new file mode 100644 index 000000000..be58998a9 --- /dev/null +++ b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/AddressWmsItemV2ProjectionTests.cs @@ -0,0 +1,1499 @@ +namespace AddressRegistry.Tests.ProjectionTests.WmsV2 +{ + using System.Collections.Generic; + using System.Threading.Tasks; + using AddressRegistry.StreetName; + using AddressRegistry.StreetName.DataStructures; + using AddressRegistry.StreetName.Events; + using Api.BackOffice.Abstractions; + using AutoFixture; + using Be.Vlaanderen.Basisregisters.GrAr.Common.Pipes; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore; + using Be.Vlaanderen.Basisregisters.Utilities.HexByteConvertor; + using EventExtensions; + using FluentAssertions; + using global::AutoFixture; + using NetTopologySuite.Geometries; + using NetTopologySuite.IO; + using NodaTime; + using Projections.Wms; + using Projections.Wms.AddressWmsItem; + using Projections.Wms.AddressWmsItemV2; + using Xunit; + using Envelope = Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Envelope; + + public class AddressWmsItemV2ProjectionTests : AddressWmsItemV2ProjectionTest + { + private readonly Fixture _fixture; + private readonly WKBReader _wkbReader; + + public AddressWmsItemV2ProjectionTests() + { + _fixture = new Fixture(); + _fixture.Customize(new WithFixedAddressPersistentLocalId()); + _fixture.Customize(new WithFixedStreetNamePersistentLocalId()); + _fixture.Customize(_ => new WithoutUnknownStreetNameAddressStatus()); + _fixture.Customize(new WithValidHouseNumber()); + _fixture.Customize(new WithExtendedWkbGeometry()); + _fixture.Customize(new InfrastructureCustomization()); + + _wkbReader = WKBReaderFactory.Create(); + } + + protected override AddressWmsItemV2Projections CreateProjection() + => new AddressWmsItemV2Projections(_wkbReader); + + [Fact] + public async Task WhenAddressWasMigratedToStreetName_HouseNumber() + { + var addressWasMigratedToStreetName = _fixture.Create() + .WithBoxNumber(null) + .WithParentAddressPersistentLocalId(null); + + await Sut + .Given(new Envelope(new Envelope(addressWasMigratedToStreetName, new Dictionary()))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasMigratedToStreetName.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.ParentAddressPersistentLocalId.Should().BeNull(); + addressWmsItem.StreetNamePersistentLocalId.Should().Be(addressWasMigratedToStreetName.StreetNamePersistentLocalId); + addressWmsItem.HouseNumber.Should().Be(addressWasMigratedToStreetName.HouseNumber); + addressWmsItem.BoxNumber.Should().Be(addressWasMigratedToStreetName.BoxNumber); + addressWmsItem.LabelType.Should().Be(WmsAddressLabelType.HouseNumberWithoutBoxes); + addressWmsItem.PostalCode.Should().Be(addressWasMigratedToStreetName.PostalCode); + addressWmsItem.Status.Should().Be(AddressWmsItemProjections.MapStatus(addressWasMigratedToStreetName.Status)); + addressWmsItem.OfficiallyAssigned.Should().Be(addressWasMigratedToStreetName.OfficiallyAssigned); + addressWmsItem.Position.Should().BeEquivalentTo((Point)_wkbReader.Read(addressWasMigratedToStreetName.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressWasMigratedToStreetName.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressWasMigratedToStreetName.GeometrySpecification)); + addressWmsItem.Removed.Should().Be(addressWasMigratedToStreetName.IsRemoved); + addressWmsItem.VersionTimestamp.Should().Be(addressWasMigratedToStreetName.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasMigratedToStreetName_HouseNumberWithBoxNumberOnSamePosition() + { + var houseNumberAddressWasMigratedToStreetName = _fixture.Create() + .WithBoxNumber(null) + .WithParentAddressPersistentLocalId(null) + .WithNotRemoved(); + var boxNumberAddressWasMigratedToStreetName = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId + 1)) + .WithBoxNumber(_fixture.Create()) + .WithParentAddressPersistentLocalId(new AddressPersistentLocalId(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberAddressWasMigratedToStreetName, new Dictionary())), + new Envelope(new Envelope(boxNumberAddressWasMigratedToStreetName, new Dictionary()))) + .Then(async ct => + { + var houseNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + houseNumberAddressWmsItem.Should().NotBeNull(); + houseNumberAddressWmsItem!.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.ParentAddressPersistentLocalId.Should() + .Be(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + boxNumberAddressWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + }); + } + + [Fact] + public async Task WhenAddressWasMigratedToStreetName_HouseNumberWithBoxNumberOnDifferentPosition() + { + var houseNumberAddressWasMigratedToStreetName = _fixture.Create() + .WithBoxNumber(null) + .WithParentAddressPersistentLocalId(null) + .WithNotRemoved(); + var boxNumberAddressWasMigratedToStreetName = _fixture.Create() + .WithPosition(new ExtendedWkbGeometry(GeometryHelpers.ExampleExtendedWkb)) + .WithAddressPersistentLocalId(new AddressPersistentLocalId(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId + 1)) + .WithBoxNumber(_fixture.Create()) + .WithParentAddressPersistentLocalId(new AddressPersistentLocalId(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberAddressWasMigratedToStreetName, new Dictionary())), + new Envelope(new Envelope(boxNumberAddressWasMigratedToStreetName, new Dictionary()))) + .Then(async ct => + { + var houseNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + houseNumberAddressWmsItem.Should().NotBeNull(); + houseNumberAddressWmsItem!.LabelType.Should().Be(WmsAddressLabelType.HouseNumberWithoutBoxes); + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.ParentAddressPersistentLocalId.Should() + .Be(houseNumberAddressWasMigratedToStreetName.AddressPersistentLocalId); + boxNumberAddressWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + }); + } + + [Fact] + public async Task WhenHouseNumberAddressWasProposedV2() + { + var addressWasProposedV2 = _fixture.Create() + .AsHouseNumberAddress(); + + await Sut + .Given(new Envelope(new Envelope(addressWasProposedV2, new Dictionary()))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.StreetNamePersistentLocalId.Should().Be(addressWasProposedV2.StreetNamePersistentLocalId); + addressWmsItem.ParentAddressPersistentLocalId.Should().BeNull(); + addressWmsItem.HouseNumber.Should().Be(addressWasProposedV2.HouseNumber); + addressWmsItem.BoxNumber.Should().BeNull(); + addressWmsItem.LabelType.Should().Be(WmsAddressLabelType.HouseNumberWithoutBoxes); + addressWmsItem.PostalCode.Should().Be(addressWasProposedV2.PostalCode); + addressWmsItem.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.OfficiallyAssigned.Should().BeTrue(); + addressWmsItem.Position.Should().BeEquivalentTo((Point)_wkbReader.Read(addressWasProposedV2.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressWasProposedV2.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressWasProposedV2.GeometrySpecification)); + addressWmsItem.Removed.Should().BeFalse(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasProposedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenBoxNumberAddressWasProposedV2() + { + var houseNumberWasMigrated = _fixture.Create() + .AsHouseNumberAddress(); + + var addressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(houseNumberWasMigrated.AddressPersistentLocalId + 1)) + .AsBoxNumberAddress(new AddressPersistentLocalId(houseNumberWasMigrated.AddressPersistentLocalId)); + + await Sut + .Given( + new Envelope(new Envelope(houseNumberWasMigrated, new Dictionary())), + new Envelope(new Envelope(addressWasProposedV2, new Dictionary()))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.StreetNamePersistentLocalId.Should().Be(addressWasProposedV2.StreetNamePersistentLocalId); + addressWmsItem.ParentAddressPersistentLocalId.Should().Be(houseNumberWasMigrated.AddressPersistentLocalId); + addressWmsItem.HouseNumber.Should().Be(addressWasProposedV2.HouseNumber); + addressWmsItem.BoxNumber.Should().Be(addressWasProposedV2.BoxNumber); + addressWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + addressWmsItem.PostalCode.Should().Be(addressWasProposedV2.PostalCode); + addressWmsItem.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.OfficiallyAssigned.Should().BeTrue(); + addressWmsItem.Position.Should().BeEquivalentTo((Point)_wkbReader.Read(addressWasProposedV2.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressWasProposedV2.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressWasProposedV2.GeometrySpecification)); + addressWmsItem.Removed.Should().BeFalse(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasProposedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasApproved() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasApproved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Current)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasApproved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromApprovedToProposed() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressApprovalWasCorrected = _fixture.Create(); + var correctionMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressApprovalWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressApprovalWasCorrected, correctionMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasApproved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.VersionTimestamp.Should().Be(addressApprovalWasCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromApprovedToProposedBecauseHouseNumberWasCorrected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressApprovalWasCorrected = _fixture.Create(); + var correctionMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressApprovalWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressApprovalWasCorrected, correctionMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasApproved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.VersionTimestamp.Should().Be(addressApprovalWasCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseHouseNumberWasRejected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseHouseNumberWasRetired() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejectedBecauseHouseNumberWasRetired = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejectedBecauseHouseNumberWasRetired.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejectedBecauseHouseNumberWasRetired, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejectedBecauseHouseNumberWasRetired.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejectedBecauseHouseNumberWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseStreetNameWasRejected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseStreetNameWasRejected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRetired = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetired.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRetired, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetired.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Retired)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseStreetNameWasRetired() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromRejectedToProposed() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + var addressRejectionWasCorrected = _fixture.Create(); + var correctedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressRejectionWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata)), + new Envelope(new Envelope(addressRejectionWasCorrected, correctedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressRejectionWasCorrected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.VersionTimestamp.Should().Be(addressRejectionWasCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasDeregulated() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasDeregulated = _fixture.Create(); + var deregulatedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasDeregulated.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasDeregulated, deregulatedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasDeregulated.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.OfficiallyAssigned.Should().BeFalse(); + addressWmsItem.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Current)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasDeregulated.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRetired() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressWasRetiredV2 = _fixture.Create(); + var retiredMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetiredV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressWasRetiredV2, retiredMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetiredV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Retired)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRetiredV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseHouseNumberWasRetired() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressWasRetiredBecauseHouseNumberWasRetired = _fixture.Create(); + var retiredMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetiredBecauseHouseNumberWasRetired.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressWasRetiredBecauseHouseNumberWasRetired, retiredMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetiredBecauseHouseNumberWasRetired.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Retired)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRetiredBecauseHouseNumberWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseStreetNameWasRetired() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressWasRetiredBecauseHouseNumberWasRetired = _fixture.Create(); + var retiredMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetiredBecauseHouseNumberWasRetired.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressWasRetiredBecauseHouseNumberWasRetired, retiredMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetiredBecauseHouseNumberWasRetired.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Retired)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRetiredBecauseHouseNumberWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasCorrectedFromRetiredToCurrent() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressWasRetiredV2 = _fixture.Create(); + var retiredMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetiredV2.GetHash() } + }; + + var addressWasCorrectedFromRetiredToCurrent = _fixture.Create(); + var correctedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasCorrectedFromRetiredToCurrent.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressWasRetiredV2, retiredMetadata)), + new Envelope(new Envelope(addressWasCorrectedFromRetiredToCurrent, correctedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetiredV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Current)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasCorrectedFromRetiredToCurrent.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressPostalCodeWasChangedV2() + { + var addressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithParentAddressPersistentLocalId(null) + .WithPostalCode(new PostalCode("9000")); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var boxNumberAddressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(2)) + .WithParentAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithPostalCode(new PostalCode("9000")); + var boxNumberProposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberAddressWasProposedV2.GetHash() } + }; + + var addressPostalCodeWasChangedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithBoxNumberPersistentLocalIds(new [] { new AddressPersistentLocalId(boxNumberAddressWasProposedV2.AddressPersistentLocalId) }) + .WithPostalCode(new PostalCode("2000")); + var postalCodeWasChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressPostalCodeWasChangedV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(boxNumberAddressWasProposedV2, boxNumberProposedMetadata)), + new Envelope(new Envelope(addressPostalCodeWasChangedV2, postalCodeWasChangedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressPostalCodeWasChangedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.PostalCode.Should().Be(addressPostalCodeWasChangedV2.PostalCode); + addressWmsItem.VersionTimestamp.Should().Be(addressPostalCodeWasChangedV2.Provenance.Timestamp); + + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberAddressWasProposedV2.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.PostalCode.Should().BeEquivalentTo(addressPostalCodeWasChangedV2.PostalCode); + boxNumberAddressWmsItem.VersionTimestamp.Should().Be(addressPostalCodeWasChangedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressPostalCodeWasCorrectedV2() + { + var addressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithParentAddressPersistentLocalId(null) + .WithPostalCode(new PostalCode("9000")); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var boxNumberAddressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(2)) + .WithParentAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithPostalCode(new PostalCode("9000")); + var boxNumberProposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberAddressWasProposedV2.GetHash() } + }; + + var addressPostalCodeWasCorrectedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithBoxNumberPersistentLocalIds(new [] { new AddressPersistentLocalId(boxNumberAddressWasProposedV2.AddressPersistentLocalId) }) + .WithPostalCode(new PostalCode("2000")); + var postalCodeWasCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressPostalCodeWasCorrectedV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(boxNumberAddressWasProposedV2, boxNumberProposedMetadata)), + new Envelope(new Envelope(addressPostalCodeWasCorrectedV2, postalCodeWasCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressPostalCodeWasCorrectedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.PostalCode.Should().Be(addressPostalCodeWasCorrectedV2.PostalCode); + addressWmsItem.VersionTimestamp.Should().Be(addressPostalCodeWasCorrectedV2.Provenance.Timestamp); + + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberAddressWasProposedV2.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.PostalCode.Should().BeEquivalentTo(addressPostalCodeWasCorrectedV2.PostalCode); + boxNumberAddressWmsItem.VersionTimestamp.Should().Be(addressPostalCodeWasCorrectedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressHouseNumberWasCorrectedV2() + { + var addressWasProposedV2 = _fixture.Create() + .WithParentAddressPersistentLocalId(null) + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithHouseNumber(new HouseNumber("101")); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var boxNumberAddressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(2)) + .WithParentAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithHouseNumber(new HouseNumber("101")); + var boxNumberProposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberAddressWasProposedV2.GetHash() } + }; + + var addressHouseNumberWasCorrectedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId)) + .WithBoxNumberPersistentLocalIds(new [] { new AddressPersistentLocalId(boxNumberAddressWasProposedV2.AddressPersistentLocalId) }) + .WithHouseNumber(new HouseNumber("102")); + var houseNumberWasCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressHouseNumberWasCorrectedV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(boxNumberAddressWasProposedV2, boxNumberProposedMetadata)), + new Envelope(new Envelope(addressHouseNumberWasCorrectedV2, houseNumberWasCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressHouseNumberWasCorrectedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.HouseNumber.Should().Be(addressHouseNumberWasCorrectedV2.HouseNumber); + addressWmsItem.VersionTimestamp.Should().Be(addressHouseNumberWasCorrectedV2.Provenance.Timestamp); + + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberAddressWasProposedV2.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.HouseNumber.Should().BeEquivalentTo(addressHouseNumberWasCorrectedV2.HouseNumber); + boxNumberAddressWmsItem.VersionTimestamp.Should().Be(addressHouseNumberWasCorrectedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressBoxNumberWasCorrectedV2() + { + var addressWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(1)) + .WithParentAddressPersistentLocalId(null) + .WithHouseNumber(new HouseNumber("101")) + .WithBoxNumber(new BoxNumber("A1")); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressBoxNumberWasCorrectedV2 = new AddressBoxNumberWasCorrectedV2( + new StreetNamePersistentLocalId(2), + new AddressPersistentLocalId(addressWasProposedV2.AddressPersistentLocalId), + new BoxNumber("1B")); + ((ISetProvenance)addressBoxNumberWasCorrectedV2).SetProvenance(_fixture.Create()); + + var boxNumberWasCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressBoxNumberWasCorrectedV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressBoxNumberWasCorrectedV2, boxNumberWasCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressBoxNumberWasCorrectedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.BoxNumber.Should().Be(addressBoxNumberWasCorrectedV2.BoxNumber); + addressWmsItem.VersionTimestamp.Should().Be(addressBoxNumberWasCorrectedV2.Provenance.Timestamp); + + var boxNumberAddressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressBoxNumberWasCorrectedV2.AddressPersistentLocalId); + boxNumberAddressWmsItem.Should().NotBeNull(); + boxNumberAddressWmsItem!.BoxNumber.Should().BeEquivalentTo(addressBoxNumberWasCorrectedV2.BoxNumber); + boxNumberAddressWmsItem.VersionTimestamp.Should().Be(addressBoxNumberWasCorrectedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressPositionWasChanged() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressPositionWasChanged = _fixture.Create(); + var positionChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressPositionWasChanged.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressPositionWasChanged, positionChangedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressPositionWasChanged.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressPositionWasChanged.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressPositionWasChanged.GeometrySpecification)); + addressWmsItem.Position.Should().Be((Point) _wkbReader.Read(addressPositionWasChanged.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.VersionTimestamp.Should().Be(addressPositionWasChanged.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WithBoxNumber_WhenAddressPositionWasChanged() + { + var addressWasMigrated = _fixture.Create() + .AsHouseNumberAddress() + .WithPosition(GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry()); + + var boxNumberWasProposed = _fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId)) + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId + 1)) + .WithExtendedWkbGeometry(GeometryHelpers.SecondGmlPointGeometry.ToExtendedWkbGeometry()); + + var houseNumberPositionWasChanged = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId)) + .WithExtendedWkbGeometry(GeometryHelpers.ThirdGmlPointGeometry.ToExtendedWkbGeometry()); + + var boxNumberPositionWasChanged = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(boxNumberWasProposed.AddressPersistentLocalId)) + .WithExtendedWkbGeometry(GeometryHelpers.ThirdGmlPointGeometry.ToExtendedWkbGeometry()); + + var addressWasMigratedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasMigrated.GetHash() } + }; + + var boxNumberWasProposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberWasProposed.GetHash() } + }; + + var houseNumberPositionWasChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, houseNumberPositionWasChanged.GetHash() } + }; + + var boxNumberPositionWasChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberPositionWasChanged.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasMigrated, addressWasMigratedMetadata)), + new Envelope(new Envelope(boxNumberWasProposed, boxNumberWasProposedMetadata)), + new Envelope(new Envelope(houseNumberPositionWasChanged, houseNumberPositionWasChangedMetadata)), + new Envelope(new Envelope(boxNumberPositionWasChanged, boxNumberPositionWasChangedMetadata))) + .Then(async ct => + { + var houseNumberWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasMigrated.AddressPersistentLocalId); + houseNumberWmsItem.Should().NotBeNull(); + houseNumberWmsItem!.Position.Should().Be((Point)_wkbReader.Read(houseNumberPositionWasChanged.ExtendedWkbGeometry.ToByteArray())); + houseNumberWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + + var boxNumberWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberWasProposed.AddressPersistentLocalId); + boxNumberWmsItem.Should().NotBeNull(); + boxNumberWmsItem!.Position.Should().Be(houseNumberWmsItem.Position); + boxNumberWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + }); + } + + [Fact] + public async Task WhenAddressPositionWasCorrectedV2() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressPositionWasCorrectedV2 = _fixture.Create(); + var positionCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressPositionWasCorrectedV2.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressPositionWasCorrectedV2, positionCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressPositionWasCorrectedV2.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressPositionWasCorrectedV2.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressPositionWasCorrectedV2.GeometrySpecification)); + addressWmsItem.Position.Should().Be((Point)_wkbReader.Read(addressPositionWasCorrectedV2.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.VersionTimestamp.Should().Be(addressPositionWasCorrectedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WithBoxNumber_WhenAddressPositionWasCorrectedV2() + { + var addressWasMigrated = _fixture.Create() + .AsHouseNumberAddress() + .WithPosition(GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry()); + + var boxNumberWasProposed = _fixture.Create() + .AsBoxNumberAddress(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId)) + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId + 1)) + .WithExtendedWkbGeometry(GeometryHelpers.SecondGmlPointGeometry.ToExtendedWkbGeometry()); + + var houseNumberPositionWasCorrected = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(addressWasMigrated.AddressPersistentLocalId)) + .WithExtendedWkbGeometry(GeometryHelpers.ThirdGmlPointGeometry.ToExtendedWkbGeometry()); + + var boxNumberPositionWasCorrected = _fixture.Create() + .WithAddressPersistentLocalId(new AddressPersistentLocalId(boxNumberWasProposed.AddressPersistentLocalId)) + .WithExtendedWkbGeometry(GeometryHelpers.ThirdGmlPointGeometry.ToExtendedWkbGeometry()); + + var addressWasMigratedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasMigrated.GetHash() } + }; + + var boxNumberWasProposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberWasProposed.GetHash() } + }; + + var houseNumberPositionWasChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, houseNumberPositionWasCorrected.GetHash() } + }; + + var boxNumberPositionWasChangedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, boxNumberPositionWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasMigrated, addressWasMigratedMetadata)), + new Envelope(new Envelope(boxNumberWasProposed, boxNumberWasProposedMetadata)), + new Envelope(new Envelope(houseNumberPositionWasCorrected, houseNumberPositionWasChangedMetadata)), + new Envelope(new Envelope(boxNumberPositionWasCorrected, boxNumberPositionWasChangedMetadata))) + .Then(async ct => + { + var houseNumberWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasMigrated.AddressPersistentLocalId); + houseNumberWmsItem.Should().NotBeNull(); + houseNumberWmsItem!.Position.Should().Be((Point)_wkbReader.Read(houseNumberPositionWasCorrected.ExtendedWkbGeometry.ToByteArray())); + houseNumberWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + + var boxNumberWmsItem = await ct.AddressWmsItemsV2.FindAsync(boxNumberWasProposed.AddressPersistentLocalId); + boxNumberWmsItem.Should().NotBeNull(); + boxNumberWmsItem!.Position.Should().Be(houseNumberWmsItem.Position); + boxNumberWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + }); + } + + [Fact] + public async Task WhenAddressHouseNumberWasReaddressed() + { + var addressPersistentLocalId = _fixture.Create(); + var boxNumberAddressPersistentLocalId = new AddressPersistentLocalId(addressPersistentLocalId + 1); + + var addressWasProposedV2 = _fixture.Create() + .WithBoxNumber(null); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressBoxNumberWasProposedV2 = _fixture.Create() + .WithAddressPersistentLocalId(boxNumberAddressPersistentLocalId); + var proposedBoxNumberMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressBoxNumberWasProposedV2.GetHash() } + }; + + var readdressedHouseNumber = new ReaddressedAddressData( + new AddressPersistentLocalId(addressPersistentLocalId + 10), + addressPersistentLocalId, + isDestinationNewlyProposed: true, + AddressStatus.Current, + new HouseNumber("3"), + boxNumber: null, + new PostalCode("9000"), + new AddressGeometry( + GeometryMethod.AppointedByAdministrator, + GeometrySpecification.Entry, + GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry()), + sourceIsOfficiallyAssigned: false); + + var readdressedBoxNumber = new ReaddressedAddressData( + new AddressPersistentLocalId(addressPersistentLocalId + 11), + boxNumberAddressPersistentLocalId, + isDestinationNewlyProposed: true, + AddressStatus.Current, + new HouseNumber("3"), + new BoxNumber("A"), + new PostalCode("9000"), + new AddressGeometry( + GeometryMethod.AppointedByAdministrator, + GeometrySpecification.Entry, + GeometryHelpers.GmlPointGeometry.ToExtendedWkbGeometry()), + sourceIsOfficiallyAssigned: false); + + var addressHouseNumberWasReaddressed = new AddressHouseNumberWasReaddressed( + _fixture.Create(), + addressPersistentLocalId, + readdressedHouseNumber, + new List { readdressedBoxNumber }); + ((ISetProvenance)addressHouseNumberWasReaddressed).SetProvenance(_fixture.Create()); + + var addressHouseNumberWasReaddressedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressHouseNumberWasReaddressed.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressBoxNumberWasProposedV2, proposedBoxNumberMetadata)), + new Envelope(new Envelope(addressHouseNumberWasReaddressed, addressHouseNumberWasReaddressedMetadata))) + .Then(async ct => + { + var houseNumberItem = await ct.AddressWmsItemsV2.FindAsync((int)addressPersistentLocalId); + houseNumberItem.Should().NotBeNull(); + + houseNumberItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(readdressedHouseNumber.SourceStatus)); + houseNumberItem.HouseNumber.Should().Be(readdressedHouseNumber.DestinationHouseNumber); + houseNumberItem.BoxNumber.Should().Be(null); + houseNumberItem.PostalCode.Should().Be(readdressedHouseNumber.SourcePostalCode); + houseNumberItem.OfficiallyAssigned.Should().Be(readdressedHouseNumber.SourceIsOfficiallyAssigned); + houseNumberItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(readdressedHouseNumber.SourceGeometryMethod)); + houseNumberItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(readdressedHouseNumber.SourceGeometrySpecification)); + houseNumberItem.Position.Should().Be((Point)_wkbReader.Read(readdressedHouseNumber.SourceExtendedWkbGeometry.ToByteArray())); + houseNumberItem.VersionTimestamp.Should().Be(addressHouseNumberWasReaddressed.Provenance.Timestamp); + + var boxNumberItem = await ct.AddressWmsItemsV2.FindAsync((int)boxNumberAddressPersistentLocalId); + boxNumberItem.Should().NotBeNull(); + + boxNumberItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(readdressedBoxNumber.SourceStatus)); + boxNumberItem.HouseNumber.Should().Be(readdressedBoxNumber.DestinationHouseNumber); + boxNumberItem.BoxNumber.Should().Be(readdressedBoxNumber.SourceBoxNumber); + boxNumberItem.PostalCode.Should().Be(readdressedBoxNumber.SourcePostalCode); + boxNumberItem.OfficiallyAssigned.Should().Be(readdressedBoxNumber.SourceIsOfficiallyAssigned); + boxNumberItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(readdressedBoxNumber.SourceGeometryMethod)); + boxNumberItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(readdressedBoxNumber.SourceGeometrySpecification)); + boxNumberItem.Position.Should().Be((Point)_wkbReader.Read(readdressedBoxNumber.SourceExtendedWkbGeometry.ToByteArray())); + boxNumberItem.VersionTimestamp.Should().Be(addressHouseNumberWasReaddressed.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasProposedBecauseOfReaddress() + { + var addressWasProposed = _fixture.Create(); + + await Sut + .Given(new Envelope(new Envelope(addressWasProposed, new Dictionary()))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasProposed.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.StreetNamePersistentLocalId.Should().Be(addressWasProposed.StreetNamePersistentLocalId); + addressWmsItem.HouseNumber.Should().Be(addressWasProposed.HouseNumber); + addressWmsItem.BoxNumber.Should().Be(addressWasProposed.BoxNumber); + addressWmsItem.LabelType.Should().Be(WmsAddressLabelType.BoxNumberOrHouseNumberWithBoxesOnSamePosition); + addressWmsItem.PostalCode.Should().Be(addressWasProposed.PostalCode); + addressWmsItem.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Proposed)); + addressWmsItem.OfficiallyAssigned.Should().BeTrue(); + addressWmsItem.Position.Should().BeEquivalentTo((Point)_wkbReader.Read(addressWasProposed.ExtendedWkbGeometry.ToByteArray())); + addressWmsItem.PositionMethod.Should().Be(AddressWmsItemProjections.ConvertGeometryMethodToString(addressWasProposed.GeometryMethod)); + addressWmsItem.PositionSpecification.Should().Be(AddressWmsItemProjections.ConvertGeometrySpecificationToString(addressWasProposed.GeometrySpecification)); + addressWmsItem.Removed.Should().BeFalse(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasProposed.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRejectedBecauseOfReaddress() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRejected = _fixture.Create(); + var rejectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRejected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRejected, rejectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRejected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Rejected)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRejected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRetiredBecauseOfReaddress() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasApproved = _fixture.Create(); + var approvedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasApproved.GetHash() } + }; + + var addressWasRetired = _fixture.Create(); + var retiredMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRetired.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasApproved, approvedMetadata)), + new Envelope(new Envelope(addressWasRetired, retiredMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRetired.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Retired)); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRetired.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedV2() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRemoved = _fixture.Create(); + var addressWasRemovedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRemoved.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRemoved, addressWasRemovedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRemoved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Removed.Should().BeTrue(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRemoved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedBecauseStreetNameWasRemoved() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRemovedBecauseStreetNameWasRemoved = _fixture.Create(); + var addressWasRemovedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRemovedBecauseStreetNameWasRemoved.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRemovedBecauseStreetNameWasRemoved, addressWasRemovedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRemovedBecauseStreetNameWasRemoved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Removed.Should().BeTrue(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRemovedBecauseStreetNameWasRemoved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressWasRemovedBecauseHouseNumberWasRemoved() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRemoved = _fixture.Create(); + var addressWasRemovedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasRemoved.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRemoved, addressWasRemovedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressWasRemoved.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Removed.Should().BeTrue(); + addressWmsItem.VersionTimestamp.Should().Be(addressWasRemoved.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressRegularizationWasCorrected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasRegularized = _fixture.Create(); + var addressWasRegularizedMetData = new Dictionary() + { + { AddEventHashPipe.HashMetadataKey, addressWasRegularized.GetHash() } + }; + + var addressRegularizationWasCorrected = _fixture.Create(); + var addressRegularizationWasCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressRegularizationWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasRegularized, addressWasRegularizedMetData)), + new Envelope(new Envelope(addressRegularizationWasCorrected, addressRegularizationWasCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressRegularizationWasCorrected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem!.Status.Should().Be(AddressWmsItemProjections.MapStatus(AddressStatus.Current)); + addressWmsItem.OfficiallyAssigned.Should().BeFalse(); + addressWmsItem.VersionTimestamp.Should().Be(addressRegularizationWasCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenAddressDeregulationWasCorrected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var addressWasDeregulated = _fixture.Create(); + var addressWasDeregulatedMetData = new Dictionary() + { + { AddEventHashPipe.HashMetadataKey, addressWasDeregulated.GetHash() } + }; + + var addressDeregulationWasCorrected = _fixture.Create(); + var addressDeregulationWasCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressDeregulationWasCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(addressWasDeregulated, addressWasDeregulatedMetData)), + new Envelope(new Envelope(addressDeregulationWasCorrected, addressDeregulationWasCorrectedMetadata))) + .Then(async ct => + { + var addressWmsItem = await ct.AddressWmsItemsV2.FindAsync(addressDeregulationWasCorrected.AddressPersistentLocalId); + addressWmsItem.Should().NotBeNull(); + addressWmsItem.OfficiallyAssigned.Should().BeTrue(); + addressWmsItem.VersionTimestamp.Should().Be(addressDeregulationWasCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenStreetNameNamesWereCorrected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var streetNameNamesWereCorrected = _fixture.Create(); + var streetNameNamesWereCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, streetNameNamesWereCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(streetNameNamesWereCorrected, streetNameNamesWereCorrectedMetadata))) + .Then(async ct => + { + var item = (await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId)); + item.Should().NotBeNull(); + item.VersionTimestamp.Should().Be(streetNameNamesWereCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenStreetNameNamesWereCorrectedWithOlderTimestamp() + { + var provenance = _fixture.Create(); + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var streetNameNamesWereCorrected = _fixture.Create(); + var streetNameNamesWereCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, streetNameNamesWereCorrected.GetHash() } + }; + ((ISetProvenance) streetNameNamesWereCorrected).SetProvenance(new Provenance( + provenance.Timestamp.Minus(Duration.FromDays(1)), + provenance.Application, + provenance.Reason, + provenance.Operator, + provenance.Modification, + provenance.Organisation + )); + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(streetNameNamesWereCorrected, streetNameNamesWereCorrectedMetadata))) + .Then(async ct => + { + var item = (await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId)); + item.Should().NotBeNull(); + item.VersionTimestamp.Should().Be(addressWasProposedV2.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenStreetNameHomonymAdditionsWereCorrected() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var streetNameHomonymAdditionsWereCorrected = _fixture.Create(); + var streetNameNamesWereCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, streetNameHomonymAdditionsWereCorrected.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(streetNameHomonymAdditionsWereCorrected, streetNameNamesWereCorrectedMetadata))) + .Then(async ct => + { + var item = (await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId)); + item.Should().NotBeNull(); + item.VersionTimestamp.Should().Be(streetNameHomonymAdditionsWereCorrected.Provenance.Timestamp); + }); + } + + [Fact] + public async Task WhenStreetNameHomonymAdditionsWereRemoved() + { + var addressWasProposedV2 = _fixture.Create(); + var proposedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, addressWasProposedV2.GetHash() } + }; + + var streetNameHomonymAdditionsWereRemoved = _fixture.Create(); + var streetNameNamesWereCorrectedMetadata = new Dictionary + { + { AddEventHashPipe.HashMetadataKey, streetNameHomonymAdditionsWereRemoved.GetHash() } + }; + + await Sut + .Given( + new Envelope(new Envelope(addressWasProposedV2, proposedMetadata)), + new Envelope(new Envelope(streetNameHomonymAdditionsWereRemoved, streetNameNamesWereCorrectedMetadata))) + .Then(async ct => + { + var item = (await ct.AddressWmsItemsV2.FindAsync(addressWasProposedV2.AddressPersistentLocalId)); + item.Should().NotBeNull(); + item.VersionTimestamp.Should().Be(streetNameHomonymAdditionsWereRemoved.Provenance.Timestamp); + }); + } + } +} diff --git a/test/AddressRegistry.Tests/ProjectionTests/WmsV2/HouseNumberComparerTests.cs b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/HouseNumberComparerTests.cs new file mode 100644 index 000000000..d7b921182 --- /dev/null +++ b/test/AddressRegistry.Tests/ProjectionTests/WmsV2/HouseNumberComparerTests.cs @@ -0,0 +1,105 @@ +namespace AddressRegistry.Tests.ProjectionTests.WmsV2 +{ + using System.Linq; + using AddressRegistry.Projections.Wms; + using AddressRegistry.StreetName; + using FluentAssertions; + using Xunit; + + public class HouseNumberComparerTests + { + private readonly HouseNumberComparer _sut = new(); + + [Fact] + public void OrderHouseNumbersWithDigitsOnly() + { + var unordered = new[] + { + new HouseNumber("5"), + new HouseNumber("9"), + new HouseNumber("10"), + new HouseNumber("1") + }; + + var ordered = unordered.OrderBy(i => i, _sut).ToArray(); + + ordered[0].Should().Be(new HouseNumber("1")); + ordered[1].Should().Be(new HouseNumber("5")); + ordered[2].Should().Be(new HouseNumber("9")); + ordered[3].Should().Be(new HouseNumber("10")); + } + + [Fact] + public void OrderHouseNumbersWithDigitsAndLetters() + { + var unordered = new[] + { + new HouseNumber("5"), + new HouseNumber("5A"), + new HouseNumber("10"), + new HouseNumber("10K"), + new HouseNumber("1"), + new HouseNumber("1C") + }; + + var ordered = unordered.OrderBy(i => i, _sut).ToArray(); + + ordered[0].Should().Be(new HouseNumber("1")); + ordered[1].Should().Be(new HouseNumber("1C")); + ordered[2].Should().Be(new HouseNumber("5")); + ordered[3].Should().Be(new HouseNumber("5A")); + ordered[4].Should().Be(new HouseNumber("10")); + ordered[5].Should().Be(new HouseNumber("10K")); + } + + [Fact] + public void OrderHouseNumberWithLettersOnly() + { + var unordered = new[] + { + new HouseNumber("D"), + new HouseNumber("A"), + new HouseNumber("Z"), + new HouseNumber("K") + }; + + var ordered = unordered.OrderBy(i => i, _sut).ToArray(); + + ordered[0].Should().Be(new HouseNumber("A")); + ordered[1].Should().Be(new HouseNumber("D")); + ordered[2].Should().Be(new HouseNumber("K")); + ordered[3].Should().Be(new HouseNumber("Z")); + } + + [Fact] + public void OrderHouseNumberWithLettersOnlyAndDigitsOnly() + { + var unordered = new[] + { + new HouseNumber("5"), + new HouseNumber("5A"), + new HouseNumber("A"), + new HouseNumber("10"), + new HouseNumber("10K"), + new HouseNumber("I"), + new HouseNumber("1"), + new HouseNumber("1C"), + new HouseNumber("100"), + new HouseNumber("Z") + }; + + var ordered = unordered.OrderBy(i => i, _sut).ToArray(); + + ordered[0].Should().Be(new HouseNumber("1")); + ordered[1].Should().Be(new HouseNumber("1C")); + ordered[2].Should().Be(new HouseNumber("5")); + ordered[3].Should().Be(new HouseNumber("5A")); + ordered[4].Should().Be(new HouseNumber("10")); + ordered[5].Should().Be(new HouseNumber("10K")); + ordered[6].Should().Be(new HouseNumber("100")); + ordered[7].Should().Be(new HouseNumber("A")); + ordered[8].Should().Be(new HouseNumber("I")); + ordered[9].Should().Be(new HouseNumber("Z")); + } + } +}