using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.DTOs; using API.Entities; using API.Extensions; using API.Extensions.QueryExtensions; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; namespace API.Data.Repositories; public interface IPersonRepository { void Attach(Person person); void Remove(Person person); Task> GetAllPeople(); Task> GetAllPersonDtosAsync(int userId); Task RemoveAllPeopleNoLongerAssociated(bool removeExternal = false); Task> GetAllPeopleDtosForLibrariesAsync(List libraryIds, int userId); Task GetCountAsync(); } public class PersonRepository : IPersonRepository { private readonly DataContext _context; private readonly IMapper _mapper; public PersonRepository(DataContext context, IMapper mapper) { _context = context; _mapper = mapper; } public void Attach(Person person) { _context.Person.Attach(person); } public void Remove(Person person) { _context.Person.Remove(person); } public async Task RemoveAllPeopleNoLongerAssociated(bool removeExternal = false) { var peopleWithNoConnections = await _context.Person .Include(p => p.SeriesMetadatas) .Include(p => p.ChapterMetadatas) .Where(p => p.SeriesMetadatas.Count == 0 && p.ChapterMetadatas.Count == 0) .AsSplitQuery() .ToListAsync(); _context.Person.RemoveRange(peopleWithNoConnections); await _context.SaveChangesAsync(); } public async Task> GetAllPeopleDtosForLibrariesAsync(List libraryIds, int userId) { var ageRating = await _context.AppUser.GetUserAgeRestriction(userId); return await _context.Series .Where(s => libraryIds.Contains(s.LibraryId)) .RestrictAgainstAgeRestriction(ageRating) .SelectMany(s => s.Metadata.People) .Distinct() .OrderBy(p => p.Name) .AsNoTracking() .AsSplitQuery() .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } public async Task GetCountAsync() { return await _context.Person.CountAsync(); } public async Task> GetAllPeople() { return await _context.Person .OrderBy(p => p.Name) .ToListAsync(); } public async Task> GetAllPersonDtosAsync(int userId) { var ageRating = await _context.AppUser.GetUserAgeRestriction(userId); return await _context.Person .OrderBy(p => p.Name) .RestrictAgainstAgeRestriction(ageRating) .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } }