mirror of
https://github.com/bitwarden/server.git
synced 2025-06-28 06:36:15 -05:00
switch back to command
This commit is contained in:
parent
82e757b987
commit
b7aac6b4da
@ -11,7 +11,6 @@ using Bit.Core.Entities;
|
|||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Exceptions;
|
using Bit.Core.Exceptions;
|
||||||
using Bit.Core.Models.Business;
|
using Bit.Core.Models.Business;
|
||||||
using Bit.Core.Models.Data;
|
|
||||||
using Bit.Core.Models.Data.Organizations;
|
using Bit.Core.Models.Data.Organizations;
|
||||||
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
using Bit.Core.Models.Data.Organizations.OrganizationUsers;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
@ -196,78 +195,46 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand
|
|||||||
/// <param name="organization">The target organization to which users are being added.</param>
|
/// <param name="organization">The target organization to which users are being added.</param>
|
||||||
/// <param name="importedUsers">A collection of imported users to consider for addition.</param>
|
/// <param name="importedUsers">A collection of imported users to consider for addition.</param>
|
||||||
/// <param name="importUserData">Data containing imported user info and existing user mappings.</param>
|
/// <param name="importUserData">Data containing imported user info and existing user mappings.</param>
|
||||||
|
|
||||||
private async Task AddNewUsers(Organization organization,
|
private async Task AddNewUsers(Organization organization,
|
||||||
IEnumerable<ImportedOrganizationUser> importedUsers,
|
IEnumerable<ImportedOrganizationUser> importedUsers,
|
||||||
OrganizationUserImportData importUserData)
|
OrganizationUserImportData importUserData)
|
||||||
{
|
{
|
||||||
var userInvites = new List<OrganizationUserInviteCommandModel>();
|
var userInvites = new List<OrganizationUserInviteCommandModel>();
|
||||||
|
|
||||||
// Determine which users are already in the organization
|
|
||||||
var existingUsersSet = new HashSet<string>(importUserData.ExistingExternalUsersIdDict.Keys).ToList();
|
|
||||||
var usersToAdd = importUserData.ImportedExternalIds.Except(existingUsersSet).ToList();
|
|
||||||
|
|
||||||
foreach (var user in importedUsers)
|
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));
|
userInvites.Add(new OrganizationUserInviteCommandModel(user.Email, user.ExternalId));
|
||||||
}
|
}
|
||||||
|
|
||||||
await InviteUsersAsync(organization, usersToAdd, importedUsers, importUserData);
|
var commandResult = await InviteUsersAsync(userInvites, organization);
|
||||||
}
|
|
||||||
|
|
||||||
private async Task InviteUsersAsync(Organization organization,
|
switch (commandResult)
|
||||||
IEnumerable<string> usersToAdd,
|
|
||||||
IEnumerable<ImportedOrganizationUser> importedUsers,
|
|
||||||
OrganizationUserImportData importUserData)
|
|
||||||
{
|
{
|
||||||
var seatsAvailable = int.MaxValue;
|
case Success<InviteOrganizationUsersResponse> result:
|
||||||
var enoughSeatsAvailable = true;
|
foreach (var u in result.Value.InvitedUsers)
|
||||||
if (organization.Seats.HasValue)
|
|
||||||
{
|
{
|
||||||
var occupiedSeats = await _organizationUserRepository.GetOccupiedSeatCountByOrganizationIdAsync(organization.Id);
|
importUserData.ExistingExternalUsersIdDict.Add(u.ExternalId!, u.Id);
|
||||||
seatsAvailable = organization.Seats.Value - occupiedSeats;
|
|
||||||
enoughSeatsAvailable = seatsAvailable >= usersToAdd.Count();
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
var hasStandaloneSecretsManager = await _paymentService.HasSecretsManagerStandalone(organization);
|
case Failure<InviteOrganizationUsersResponse> failure:
|
||||||
|
throw new BadRequestException(failure.Error.Message);
|
||||||
var userInvites = new List<(OrganizationUserInvite, string)>();
|
default:
|
||||||
foreach (var user in importedUsers)
|
throw new InvalidOperationException($"Unhandled commandResult type: {commandResult.GetType().Name}");
|
||||||
{
|
|
||||||
if (!usersToAdd.Contains(user.ExternalId) || string.IsNullOrWhiteSpace(user.Email))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var invite = new OrganizationUserInvite
|
|
||||||
{
|
|
||||||
Emails = new List<string> { user.Email },
|
|
||||||
Type = OrganizationUserType.User,
|
|
||||||
Collections = new List<CollectionAccessSelection>(),
|
|
||||||
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);
|
/// <summary>
|
||||||
foreach (var invitedUser in invitedUsers)
|
/// Sends the user invites through the InviteOrganizationUserCommand
|
||||||
|
/// <param name="invites">The list of organization user invites command models to be used for inviting users</param>
|
||||||
|
/// <param name="organization">The organization to which users are being invited</param>
|
||||||
|
/// </summary>
|
||||||
|
private async Task<CommandResult<InviteOrganizationUsersResponse>> InviteUsersAsync(List<OrganizationUserInviteCommandModel> invites, Organization organization)
|
||||||
{
|
{
|
||||||
importUserData.ExistingExternalUsersIdDict.TryAdd(invitedUser.ExternalId!, invitedUser.Id);
|
var plan = await _pricingClient.GetPlanOrThrow(organization.PlanType);
|
||||||
}
|
var inviteOrganization = new InviteOrganization(organization, plan);
|
||||||
|
var request = new InviteOrganizationUsersRequest(invites.ToArray(), inviteOrganization, Guid.Empty, DateTimeOffset.UtcNow);
|
||||||
|
|
||||||
|
return await _inviteOrganizationUsersCommand.InviteImportedOrganizationUsersAsync(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user