mirror of
https://github.com/bitwarden/server
synced 2025-12-10 13:23:27 +00:00
* Add new feature flag for Members Get Endpoint Optimization * Add a new version of OrganizationUser_ReadByOrganizationIdWithClaimedDomains that uses CTE for better performance * Add stored procedure OrganizationUserUserDetails_ReadByOrganizationId_V2 for retrieving user details, group associations, and collection associations by organization ID. * Add the sql migration script to add the new stored procedures * Introduce GetManyDetailsByOrganizationAsync_vNext and GetManyByOrganizationWithClaimedDomainsAsync_vNext in IOrganizationUserRepository to enhance performance by reducing database round trips. * Updated GetOrganizationUsersClaimedStatusQuery to use an optimized query when the feature flag is enabled * Updated OrganizationUserUserDetailsQuery to use optimized queries when the feature flag is enabled * Add integration tests for GetManyDetailsByOrganizationAsync_vNext * Add integration tests for GetManyByOrganizationWithClaimedDomainsAsync_vNext to validate behavior with verified and unverified domains. * Optimize performance by conditionally setting permissions only for Custom user types in OrganizationUserUserDetailsQuery. * Create UserEmailDomainView to extract email domains from users' email addresses * Create stored procedure Organization_ReadByClaimedUserEmailDomain_V2 that uses UserEmailDomainView to fetch Email domains * Add GetByVerifiedUserEmailDomainAsync_vNext method to IOrganizationRepository and its implementations * Refactor OrganizationUser_ReadByOrganizationIdWithClaimedDomains_V2 stored procedure to use UserEmailDomainView for email domain extraction, improving query efficiency and clarity. * Enhance IOrganizationUserRepository with detailed documentation for GetManyDetailsByOrganizationAsync method, clarifying its purpose and performance optimizations. Added remarks for better understanding of its functionality. * Fix missing newline at the end of Organization_ReadByClaimedUserEmailDomain_V2.sql to adhere to coding standards. * Update the database migration script to include UserEmailDomainView * Bumped the date on the migration script * Remove GetByVerifiedUserEmailDomainAsync_vNext method and its stored procedure. * Refactor UserEmailDomainView index creation to check for existence before creation * Update OrganizationUser_ReadByOrganizationIdWithClaimedDomains_V2 to use CTE and add indexes * Remove creation of unique clustered index from UserEmailDomainView and related migration script adjustments * Update indexes and sproc * Fix index name when checking if it already exists * Bump up date on migration script
99 lines
3.0 KiB
Transact-SQL
99 lines
3.0 KiB
Transact-SQL
CREATE OR ALTER VIEW [dbo].[UserEmailDomainView]
|
|
AS
|
|
SELECT
|
|
Id,
|
|
Email,
|
|
SUBSTRING(Email, CHARINDEX('@', Email) + 1, LEN(Email)) AS EmailDomain
|
|
FROM dbo.[User]
|
|
WHERE Email IS NOT NULL
|
|
AND CHARINDEX('@', Email) > 0
|
|
GO
|
|
|
|
-- Index on OrganizationUser for efficient filtering
|
|
IF NOT EXISTS(SELECT name FROM sys.indexes WHERE name = 'IX_OrganizationUser_OrganizationId_UserId')
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX [IX_OrganizationUser_OrganizationId_UserId]
|
|
ON [dbo].[OrganizationUser] ([OrganizationId], [UserId])
|
|
INCLUDE ([Email], [Status], [Type], [ExternalId], [CreationDate],
|
|
[RevisionDate], [Permissions], [ResetPasswordKey], [AccessSecretsManager])
|
|
END
|
|
GO
|
|
|
|
IF NOT EXISTS(SELECT name FROM sys.indexes WHERE name = 'IX_User_Id_EmailDomain')
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX [IX_User_Id_EmailDomain]
|
|
ON [dbo].[User] ([Id], [Email])
|
|
END
|
|
GO
|
|
|
|
IF NOT EXISTS(SELECT name FROM sys.indexes WHERE name = 'IX_OrganizationDomain_OrganizationId_VerifiedDate')
|
|
BEGIN
|
|
CREATE NONCLUSTERED INDEX [IX_OrganizationDomain_OrganizationId_VerifiedDate]
|
|
ON [dbo].[OrganizationDomain] ([OrganizationId], [VerifiedDate])
|
|
INCLUDE ([DomainName])
|
|
WHERE [VerifiedDate] IS NOT NULL
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE [dbo].[OrganizationUserUserDetails_ReadByOrganizationId_V2]
|
|
@OrganizationId UNIQUEIDENTIFIER,
|
|
@IncludeGroups BIT = 0,
|
|
@IncludeCollections BIT = 0
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON
|
|
|
|
-- Result Set 1: User Details (always returned)
|
|
SELECT *
|
|
FROM [dbo].[OrganizationUserUserDetailsView]
|
|
WHERE OrganizationId = @OrganizationId
|
|
|
|
-- Result Set 2: Group associations (if requested)
|
|
IF @IncludeGroups = 1
|
|
BEGIN
|
|
SELECT gu.*
|
|
FROM [dbo].[GroupUser] gu
|
|
INNER JOIN [dbo].[OrganizationUser] ou ON gu.OrganizationUserId = ou.Id
|
|
WHERE ou.OrganizationId = @OrganizationId
|
|
END
|
|
|
|
-- Result Set 3: Collection associations (if requested)
|
|
IF @IncludeCollections = 1
|
|
BEGIN
|
|
SELECT cu.*
|
|
FROM [dbo].[CollectionUser] cu
|
|
INNER JOIN [dbo].[OrganizationUser] ou ON cu.OrganizationUserId = ou.Id
|
|
WHERE ou.OrganizationId = @OrganizationId
|
|
END
|
|
END
|
|
GO
|
|
|
|
CREATE OR ALTER PROCEDURE [dbo].[OrganizationUser_ReadByOrganizationIdWithClaimedDomains_V2]
|
|
@OrganizationId UNIQUEIDENTIFIER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
WITH OrgUsers AS (
|
|
SELECT *
|
|
FROM [dbo].[OrganizationUserView]
|
|
WHERE [OrganizationId] = @OrganizationId
|
|
),
|
|
UserDomains AS (
|
|
SELECT U.[Id], U.[EmailDomain]
|
|
FROM [dbo].[UserEmailDomainView] U
|
|
WHERE EXISTS (
|
|
SELECT 1
|
|
FROM [dbo].[OrganizationDomainView] OD
|
|
WHERE OD.[OrganizationId] = @OrganizationId
|
|
AND OD.[VerifiedDate] IS NOT NULL
|
|
AND OD.[DomainName] = U.[EmailDomain]
|
|
)
|
|
)
|
|
SELECT OU.*
|
|
FROM OrgUsers OU
|
|
JOIN UserDomains UD ON OU.[UserId] = UD.[Id]
|
|
OPTION (RECOMPILE);
|
|
END
|
|
GO
|