using Microsoft.EntityFrameworkCore; using DramaLing.Api.Data; using DramaLing.Api.Models.Entities; using DramaLing.Api.Contracts.Repositories; namespace DramaLing.Api.Repositories; public class FlashcardRepository : BaseRepository, IFlashcardRepository { public FlashcardRepository(DramaLingDbContext context, ILogger> logger) : base(context, logger) { } public async Task> GetByUserIdAsync(Guid userId, string? search = null, bool favoritesOnly = false) { var query = _context.Flashcards .Where(f => f.UserId == userId && !f.IsArchived) .AsQueryable(); // 搜尋篩選 if (!string.IsNullOrEmpty(search)) { query = query.Where(f => f.Word.Contains(search) || f.Translation.Contains(search) || (f.Definition != null && f.Definition.Contains(search))); } // 收藏篩選 if (favoritesOnly) { query = query.Where(f => f.IsFavorite); } return await query .Include(f => f.FlashcardExampleImages) .ThenInclude(fei => fei.ExampleImage) .OrderByDescending(f => f.CreatedAt) .ToListAsync(); } public async Task GetByUserIdAndFlashcardIdAsync(Guid userId, Guid flashcardId) { return await _context.Flashcards .Include(f => f.FlashcardExampleImages) .ThenInclude(fei => fei.ExampleImage) .FirstOrDefaultAsync(f => f.Id == flashcardId && f.UserId == userId && !f.IsArchived); } public async Task GetCountByUserIdAsync(Guid userId, string? search = null, bool favoritesOnly = false) { var query = _context.Flashcards .Where(f => f.UserId == userId && !f.IsArchived) .AsQueryable(); // 搜尋篩選 if (!string.IsNullOrEmpty(search)) { query = query.Where(f => f.Word.Contains(search) || f.Translation.Contains(search) || (f.Definition != null && f.Definition.Contains(search))); } // 收藏篩選 if (favoritesOnly) { query = query.Where(f => f.IsFavorite); } return await query.CountAsync(); } public async Task> GetPagedByUserIdAsync(Guid userId, int page, int pageSize, string? search = null, bool favoritesOnly = false) { var query = _context.Flashcards .Where(f => f.UserId == userId && !f.IsArchived) .AsQueryable(); // 搜尋篩選 if (!string.IsNullOrEmpty(search)) { query = query.Where(f => f.Word.Contains(search) || f.Translation.Contains(search) || (f.Definition != null && f.Definition.Contains(search))); } // 收藏篩選 if (favoritesOnly) { query = query.Where(f => f.IsFavorite); } return await query .OrderByDescending(f => f.CreatedAt) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); } }