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

68 lines
No EOL
2.3 KiB
C#

using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using PhoenixLib.Caching;
using PhoenixLib.Logging;
using WingsAPI.Data.Families;
namespace FamilyServer.Managers
{
public class FamilyManager
{
private readonly ILongKeyCachedRepository<FamilyDTO> _familyCache;
private readonly IFamilyDAO _familyDao;
private readonly HashSet<long> _instantiatedFamilyIds = new();
public FamilyManager(ILongKeyCachedRepository<FamilyDTO> familyCache, IFamilyDAO familyDao)
{
_familyCache = familyCache;
_familyDao = familyDao;
}
public async Task<FamilyDTO> AddFamilyAsync(FamilyDTO familyDto)
{
FamilyDTO family = await SaveFamilyAsync(familyDto);
_familyCache.Set(familyDto.Id, family);
if (!_instantiatedFamilyIds.Contains(family.Id))
{
_instantiatedFamilyIds.Add(family.Id);
}
return family;
}
public async Task RemoveFamilyByIdAsync(long familyId)
{
await _familyDao.DeleteByIdAsync(familyId);
_familyCache.Remove(familyId);
_instantiatedFamilyIds.Remove(familyId);
}
public async Task<FamilyDTO> GetFamilyByFamilyIdAsync(long familyId)
{
FamilyDTO family = await _familyCache.GetOrSetAsync(familyId, async () => await _familyDao.GetByIdAsync(familyId));
if (family == null)
{
Log.Error($"[FAMILY_MANAGER] {familyId} could not be found from the cache/db", new DataException($"{familyId} could not be found from the cache/db"));
return null;
}
if (!_instantiatedFamilyIds.Contains(family.Id))
{
_instantiatedFamilyIds.Add(family.Id);
}
return family;
}
public async Task<FamilyDTO> GetFamilyByNameAsync(string name) => await _familyDao.GetByNameAsync(name);
public async Task<FamilyDTO> SaveFamilyAsync(FamilyDTO familyDto) => await _familyDao.SaveAsync(familyDto);
public List<FamilyDTO> GetFamiliesInMemory()
{
return _instantiatedFamilyIds.Select(s => _familyCache.Get(s)).ToList();
}
}
}