V13: Clear username cache (#17815)

* Clear member username cache on delete

* Also refresh cache on update
This commit is contained in:
Nikolaj Geisle
2024-12-16 07:18:30 +01:00
committed by Elitsa
parent 70272f1a1a
commit 838294efe1
2 changed files with 16 additions and 1 deletions

View File

@@ -30,4 +30,10 @@ public class MemberRepositoryUsernameCachePolicy : DefaultRepositoryCachePolicy<
return entity;
}
public void DeleteByUserName(string key, string? username)
{
var cacheKey = GetEntityCacheKey(key + username);
Cache.ClearByKey(cacheKey);
}
}

View File

@@ -39,6 +39,7 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
private readonly ITagRepository _tagRepository;
private bool _passwordConfigInitialized;
private string? _passwordConfigJson;
private const string UsernameCacheKey = "uRepo_userNameKey+";
public MemberRepository(
IScopeAccessor scopeAccessor,
@@ -326,7 +327,7 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
}
public IMember? GetByUsername(string? username) =>
_memberByUsernameCachePolicy.GetByUserName("uRepo_userNameKey+", username, PerformGetByUsername, PerformGetAllByUsername);
_memberByUsernameCachePolicy.GetByUserName(UsernameCacheKey, username, PerformGetByUsername, PerformGetAllByUsername);
public int[] GetMemberIds(string[] usernames)
{
@@ -606,6 +607,12 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
return sql;
}
protected override void PersistDeletedItem(IMember entity)
{
_memberByUsernameCachePolicy.DeleteByUserName(UsernameCacheKey, entity.Username);
base.PersistDeletedItem(entity);
}
// TODO: move that one up to Versionable! or better: kill it!
protected override Sql<ISqlContext> GetBaseQuery(bool isCount) =>
GetBaseQuery(isCount ? QueryType.Count : QueryType.Single);
@@ -936,6 +943,8 @@ public class MemberRepository : ContentRepositoryBase<int, IMember, MemberReposi
OnUowRefreshedEntity(new MemberRefreshNotification(entity, new EventMessages()));
_memberByUsernameCachePolicy.DeleteByUserName(UsernameCacheKey, entity.Username);
entity.ResetDirtyProperties();
}