Skip to content

[PM-33951] feat(admin-console): Add bulk confirmation and pending auto-confirmation#7661

Open
JaredScar wants to merge 8 commits into
mainfrom
ac/pm-33919-db-changes
Open

[PM-33951] feat(admin-console): Add bulk confirmation and pending auto-confirmation#7661
JaredScar wants to merge 8 commits into
mainfrom
ac/pm-33919-db-changes

Conversation

@JaredScar
Copy link
Copy Markdown
Contributor

@JaredScar JaredScar commented May 18, 2026

🎟️ Tracking

https://bitwarden.atlassian.net/browse/PM-33951

📔 Objective

This PR contains the database changes needed for #7527, split to their own PR to manage PR size.

…ion methods for organization users

- Implemented ConfirmManyOrganizationUsersAsync to confirm multiple users in a single operation.
- Added GetManyPendingAutoConfirmAsync to retrieve users pending automatic confirmation.
- Created stored procedures for bulk confirmation and fetching pending users.
- Updated relevant repository interfaces and implementations across Dapper and Entity Framework.
@JaredScar JaredScar requested review from a team as code owners May 18, 2026 16:05
@JaredScar JaredScar added the ai-review Request a Claude code review label May 18, 2026
@JaredScar JaredScar requested a review from r-tome May 18, 2026 16:05
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 18, 2026

🤖 Bitwarden Claude Code Review

Overall Assessment: REQUEST CHANGES

This PR adds bulk confirmation (ConfirmManyOrganizationUsersAsync) and pending-auto-confirm read (GetManyPendingAutoConfirmAsync) repository methods, accompanied by two new stored procedures, dual-ORM Dapper/EF implementations, and integration test coverage. The dual-write changes are well structured and follow established repository patterns. One blocking inconsistency between the migration script and the source-of-truth SP file remains from an earlier rename.

Code Review Details
  • ⚠️ : Migration declares [Key] as NVARCHAR(MAX) but the source SP uses VARCHAR(MAX); SSDT drift check will fail CI
    • util/Migrator/DbScripts/2026-05-22_00_AddOrganizationUserUpdateStatusKey.sql:12,22

@JaredScar JaredScar changed the title [PM-33919] feat(admin-console): Add bulk confirmation and pending auto-confirmation [PM-33951] feat(admin-console): Add bulk confirmation and pending auto-confirmation May 18, 2026
Comment thread util/Migrator/DbScripts/2026-05-14_01_AddOrganizationUserConfirmByIds.sql Outdated
Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_ReadByOrganizationIdStatus.sql Outdated
@codecov
Copy link
Copy Markdown

codecov Bot commented May 18, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 64.92%. Comparing base (d903096) to head (4d5f03c).
⚠️ Report is 6 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #7661      +/-   ##
==========================================
+ Coverage   64.86%   64.92%   +0.06%     
==========================================
  Files        2140     2141       +1     
  Lines       94629    94715      +86     
  Branches     8445     8459      +14     
==========================================
+ Hits        61378    61496     +118     
+ Misses      31155    31121      -34     
- Partials     2096     2098       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

@r-tome r-tome left a comment

Choose a reason for hiding this comment

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

Claude pointed out a few things to fix. Let me know when to review this again

@mkincaid-bw
Copy link
Copy Markdown
Contributor

There are similar database changes in PR 7527, as well as this one. Do both PR's need a review from dbops or only this one?

@JaredScar
Copy link
Copy Markdown
Contributor Author

JaredScar commented May 19, 2026

There are similar database changes in PR 7527, as well as this one. Do both PR's need a review from dbops or only this one?

Valid question! @mkincaid-bw -- Sorry for the confusion. @eliykat suggested we split up that PR into smaller PRs like this one that we merge first, then that original PR will be smaller and easier to review since that big chunk of code are broken into pieces. Theoretically speaking, this should be the only one DB ops needs to worry about 😄

…ationUsersAsync to IReadOnlyCollection

- Updated the ConfirmManyOrganizationUsersAsync method signature in the IOrganizationUserRepository and its implementations to use IReadOnlyCollection instead of IEnumerable for better performance and clarity.
- Adjusted related repository methods in both Dapper and Entity Framework implementations to reflect this change.
- Added unit tests to ensure the new implementation behaves as expected, including scenarios for mixed batches and idempotency.
@JaredScar JaredScar requested a review from r-tome May 19, 2026 19:50
@eliykat eliykat self-requested a review May 21, 2026 04:53
Copy link
Copy Markdown
Member

@eliykat eliykat left a comment

Choose a reason for hiding this comment

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

Thanks @JaredScar for splitting this to a separate PR - I cannot tell you how much easier it is to review smaller PRs.

Aside from my comments below, please check the CI runs:

  • db integration test is failing - potentially faulty prod or test logic
  • db validation is failing - this ensures that the migration scripts match the src/Sql files
  • validate new migration naming and order - this is failing because later migrations have overtaken you and you need to bump the dates on your script

More info available in each of the runs, or hit me up on Slack if you have questions.

EDIT: please also add more info to your PR description, e.g.

This PR contains the database changes needed for #7527, split to their own PR to manage PR size.

The PR link is particularly useful to understand what's going on.

Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_ReadByOrganizationIdStatus.sql Outdated
JaredScar and others added 3 commits May 21, 2026 11:48
…dingAutoConfirm methods

