Properly invalidate account caches when deleting systems
This commit is contained in:
		| @@ -1,4 +1,5 @@ | |||||||
| using System; | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
|  |  | ||||||
| @@ -26,6 +27,16 @@ namespace PluralKit.Core | |||||||
|  |  | ||||||
|         public Task InvalidateSystem(PKSystem system) => InvalidateSystem(system.Id); |         public Task InvalidateSystem(PKSystem system) => InvalidateSystem(system.Id); | ||||||
|  |  | ||||||
|  |         public void InvalidateDeletedSystem(int systemId, IEnumerable<ulong> accounts) | ||||||
|  |         { | ||||||
|  |             // Used when the system's already removed so we can't look up accounts | ||||||
|  |             // We assume the account list is saved already somewhere and can be passed here (which is the case in Store) | ||||||
|  |              | ||||||
|  |             _cache.Remove(KeyForSystem(systemId)); | ||||||
|  |             foreach (var account in accounts)  | ||||||
|  |                 _cache.Remove(KeyForAccount(account)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public async Task InvalidateSystem(int systemId) |         public async Task InvalidateSystem(int systemId) | ||||||
|         { |         { | ||||||
|             if (_cache.TryGetValue<CachedAccount>(KeyForSystem(systemId), out var systemCache)) |             if (_cache.TryGetValue<CachedAccount>(KeyForSystem(systemId), out var systemCache)) | ||||||
|   | |||||||
| @@ -540,12 +540,16 @@ namespace PluralKit { | |||||||
|             await _cache.InvalidateSystem(system); |             await _cache.InvalidateSystem(system); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task DeleteSystem(PKSystem system) { |         public async Task DeleteSystem(PKSystem system) | ||||||
|             using (var conn = await _conn.Obtain()) |         { | ||||||
|                 await conn.ExecuteAsync("delete from systems where id = @Id", system); |             using var conn = await _conn.Obtain(); | ||||||
|  |              | ||||||
|  |             // Fetch the list of accounts *before* deletion so we can cache-bust all of those | ||||||
|  |             var accounts = (await conn.QueryAsync<ulong>("select uid from accounts where system = @Id", system)).ToArray(); | ||||||
|  |             await conn.ExecuteAsync("delete from systems where id = @Id", system); | ||||||
|              |              | ||||||
|             _logger.Information("Deleted system {System}", system.Id); |             _logger.Information("Deleted system {System}", system.Id); | ||||||
|             await _cache.InvalidateSystem(system); |             _cache.InvalidateDeletedSystem(system.Id, accounts); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async Task<IEnumerable<ulong>> GetSystemAccounts(PKSystem system) |         public async Task<IEnumerable<ulong>> GetSystemAccounts(PKSystem system) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user