From e22c52a38602553a46c0cdc55691ebe537b01161 Mon Sep 17 00:00:00 2001 From: JaredScar Date: Tue, 14 Jul 2026 13:13:32 -0400 Subject: [PATCH] [PM-40152] feat: Enhance provider seat limit validation messages Updated the InviteUsersPasswordManagerValidator to include seat count in validation results. Modified ProviderResellerSeatLimitError to accept seat count and adjusted related validation logic in InvitingUserOrganizationProviderValidator. Updated OrganizationService to reflect seat limits in error messages and adjusted corresponding tests for consistency. --- .../PasswordManager/InviteUsersPasswordManagerValidator.cs | 2 +- .../InviteUsers/Validation/Provider/Errors.cs | 7 +++++-- .../Provider/InvitingUserOrganizationProviderValidator.cs | 4 ++-- .../Services/Implementations/OrganizationService.cs | 2 +- .../AdminConsole/Services/OrganizationServiceTests.cs | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/PasswordManager/InviteUsersPasswordManagerValidator.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/PasswordManager/InviteUsersPasswordManagerValidator.cs index cd03735a56f9..56eab7de8e57 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/PasswordManager/InviteUsersPasswordManagerValidator.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/PasswordManager/InviteUsersPasswordManagerValidator.cs @@ -99,7 +99,7 @@ public async Task> ValidateA if (provider is not null) { - var providerValidationResult = InvitingUserOrganizationProviderValidator.Validate(new InviteOrganizationProvider(provider)); + var providerValidationResult = InvitingUserOrganizationProviderValidator.Validate(new InviteOrganizationProvider(provider), request.Seats); if (providerValidationResult is Invalid invalidProviderValidation) { diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/Errors.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/Errors.cs index 759ac1b7807f..3a49222e1262 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/Errors.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/Errors.cs @@ -7,7 +7,10 @@ public record ProviderBillableSeatLimitError(InviteOrganizationProvider InvalidR public const string Code = "Seat limit has been reached. Please contact your provider to add more seats."; } -public record ProviderResellerSeatLimitError(InviteOrganizationProvider InvalidRequest) : Error(Code, InvalidRequest) +public record ProviderResellerSeatLimitError : Error { - public const string Code = "Seat limit has been reached. Contact your provider to purchase additional seats."; + public ProviderResellerSeatLimitError(InviteOrganizationProvider invalidRequest, int? seats) + : base($"Seat limit of {seats} has been reached. Contact your provider to purchase additional seats.", invalidRequest) + { + } } diff --git a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/InvitingUserOrganizationProviderValidator.cs b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/InvitingUserOrganizationProviderValidator.cs index eeb19eec98d4..2bac233fe1fe 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/InvitingUserOrganizationProviderValidator.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/OrganizationUsers/InviteUsers/Validation/Provider/InvitingUserOrganizationProviderValidator.cs @@ -6,7 +6,7 @@ namespace Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUse public static class InvitingUserOrganizationProviderValidator { - public static ValidationResult Validate(InviteOrganizationProvider inviteOrganizationProvider) + public static ValidationResult Validate(InviteOrganizationProvider inviteOrganizationProvider, int? seats) { if (inviteOrganizationProvider is not { Enabled: true }) { @@ -20,7 +20,7 @@ public static ValidationResult Validate(InviteOrgani if (inviteOrganizationProvider.Type == ProviderType.Reseller) { - return new Invalid(new ProviderResellerSeatLimitError(inviteOrganizationProvider)); + return new Invalid(new ProviderResellerSeatLimitError(inviteOrganizationProvider, seats)); } return new Valid(inviteOrganizationProvider); diff --git a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs index 9df532deb440..1fc1e4957c67 100644 --- a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs +++ b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs @@ -733,7 +733,7 @@ await _sendOrganizationInvitesCommand.SendInvitesAsync(new SendInvitesRequest( if (provider.Type == ProviderType.Reseller) { - return (false, "Seat limit has been reached. Contact your provider to purchase additional seats."); + return (false, $"Seat limit of {organization.Seats} has been reached. Contact your provider to purchase additional seats."); } } diff --git a/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs b/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs index fba575d3bdd5..6632713224d7 100644 --- a/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs @@ -829,7 +829,7 @@ public async Task CanScaleAsync_FailsOnResellerManagedOrganization( var (result, failureMessage) = await sutProvider.Sut.CanScaleAsync(organization, 10); Assert.False(result); - Assert.Contains("Seat limit has been reached. Contact your provider to purchase additional seats.", failureMessage); + Assert.Contains($"Seat limit of {organization.Seats} has been reached. Contact your provider to purchase additional seats.", failureMessage); }