- Introduced ConfirmManyOrganizationUsersTests to validate the confirmation of multiple organization users, ensuring only accepted users are confirmed and idempotency is maintained.
- Added GetManyPendingAutoConfirmTests to verify retrieval of pending auto-confirm users, ensuring only eligible users are returned based on specific criteria.
- Removed duplicate test implementations from OrganizationUserRepositoryTests to maintain clarity and organization in the test suite.
@JaredScar JaredScar requested a review from eliykat May 21, 2026 16:03
Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_ConfirmByIds.sql Outdated
Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_ReadByPendingAutoConfirm.sql Outdated
Copy link
Copy Markdown
Member

@eliykat eliykat left a comment

Choose a reason for hiding this comment

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

My changes have been addressed, I can approve once @mkincaid-bw is happy and CI checks are passing.

Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_ConfirmByIds.sql Outdated
JaredScar and others added 2 commits May 22, 2026 12:12
…e related repository method

- Added OrganizationUser_UpdateStatusKey stored procedure to handle updating the status and key of organization users based on a JSON input.
- Updated OrganizationUserRepository to call the new stored procedure instead of the previous confirmation procedure.
- Modified OrganizationUser_ReadByPendingAutoConfirm stored procedure to filter users by a new type value.
- Enhanced integration tests to verify the correct behavior of the updated confirmation logic, ensuring revision dates are accurately tracked.
@JaredScar JaredScar requested review from eliykat and r-tome May 22, 2026 16:42
@JaredScar JaredScar requested a review from mkincaid-bw May 22, 2026 16:42
Copy link
Copy Markdown
Contributor

@mkincaid-bw mkincaid-bw left a comment

Choose a reason for hiding this comment

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

Couple more minor changes.

Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateStatusKey.sql Outdated
Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateStatusKey.sql Outdated
Comment thread src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateStatusKey.sql Outdated
@JaredScar JaredScar requested a review from mkincaid-bw May 22, 2026 20:53
…anyStatusKey

- Renamed the stored procedure to OrganizationUser_UpdateManyStatusKey to better reflect its functionality of updating multiple organization users' statuses.
- Updated the OrganizationUserRepository to call the new stored procedure.
- Adjusted the migration script to create or alter the procedure accordingly.
@sonarqubecloud
Copy link
Copy Markdown

Comment on lines +10 to +23
DECLARE @UsersToUpdate AS TABLE (
[Id] UNIQUEIDENTIFIER NOT NULL,
[Key] NVARCHAR(MAX) NULL
)

INSERT INTO @UsersToUpdate
SELECT
[Id],
[Key]
FROM OPENJSON(@UsersJson)
WITH (
[Id] UNIQUEIDENTIFIER '$.Id',
[Key] NVARCHAR(MAX) '$.Key'
)
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.

⚠️ IMPORTANT: Migration declares [Key] as NVARCHAR(MAX) but the SP source-of-truth file uses VARCHAR(MAX), which will fail the SSDT drift check in CI.

Details and fix

The source file src/Sql/dbo/Stored Procedures/OrganizationUser_UpdateManyStatusKey.sql defines the temp table column and the OPENJSON output as VARCHAR(MAX), matching the underlying OrganizationUser.[Key] column (which is VARCHAR(MAX) per src/Sql/dbo/Tables/OrganizationUser.sql:6). This migration file still has NVARCHAR(MAX) in both places.

.github/workflows/test-database.yml runs sqlpackage /action:DeployReport to compare the dacpac (built from src/Sql/) against the database after migrations are applied. Any <Operations> in the report fails the job — so this divergence will block the merge.

DECLARE @UsersToUpdate AS TABLE (
    [Id]  UNIQUEIDENTIFIER NOT NULL,
    [Key] VARCHAR(MAX)     NULL
)

INSERT INTO @UsersToUpdate
SELECT
    [Id],
    [Key]
FROM OPENJSON(@UsersJson)
WITH (
    [Id]  UNIQUEIDENTIFIER '$.Id',
    [Key] VARCHAR(MAX)     '$.Key'
)

This was flagged earlier (threads PRRC_kwDOAsltcc7EH_zb and PRRC_kwDOAsltcc7EIBCm) but the SP rename in 4d5f03c94 only carried the fix into the source SP file, not into this migration.

Copy link
Copy Markdown
Contributor

@mkincaid-bw mkincaid-bw left a comment

Choose a reason for hiding this comment

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

Sorry, I should have flagged the data type changes in the migration script as well. Also have some really minor, petty spacing nit picks 😄


DECLARE @UsersToUpdate AS TABLE (
[Id] UNIQUEIDENTIFIER NOT NULL,
[Key] NVARCHAR(MAX) NULL
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.

Suggested change
[Key] NVARCHAR(MAX) NULL
[Key] VARCHAR(MAX) NULL

FROM OPENJSON(@UsersJson)
WITH (
[Id] UNIQUEIDENTIFIER '$.Id',
[Key] NVARCHAR(MAX) '$.Key'
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.

Suggested change
[Key] NVARCHAR(MAX) '$.Key'
[Key] VARCHAR(MAX) '$.Key'


DECLARE @UsersToUpdate AS TABLE (
[Id] UNIQUEIDENTIFIER NOT NULL,
[Key] VARCHAR(MAX) NULL
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.

⛏️

Suggested change
[Key] VARCHAR(MAX) NULL
[Key] VARCHAR(MAX) NULL

FROM OPENJSON(@UsersJson)
WITH (
[Id] UNIQUEIDENTIFIER '$.Id',
[Key] VARCHAR(MAX) '$.Key'
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.

⛏️

Suggested change
[Key] VARCHAR(MAX) '$.Key'
[Key] VARCHAR(MAX) '$.Key'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review Request a Claude code review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants