mirror of
https://github.com/bitwarden/server.git
synced 2025-05-21 03:24:31 -05:00
Moved to private method. Made ScimInvite inherit the single invite base model. Moved create methods to constructors. A few more CR changes included.
This commit is contained in:
parent
085dbffed1
commit
611ad8c343
@ -1,4 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Enums;
|
using Bit.Core.AdminConsole.Enums;
|
||||||
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
@ -26,13 +27,17 @@ public class ScimUserRequestModel : BaseScimUserModel
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public OrganizationUserSingleEmailInvite ToInvite(ScimProviderType scimProvider, bool hasSecretsManager) =>
|
public InviteScimOrganizationUserRequest ToRequest(
|
||||||
OrganizationUserSingleEmailInvite.Create(
|
ScimProviderType scimProvider,
|
||||||
EmailForInvite(scimProvider),
|
bool hasSecretsManager,
|
||||||
[],
|
OrganizationDto organization,
|
||||||
OrganizationUserType.User,
|
DateTimeOffset performedAt) =>
|
||||||
new Permissions(),
|
new(
|
||||||
hasSecretsManager);
|
email: EmailForInvite(scimProvider),
|
||||||
|
hasSecretsManager: hasSecretsManager,
|
||||||
|
organization: organization,
|
||||||
|
performedAt: performedAt,
|
||||||
|
externalId: ExternalIdForInvite());
|
||||||
|
|
||||||
private string EmailForInvite(ScimProviderType scimProvider)
|
private string EmailForInvite(ScimProviderType scimProvider)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
using Bit.Core;
|
#nullable enable
|
||||||
|
|
||||||
|
using Bit.Core;
|
||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
@ -25,7 +27,7 @@ public class PostUserCommand(
|
|||||||
TimeProvider timeProvider)
|
TimeProvider timeProvider)
|
||||||
: IPostUserCommand
|
: IPostUserCommand
|
||||||
{
|
{
|
||||||
public async Task<OrganizationUserUserDetails> PostUserAsync(Guid organizationId, ScimUserRequestModel model)
|
public async Task<OrganizationUserUserDetails?> PostUserAsync(Guid organizationId, ScimUserRequestModel model)
|
||||||
{
|
{
|
||||||
var scimProvider = scimContext.RequestScimProvider;
|
var scimProvider = scimContext.RequestScimProvider;
|
||||||
var invite = model.ToOrganizationUserInvite(scimProvider);
|
var invite = model.ToOrganizationUserInvite(scimProvider);
|
||||||
@ -57,23 +59,11 @@ public class PostUserCommand(
|
|||||||
|
|
||||||
if (featureService.IsEnabled(FeatureFlagKeys.ScimInviteUserOptimization))
|
if (featureService.IsEnabled(FeatureFlagKeys.ScimInviteUserOptimization))
|
||||||
{
|
{
|
||||||
var request = InviteScimOrganizationUserRequest.Create(
|
return await InviteScimOrganizationUserAsync(model.ToRequest(
|
||||||
model.ToInvite(scimProvider, hasStandaloneSecretsManager),
|
scimProvider: scimProvider,
|
||||||
OrganizationDto.FromOrganization(organization),
|
hasSecretsManager: hasStandaloneSecretsManager,
|
||||||
timeProvider.GetUtcNow(),
|
organization: OrganizationDto.FromOrganization(organization),
|
||||||
model.ExternalIdForInvite()
|
performedAt: timeProvider.GetUtcNow()));
|
||||||
);
|
|
||||||
|
|
||||||
var result = await inviteOrganizationUsersCommand.InviteScimOrganizationUserAsync(request);
|
|
||||||
|
|
||||||
if (result is Success<ScimInviteOrganizationUsersResponse> successfulResponse)
|
|
||||||
{
|
|
||||||
var invitedUser = await organizationUserRepository.GetDetailsByIdAsync(successfulResponse.Value.InvitedUser.Id);
|
|
||||||
|
|
||||||
return invitedUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var invitedOrgUser = await organizationService.InviteUserAsync(organizationId, invitingUserId: null, EventSystemUser.SCIM,
|
var invitedOrgUser = await organizationService.InviteUserAsync(organizationId, invitingUserId: null, EventSystemUser.SCIM,
|
||||||
@ -82,4 +72,19 @@ public class PostUserCommand(
|
|||||||
|
|
||||||
return orgUser;
|
return orgUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<OrganizationUserUserDetails?> InviteScimOrganizationUserAsync(InviteScimOrganizationUserRequest request)
|
||||||
|
{
|
||||||
|
var result = await inviteOrganizationUsersCommand.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
|
if (result is not Success<ScimInviteOrganizationUsersResponse> successfulResponse)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var invitedUser = await organizationUserRepository.GetDetailsByIdAsync(successfulResponse.Value.InvitedUser.Id);
|
||||||
|
|
||||||
|
return invitedUser;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
|
|
||||||
public async Task<CommandResult<ScimInviteOrganizationUsersResponse>> InviteScimOrganizationUserAsync(InviteScimOrganizationUserRequest request)
|
public async Task<CommandResult<ScimInviteOrganizationUsersResponse>> InviteScimOrganizationUserAsync(InviteScimOrganizationUserRequest request)
|
||||||
{
|
{
|
||||||
var result = await InviteOrganizationUsersAsync(InviteOrganizationUsersRequest.Create(request));
|
var result = await InviteOrganizationUsersAsync(new InviteOrganizationUsersRequest(request));
|
||||||
|
|
||||||
if (result is Failure<IEnumerable<OrganizationUser>> failure)
|
if (result is Failure<IEnumerable<OrganizationUser>> failure)
|
||||||
{
|
{
|
||||||
@ -47,7 +47,7 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
|
|
||||||
if (result.Value.Any())
|
if (result.Value.Any())
|
||||||
{
|
{
|
||||||
await eventService.LogOrganizationUserEventAsync((IOrganizationUser)result.Value.First(), EventType.OrganizationUser_Invited, EventSystemUser.SCIM, request.PerformedAt.UtcDateTime);
|
await eventService.LogOrganizationUserEventAsync<IOrganizationUser>(result.Value.First(), EventType.OrganizationUser_Invited, EventSystemUser.SCIM, request.PerformedAt.UtcDateTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Success<ScimInviteOrganizationUsersResponse>(new ScimInviteOrganizationUsersResponse
|
return new Success<ScimInviteOrganizationUsersResponse>(new ScimInviteOrganizationUsersResponse
|
||||||
@ -113,7 +113,7 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
{
|
{
|
||||||
logger.LogError(ex, FailedToInviteUsers);
|
logger.LogError(ex, FailedToInviteUsers);
|
||||||
|
|
||||||
await organizationUserRepository.DeleteManyAsync(organizationUserCollection.Select(x => x.User.Id));
|
await organizationUserRepository.DeleteManyAsync(organizationUserCollection.Select(x => x.OrganizationUser.Id));
|
||||||
|
|
||||||
await RevertSecretsManagerChangesAsync(validatedRequest, organization);
|
await RevertSecretsManagerChangesAsync(validatedRequest, organization);
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
return new Failure<IEnumerable<OrganizationUser>>(FailedToInviteUsers);
|
return new Failure<IEnumerable<OrganizationUser>>(FailedToInviteUsers);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Success<IEnumerable<OrganizationUser>>(organizationUserCollection.Select(x => x.User));
|
return new Success<IEnumerable<OrganizationUser>>(organizationUserCollection.Select(x => x.OrganizationUser));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RevertPasswordManagerChangesAsync(Valid<InviteUserOrganizationValidationRequest> valid, Organization organization)
|
private async Task RevertPasswordManagerChangesAsync(Valid<InviteUserOrganizationValidationRequest> valid, Organization organization)
|
||||||
@ -162,7 +162,7 @@ public class InviteOrganizationUsersCommand(IEventService eventService,
|
|||||||
private async Task SendInvitesAsync(IEnumerable<CreateOrganizationUser> users, Organization organization) =>
|
private async Task SendInvitesAsync(IEnumerable<CreateOrganizationUser> users, Organization organization) =>
|
||||||
await sendOrganizationInvitesCommand.SendInvitesAsync(
|
await sendOrganizationInvitesCommand.SendInvitesAsync(
|
||||||
new SendInvitesRequest(
|
new SendInvitesRequest(
|
||||||
users.Select(x => x.User),
|
users.Select(x => x.OrganizationUser),
|
||||||
organization));
|
organization));
|
||||||
|
|
||||||
private async Task SendAdditionalEmailsAsync(Valid<InviteUserOrganizationValidationRequest> valid, Organization organization)
|
private async Task SendAdditionalEmailsAsync(Valid<InviteUserOrganizationValidationRequest> valid, Organization organization)
|
||||||
|
@ -7,7 +7,7 @@ namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUse
|
|||||||
|
|
||||||
public class CreateOrganizationUser
|
public class CreateOrganizationUser
|
||||||
{
|
{
|
||||||
public OrganizationUser User { get; set; }
|
public OrganizationUser OrganizationUser { get; set; }
|
||||||
public CollectionAccessSelection[] Collections { get; set; } = [];
|
public CollectionAccessSelection[] Collections { get; set; } = [];
|
||||||
public Guid[] Groups { get; set; } = [];
|
public Guid[] Groups { get; set; } = [];
|
||||||
}
|
}
|
||||||
@ -17,7 +17,7 @@ public static class CreateOrganizationUserExtensions
|
|||||||
public static Func<OrganizationUserInviteDto, CreateOrganizationUser> MapToDataModel(DateTimeOffset performedAt) =>
|
public static Func<OrganizationUserInviteDto, CreateOrganizationUser> MapToDataModel(DateTimeOffset performedAt) =>
|
||||||
o => new CreateOrganizationUser
|
o => new CreateOrganizationUser
|
||||||
{
|
{
|
||||||
User = new OrganizationUser
|
OrganizationUser = new OrganizationUser
|
||||||
{
|
{
|
||||||
Id = CoreHelpers.GenerateComb(),
|
Id = CoreHelpers.GenerateComb(),
|
||||||
OrganizationId = o.OrganizationId,
|
OrganizationId = o.OrganizationId,
|
||||||
|
@ -9,20 +9,21 @@ public class InviteOrganizationUsersRequest
|
|||||||
public Guid PerformedBy { get; }
|
public Guid PerformedBy { get; }
|
||||||
public DateTimeOffset PerformedAt { get; }
|
public DateTimeOffset PerformedAt { get; }
|
||||||
|
|
||||||
public InviteOrganizationUsersRequest(OrganizationUserInvite[] Invites,
|
public InviteOrganizationUsersRequest(OrganizationUserInvite[] invites,
|
||||||
OrganizationDto Organization,
|
OrganizationDto organization,
|
||||||
Guid PerformedBy,
|
Guid performedBy,
|
||||||
DateTimeOffset PerformedAt)
|
DateTimeOffset performedAt)
|
||||||
{
|
{
|
||||||
this.Invites = Invites;
|
Invites = invites;
|
||||||
this.Organization = Organization;
|
Organization = organization;
|
||||||
this.PerformedBy = PerformedBy;
|
PerformedBy = performedBy;
|
||||||
this.PerformedAt = PerformedAt;
|
PerformedAt = performedAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static InviteOrganizationUsersRequest Create(InviteScimOrganizationUserRequest request) =>
|
public InviteOrganizationUsersRequest(InviteScimOrganizationUserRequest request) :
|
||||||
new([OrganizationUserInvite.Create(request.Invite, request.ExternalId)],
|
this([OrganizationUserInvite.Create(request, request.ExternalId)],
|
||||||
request.Organization,
|
request.Organization,
|
||||||
Guid.Empty,
|
Guid.Empty,
|
||||||
request.PerformedAt);
|
request.PerformedAt)
|
||||||
|
{ }
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,4 @@ public class ScimInviteOrganizationUsersResponse
|
|||||||
{
|
{
|
||||||
public OrganizationUser InvitedUser { get; init; }
|
public OrganizationUser InvitedUser { get; init; }
|
||||||
|
|
||||||
public static ScimInviteOrganizationUsersResponse Create(OrganizationUser invitedUser)
|
|
||||||
{
|
|
||||||
return new ScimInviteOrganizationUsersResponse
|
|
||||||
{
|
|
||||||
InvitedUser = invitedUser
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,28 @@
|
|||||||
using Bit.Core.AdminConsole.Models.Business;
|
using Bit.Core.AdminConsole.Models.Business;
|
||||||
|
using Bit.Core.Enums;
|
||||||
|
using Bit.Core.Models.Data;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
|
|
||||||
public class InviteScimOrganizationUserRequest
|
public record InviteScimOrganizationUserRequest : OrganizationUserSingleEmailInvite
|
||||||
{
|
{
|
||||||
public OrganizationUserSingleEmailInvite Invite { get; }
|
public OrganizationDto Organization { get; private init; }
|
||||||
public OrganizationDto Organization { get; }
|
public DateTimeOffset PerformedAt { get; private init; }
|
||||||
public DateTimeOffset PerformedAt { get; }
|
public string ExternalId { get; private init; } = string.Empty;
|
||||||
public string ExternalId { get; } = string.Empty;
|
|
||||||
|
|
||||||
private InviteScimOrganizationUserRequest(OrganizationUserSingleEmailInvite invite,
|
public InviteScimOrganizationUserRequest(string email,
|
||||||
|
bool hasSecretsManager,
|
||||||
OrganizationDto organization,
|
OrganizationDto organization,
|
||||||
DateTimeOffset performedAt,
|
DateTimeOffset performedAt,
|
||||||
string externalId)
|
string externalId) : base(
|
||||||
|
email: email,
|
||||||
|
accessibleCollections: [],
|
||||||
|
type: OrganizationUserType.User,
|
||||||
|
permissions: new Permissions(),
|
||||||
|
accessSecretsManager: hasSecretsManager)
|
||||||
{
|
{
|
||||||
Invite = invite;
|
|
||||||
Organization = organization;
|
Organization = organization;
|
||||||
PerformedAt = performedAt;
|
PerformedAt = performedAt;
|
||||||
ExternalId = externalId;
|
ExternalId = externalId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static InviteScimOrganizationUserRequest Create(OrganizationUserSingleEmailInvite invite,
|
|
||||||
OrganizationDto organization, DateTimeOffset performedAt, string externalId) =>
|
|
||||||
new(invite, organization, performedAt, externalId);
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ public class OrganizationUserInvite
|
|||||||
public string[] Emails { get; private init; } = [];
|
public string[] Emails { get; private init; } = [];
|
||||||
public CollectionAccessSelection[] AccessibleCollections { get; private init; } = [];
|
public CollectionAccessSelection[] AccessibleCollections { get; private init; } = [];
|
||||||
public OrganizationUserType Type { get; private init; } = OrganizationUserType.User;
|
public OrganizationUserType Type { get; private init; } = OrganizationUserType.User;
|
||||||
|
|
||||||
public Permissions Permissions { get; private init; } = new();
|
public Permissions Permissions { get; private init; } = new();
|
||||||
public string ExternalId { get; private init; } = string.Empty;
|
public string ExternalId { get; private init; } = string.Empty;
|
||||||
public bool AccessSecretsManager { get; private init; }
|
public bool AccessSecretsManager { get; private init; }
|
||||||
|
@ -7,15 +7,15 @@ using static Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Invite
|
|||||||
|
|
||||||
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
||||||
|
|
||||||
public class OrganizationUserSingleEmailInvite
|
public record OrganizationUserSingleEmailInvite
|
||||||
{
|
{
|
||||||
public string Email { get; private init; } = string.Empty;
|
public string Email { get; init; } = string.Empty;
|
||||||
public CollectionAccessSelection[] AccessibleCollections { get; private init; } = [];
|
public CollectionAccessSelection[] AccessibleCollections { get; init; } = [];
|
||||||
public Permissions Permissions { get; private init; } = new();
|
public Permissions Permissions { get; init; } = new();
|
||||||
public OrganizationUserType Type { get; private init; } = OrganizationUserType.User;
|
public OrganizationUserType Type { get; init; } = OrganizationUserType.User;
|
||||||
public bool AccessSecretsManager { get; private init; }
|
public bool AccessSecretsManager { get; init; }
|
||||||
|
|
||||||
public static OrganizationUserSingleEmailInvite Create(string email,
|
public OrganizationUserSingleEmailInvite(string email,
|
||||||
IEnumerable<CollectionAccessSelection> accessibleCollections,
|
IEnumerable<CollectionAccessSelection> accessibleCollections,
|
||||||
OrganizationUserType type,
|
OrganizationUserType type,
|
||||||
Permissions permissions,
|
Permissions permissions,
|
||||||
@ -31,13 +31,10 @@ public class OrganizationUserSingleEmailInvite
|
|||||||
throw new BadRequestException(InvalidCollectionConfigurationErrorMessage);
|
throw new BadRequestException(InvalidCollectionConfigurationErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new OrganizationUserSingleEmailInvite
|
Email = email;
|
||||||
{
|
AccessibleCollections = accessibleCollections.ToArray();
|
||||||
Email = email,
|
Type = type;
|
||||||
AccessibleCollections = accessibleCollections.ToArray(),
|
Permissions = permissions;
|
||||||
Type = type,
|
AccessSecretsManager = accessSecretsManager;
|
||||||
Permissions = permissions,
|
|
||||||
AccessSecretsManager = accessSecretsManager
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -590,12 +590,12 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
|
|||||||
$"[{Schema}].[OrganizationUser_CreateManyWithCollectionsAndGroups]",
|
$"[{Schema}].[OrganizationUser_CreateManyWithCollectionsAndGroups]",
|
||||||
new
|
new
|
||||||
{
|
{
|
||||||
OrganizationUserData = JsonSerializer.Serialize(organizationUserCollection.Select(x => x.User)),
|
OrganizationUserData = JsonSerializer.Serialize(organizationUserCollection.Select(x => x.OrganizationUser)),
|
||||||
CollectionData = JsonSerializer.Serialize(organizationUserCollection
|
CollectionData = JsonSerializer.Serialize(organizationUserCollection
|
||||||
.SelectMany(x => x.Collections, (user, collection) => new CollectionUser
|
.SelectMany(x => x.Collections, (user, collection) => new CollectionUser
|
||||||
{
|
{
|
||||||
CollectionId = collection.Id,
|
CollectionId = collection.Id,
|
||||||
OrganizationUserId = user.User.Id,
|
OrganizationUserId = user.OrganizationUser.Id,
|
||||||
ReadOnly = collection.ReadOnly,
|
ReadOnly = collection.ReadOnly,
|
||||||
HidePasswords = collection.HidePasswords,
|
HidePasswords = collection.HidePasswords,
|
||||||
Manage = collection.Manage
|
Manage = collection.Manage
|
||||||
@ -604,7 +604,7 @@ public class OrganizationUserRepository : Repository<OrganizationUser, Guid>, IO
|
|||||||
.SelectMany(x => x.Groups, (user, group) => new GroupUser
|
.SelectMany(x => x.Groups, (user, group) => new GroupUser
|
||||||
{
|
{
|
||||||
GroupId = group,
|
GroupId = group,
|
||||||
OrganizationUserId = user.User.Id
|
OrganizationUserId = user.OrganizationUser.Id
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
commandType: CommandType.StoredProcedure);
|
commandType: CommandType.StoredProcedure);
|
||||||
|
@ -762,19 +762,19 @@ public class OrganizationUserRepository : Repository<Core.Entities.OrganizationU
|
|||||||
|
|
||||||
await using var dbContext = GetDatabaseContext(scope);
|
await using var dbContext = GetDatabaseContext(scope);
|
||||||
|
|
||||||
dbContext.OrganizationUsers.AddRange(Mapper.Map<List<OrganizationUser>>(organizationUserCollection.Select(x => x.User)));
|
dbContext.OrganizationUsers.AddRange(Mapper.Map<List<OrganizationUser>>(organizationUserCollection.Select(x => x.OrganizationUser)));
|
||||||
dbContext.CollectionUsers.AddRange(organizationUserCollection.SelectMany(x => x.Collections, (user, collection) => new CollectionUser
|
dbContext.CollectionUsers.AddRange(organizationUserCollection.SelectMany(x => x.Collections, (user, collection) => new CollectionUser
|
||||||
{
|
{
|
||||||
CollectionId = collection.Id,
|
CollectionId = collection.Id,
|
||||||
HidePasswords = collection.HidePasswords,
|
HidePasswords = collection.HidePasswords,
|
||||||
OrganizationUserId = user.User.Id,
|
OrganizationUserId = user.OrganizationUser.Id,
|
||||||
Manage = collection.Manage,
|
Manage = collection.Manage,
|
||||||
ReadOnly = collection.ReadOnly
|
ReadOnly = collection.ReadOnly
|
||||||
}));
|
}));
|
||||||
dbContext.GroupUsers.AddRange(organizationUserCollection.SelectMany(x => x.Groups, (user, group) => new GroupUser
|
dbContext.GroupUsers.AddRange(organizationUserCollection.SelectMany(x => x.Groups, (user, group) => new GroupUser
|
||||||
{
|
{
|
||||||
GroupId = group,
|
GroupId = group,
|
||||||
OrganizationUserId = user.User.Id
|
OrganizationUserId = user.OrganizationUser.Id
|
||||||
}));
|
}));
|
||||||
|
|
||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
|
@ -15,7 +15,7 @@ public class InviteOrganizationUserRequestTests
|
|||||||
public void Create_WhenPassedInvalidEmail_ThrowsException(string email,
|
public void Create_WhenPassedInvalidEmail_ThrowsException(string email,
|
||||||
OrganizationUserType type, Permissions permissions, bool accessSecretsManager)
|
OrganizationUserType type, Permissions permissions, bool accessSecretsManager)
|
||||||
{
|
{
|
||||||
var action = () => OrganizationUserSingleEmailInvite.Create(email, [], type, permissions, accessSecretsManager);
|
var action = () => new OrganizationUserSingleEmailInvite(email, [], type, permissions, accessSecretsManager);
|
||||||
|
|
||||||
var exception = Assert.Throws<BadRequestException>(action);
|
var exception = Assert.Throws<BadRequestException>(action);
|
||||||
|
|
||||||
@ -30,8 +30,7 @@ public class InviteOrganizationUserRequestTests
|
|||||||
|
|
||||||
var invalidCollectionConfiguration = new CollectionAccessSelection { Manage = true, HidePasswords = true };
|
var invalidCollectionConfiguration = new CollectionAccessSelection { Manage = true, HidePasswords = true };
|
||||||
|
|
||||||
var action = () =>
|
var action = () => new OrganizationUserSingleEmailInvite(validEmail, [invalidCollectionConfiguration], type, permissions, accessSecretsManager);
|
||||||
OrganizationUserSingleEmailInvite.Create(validEmail, [invalidCollectionConfiguration], type, permissions, accessSecretsManager);
|
|
||||||
|
|
||||||
var exception = Assert.Throws<BadRequestException>(action);
|
var exception = Assert.Throws<BadRequestException>(action);
|
||||||
|
|
||||||
@ -45,7 +44,7 @@ public class InviteOrganizationUserRequestTests
|
|||||||
const string validEmail = "test@email.com";
|
const string validEmail = "test@email.com";
|
||||||
var validCollectionConfiguration = new CollectionAccessSelection { Id = Guid.NewGuid(), Manage = true };
|
var validCollectionConfiguration = new CollectionAccessSelection { Id = Guid.NewGuid(), Manage = true };
|
||||||
|
|
||||||
var invite = OrganizationUserSingleEmailInvite.Create(validEmail, [validCollectionConfiguration], type, permissions, accessSecretsManager);
|
var invite = new OrganizationUserSingleEmailInvite(validEmail, [validCollectionConfiguration], type, permissions, accessSecretsManager);
|
||||||
|
|
||||||
Assert.NotNull(invite);
|
Assert.NotNull(invite);
|
||||||
Assert.Equal(validEmail, invite.Email);
|
Assert.Equal(validEmail, invite.Email);
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
using Bit.Core.AdminConsole.Models.Business;
|
|
||||||
using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models;
|
|
||||||
using Bit.Core.Enums;
|
|
||||||
using Bit.Core.Models.Data;
|
|
||||||
|
|
||||||
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Helpers;
|
|
||||||
|
|
||||||
public static class InviteScimOrganizationUserRequestHelpers
|
|
||||||
{
|
|
||||||
public static InviteScimOrganizationUserRequest GetInviteScimOrganizationUserRequestDefault(string email,
|
|
||||||
OrganizationDto organizationDto, DateTimeOffset performedAt, string externalId) =>
|
|
||||||
InviteScimOrganizationUserRequest.Create(
|
|
||||||
OrganizationUserSingleEmailInvite.Create(
|
|
||||||
email,
|
|
||||||
[],
|
|
||||||
OrganizationUserType.User,
|
|
||||||
new Permissions(),
|
|
||||||
false),
|
|
||||||
organizationDto,
|
|
||||||
performedAt,
|
|
||||||
externalId
|
|
||||||
);
|
|
||||||
}
|
|
@ -12,8 +12,8 @@ public static class InviteUserOrganizationValidationRequestHelpers
|
|||||||
{
|
{
|
||||||
Invites =
|
Invites =
|
||||||
[
|
[
|
||||||
OrganizationUserInviteDto.Create(request.Invite.Email,
|
OrganizationUserInviteDto.Create(request.Email,
|
||||||
OrganizationUserInvite.Create(request.Invite, request.ExternalId), organizationDto.OrganizationId)
|
OrganizationUserInvite.Create(request, request.ExternalId), organizationDto.OrganizationId)
|
||||||
],
|
],
|
||||||
Organization = organizationDto,
|
Organization = organizationDto,
|
||||||
PerformedBy = Guid.Empty,
|
PerformedBy = Guid.Empty,
|
||||||
|
@ -18,7 +18,6 @@ using Bit.Test.Common.AutoFixture.Attributes;
|
|||||||
using Microsoft.Extensions.Time.Testing;
|
using Microsoft.Extensions.Time.Testing;
|
||||||
using NSubstitute;
|
using NSubstitute;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
using static Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Helpers.InviteScimOrganizationUserRequestHelpers;
|
|
||||||
using static Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Helpers.InviteUserOrganizationValidationRequestHelpers;
|
using static Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Helpers.InviteUserOrganizationValidationRequestHelpers;
|
||||||
|
|
||||||
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers;
|
||||||
@ -41,7 +40,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -58,7 +58,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Success<OrganizationUser>>(result);
|
Assert.IsType<Success<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
|
|
||||||
sutProvider.GetDependency<IPaymentService>()
|
sutProvider.GetDependency<IPaymentService>()
|
||||||
.DidNotReceiveWithAnyArgs()
|
.DidNotReceiveWithAnyArgs()
|
||||||
@ -88,7 +88,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -109,12 +110,12 @@ public class InviteOrganizationUserCommandTests
|
|||||||
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Success<OrganizationUser>>(result);
|
Assert.IsType<Success<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
|
|
||||||
sutProvider.GetDependency<IOrganizationUserRepository>()
|
sutProvider.GetDependency<IOrganizationUserRepository>()
|
||||||
.Received(1)
|
.Received(1)
|
||||||
.CreateManyAsync(Arg.Is<IEnumerable<CreateOrganizationUser>>(users =>
|
.CreateManyAsync(Arg.Is<IEnumerable<CreateOrganizationUser>>(users =>
|
||||||
users.Any(user => user.User.Email == request.Invite.Email)));
|
users.Any(user => user.OrganizationUser.Email == request.Email)));
|
||||||
|
|
||||||
sutProvider.GetDependency<ISendOrganizationInvitesCommand>()
|
sutProvider.GetDependency<ISendOrganizationInvitesCommand>()
|
||||||
.Received(1)
|
.Received(1)
|
||||||
@ -140,7 +141,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -194,7 +196,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -221,7 +224,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Success<OrganizationUser>>(result);
|
Assert.IsType<Success<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
|
|
||||||
sutProvider.GetDependency<IMailService>()
|
sutProvider.GetDependency<IMailService>()
|
||||||
.Received(1)
|
.Received(1)
|
||||||
@ -249,7 +252,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -279,7 +283,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Success<OrganizationUser>>(result);
|
Assert.IsType<Success<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
|
|
||||||
sutProvider.GetDependency<IPaymentService>()
|
sutProvider.GetDependency<IPaymentService>()
|
||||||
.AdjustSeatsAsync(organization, organizationDto.Plan, passwordManagerUpdate.SeatsRequiredToAdd);
|
.AdjustSeatsAsync(organization, organizationDto.Plan, passwordManagerUpdate.SeatsRequiredToAdd);
|
||||||
@ -311,7 +315,8 @@ public class InviteOrganizationUserCommandTests
|
|||||||
|
|
||||||
var organizationDto = OrganizationDto.FromOrganization(organization);
|
var organizationDto = OrganizationDto.FromOrganization(organization);
|
||||||
|
|
||||||
var request = GetInviteScimOrganizationUserRequestDefault(user.Email,
|
var request = new InviteScimOrganizationUserRequest(user.Email,
|
||||||
|
true,
|
||||||
organizationDto,
|
organizationDto,
|
||||||
timeProvider.GetUtcNow(),
|
timeProvider.GetUtcNow(),
|
||||||
externalId);
|
externalId);
|
||||||
@ -345,7 +350,7 @@ public class InviteOrganizationUserCommandTests
|
|||||||
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
var result = await sutProvider.Sut.InviteScimOrganizationUserAsync(request);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<Success<OrganizationUser>>(result);
|
Assert.IsType<Success<ScimInviteOrganizationUsersResponse>>(result);
|
||||||
|
|
||||||
sutProvider.GetDependency<IUpdateSecretsManagerSubscriptionCommand>()
|
sutProvider.GetDependency<IUpdateSecretsManagerSubscriptionCommand>()
|
||||||
.Received(1)
|
.Received(1)
|
||||||
|
@ -396,9 +396,9 @@ public class OrganizationUserRepositoryTests
|
|||||||
|
|
||||||
var orgUserCollection = new List<CreateOrganizationUser>
|
var orgUserCollection = new List<CreateOrganizationUser>
|
||||||
{
|
{
|
||||||
new CreateOrganizationUser
|
new()
|
||||||
{
|
{
|
||||||
User = new OrganizationUser
|
OrganizationUser = new OrganizationUser
|
||||||
{
|
{
|
||||||
Id = CoreHelpers.GenerateComb(),
|
Id = CoreHelpers.GenerateComb(),
|
||||||
OrganizationId = organization.Id,
|
OrganizationId = organization.Id,
|
||||||
@ -425,6 +425,7 @@ public class OrganizationUserRepositoryTests
|
|||||||
|
|
||||||
await organizationUserRepository.CreateManyAsync(orgUserCollection);
|
await organizationUserRepository.CreateManyAsync(orgUserCollection);
|
||||||
|
|
||||||
var orgUser = await organizationUserRepository.GetDetailsByIdAsync(orgUserCollection.First().User.Id);
|
var orgUser = await organizationUserRepository.GetDetailsByIdAsync(orgUserCollection.First().OrganizationUser.Id);
|
||||||
|
Assert.Equal(orgUserCollection.First().OrganizationUser.Id, orgUser.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user