Refactor archive to do one sync delete of all keys rather than many

Otherwise we could be waiting on 50 sync calls to redis to happen. This
way we do it in one sync call and follow the pattern of
b98f4561fa/app/notify_client/organisations_api_client.py (L56)
This commit is contained in:
David McDonald
2020-05-22 17:12:00 +01:00
parent a65ada0d7e
commit 0fdda016e2
3 changed files with 17 additions and 6 deletions

View File

@@ -302,7 +302,11 @@ def archive_service(service_id):
):
abort(403)
if request.method == 'POST':
service_api_client.archive_service(service_id, current_service.active_users)
# We need to purge the cache for the services users as otherwise, although they will have had their permissions
# removed in the DB, they would still have permissions in the cache to view/edit/manage this service
cached_service_user_ids = [user.id for user in current_service.active_users]
service_api_client.archive_service(service_id, cached_service_user_ids)
flash(
'{} was deleted'.format(current_service.name),
'default_with_tick',

View File

@@ -130,11 +130,9 @@ class ServiceAPIClient(NotifyAdminAPIClient):
@cache.delete('service-{service_id}')
@cache.delete('service-{service_id}-templates')
def archive_service(self, service_id, service_users):
# We need to purge the cache for the services users as otherwise, although they will have had their permissions
# removed in the DB, they would still have permissions in the cache to view/edit/manage this service
for user in service_users:
cache.delete(f'user-{user.id}')
def archive_service(self, service_id, cached_service_user_ids):
if cached_service_user_ids:
cache.delete(*map('user-{}'.format, cached_service_user_ids))
return self.post('/service/{}/archive'.format(service_id), data=None)
@cache.delete('service-{service_id}')

View File

@@ -479,3 +479,12 @@ def test_deletes_caches_when_modifying_templates(
assert mock_redis_delete.call_args_list == list(map(call, expected_cache_deletes))
assert len(mock_request.call_args_list) == 1
def test_deletes_cached_users_when_archiving_service(mocker):
mock_redis_delete = mocker.patch('app.notify_client.service_api_client.cache.delete')
mocker.patch('notifications_python_client.base.BaseAPIClient.request')
service_api_client.archive_service(SERVICE_ONE_ID, ["my-user-id1", "my-user-id2"])
assert mock_redis_delete.call_args_list == [call('user-my-user-id1', 'user-my-user-id2')]