From b6255a64fed01c2d9295ced6478a35b25d30fbe8 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Fri, 9 Feb 2024 10:27:47 +1000 Subject: [PATCH] [AC-2184] Force sync after opting in to Flexible Collections (#3766) --- .../Controllers/OrganizationsController.cs | 13 ++++++++++- .../OrganizationsControllerTests.cs | 22 ++++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/Api/AdminConsole/Controllers/OrganizationsController.cs b/src/Api/AdminConsole/Controllers/OrganizationsController.cs index 6acdace5e3..7e16f75c41 100644 --- a/src/Api/AdminConsole/Controllers/OrganizationsController.cs +++ b/src/Api/AdminConsole/Controllers/OrganizationsController.cs @@ -57,6 +57,7 @@ public class OrganizationsController : Controller private readonly IUpdateSecretsManagerSubscriptionCommand _updateSecretsManagerSubscriptionCommand; private readonly IUpgradeOrganizationPlanCommand _upgradeOrganizationPlanCommand; private readonly IAddSecretsManagerSubscriptionCommand _addSecretsManagerSubscriptionCommand; + private readonly IPushNotificationService _pushNotificationService; public OrganizationsController( IOrganizationRepository organizationRepository, @@ -78,7 +79,8 @@ public class OrganizationsController : Controller ILicensingService licensingService, IUpdateSecretsManagerSubscriptionCommand updateSecretsManagerSubscriptionCommand, IUpgradeOrganizationPlanCommand upgradeOrganizationPlanCommand, - IAddSecretsManagerSubscriptionCommand addSecretsManagerSubscriptionCommand) + IAddSecretsManagerSubscriptionCommand addSecretsManagerSubscriptionCommand, + IPushNotificationService pushNotificationService) { _organizationRepository = organizationRepository; _organizationUserRepository = organizationUserRepository; @@ -100,6 +102,7 @@ public class OrganizationsController : Controller _updateSecretsManagerSubscriptionCommand = updateSecretsManagerSubscriptionCommand; _upgradeOrganizationPlanCommand = upgradeOrganizationPlanCommand; _addSecretsManagerSubscriptionCommand = addSecretsManagerSubscriptionCommand; + _pushNotificationService = pushNotificationService; } [HttpGet("{id}")] @@ -846,6 +849,14 @@ public class OrganizationsController : Controller organization.FlexibleCollections = true; await _organizationService.ReplaceAndUpdateCacheAsync(organization); + + // Force a vault sync for all owners and admins of the organization so that changes show immediately + // Custom users are intentionally not handled as they are likely to be less impacted and we want to limit simultaneous syncs + var orgUsers = await _organizationUserRepository.GetManyByOrganizationAsync(id, null); + await Task.WhenAll(orgUsers + .Where(ou => ou.UserId.HasValue && + ou.Type is OrganizationUserType.Admin or OrganizationUserType.Owner) + .Select(ou => _pushNotificationService.PushSyncVaultAsync(ou.UserId.Value))); } private async Task TryGrantOwnerAccessToSecretsManagerAsync(Guid organizationId, Guid userId) diff --git a/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs b/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs index 947079eb57..76e4432b50 100644 --- a/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs +++ b/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs @@ -50,6 +50,7 @@ public class OrganizationsControllerTests : IDisposable private readonly IUpdateSecretsManagerSubscriptionCommand _updateSecretsManagerSubscriptionCommand; private readonly IUpgradeOrganizationPlanCommand _upgradeOrganizationPlanCommand; private readonly IAddSecretsManagerSubscriptionCommand _addSecretsManagerSubscriptionCommand; + private readonly IPushNotificationService _pushNotificationService; private readonly OrganizationsController _sut; @@ -75,6 +76,7 @@ public class OrganizationsControllerTests : IDisposable _updateSecretsManagerSubscriptionCommand = Substitute.For(); _upgradeOrganizationPlanCommand = Substitute.For(); _addSecretsManagerSubscriptionCommand = Substitute.For(); + _pushNotificationService = Substitute.For(); _sut = new OrganizationsController( _organizationRepository, @@ -96,7 +98,8 @@ public class OrganizationsControllerTests : IDisposable _licensingService, _updateSecretsManagerSubscriptionCommand, _upgradeOrganizationPlanCommand, - _addSecretsManagerSubscriptionCommand); + _addSecretsManagerSubscriptionCommand, + _pushNotificationService); } public void Dispose() @@ -358,8 +361,20 @@ public class OrganizationsControllerTests : IDisposable public async Task EnableCollectionEnhancements_Success(Organization organization) { organization.FlexibleCollections = false; + var admin = new OrganizationUser { UserId = Guid.NewGuid(), Type = OrganizationUserType.Admin }; + var owner = new OrganizationUser { UserId = Guid.NewGuid(), Type = OrganizationUserType.Owner }; + var user = new OrganizationUser { UserId = Guid.NewGuid(), Type = OrganizationUserType.User }; + var invited = new OrganizationUser + { + UserId = null, + Type = OrganizationUserType.Admin, + Email = "invited@example.com" + }; + var orgUsers = new List { admin, owner, user, invited }; + _currentContext.OrganizationOwner(organization.Id).Returns(true); _organizationRepository.GetByIdAsync(organization.Id).Returns(organization); + _organizationUserRepository.GetManyByOrganizationAsync(organization.Id, null).Returns(orgUsers); await _sut.EnableCollectionEnhancements(organization.Id); @@ -368,6 +383,9 @@ public class OrganizationsControllerTests : IDisposable Arg.Is(o => o.Id == organization.Id && o.FlexibleCollections)); + await _pushNotificationService.Received(1).PushSyncVaultAsync(admin.UserId.Value); + await _pushNotificationService.Received(1).PushSyncVaultAsync(owner.UserId.Value); + await _pushNotificationService.DidNotReceive().PushSyncVaultAsync(user.UserId.Value); } [Theory, AutoData] @@ -381,6 +399,7 @@ public class OrganizationsControllerTests : IDisposable await _organizationRepository.DidNotReceiveWithAnyArgs().EnableCollectionEnhancements(Arg.Any()); await _organizationService.DidNotReceiveWithAnyArgs().ReplaceAndUpdateCacheAsync(Arg.Any()); + await _pushNotificationService.DidNotReceiveWithAnyArgs().PushSyncVaultAsync(Arg.Any()); } [Theory, AutoData] @@ -395,5 +414,6 @@ public class OrganizationsControllerTests : IDisposable await _organizationRepository.DidNotReceiveWithAnyArgs().EnableCollectionEnhancements(Arg.Any()); await _organizationService.DidNotReceiveWithAnyArgs().ReplaceAndUpdateCacheAsync(Arg.Any()); + await _pushNotificationService.DidNotReceiveWithAnyArgs().PushSyncVaultAsync(Arg.Any()); } }