public override async Task Process(Message message) { SpecificationVersionComparisonModel versionComparison = message.GetPayloadAsInstanceOf <SpecificationVersionComparisonModel>(); if (versionComparison == null || versionComparison.Current == null || versionComparison.Previous == null) { _logger.Error($"A null versionComparison was provided to users"); throw new InvalidModelException(nameof(SpecificationVersionComparisonModel), new[] { "Null or invalid model provided" }); } string specificationId = versionComparison.Id; if (string.IsNullOrWhiteSpace(specificationId)) { _logger.Error($"A null specificationId was provided to users in model"); throw new InvalidModelException(nameof(SpecificationVersionComparisonModel), new[] { "Null or invalid specificationId on model" }); } IEnumerable <string> previousFundingStreams = versionComparison.Previous.FundingStreams.OrderBy(c => c.Id).Select(f => f.Id); IEnumerable <string> currentFundingStreams = versionComparison.Current.FundingStreams.OrderBy(c => c.Id).Select(f => f.Id); if (!previousFundingStreams.SequenceEqual(currentFundingStreams)) { _logger.Information("Found changed funding streams for specification '{SpecificationId}' Previous: {PreviousFundingStreams} Current {CurrentFundingStreams}", specificationId, previousFundingStreams, currentFundingStreams); Dictionary <string, bool> userIds = new Dictionary <string, bool>(); IEnumerable <string> allFundingStreamIds = previousFundingStreams.Union(currentFundingStreams); foreach (string fundingStreamId in allFundingStreamIds) { IEnumerable <FundingStreamPermission> userPermissions = await _userRepositoryPolicy.ExecuteAsync(() => _userRepository.GetUsersWithFundingStreamPermissions(fundingStreamId)); foreach (FundingStreamPermission permission in userPermissions) { if (!userIds.ContainsKey(permission.UserId)) { userIds.Add(permission.UserId, true); } } } foreach (string userId in userIds.Keys) { _logger.Information("Clearing effective permissions for userId '{UserId}' for specification '{SpecificationId}'", userId, specificationId); await _cacheProviderPolicy.ExecuteAsync(() => _cacheProvider.DeleteHashKey <EffectiveSpecificationPermission>($"{CacheKeys.EffectivePermissions}:{userId}", specificationId)); } } else { _logger.Information("No funding streams have changed for specification '{SpecificationId}' which require effective permission clearing.", specificationId); } }