server-master/srcs/FamilyServer/Managers/FamilyMembershipManager.cs
2026-02-10 18:21:30 +01:00

94 lines
No EOL
4.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using PhoenixLib.Caching;
using PhoenixLib.Logging;
using WingsAPI.Data.Families;
namespace FamilyServer.Managers
{
public class FamilyMembershipManager
{
private readonly ILongKeyCachedRepository<FamilyMembershipDto> _cachedMembers;
private readonly ILongKeyCachedRepository<Dictionary<long, FamilyMembershipDto>> _cachedMembersByFamilyId;
private readonly IFamilyMembershipDao _familyMembershipDao;
public FamilyMembershipManager(IFamilyMembershipDao familyMembershipDao, ILongKeyCachedRepository<FamilyMembershipDto> cachedMembers,
ILongKeyCachedRepository<Dictionary<long, FamilyMembershipDto>> cachedMembersByFamilyId)
{
_familyMembershipDao = familyMembershipDao;
_cachedMembers = cachedMembers;
_cachedMembersByFamilyId = cachedMembersByFamilyId;
}
public async Task<FamilyMembershipDto> GetFamilyMembershipByCharacterIdAsync(long characterId)
{
FamilyMembershipDto cachedMembership = _cachedMembers.Get(characterId);
return cachedMembership ?? await _familyMembershipDao.GetByCharacterIdAsync(characterId);
}
public async Task<List<FamilyMembershipDto>> GetFamilyMembershipsByFamilyIdAsync(long familyId)
{
var list = _cachedMembersByFamilyId.Get(familyId)?.Values.ToList();
if (list != null)
{
return list;
}
list = await _familyMembershipDao.GetByFamilyIdAsync(familyId);
if (list == null || list.Count < 1)
{
return null;
}
var dictionary = new Dictionary<long, FamilyMembershipDto>();
foreach (FamilyMembershipDto membership in list)
{
if (!dictionary.TryAdd(membership.CharacterId, membership))
{
Log.Warn(
$"[FAMILY_MEMBERSHIP_CACHE_MANAGER] Found a duplicated membership for CharacterId: {membership.CharacterId.ToString()} | Duplicated Membership's Id: {membership.Id.ToString()}");
}
_cachedMembers.Set(membership.CharacterId, membership);
}
_cachedMembersByFamilyId.Set(familyId, dictionary);
return list;
}
public async Task<FamilyMembershipDto> AddFamilyMembershipAsync(FamilyMembershipDto membership)
{
FamilyMembershipDto savedMembership = await SaveFamilyMembershipAsync(membership);
_cachedMembers.Set(savedMembership.CharacterId, savedMembership);
_cachedMembersByFamilyId.Get(savedMembership.FamilyId)?.Add(savedMembership.CharacterId, savedMembership);
return savedMembership;
}
public async Task<IEnumerable<FamilyMembershipDto>> AddFamilyMembershipsAsync(IReadOnlyList<FamilyMembershipDto> memberships)
{
IEnumerable<FamilyMembershipDto> savedMemberships = await SaveFamilyMembershipsAsync(memberships);
foreach (FamilyMembershipDto membership in savedMemberships)
{
_cachedMembers.Set(membership.CharacterId, membership);
_cachedMembersByFamilyId.Get(membership.FamilyId)?.Add(membership.CharacterId, membership);
}
return savedMemberships;
}
public async Task<FamilyMembershipDto> SaveFamilyMembershipAsync(FamilyMembershipDto membership) => await _familyMembershipDao.SaveAsync(membership);
public async Task<IEnumerable<FamilyMembershipDto>> SaveFamilyMembershipsAsync(IReadOnlyList<FamilyMembershipDto> memberships) => await _familyMembershipDao.SaveAsync(memberships);
public async Task RemoveFamilyMembershipByCharAndFamIdAsync(FamilyMembershipDto familyMembership)
{
await _familyMembershipDao.DeleteByIdAsync(familyMembership.Id);
_cachedMembers.Remove(familyMembership.CharacterId);
_cachedMembersByFamilyId.Get(familyMembership.FamilyId)?.Remove(familyMembership.CharacterId);
}
}
}