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); } }