From c6a529bcabd22fc0fbb7911ab658f64a26e5f898 Mon Sep 17 00:00:00 2001
From: Dominika Zemanovicova <xzemanov@fi.muni.cz>
Date: Sun, 16 Apr 2023 15:18:21 +0200
Subject: [PATCH] Change QuestionMapper to map to entities inside dto

---
 .../moduleexercise/answer/AnswerMapper.java   | 11 +++++
 .../question/QuestionMapper.java              | 48 +++++++++++++++++--
 2 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/answer/AnswerMapper.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/answer/AnswerMapper.java
index 3dec5ca6..f1cb4626 100644
--- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/answer/AnswerMapper.java
+++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/answer/AnswerMapper.java
@@ -6,6 +6,9 @@ import org.fuseri.model.dto.exercise.AnswerInQuestionCreateDto;
 import org.fuseri.moduleexercise.common.DomainMapper;
 import org.mapstruct.Mapper;
 
+import java.util.List;
+import java.util.Set;
+
 /**
  * Mapper between Answers and their corresponding DTOs
  */
@@ -20,6 +23,14 @@ public interface AnswerMapper extends DomainMapper<Answer, AnswerDto> {
      */
     Answer fromCreateDto(AnswerCreateDto dto);
 
+    /**
+     * Convert List of AnswerInQuestionCreateDto to List of corresponding Answers
+     *
+     * @param dtos to be converted
+     * @return corresponding list of Answers
+     */
+    Set<Answer> fromCreateDtoList(List<AnswerInQuestionCreateDto> dtos);
+
     /**
      * Convert DTO of type AnswerInQuestionCreateDto to Answer
      * @param dto DTO to be converted
diff --git a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionMapper.java b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionMapper.java
index 9c4e62a2..b3cd9707 100644
--- a/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionMapper.java
+++ b/application/module-exercise/src/main/java/org/fuseri/moduleexercise/question/QuestionMapper.java
@@ -1,17 +1,53 @@
 package org.fuseri.moduleexercise.question;
 
+import org.fuseri.model.dto.exercise.AnswerInQuestionCreateDto;
 import org.fuseri.model.dto.exercise.QuestionCreateDto;
 import org.fuseri.model.dto.exercise.QuestionDto;
 import org.fuseri.model.dto.exercise.QuestionUpdateDto;
+import org.fuseri.moduleexercise.answer.Answer;
+import org.fuseri.moduleexercise.answer.AnswerMapper;
 import org.fuseri.moduleexercise.common.DomainMapper;
+import org.fuseri.moduleexercise.exercise.Exercise;
+import org.fuseri.moduleexercise.exercise.ExerciseService;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
+import org.mapstruct.Named;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+import java.util.Set;
 
 /**
  * Mapper between Questions and their corresponding DTOs
  */
-@Mapper
-public interface QuestionMapper extends DomainMapper<Question, QuestionDto> {
+@Mapper(componentModel = "spring", uses = {AnswerMapper.class, ExerciseService.class})
+public abstract class QuestionMapper implements DomainMapper<Question, QuestionDto> {
+
+    @Autowired
+    private ExerciseService exerciseService;
+
+    @Autowired
+    private AnswerMapper answerMapper;
+
+    @Named("mapIdToExercise")
+    public Exercise mapIdToExercise(Long id) {
+        return exerciseService.find(id);
+    }
+
+    @Named("mapDtoAnswersToAnswers")
+    public Set<Answer> mapDtoAnswersToAnswers(List<AnswerInQuestionCreateDto> dtos) {
+        return answerMapper.fromCreateDtoList(dtos);
+    }
+
+    /**
+     * Convert entity to its corresponding DTO
+     *
+     * @param question to be converted
+     * @return corresponding DTO created from question
+     */
+    @Override
+    @Mapping(target = "exerciseId", source = "question.exercise.id")
+    public abstract QuestionDto toDto(Question question);
 
     /**
      * Convert DTO of type QuestionCreateDto to Question
@@ -19,8 +55,10 @@ public interface QuestionMapper extends DomainMapper<Question, QuestionDto> {
      * @param dto DTO to be converted
      * @return corresponding Question entity created from DTO
      */
-    @Mapping(target = "answers", ignore = true)
-    Question fromCreateDto(QuestionCreateDto dto);
+    @Mapping(target = "exercise", source = "dto.exerciseId", qualifiedByName = "mapIdToExercise")
+    @Mapping(target = "answers", source = "dto.answers", qualifiedByName = "mapDtoAnswersToAnswers")
+    public abstract Question fromCreateDto(QuestionCreateDto dto);
 
-    Question fromUpdateDto(QuestionUpdateDto dto);
+    @Mapping(target = "exercise", source = "dto.exerciseId", qualifiedByName = "mapIdToExercise")
+    public abstract Question fromUpdateDto(QuestionUpdateDto dto);
 }
-- 
GitLab