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 IQuizRepository. /// This is part of the Infrastructure layer. /// public class QuizRepository : IQuizRepository { private readonly AppDbContext _context; public QuizRepository(AppDbContext context) { _context = context; } public async Task GetByIdAsync(int id, CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .FirstOrDefaultAsync(q => q.Id == id, cancellationToken); } public async Task> GetAllAsync(CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .AsNoTracking() .ToListAsync(cancellationToken); } public async Task AddAsync(Quiz entity, CancellationToken cancellationToken = default) { await _context.Quizzes.AddAsync(entity, cancellationToken); await _context.SaveChangesAsync(cancellationToken); return entity; } public async Task UpdateAsync(Quiz entity, CancellationToken cancellationToken = default) { _context.Quizzes.Update(entity); await _context.SaveChangesAsync(cancellationToken); } public async Task DeleteAsync(Quiz entity, CancellationToken cancellationToken = default) { _context.Quizzes.Remove(entity); await _context.SaveChangesAsync(cancellationToken); } public async Task ExistsAsync(int id, CancellationToken cancellationToken = default) { return await _context.Quizzes .AnyAsync(q => q.Id == id, cancellationToken); } public async Task> GetByLessonAsync(int lessonId, CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .Where(q => q.LessonId == lessonId) .OrderBy(q => q.Id) .AsNoTracking() .ToListAsync(cancellationToken); } public async Task> GetAllOrderedAsync(CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .OrderBy(q => q.Lesson.Order) .ThenBy(q => q.Id) .AsNoTracking() .ToListAsync(cancellationToken); } public async Task> GetActiveByLessonAsync(int lessonId, CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .Where(q => q.LessonId == lessonId && q.IsActive) .OrderBy(q => q.Id) .AsNoTracking() .ToListAsync(cancellationToken); } public async Task GetWithQuestionsAsync(int id, CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .Include(q => q.Questions.OrderBy(qq => qq.Order)) .ThenInclude(qq => qq.Options.OrderBy(o => o.Order)) .FirstOrDefaultAsync(q => q.Id == id, cancellationToken); } public async Task GetFirstByLessonAsync(int lessonId, CancellationToken cancellationToken = default) { return await _context.Quizzes .Include(q => q.Lesson) .Where(q => q.LessonId == lessonId && q.IsActive) .OrderBy(q => q.Id) .FirstOrDefaultAsync(cancellationToken); } public async Task ExistsByLessonAsync(int lessonId, CancellationToken cancellationToken = default) { return await _context.Quizzes .AnyAsync(q => q.LessonId == lessonId, cancellationToken); } }