From b7aac6b4da034b0dd9b86eaaba7680489c7a260f Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 9 Jun 2025 15:56:05 -0400 Subject: [PATCH] switch back to command --- .../ImportOrganizationUserCommand.cs | 83 ++++++------------- 1 file changed, 25 insertions(+), 58 deletions(-) diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs index e3716e0bc3..018e3da117 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs @@ -11,7 +11,6 @@ using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.Models.Business; -using Bit.Core.Models.Data; using Bit.Core.Models.Data.Organizations; using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Repositories; @@ -196,78 +195,46 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand /// The target organization to which users are being added. /// A collection of imported users to consider for addition. /// Data containing imported user info and existing user mappings. - private async Task AddNewUsers(Organization organization, IEnumerable importedUsers, OrganizationUserImportData importUserData) { var userInvites = new List(); - // Determine which users are already in the organization - var existingUsersSet = new HashSet(importUserData.ExistingExternalUsersIdDict.Keys).ToList(); - var usersToAdd = importUserData.ImportedExternalIds.Except(existingUsersSet).ToList(); - foreach (var user in importedUsers) { - // Ignore users already part of the organization - if (!usersToAdd.Contains(user.ExternalId) || string.IsNullOrWhiteSpace(user.Email)) - { - continue; - } - userInvites.Add(new OrganizationUserInviteCommandModel(user.Email, user.ExternalId)); } - await InviteUsersAsync(organization, usersToAdd, importedUsers, importUserData); + var commandResult = await InviteUsersAsync(userInvites, organization); + + switch (commandResult) + { + case Success result: + foreach (var u in result.Value.InvitedUsers) + { + importUserData.ExistingExternalUsersIdDict.Add(u.ExternalId!, u.Id); + } + break; + case Failure failure: + throw new BadRequestException(failure.Error.Message); + default: + throw new InvalidOperationException($"Unhandled commandResult type: {commandResult.GetType().Name}"); + } } - private async Task InviteUsersAsync(Organization organization, - IEnumerable usersToAdd, - IEnumerable importedUsers, - OrganizationUserImportData importUserData) + /// + /// Sends the user invites through the InviteOrganizationUserCommand + /// The list of organization user invites command models to be used for inviting users + /// The organization to which users are being invited + /// + private async Task> InviteUsersAsync(List invites, Organization organization) { - var seatsAvailable = int.MaxValue; - var enoughSeatsAvailable = true; - if (organization.Seats.HasValue) - { - var occupiedSeats = await _organizationUserRepository.GetOccupiedSeatCountByOrganizationIdAsync(organization.Id); - seatsAvailable = organization.Seats.Value - occupiedSeats; - enoughSeatsAvailable = seatsAvailable >= usersToAdd.Count(); - } + var plan = await _pricingClient.GetPlanOrThrow(organization.PlanType); + var inviteOrganization = new InviteOrganization(organization, plan); + var request = new InviteOrganizationUsersRequest(invites.ToArray(), inviteOrganization, Guid.Empty, DateTimeOffset.UtcNow); - var hasStandaloneSecretsManager = await _paymentService.HasSecretsManagerStandalone(organization); - - var userInvites = new List<(OrganizationUserInvite, string)>(); - foreach (var user in importedUsers) - { - if (!usersToAdd.Contains(user.ExternalId) || string.IsNullOrWhiteSpace(user.Email)) - { - continue; - } - - try - { - var invite = new OrganizationUserInvite - { - Emails = new List { user.Email }, - Type = OrganizationUserType.User, - Collections = new List(), - AccessSecretsManager = hasStandaloneSecretsManager - }; - userInvites.Add((invite, user.ExternalId)); - } - catch (BadRequestException) - { - // Thrown when the user is already invited to the organization - continue; - } - } - - var invitedUsers = await _organizationService.InviteUsersAsync(organization.Id, Guid.Empty, _EventSystemUser, userInvites); - foreach (var invitedUser in invitedUsers) - { - importUserData.ExistingExternalUsersIdDict.TryAdd(invitedUser.ExternalId!, invitedUser.Id); - } + return await _inviteOrganizationUsersCommand.InviteImportedOrganizationUsersAsync(request); } ///