using Microsoft.EntityFrameworkCore;
using NexusReader.Application.Abstractions.Persistence;
using NexusReader.Data.Persistence;
using NexusReader.Domain.Entities;
namespace NexusReader.Infrastructure.Persistence;
///
/// EF Core implementation of .
/// Uses a scoped created via the factory for long-running operations.
///
internal sealed class EbookRepository : IEbookRepository
{
private readonly AppDbContext _context;
public EbookRepository(AppDbContext context)
{
_context = context;
}
///
public async Task FindAuthorByNameAsync(string name, CancellationToken cancellationToken = default)
{
// Use PostgreSQL ILike for case-insensitive searching if on Npgsql provider,
// otherwise fallback to string comparison.
if (_context.Database.IsNpgsql())
{
return await _context.Authors
.FirstOrDefaultAsync(a => EF.Functions.ILike(a.Name, name), cancellationToken);
}
return await _context.Authors
.FirstOrDefaultAsync(
a => a.Name.ToLower() == name.ToLower(),
cancellationToken);
}
///
public void AddAuthor(Author author) => _context.Authors.Add(author);
///
public void AddEbook(Ebook ebook)
{
// Explicitly set the readiness flag to false upon addition
ebook.IsReadyForReading = false;
_context.Ebooks.Add(ebook);
}
///
public Task SaveChangesAsync(CancellationToken cancellationToken = default)
=> _context.SaveChangesAsync(cancellationToken);
}