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;
}
}
}