namespace GermanApp.Domain.Entities; /// /// Tracks a user's progress through story segments. /// A user unlocks story segments by completing lessons. /// public class StoryProgress { public int Id { get; private set; } /// /// The user ID who owns this progress. /// public int UserId { get; private set; } /// /// The level ID this progress is for. /// public int LevelId { get; private set; } /// /// The story segment ID that was unlocked. /// public int StorySegmentId { get; private set; } /// /// Whether the user has read/listened to this segment. /// public bool IsCompleted { get; private set; } /// /// When the segment was unlocked. /// public DateTime UnlockedAt { get; private set; } /// /// When the segment was completed (read/listened to). /// public DateTime? CompletedAt { get; private set; } /// /// Timestamp when the progress record was created. /// public DateTime CreatedAt { get; private set; } /// /// Timestamp when the progress record was last updated. /// public DateTime? UpdatedAt { get; private set; } // Navigation properties public virtual User? User { get; private set; } public virtual Level? Level { get; private set; } public virtual StorySegment? StorySegment { get; private set; } /// /// Constructor for EF Core deserialization. /// private StoryProgress() { } /// /// Factory method to create a new story progress record. /// /// The user ID /// The level ID /// The story segment ID /// New StoryProgress instance public static StoryProgress Create(int userId, int levelId, int storySegmentId) { return new StoryProgress { UserId = userId, LevelId = levelId, StorySegmentId = storySegmentId, IsCompleted = false, UnlockedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow }; } /// /// Marks this story segment as completed (read/listened to). /// public void MarkAsCompleted() { if (!IsCompleted) { IsCompleted = true; CompletedAt = DateTime.UtcNow; UpdatedAt = DateTime.UtcNow; } } /// /// Marks this story segment as not completed. /// public void MarkAsIncomplete() { if (IsCompleted) { IsCompleted = false; CompletedAt = null; UpdatedAt = DateTime.UtcNow; } } }