using GermanApp.Domain.Entities;
using GermanApp.Domain.Interfaces;
using GermanApp.Infrastructure.Data.DbContext;
using Microsoft.EntityFrameworkCore;
namespace GermanApp.Infrastructure.Data.Repositories;
///
/// Entity Framework Core implementation of IQuizOptionRepository.
/// This is part of the Infrastructure layer.
///
public class QuizOptionRepository : IQuizOptionRepository
{
private readonly AppDbContext _context;
public QuizOptionRepository(AppDbContext context)
{
_context = context;
}
public async Task GetByIdAsync(int id, CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.Include(o => o.QuizQuestion)
.FirstOrDefaultAsync(o => o.Id == id, cancellationToken);
}
public async Task> GetAllAsync(CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.Include(o => o.QuizQuestion)
.AsNoTracking()
.ToListAsync(cancellationToken);
}
public async Task AddAsync(QuizOption entity, CancellationToken cancellationToken = default)
{
await _context.QuizOptions.AddAsync(entity, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
return entity;
}
public async Task UpdateAsync(QuizOption entity, CancellationToken cancellationToken = default)
{
_context.QuizOptions.Update(entity);
await _context.SaveChangesAsync(cancellationToken);
}
public async Task DeleteAsync(QuizOption entity, CancellationToken cancellationToken = default)
{
_context.QuizOptions.Remove(entity);
await _context.SaveChangesAsync(cancellationToken);
}
public async Task ExistsAsync(int id, CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.AnyAsync(o => o.Id == id, cancellationToken);
}
public async Task> GetByQuestionAsync(int questionId, CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.Include(o => o.QuizQuestion)
.Where(o => o.QuizQuestionId == questionId)
.OrderBy(o => o.Order)
.AsNoTracking()
.ToListAsync(cancellationToken);
}
public async Task GetCorrectOptionAsync(int questionId, CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.Include(o => o.QuizQuestion)
.Where(o => o.QuizQuestionId == questionId && o.IsCorrect)
.OrderBy(o => o.Order)
.FirstOrDefaultAsync(cancellationToken);
}
public async Task> GetCorrectOptionsAsync(int questionId, CancellationToken cancellationToken = default)
{
return await _context.QuizOptions
.Include(o => o.QuizQuestion)
.Where(o => o.QuizQuestionId == questionId && o.IsCorrect)
.OrderBy(o => o.Order)
.AsNoTracking()
.ToListAsync(cancellationToken);
}
public async Task DeleteByQuestionAsync(int questionId, CancellationToken cancellationToken = default)
{
var options = await _context.QuizOptions
.Where(o => o.QuizQuestionId == questionId)
.ToListAsync(cancellationToken);
_context.QuizOptions.RemoveRange(options);
await _context.SaveChangesAsync(cancellationToken);
}
public async Task OrderExistsForQuestionAsync(int questionId, int order, int? excludeId = null, CancellationToken cancellationToken = default)
{
var query = _context.QuizOptions
.Where(o => o.QuizQuestionId == questionId && o.Order == order);
if (excludeId.HasValue)
{
query = query.Where(o => o.Id != excludeId.Value);
}
return await query.AnyAsync(cancellationToken);
}
}