From 1f5ea44a075542f1a48552b5111e68691d2bbe84 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 7 May 2025 16:55:44 -0400 Subject: [PATCH] extract add users to function, rename --- .../OrganizationUserSyncData.cs | 2 +- .../ImportOrganizationUserCommand.cs | 92 ++++++++++--------- 2 files changed, 48 insertions(+), 46 deletions(-) diff --git a/src/Core/AdminConsole/Models/Data/Organizations/OrganizationUsers/OrganizationUserSyncData.cs b/src/Core/AdminConsole/Models/Data/Organizations/OrganizationUsers/OrganizationUserSyncData.cs index 0a7c7e35e1..aa779b8fd4 100644 --- a/src/Core/AdminConsole/Models/Data/Organizations/OrganizationUsers/OrganizationUserSyncData.cs +++ b/src/Core/AdminConsole/Models/Data/Organizations/OrganizationUsers/OrganizationUserSyncData.cs @@ -1,6 +1,6 @@ namespace Bit.Core.Models.Data.Organizations.OrganizationUsers; -public class OrganizationUserSyncData +public class OrganizationUserImportData { public HashSet NewUsersSet { get; set; } public ICollection ExistingUsers { get; set; } diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs index d2765ec9fb..755786789d 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs @@ -47,20 +47,6 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand _organizationService = organizationService; } - private IEnumerable GetExistingExternalUsers(ICollection existingUsers) - { - return existingUsers - .Where(u => !string.IsNullOrWhiteSpace(u.ExternalId)) - .ToList(); - } - - private Dictionary GetExistingExternalUsersIdDict(ICollection existingUsers) - { - return existingUsers - .Where(u => !string.IsNullOrWhiteSpace(u.ExternalId)) - .ToDictionary(u => u.ExternalId, u => u.Id); - } - public async Task ImportAsync(Guid organizationId, IEnumerable groups, IEnumerable newUsers, @@ -82,7 +68,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand var existingUsers = await _organizationUserRepository.GetManyDetailsByOrganizationAsync(organizationId); - var syncData = new OrganizationUserSyncData + var importData = new OrganizationUserImportData { NewUsersSet = new HashSet(newUsers?.Select(u => u.ExternalId) ?? new List()), ExistingUsers = existingUsers, @@ -93,28 +79,22 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand var events = new List<(OrganizationUserUserDetails ou, EventType e, DateTime? d)>(); // Users - await RemoveExistingExternalUsers(removeUserExternalIds, events, syncData); - + await RemoveExistingExternalUsers(removeUserExternalIds, events, importData); if (overwriteExisting) { - await OverwriteExisting(events, syncData); + await OverwriteExisting(events, importData); } - - await RemoveExistingUsers(existingUsers, newUsers, organization, eventSystemUser, syncData); + await RemoveExistingUsers(existingUsers, newUsers, organization, importData); + await AddNewUsers(organization, newUsers, eventSystemUser, importData); // Groups - await SyncGroups(organization, groups, eventSystemUser, syncData); + await ImportGroups(organization, groups, eventSystemUser, importData); await _eventService.LogOrganizationUserEventsAsync(events.Select(e => (e.ou, e.e, eventSystemUser, e.d))); await _referenceEventService.RaiseEventAsync( new ReferenceEvent(ReferenceEventType.DirectorySynced, organization, _currentContext)); } - private async Task GetOrgById(Guid id) - { - return await _organizationRepository.GetByIdAsync(id); - } - private async Task UpdateUsersAsync(Group group, HashSet groupUsers, Dictionary existingUsersIdDict, HashSet existingUsers = null) { @@ -131,7 +111,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand private async Task RemoveExistingExternalUsers( IEnumerable removeUserExternalIds, List<(OrganizationUserUserDetails ou, EventType e, DateTime? d)> events, - OrganizationUserSyncData syncData + OrganizationUserImportData importData ) { if (!removeUserExternalIds.Any()) @@ -139,9 +119,9 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand return; } - var existingUsersDict = syncData.ExistingExternalUsers.ToDictionary(u => u.ExternalId); + var existingUsersDict = importData.ExistingExternalUsers.ToDictionary(u => u.ExternalId); var removeUsersSet = new HashSet(removeUserExternalIds) - .Except(syncData.NewUsersSet) + .Except(importData.NewUsersSet) .Where(u => existingUsersDict.ContainsKey(u) && existingUsersDict[u].Type != OrganizationUserType.Owner) .Select(u => existingUsersDict[u]); @@ -158,8 +138,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand IEnumerable existingUsers, IEnumerable newUsers, Organization organization, - EventSystemUser eventSystemUser, - OrganizationUserSyncData syncData + OrganizationUserImportData importData ) { if (!newUsers.Any()) @@ -182,14 +161,20 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand { orgUser.ExternalId = newUsersEmailsDict[user].ExternalId; usersToUpsert.Add(orgUser); - syncData.ExistingExternalUsersIdDict.Add(orgUser.ExternalId, orgUser.Id); + importData.ExistingExternalUsersIdDict.Add(orgUser.ExternalId, orgUser.Id); } } await _organizationUserRepository.UpsertManyAsync(usersToUpsert); + } - // Add new users - var existingUsersSet = new HashSet(syncData.ExistingExternalUsersIdDict.Keys); - var usersToAdd = syncData.NewUsersSet.Except(existingUsersSet).ToList(); + private async Task AddNewUsers(Organization organization, + IEnumerable newUsers, + EventSystemUser eventSystemUser, + OrganizationUserImportData importData) + { + + var existingUsersSet = new HashSet(importData.ExistingExternalUsersIdDict.Keys); + var usersToAdd = importData.NewUsersSet.Except(existingUsersSet).ToList(); var seatsAvailable = int.MaxValue; var enoughSeatsAvailable = true; @@ -232,20 +217,20 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand var invitedUsers = await _organizationService.InviteUsersAsync(organization.Id, invitingUserId: null, systemUser: eventSystemUser, userInvites); foreach (var invitedUser in invitedUsers) { - syncData.ExistingExternalUsersIdDict.Add(invitedUser.ExternalId, invitedUser.Id); + importData.ExistingExternalUsersIdDict.Add(invitedUser.ExternalId, invitedUser.Id); } } private async Task OverwriteExisting( List<(OrganizationUserUserDetails ou, EventType e, DateTime? d)> events, - OrganizationUserSyncData syncData + OrganizationUserImportData importData ) { // Remove existing external users that are not in new user set - var usersToDelete = syncData.ExistingExternalUsers.Where(u => + var usersToDelete = importData.ExistingExternalUsers.Where(u => u.Type != OrganizationUserType.Owner && - !syncData.NewUsersSet.Contains(u.ExternalId) && - syncData.ExistingExternalUsersIdDict.ContainsKey(u.ExternalId)); + !importData.NewUsersSet.Contains(u.ExternalId) && + importData.ExistingExternalUsersIdDict.ContainsKey(u.ExternalId)); await _organizationUserRepository.DeleteManyAsync(usersToDelete.Select(u => u.Id)); events.AddRange(usersToDelete.Select(u => ( u, @@ -255,14 +240,14 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand ); foreach (var deletedUser in usersToDelete) { - syncData.ExistingExternalUsersIdDict.Remove(deletedUser.ExternalId); + importData.ExistingExternalUsersIdDict.Remove(deletedUser.ExternalId); } } - private async Task SyncGroups(Organization organization, + private async Task ImportGroups(Organization organization, IEnumerable groups, EventSystemUser eventSystemUser, - OrganizationUserSyncData syncData + OrganizationUserImportData importData ) { @@ -293,7 +278,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand savedGroups.Add(await _groupRepository.CreateAsync(group)); await UpdateUsersAsync(group, groupsDict[group.ExternalId].ExternalUserIds, - syncData.ExistingExternalUsersIdDict); + importData.ExistingExternalUsersIdDict); } await _eventService.LogGroupEventsAsync( @@ -322,7 +307,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand } await UpdateUsersAsync(group, groupsDict[group.ExternalId].ExternalUserIds, - syncData.ExistingExternalUsersIdDict, + importData.ExistingExternalUsersIdDict, existingGroupUsers.ContainsKey(group.Id) ? existingGroupUsers[group.Id] : null); } @@ -332,5 +317,22 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand } } + private IEnumerable GetExistingExternalUsers(ICollection existingUsers) + { + return existingUsers + .Where(u => !string.IsNullOrWhiteSpace(u.ExternalId)) + .ToList(); + } + private Dictionary GetExistingExternalUsersIdDict(ICollection existingUsers) + { + return existingUsers + .Where(u => !string.IsNullOrWhiteSpace(u.ExternalId)) + .ToDictionary(u => u.ExternalId, u => u.Id); + } + + private async Task GetOrgById(Guid id) + { + return await _organizationRepository.GetByIdAsync(id); + } }