using GermanApp.Domain.Entities; namespace GermanApp.Application.DTOs; /// /// Data Transfer Object for Quiz - used for API responses. /// This is a read-only representation of a Quiz entity. /// public record QuizDto( int Id, int LessonId, string LessonTitle, string Title, string? Description, int PassingScore, int TimeLimitMinutes, bool ShuffleQuestions, bool IsActive, int QuestionCount, int TotalPoints, DateTime CreatedAt, DateTime? UpdatedAt); /// /// Data Transfer Object for creating a new Quiz. /// public record CreateQuizDto( int LessonId, string Title, string? Description, int PassingScore, int TimeLimitMinutes, bool ShuffleQuestions); /// /// Data Transfer Object for updating an existing Quiz. /// public record UpdateQuizDto( int LessonId, string Title, string? Description, int PassingScore, int TimeLimitMinutes, bool ShuffleQuestions, bool IsActive); /// /// Data Transfer Object for quiz with its questions. /// public record QuizWithQuestionsDto( int Id, int LessonId, string LessonTitle, string Title, string? Description, int PassingScore, int TimeLimitMinutes, bool ShuffleQuestions, bool IsActive, DateTime CreatedAt, DateTime? UpdatedAt, IReadOnlyList Questions); /// /// Data Transfer Object for quiz list item (summary). /// public record QuizListItemDto( int Id, int LessonId, string LessonTitle, string Title, bool IsActive, int QuestionCount, DateTime CreatedAt); /// /// Data Transfer Object for submitting quiz answers. /// public record SubmitQuizDto( int QuizId, IReadOnlyList Answers); /// /// Extension methods for mapping between Quiz entity and DTOs. /// public static class QuizDtoExtensions { public static QuizDto ToDto(this Quiz quiz) => new( quiz.Id, quiz.LessonId, quiz.Lesson?.Title ?? "Unknown", quiz.Title, quiz.Description, quiz.PassingScore, quiz.TimeLimitMinutes, quiz.ShuffleQuestions, quiz.IsActive, quiz.Questions?.Count ?? 0, quiz.Questions?.Sum(q => q.Points) ?? 0, quiz.CreatedAt, quiz.UpdatedAt); public static QuizListItemDto ToListItemDto(this Quiz quiz) => new( quiz.Id, quiz.LessonId, quiz.Lesson?.Title ?? "Unknown", quiz.Title, quiz.IsActive, quiz.Questions?.Count ?? 0, quiz.CreatedAt); public static QuizWithQuestionsDto ToQuizWithQuestionsDto(this Quiz quiz) => new( quiz.Id, quiz.LessonId, quiz.Lesson?.Title ?? "Unknown", quiz.Title, quiz.Description, quiz.PassingScore, quiz.TimeLimitMinutes, quiz.ShuffleQuestions, quiz.IsActive, quiz.CreatedAt, quiz.UpdatedAt, quiz.Questions?.OrderBy(q => q.Order).Select(q => q.ToDto()).ToList() ?? new List()); public static Quiz ToEntity(this CreateQuizDto dto) => Quiz.Create( dto.LessonId, dto.Title, dto.Description, dto.PassingScore, dto.TimeLimitMinutes); public static void UpdateFromDto(this Quiz quiz, UpdateQuizDto dto) { quiz.UpdateLesson(dto.LessonId); quiz.UpdateTitle(dto.Title); quiz.UpdateDescription(dto.Description); quiz.UpdatePassingScore(dto.PassingScore); quiz.UpdateTimeLimit(dto.TimeLimitMinutes); quiz.UpdateShuffleQuestions(dto.ShuffleQuestions); if (dto.IsActive != quiz.IsActive) { if (dto.IsActive) quiz.Activate(); else quiz.Deactivate(); } } }