using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using AutoMapper; using AutoMapper.QueryableExtensions; using Kavita.API.Repositories; using Kavita.API.Services; using Kavita.Common.Extensions; using Kavita.Models; using Kavita.Models.DTOs.Font; using Kavita.Models.Entities; using Microsoft.EntityFrameworkCore; namespace Kavita.Database.Repositories; public class EpubFontRepository(DataContext context, IMapper mapper) : IEpubFontRepository { public void Add(EpubFont font) { context.Add(font); } public void Remove(EpubFont font) { context.Remove(font); } public void Update(EpubFont font) { context.Entry(font).State = EntityState.Modified; } public async Task> GetFontDtosAsync(CancellationToken ct = default) { return await context.EpubFont .OrderBy(s => s.Name == Defaults.DefaultFont ? -1 : 0) .ThenBy(s => s) .ProjectTo(mapper.ConfigurationProvider) .ToListAsync(ct); } public async Task GetFontDtoAsync(int fontId, CancellationToken ct = default) { return await context.EpubFont .Where(f => f.Id == fontId) .ProjectTo(mapper.ConfigurationProvider) .FirstOrDefaultAsync(ct); } public async Task GetFontDtoByNameAsync(string name, CancellationToken ct = default) { return await context.EpubFont .Where(f => f.NormalizedName.Equals(name.ToNormalized())) .ProjectTo(mapper.ConfigurationProvider) .FirstOrDefaultAsync(ct); } public async Task> GetFontsAsync(CancellationToken ct = default) { return await context.EpubFont.ToListAsync(ct); } public async Task GetFontAsync(int fontId, CancellationToken ct = default) { return await context.EpubFont .Where(f => f.Id == fontId) .FirstOrDefaultAsync(ct); } public async Task IsFontInUseAsync(int fontId, CancellationToken ct = default) { return await context.AppUserReadingProfiles .Join(context.EpubFont, preference => preference.BookReaderFontFamily, font => font.Name, (preference, font) => new { preference, font }) .AnyAsync(joined => joined.font.Id == fontId, ct); } }