Properly invalidate account caches when deleting systems
This commit is contained in:
		| @@ -1,4 +1,5 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| @@ -26,6 +27,16 @@ namespace PluralKit.Core | ||||
|  | ||||
|         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) | ||||
|         { | ||||
|             if (_cache.TryGetValue<CachedAccount>(KeyForSystem(systemId), out var systemCache)) | ||||
|   | ||||
| @@ -540,12 +540,16 @@ namespace PluralKit { | ||||
|             await _cache.InvalidateSystem(system); | ||||
|         } | ||||
|  | ||||
|         public async Task DeleteSystem(PKSystem system) { | ||||
|             using (var conn = await _conn.Obtain()) | ||||
|                 await conn.ExecuteAsync("delete from systems where id = @Id", system); | ||||
|         public async Task DeleteSystem(PKSystem 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); | ||||
|             await _cache.InvalidateSystem(system); | ||||
|             _cache.InvalidateDeletedSystem(system.Id, accounts); | ||||
|         } | ||||
|  | ||||
|         public async Task<IEnumerable<ulong>> GetSystemAccounts(PKSystem system) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user