using GermanApp.Domain.Entities; namespace GermanApp.Application.DTOs; /// /// Data Transfer Object for QuizQuestion - used for API responses. /// This is a read-only representation of a QuizQuestion entity. /// public record QuizQuestionDto( int Id, int LessonId, string LessonTitle, string QuestionText, QuestionType Type, string? CorrectAnswer, int Difficulty, int Order, bool IsActive, DateTime CreatedAt, DateTime? UpdatedAt, IReadOnlyList Options); /// /// Data Transfer Object for creating a new QuizQuestion. /// public record CreateQuizQuestionDto( int LessonId, string QuestionText, QuestionType Type, string? CorrectAnswer, int Difficulty, int Order, IReadOnlyList? Options); /// /// Data Transfer Object for updating an existing QuizQuestion. /// public record UpdateQuizQuestionDto( int LessonId, string QuestionText, QuestionType Type, string? CorrectAnswer, int Difficulty, int Order, bool IsActive, IReadOnlyList? Options); /// /// Data Transfer Object for QuizOption - used for API responses. /// public record QuizOptionDto( int Id, int QuizQuestionId, string Text, bool IsCorrect, int Order); /// /// Data Transfer Object for creating a new QuizOption. /// public record CreateQuizOptionDto( string Text, bool IsCorrect, int Order); /// /// Data Transfer Object for updating an existing QuizOption. /// public record UpdateQuizOptionDto( int Id, string Text, bool IsCorrect, int Order); /// /// Data Transfer Object for quiz question with user's answer. /// public record QuizQuestionWithAnswerDto( int QuizQuestionId, int LessonId, string QuestionText, QuestionType Type, IReadOnlyList Options, string? UserAnswer, bool IsCorrect); /// /// Data Transfer Object for submitting quiz answers. /// public record SubmitQuizAnswersDto( int LessonId, IReadOnlyList Answers); /// /// Data Transfer Object for a single quiz answer submission. /// public record QuizAnswerDto( int QuizQuestionId, string? AnswerText, int[]? SelectedOptionIds); /// /// Data Transfer Object for quiz result. /// public record QuizResultDto( int LessonId, int TotalQuestions, int CorrectAnswers, double ScorePercentage, bool Passed, TimeSpan TimeTaken, IReadOnlyList QuestionResults); /// /// Data Transfer Object for individual question result. /// public record QuizQuestionResultDto( int QuizQuestionId, string QuestionText, QuestionType Type, bool IsCorrect, string? CorrectAnswer, string? UserAnswer); /// /// Extension methods for mapping between QuizQuestion entity and DTOs. /// public static class QuizQuestionDtoExtensions { public static QuizQuestionDto ToDto(this QuizQuestion quizQuestion) => new( quizQuestion.Id, quizQuestion.LessonId, quizQuestion.Lesson?.Title ?? "Unknown", quizQuestion.QuestionText, quizQuestion.Type, quizQuestion.CorrectAnswer, quizQuestion.Difficulty, quizQuestion.Order, quizQuestion.IsActive, quizQuestion.CreatedAt, quizQuestion.UpdatedAt, quizQuestion.Options?.OrderBy(o => o.Order).Select(o => o.ToDto()).ToList() ?? new List()); public static QuizQuestion ToEntity(this CreateQuizQuestionDto dto) => QuizQuestion.Create( dto.LessonId, dto.QuestionText, dto.Type, dto.CorrectAnswer ?? string.Empty, dto.Difficulty, dto.Order); public static void UpdateFromDto(this QuizQuestion quizQuestion, UpdateQuizQuestionDto dto) { quizQuestion.UpdateLesson(dto.LessonId); quizQuestion.UpdateQuestionText(dto.QuestionText); quizQuestion.UpdateType(dto.Type); quizQuestion.UpdateCorrectAnswer(dto.CorrectAnswer ?? string.Empty); quizQuestion.UpdateDifficulty(dto.Difficulty); quizQuestion.UpdateOrder(dto.Order); if (dto.IsActive != quizQuestion.IsActive) { if (dto.IsActive) quizQuestion.Activate(); else quizQuestion.Deactivate(); } } public static QuizOptionDto ToDto(this QuizOption quizOption) => new( quizOption.Id, quizOption.QuizQuestionId, quizOption.Text, quizOption.IsCorrect, quizOption.Order); public static QuizOption ToEntity(this CreateQuizOptionDto dto, int quizQuestionId) => QuizOption.Create( quizQuestionId, dto.Text, dto.IsCorrect, dto.Order); public static void UpdateFromDto(this QuizOption quizOption, UpdateQuizOptionDto dto) { quizOption.UpdateText(dto.Text); quizOption.UpdateIsCorrect(dto.IsCorrect); quizOption.UpdateOrder(dto.Order); } }