using GermanApp.Domain.Entities; namespace GermanApp.Application.DTOs; /// /// Data Transfer Object for UserProgress - used for API responses. /// This is a read-only representation of a UserProgress entity. /// public record UserProgressDto( int Id, int UserId, int LessonId, bool IsCompleted, int QuizScore, DateTime LastAttemptDate, string? LessonTitle = null, string? LevelName = null, string? LevelCode = null); /// /// Data Transfer Object for creating/updating user progress. /// public record UpdateUserProgressDto( int LessonId, bool IsCompleted, int QuizScore); /// /// Data Transfer Object for level completion summary. /// public record LevelCompletionDto( int LevelId, string LevelName, string LevelCode, int TotalLessons, int CompletedLessons, double CompletionPercentage); /// /// Extension methods for mapping between UserProgress entity and DTOs. /// public static class UserProgressDtoExtensions { public static UserProgressDto ToDto(this UserProgress userProgress) => new( userProgress.Id, userProgress.UserId, userProgress.LessonId, userProgress.IsCompleted, userProgress.QuizScore, userProgress.LastAttemptDate, userProgress.Lesson?.Title, userProgress.Lesson?.Level?.Name, userProgress.Lesson?.Level?.Code); public static UserProgress ToEntity(this UpdateUserProgressDto dto, int userId) { var progress = UserProgress.Create(userId, dto.LessonId); if (dto.IsCompleted) { progress.MarkAsCompleted(dto.QuizScore); } else { progress.UpdateQuizScore(dto.QuizScore); } return progress; } public static void UpdateFromDto(this UserProgress userProgress, UpdateUserProgressDto dto) { if (dto.IsCompleted) { userProgress.MarkAsCompleted(dto.QuizScore); } else { userProgress.UpdateQuizScore(dto.QuizScore); } } }