Properly invalidate account caches when deleting systems
This commit is contained in:
parent
ab39ebc512
commit
de427d8bfe
@ -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())
|
{
|
||||||
|
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);
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user