dramaling-vocab-learning/backend/DramaLing.Api/Models/Entities/StudyCard.cs

95 lines
2.7 KiB
C#

using System.ComponentModel.DataAnnotations;
namespace DramaLing.Api.Models.Entities;
/// <summary>
/// 學習會話中的詞卡進度追蹤
/// </summary>
public class StudyCard
{
public Guid Id { get; set; }
public Guid StudySessionId { get; set; }
public Guid FlashcardId { get; set; }
[Required]
[MaxLength(100)]
public string Word { get; set; } = string.Empty;
/// <summary>
/// 該詞卡預定的測驗類型列表 (JSON序列化)
/// 例如: ["flip-memory", "vocab-choice", "sentence-fill"]
/// </summary>
[Required]
public string PlannedTestsJson { get; set; } = string.Empty;
/// <summary>
/// 詞卡在會話中的順序
/// </summary>
public int Order { get; set; }
/// <summary>
/// 是否已完成所有測驗
/// </summary>
public bool IsCompleted { get; set; } = false;
/// <summary>
/// 詞卡學習開始時間
/// </summary>
public DateTime StartedAt { get; set; } = DateTime.UtcNow;
/// <summary>
/// 詞卡學習完成時間
/// </summary>
public DateTime? CompletedAt { get; set; }
// Navigation Properties
public virtual StudySession StudySession { get; set; } = null!;
public virtual Flashcard Flashcard { get; set; } = null!;
public virtual ICollection<TestResult> TestResults { get; set; } = new List<TestResult>();
// Helper Properties (不映射到資料庫)
public List<string> PlannedTests
{
get => string.IsNullOrEmpty(PlannedTestsJson)
? new List<string>()
: System.Text.Json.JsonSerializer.Deserialize<List<string>>(PlannedTestsJson) ?? new List<string>();
set => PlannedTestsJson = System.Text.Json.JsonSerializer.Serialize(value);
}
public int CompletedTestsCount => TestResults?.Count ?? 0;
public int PlannedTestsCount => PlannedTests.Count;
public bool AllTestsCompleted => CompletedTestsCount >= PlannedTestsCount;
}
/// <summary>
/// 詞卡內的測驗結果記錄
/// </summary>
public class TestResult
{
public Guid Id { get; set; }
public Guid StudyCardId { get; set; }
[Required]
[MaxLength(50)]
public string TestType { get; set; } = string.Empty; // flip-memory, vocab-choice, etc.
public bool IsCorrect { get; set; }
public string? UserAnswer { get; set; }
/// <summary>
/// 信心等級 (1-5, 主要用於翻卡記憶測驗)
/// </summary>
[Range(1, 5)]
public int? ConfidenceLevel { get; set; }
public int ResponseTimeMs { get; set; }
public DateTime CompletedAt { get; set; } = DateTime.UtcNow;
// Navigation Properties
public virtual StudyCard StudyCard { get; set; } = null!;
}