using System; using System.Linq; using AutoMapper; using Kavita.Models.DTOs; using Kavita.Models.Entities; namespace Kavita.Models.AutoMapper; /// /// This is a way to attach progress at the DB level via a JOIN. Critical for healthy response time. /// public class AutoMapperSeriesProfile : Profile { public AutoMapperSeriesProfile() { int userId = 0; // Placeholder, will be replaced at runtime CreateMap() .ForMember(dest => dest.LibraryName, opt => opt.MapFrom(src => src.Library.Name)) .ForMember(dest => dest.PagesRead, opt => opt.MapFrom(src => src.Progress .Where(p => p.AppUserId == userId) .Sum(p => (int?)p.PagesRead) ?? 0)) .ForMember(dest => dest.LatestReadDate, opt => opt.MapFrom(src => src.Progress .Where(p => p.AppUserId == userId) .Max(p => (DateTime?)p.LastModified) ?? DateTime.MinValue)) .ForMember(dest => dest.TotalReads, opt => opt.MapFrom(src => src.Progress .Where(p => p.AppUserId == userId) .Min(p => (int?)p.TotalReads) ?? 0)) .ForMember(dest => dest.UserRating, opt => opt.MapFrom(src => src.Ratings .Where(r => r.AppUserId == userId) .Select(r => (float?)r.Rating) .FirstOrDefault() ?? 0f)) .ForMember(dest => dest.HasUserRated, opt => opt.MapFrom(src => src.Ratings .Any(r => r.AppUserId == userId && r.HasBeenRated))); } }