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 _cachedMembers; private readonly ILongKeyCachedRepository> _cachedMembersByFamilyId; private readonly IFamilyMembershipDao _familyMembershipDao; public FamilyMembershipManager(IFamilyMembershipDao familyMembershipDao, ILongKeyCachedRepository cachedMembers, ILongKeyCachedRepository> cachedMembersByFamilyId) { _familyMembershipDao = familyMembershipDao; _cachedMembers = cachedMembers; _cachedMembersByFamilyId = cachedMembersByFamilyId; } public async Task GetFamilyMembershipByCharacterIdAsync(long characterId) { FamilyMembershipDto cachedMembership = _cachedMembers.Get(characterId); return cachedMembership ?? await _familyMembershipDao.GetByCharacterIdAsync(characterId); } public async Task> 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(); 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 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> AddFamilyMembershipsAsync(IReadOnlyList memberships) { IEnumerable 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 SaveFamilyMembershipAsync(FamilyMembershipDto membership) => await _familyMembershipDao.SaveAsync(membership); public async Task> SaveFamilyMembershipsAsync(IReadOnlyList 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); } } }