From f76d6fde6272ad410e24fab1dcf5acb96cd05371 Mon Sep 17 00:00:00 2001 From: Brandon Date: Fri, 9 May 2025 11:06:14 -0400 Subject: [PATCH] implement command --- .../ImportOrganizationUserCommand.cs | 26 +++++++++----- .../IInviteOrganizationUsersCommand.cs | 10 ++++++ .../InviteOrganizationUsersCommand.cs | 34 +++++++++++++++++++ 3 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs index 5d7ea80470..367e763f33 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommand.cs @@ -147,7 +147,7 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand IEnumerable newUsers, Organization organization, OrganizationUserImportData importData - ) + ) { if (!newUsers.Any()) { @@ -217,21 +217,29 @@ public class ImportOrganizationUserCommand : IImportOrganizationUserCommand var commandResult = await InviteUsersAsync(userInvites, organization); - //@TODO: replace with command, add invited users from commandResult to importData - //var invitedUsers = await _organizationService.InviteUsersAsync(organization.Id, invitingUserId: null, systemUser: eventSystemUser, userInvites); - //foreach (var invitedUser in invitedUsers) - //{ - // importData.ExistingExternalUsersIdDict.Add(invitedUser.ExternalId, invitedUser.Id); - //} + switch (commandResult) + { + case Success success: + var result = success.Value; + foreach (var u in result.InvitedUsers) + { + importData.ExistingExternalUsersIdDict.Add(u.ExternalId, u.Id); + } + break; + case Failure failure: + throw new BadRequestException(failure.ErrorMessage); + default: + throw new InvalidOperationException($"Unhandled commandResult type: {commandResult.GetType().Name}"); + } } - private async Task> InviteUsersAsync(List invites, Organization organization) + private async Task> InviteUsersAsync(List invites, Organization organization) { 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.InviteScimOrganizationUserAsync(request); + return await _inviteOrganizationUsersCommand.InviteImportedOrganizationUsersAsync(request, organization.Id); } private async Task OverwriteExisting( diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/IInviteOrganizationUsersCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/IInviteOrganizationUsersCommand.cs index 3e4c7652a5..1322bb4423 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/IInviteOrganizationUsersCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/IInviteOrganizationUsersCommand.cs @@ -19,4 +19,14 @@ public interface IInviteOrganizationUsersCommand /// /// Response from InviteScimOrganiation Task> InviteScimOrganizationUserAsync(InviteOrganizationUsersRequest request); + /// + /// Sends invitations to add imported organization users via directory connector or public API. + /// This can be a Success or a Failure. Failure will contain the Error along with a representation of the errored value. + /// Success will be the successful return object. + /// + /// + /// Contains the details for inviting the imported organization users. + /// + /// Response from InviteOrganiationUsersAsync + Task> InviteImportedOrganizationUsersAsync(InviteOrganizationUsersRequest request, Guid organizationId); } diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/InviteOrganizationUsersCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/InviteOrganizationUsersCommand.cs index 7ce3848661..dd54a3bad2 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/InviteOrganizationUsersCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/InviteOrganizationUsersCommand.cs @@ -76,6 +76,40 @@ public class InviteOrganizationUsersCommand(IEventService eventService, } } + public async Task> InviteImportedOrganizationUsersAsync(InviteOrganizationUsersRequest request, Guid organizationId) + { + var result = await InviteOrganizationUsersAsync(request); + + switch (result) + { + case Failure failure: + return new Failure( + failure.Errors.Select(error => new Error(error.Message, + new InviteOrganizationUsersResponse(error.ErroredValue.InvitedUsers, organizationId) + ))); + + case Success success when success.Value.InvitedUsers.Any(): + + // add a bulk method? + foreach (var user in success.Value.InvitedUsers) + { + await eventService.LogOrganizationUserEventAsync( + organizationUser: user, + type: EventType.OrganizationUser_Invited, + systemUser: EventSystemUser.PublicApi, + date: request.PerformedAt.UtcDateTime); + } + + return new Success(new InviteOrganizationUsersResponse(success.Value.InvitedUsers, organizationId) + ); + + default: + return new Failure( + new InvalidResultTypeError( + new InviteOrganizationUsersResponse(organizationId))); + } + } + private async Task> InviteOrganizationUsersAsync(InviteOrganizationUsersRequest request) { var invitesToSend = (await FilterExistingUsersAsync(request)).ToArray();