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