From 9c3178d104eb9d01f2e005fad595bf1193e54f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=84=AD=E6=B2=9B=E8=BB=92?= Date: Wed, 24 Sep 2025 01:29:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=BE=A9=E7=B7=A8=E8=AD=AF?= =?UTF-8?q?=E9=8C=AF=E8=AA=A4=EF=BC=8C=E7=A7=BB=E9=99=A4=E8=88=8A=E7=89=88?= =?UTF-8?q?Repository=E4=BE=9D=E8=B3=B4=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../Extensions/ServiceCollectionExtensions.cs | 1 - .../Repositories/SimpleFlashcardRepository.cs | 153 ------------------ 2 files changed, 154 deletions(-) delete mode 100644 backend/DramaLing.Api/Repositories/SimpleFlashcardRepository.cs diff --git a/backend/DramaLing.Api/Extensions/ServiceCollectionExtensions.cs b/backend/DramaLing.Api/Extensions/ServiceCollectionExtensions.cs index 081861a..6877e79 100644 --- a/backend/DramaLing.Api/Extensions/ServiceCollectionExtensions.cs +++ b/backend/DramaLing.Api/Extensions/ServiceCollectionExtensions.cs @@ -48,7 +48,6 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddRepositoryServices(this IServiceCollection services) { services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>)); - services.AddScoped(); services.AddScoped(); return services; diff --git a/backend/DramaLing.Api/Repositories/SimpleFlashcardRepository.cs b/backend/DramaLing.Api/Repositories/SimpleFlashcardRepository.cs deleted file mode 100644 index 5f1da67..0000000 --- a/backend/DramaLing.Api/Repositories/SimpleFlashcardRepository.cs +++ /dev/null @@ -1,153 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using DramaLing.Api.Data; -using DramaLing.Api.Models.Entities; - -namespace DramaLing.Api.Repositories; - -/// -/// 簡化的 Flashcard Repository 實作 -/// -public class SimpleFlashcardRepository : BaseRepository, IFlashcardRepository -{ - public SimpleFlashcardRepository(DramaLingDbContext context, ILogger logger) - : base(context, logger) - { - } - - public async Task> GetFlashcardsByUserIdAsync(Guid userId) - { - return await _dbSet.AsNoTracking().Where(f => f.UserId == userId).ToListAsync(); - } - - public async Task> GetFlashcardsByCardSetIdAsync(Guid cardSetId) - { - return await _dbSet.AsNoTracking().Where(f => f.CardSetId == cardSetId).ToListAsync(); - } - - public async Task> GetDueFlashcardsAsync(Guid userId, DateTime dueDate) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId && f.NextReviewDate <= dueDate) - .ToListAsync(); - } - - public async Task> GetFlashcardsByDifficultyAsync(Guid userId, string difficultyLevel) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId && f.DifficultyLevel == difficultyLevel) - .ToListAsync(); - } - - public async Task> GetRecentlyAddedAsync(Guid userId, int count) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId) - .OrderByDescending(f => f.CreatedAt) - .Take(count) - .ToListAsync(); - } - - public async Task> GetMostReviewedAsync(Guid userId, int count) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId) - .OrderByDescending(f => f.TimesReviewed) - .Take(count) - .ToListAsync(); - } - - public async Task GetTotalFlashcardsCountAsync(Guid userId) - { - return await _dbSet.CountAsync(f => f.UserId == userId && !f.IsArchived); - } - - public async Task GetMasteredFlashcardsCountAsync(Guid userId) - { - return await _dbSet.CountAsync(f => f.UserId == userId && f.MasteryLevel >= 5); - } - - public async Task> GetFlashcardsByDifficultyStatsAsync(Guid userId) - { - var stats = await _dbSet - .Where(f => f.UserId == userId && !f.IsArchived) - .GroupBy(f => f.DifficultyLevel) - .Select(g => new { Level = g.Key, Count = g.Count() }) - .ToDictionaryAsync(x => x.Level ?? "Unknown", x => x.Count); - - return stats; - } - - public async Task> SearchFlashcardsAsync(Guid userId, string searchTerm) - { - var term = searchTerm.ToLower(); - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId && - (f.Word.ToLower().Contains(term) || f.Translation.ToLower().Contains(term))) - .ToListAsync(); - } - - public async Task> GetFavoriteFlashcardsAsync(Guid userId) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId && f.IsFavorite) - .ToListAsync(); - } - - public async Task> GetArchivedFlashcardsAsync(Guid userId) - { - return await _dbSet.AsNoTracking() - .Where(f => f.UserId == userId && f.IsArchived) - .ToListAsync(); - } - - public async Task BulkUpdateMasteryLevelAsync(IEnumerable flashcardIds, int newMasteryLevel) - { - try - { - var ids = flashcardIds.ToList(); - var flashcards = await _dbSet.Where(f => ids.Contains(f.Id)).ToListAsync(); - foreach (var flashcard in flashcards) - { - flashcard.MasteryLevel = newMasteryLevel; - flashcard.UpdatedAt = DateTime.UtcNow; - } - return true; - } - catch - { - return false; - } - } - - public async Task BulkUpdateNextReviewDateAsync(IEnumerable flashcardIds, DateTime newDate) - { - try - { - var ids = flashcardIds.ToList(); - var flashcards = await _dbSet.Where(f => ids.Contains(f.Id)).ToListAsync(); - foreach (var flashcard in flashcards) - { - flashcard.NextReviewDate = newDate; - flashcard.UpdatedAt = DateTime.UtcNow; - } - return true; - } - catch - { - return false; - } - } - - public async Task> GetFlashcardsWithIncludesAsync(Guid userId, - bool includeTags = false, bool includeStudyRecords = false) - { - var query = _dbSet.AsNoTracking().Where(f => f.UserId == userId); - - if (includeTags) - { - query = query.Include(f => f.FlashcardTags!); - } - - return await query.ToListAsync(); - } -} \ No newline at end of file