dramaling-vocab-learning/backend/DramaLing.Api/Repositories
鄭沛軒 ce0455df3d feat: 實現詞彙完全掌握時自動更新複習時間功能
## 後端改進
- 新增 POST /flashcards/{id}/mastered 簡化API端點
- 實作 MarkWordMasteredAsync 方法,專門處理詞彙掌握
- 修復 GetOrCreateReviewAsync 立即保存新記錄問題
- 使用 2^成功次數 演算法計算下次複習間隔

## 前端整合
- 更新 useReviewSession 支援詞彙級別完成檢測
- 新增 checkWordCompleteAndCorrect 檢查所有測驗項目
- 實作 submitWordCompletion 自動提交詞彙掌握
- 新增 markWordMastered API 方法呼叫簡化端點
- 改用真實後端資料替代靜態測試資料

## 核心功能
- 詞彙所有測驗(flip-card + vocab-choice)完成且全對時自動觸發
- 背景呼叫 /mastered API 更新複習演算法
- Console 顯示詳細掌握訊息和新複習時間
- 容錯設計:API失敗不影響複習流程繼續

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 00:29:53 +08:00
..
BaseRepository.cs feat: 實施全面的程式碼架構優化 2025-09-23 19:00:17 +08:00
FlashcardRepository.cs feat: 修復圖片生成服務 + 統一播放按鈕設計 + API 完善 2025-10-02 03:58:03 +08:00
FlashcardReviewRepository.cs feat: 實現詞彙完全掌握時自動更新複習時間功能 2025-10-07 00:29:53 +08:00
IFlashcardRepository.cs feat: 完成後端架構全面優化 - 階段一二 2025-09-30 03:32:51 +08:00
IFlashcardReviewRepository.cs feat: 實現 /api/flashcards/due API 完整功能 2025-10-06 20:49:40 +08:00
IRepository.cs feat: 實施全面的程式碼架構優化 2025-09-23 19:00:17 +08:00
IUserRepository.cs feat: 實施全面的程式碼架構優化 2025-09-23 19:00:17 +08:00
README.md feat: 完成後端架構全面優化 - 階段一二 2025-09-30 03:32:51 +08:00
UserRepository.cs feat: 啟用智能快取系統,實現 57,200 倍性能提升 2025-09-23 19:50:53 +08:00

README.md

Repository 層架構說明

概述

Repository 層負責數據訪問邏輯,提供統一的數據操作介面,遵循 Repository Pattern 和 Unit of Work 模式。

架構結構

Repositories/
├── README.md                 # 本文檔
├── IRepository.cs           # 通用 Repository 介面
├── BaseRepository.cs        # Repository 基礎實作
├── IUserRepository.cs       # 用戶 Repository 介面
└── UserRepository.cs        # 用戶 Repository 實作

核心介面

IRepository - 通用 Repository 介面

提供基礎 CRUD 操作:

  • GetByIdAsync(int id) - 根據 ID 獲取實體
  • GetAllAsync() - 獲取所有實體
  • AddAsync(T entity) - 新增實體
  • UpdateAsync(T entity) - 更新實體
  • DeleteAsync(int id) - 刪除實體

BaseRepository - Repository 基礎實作

實作通用 Repository 介面,提供:

  • Entity Framework Core 集成
  • 統一錯誤處理
  • 異步操作支持
  • 基礎查詢優化

具體 Repository

IUserRepository / UserRepository

專門處理用戶相關數據操作:

  • 繼承自 IRepository<User>
  • 提供用戶特定的查詢方法
  • 處理用戶認證相關邏輯

使用方式

依賴注入配置

ServiceCollectionExtensions.cs 中註冊:

services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
services.AddScoped<IUserRepository, UserRepository>();

在 Service 中使用

public class SomeService
{
    private readonly IUserRepository _userRepository;

    public SomeService(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public async Task<User> GetUserAsync(int id)
    {
        return await _userRepository.GetByIdAsync(id);
    }
}

設計原則

  1. 單一職責:每個 Repository 只負責一個 Entity 的數據訪問
  2. 介面隔離:提供清晰的介面定義,方便測試和替換實作
  3. 依賴反轉Service 層依賴於 Repository 介面,而非具體實作
  4. 異步優先:所有數據操作都使用異步方法

擴展指南

新增 Repository

  1. 建立介面檔案:I{Entity}Repository.cs
  2. 建立實作檔案:{Entity}Repository.cs
  3. 在 ServiceCollectionExtensions 中註冊
  4. 更新本文檔

實作範例

// IFlashcardRepository.cs
public interface IFlashcardRepository : IRepository<Flashcard>
{
    Task<IEnumerable<Flashcard>> GetByUserIdAsync(int userId);
}

// FlashcardRepository.cs
public class FlashcardRepository : BaseRepository<Flashcard>, IFlashcardRepository
{
    public FlashcardRepository(DramaLingDbContext context) : base(context) { }

    public async Task<IEnumerable<Flashcard>> GetByUserIdAsync(int userId)
    {
        return await _context.Flashcards
            .Where(f => f.UserId == userId)
            .ToListAsync();
    }
}

版本: 1.0 最後更新: 2025-09-30 維護者: DramaLing 開發團隊