Skip to content

Add versioned client delegation API support - #2408

Merged
sonwit merged 4 commits into
mainfrom
3737-klientdelegering-v2-bff-lesing
Jul 28, 2026
Merged

Add versioned client delegation API support#2408
sonwit merged 4 commits into
mainfrom
3737-klientdelegering-v2-bff-lesing

Conversation

@sonwit

@sonwit sonwit commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Del av Altinn/altinn-authorization-tmp#3737.

BFF-en kaller nå v2 av clientdelegations-API-et når flagget
AccessManagementUI.UseNewSingleRightsClientDelegation er på. v2-lesesvarene
inneholder enkelttjenester (resources) per rolle, som eksponeres videre på
BFF-modellene. Med flagget av er v1-oppførselen uendret.

Description

  • Fjerner versjon på ApiAccessManagementEndpoint i env-filene og setter versjon
    dynamisk der den brukes. Versjoner utvikler seg uavhengig per API-område, så
    versjonen hører hjemme der strengen brukes.
  • Legger til ClientDelegationClientV2 så V1 kan slettes når V2 er ferdig.
    ClientDelegationClientSelector er eneste flaggsjekkpunkt og velger klient runtime.
  • Ny modell CompactResource { Id, RefId } som kun populeres av v2 (feat: return the resource registry id on v2 client delegation resources altinn-authorization-tmp#3829)

Sonarqube klager på kodeduplisering, men tenker at vi kan ignorere det siden v1 kan slettes når vi har v2 på plass.

Related Issue(s)

Verification

  • Your code builds clean without any errors or warnings
  • Manual testing done (required)
  • Relevant automated test added (if you find this hard, leave it and we'll help out)
  • All tests run green

Documentation

  • User documentation is updated with a separate linked PR in altinn-studio-docs. (if applicable)

Summary by CodeRabbit

Summary

  • New Features

    • Added support for single-right delegation “resources” alongside roles and access packages.
    • Enabled controlled switching between legacy and updated delegation behavior.
  • Bug Fixes

    • Standardized Access Management API base routing by appending the correct versioned path.
    • Improved request behavior for updated delegation calls, including token-based authentication.
  • Documentation

    • Clarified the meaning of the configured Access Management endpoint.
  • Tests

    • Updated mock and expected delegation payloads and expanded test coverage for version selection and request routing.

Introduce ClientDelegationClientV1 and V2 with feature flag-based routing via ClientDelegationClientSelector. The v2 client supports single rights resources and uses updated endpoint parameter names (client/agent instead of from/to). Configuration endpoints now store versionless base URLs; clients append their version suffix. Includes comprehensive tests and mock data updates.
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The change adds v1 and v2 client delegation implementations with feature-flagged routing, updates Access Management clients to append API versions, introduces compact resource models, changes endpoint configuration, and adds HTTP contract tests.

Changes

Client delegation resource contract

Layer / File(s) Summary
Resource model and fixtures
backend/src/.../Core/Models/ClientDelegation/ClientDelegation.cs, backend/src/.../Mocks/Data/ClientDelegation/myClients.json, backend/src/.../Tests/Data/ExpectedResults/ClientDelegation/myClients.json
RoleAccessPackages now contains Resources, backed by the new CompactResource model and matching JSON fixtures.

Versioned API endpoint configuration

Layer / File(s) Summary
Versioned client base addresses
backend/src/.../Integration/Clients/*Client.cs
Access Management HTTP clients append v1/ to the configured endpoint.
Versionless endpoint settings
backend/src/.../Integration/Configuration/PlatformSettings.cs, backend/src/.../appsettings*.json
Configured Access Management endpoints no longer include /v1/.

v1 and v2 delegation clients

Layer / File(s) Summary
Delegation client implementations
backend/src/.../Integration/Clients/ClientDelegationClientV1.cs, backend/src/.../Integration/Clients/ClientDelegationClientV2.cs
The legacy client is versioned as v1, while the v2 client implements versioned delegation reads, writes, authentication, serialization, and error handling.

Feature-flagged selection and validation

Layer / File(s) Summary
Selector, registration, dependency, and HTTP contracts
backend/src/.../Integration/Clients/ClientDelegationClientSelector.cs, backend/src/.../Program.cs, backend/src/.../Integration/Altinn.AccessManagement.UI.Integration.csproj, backend/src/.../Tests/Clients/ClientDelegationClientTest.cs
IClientDelegationClient resolves to v1 or v2 through IFeatureManager; DI wiring and request URL/method tests cover both implementations.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related PRs

Suggested labels: kind/feature-request, Test

Suggested reviewers: mgunnerud, allinox

Poem

Two API paths now gleam,
V1 and V2 share one stream.
Flags choose the route with care,
Resources bloom in payload air.
Tests record each request’s flight.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 74.58% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding versioned client delegation API support.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 3737-klientdelegering-v2-bff-lesing

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/AccessManagementClient.cs`:
- Line 51: Update the role-assignment request URLs in AccessManagementClient to
remain relative to the versioned BaseAddress, using assignment paths without a
leading slash while preserving existing IDs and query parameters. Add a contract
test that verifies the resulting absolute URLs retain the /v1/ base path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5ad0f178-fc06-4859-93b6-292dc8e48c40

📥 Commits

Reviewing files that changed from the base of the PR and between 5400748 and 3e09167.

📒 Files selected for processing (29)
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Core/Models/ClientDelegation/ClientDelegation.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Altinn.AccessManagement.UI.Integration.csproj
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/AccessManagementClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/AccessManagementClientV0.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/AccessPackageClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientSelector.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV1.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV2.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ConnectionClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ConsentClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/InstanceClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/MaskinportenClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/RequestClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/RoleClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/SingleRightClient.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Configuration/PlatformSettings.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Mocks/Data/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Clients/ClientDelegationClientTest.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Data/ExpectedResults/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/Program.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.AT21.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.AT22.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.AT23.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.AT24.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.Development.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.Prod.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.TT02.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.YT01.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Clients/ClientDelegationClientTest.cs (1)

130-139: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Assert POST payload contracts too.

These mutation tests verify only method and URI, so a missing or incorrectly serialized DelegationBatchInputDto still passes. Capture and assert the JSON body (and content type) for the add/remove access-package calls.

Also applies to: 185-205

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Clients/ClientDelegationClientTest.cs`
around lines 130 - 139, Extend the add and remove access-package tests,
including RemoveMyClientAccessPackages_V2PostsToDeleteRoute and the
corresponding tests around lines 185-205, to capture and validate the request
body serialized from _payload as DelegationBatchInputDto JSON. Assert the
request content type is application/json while preserving the existing HTTP
method and URI assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Clients/ClientDelegationClientTest.cs`:
- Around line 130-139: Extend the add and remove access-package tests, including
RemoveMyClientAccessPackages_V2PostsToDeleteRoute and the corresponding tests
around lines 185-205, to capture and validate the request body serialized from
_payload as DelegationBatchInputDto JSON. Assert the request content type is
application/json while preserving the existing HTTP method and URI assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d502726c-34c2-4212-b3f8-bf776a90787b

📥 Commits

Reviewing files that changed from the base of the PR and between 3e09167 and 0be8fd3.

📒 Files selected for processing (7)
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Core/Models/ClientDelegation/ClientDelegation.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV1.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV2.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Mocks/Data/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Clients/ClientDelegationClientTest.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Data/ExpectedResults/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI/appsettings.Development.json
🚧 Files skipped from review as they are similar to previous changes (4)
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Mocks/Data/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Tests/Data/ExpectedResults/ClientDelegation/myClients.json
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV1.cs
  • backend/src/Altinn.AccessManagement.UI/Altinn.AccessManagement.UI.Integration/Clients/ClientDelegationClientV2.cs

@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
50.0% Coverage on New Code (required ≥ 65%)
50.2% Duplication on New Code (required ≤ 10%)
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@sonwit
sonwit requested a review from mgunnerud July 28, 2026 07:58

@mgunnerud mgunnerud left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀

@sonwit
sonwit merged commit cd89189 into main Jul 28, 2026
8 of 9 checks passed
@sonwit
sonwit deleted the 3737-klientdelegering-v2-bff-lesing branch July 28, 2026 09:30
@coderabbitai coderabbitai Bot mentioned this pull request Jul 28, 2026
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants