#nullable enable using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.DTOs.Font; using API.Entities; using API.Extensions; using API.Services.Tasks; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; namespace API.Data.Repositories; public interface IEpubFontRepository { void Add(EpubFont font); void Remove(EpubFont font); void Update(EpubFont font); Task> GetFontDtosAsync(); Task GetFontDtoAsync(int fontId); Task GetFontDtoByNameAsync(string name); Task> GetFontsAsync(); Task GetFontAsync(int fontId); Task IsFontInUseAsync(int fontId); } public class EpubFontRepository: IEpubFontRepository { private readonly DataContext _context; private readonly IMapper _mapper; public EpubFontRepository(DataContext context, IMapper mapper) { _context = context; _mapper = mapper; } 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() { return await _context.EpubFont .OrderBy(s => s.Name == FontService.DefaultFont ? -1 : 0) .ThenBy(s => s) .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } public async Task GetFontDtoAsync(int fontId) { return await _context.EpubFont .Where(f => f.Id == fontId) .ProjectTo(_mapper.ConfigurationProvider) .FirstOrDefaultAsync(); } public async Task GetFontDtoByNameAsync(string name) { return await _context.EpubFont .Where(f => f.NormalizedName.Equals(name.ToNormalized())) .ProjectTo(_mapper.ConfigurationProvider) .FirstOrDefaultAsync(); } public async Task> GetFontsAsync() { return await _context.EpubFont .ToListAsync(); } public async Task GetFontAsync(int fontId) { return await _context.EpubFont .Where(f => f.Id == fontId) .FirstOrDefaultAsync(); } public async Task IsFontInUseAsync(int fontId) { return await _context.AppUserReadingProfiles .Join(_context.EpubFont, preference => preference.BookReaderFontFamily, font => font.Name, (preference, font) => new { preference, font }) .AnyAsync(joined => joined.font.Id == fontId); } }