diff --git a/docs/v0.1.2/relatorio_02.md b/docs/v0.1.2/relatorio_02.md index eea2ddb..748eebe 100644 --- a/docs/v0.1.2/relatorio_02.md +++ b/docs/v0.1.2/relatorio_02.md @@ -1,7 +1,7 @@ # Mirante: Relatório para v0.1.2 ## Tarefas -- Resolução de uma regressão de recursão infinita ao tentar implementar a lógica de autenticação +- [x] Resolução de uma regressão de recursão infinita ao tentar implementar a lógica de autenticação ## Desenvolvimento @@ -13,3 +13,28 @@ Embora esta questão tenha sido resolvida com o uso do padrão de `DTOs`, foi in A primeira solução encontrada relaciona-se ao uso das anotações e `@JsonManagedReference` e `@JsonBackReference`, fornecidas no pacote `com.fasterxml.jackson.annotation.JsonBackReference`, que instruem o serializador de JSON saber em qual ponta da relação ele deve colocar a listagem completa, e em qual ponta apenas o _id_. +Como próximo passo, prossegui à listagem das opções de um exercício ao solicitá-lo pelo _id_, por exemplo, `/exercise/ex002`. + +O endpoint `/exercise` passou a construir manualmente os DTOs aninhados, através da seguinte lógica: + +```java + exercises.forEach(e -> { + ExerciseDTO dto = new ExerciseDTO(); + dto.id = e.getId(); + dto.instruction = e.getInstruction(); + dto.set = e.getSetId(); + dto.options = new HashSet(); + e.getOptions().forEach(o -> { + OptionDTO optionDTO = new OptionDTO(); + optionDTO.id = o.getId(); + optionDTO.content = o.getContent(); + optionDTO.place = o.getPlace(); + optionDTO.correct = o.getCorrect(); + optionDTO.exercise = o.getExerciseId(); + dto.options.add(optionDTO); + }); + exerciseDTOs.add(dto); + }); +``` + +Este código pode ainda ser melhorado com o uso da biblioteca `modelMapper`, que reduziria muito o código. De toda forma, ele agora atende à necessidade atual. diff --git a/src/main/java/mirante/api/exercise/ExerciseController.java b/src/main/java/mirante/api/exercise/ExerciseController.java index 1579926..86ccc67 100644 --- a/src/main/java/mirante/api/exercise/ExerciseController.java +++ b/src/main/java/mirante/api/exercise/ExerciseController.java @@ -1,8 +1,11 @@ package mirante.api.exercise; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import mirante.api.exercise.option.OptionDTO; import org.springframework.web.bind.annotation.*; import org.springframework.http.HttpStatus; import org.springframework.web.server.ResponseStatusException; @@ -26,6 +29,16 @@ List getExercises() { dto.id = e.getId(); dto.instruction = e.getInstruction(); dto.set = e.getSetId(); + dto.options = new HashSet(); + e.getOptions().forEach(o -> { + OptionDTO optionDTO = new OptionDTO(); + optionDTO.id = o.getId(); + optionDTO.content = o.getContent(); + optionDTO.place = o.getPlace(); + optionDTO.correct = o.getCorrect(); + optionDTO.exercise = o.getExerciseId(); + dto.options.add(optionDTO); + }); exerciseDTOs.add(dto); }); diff --git a/src/main/java/mirante/api/exercise/ExerciseDTO.java b/src/main/java/mirante/api/exercise/ExerciseDTO.java index adbfcbf..7e9cb90 100644 --- a/src/main/java/mirante/api/exercise/ExerciseDTO.java +++ b/src/main/java/mirante/api/exercise/ExerciseDTO.java @@ -1,7 +1,12 @@ package mirante.api.exercise; +import mirante.api.exercise.option.OptionDTO; + +import java.util.Set; + public class ExerciseDTO { public String id; public String instruction; public String set; + public Set options; } diff --git a/src/test/hurl/v0.1.2/A1-option-single.hurl b/src/test/hurl/v0.1.2/A1-option-single.hurl index 3ecfdf6..285ee52 100644 --- a/src/test/hurl/v0.1.2/A1-option-single.hurl +++ b/src/test/hurl/v0.1.2/A1-option-single.hurl @@ -2,7 +2,7 @@ POST http://localhost:8888/option { "id": "option-demo-pdp-0001A", "content": "Polimorfismo", - "correct": true, + "t": true, "place": 1, "exercise_id": "demo-pdp-0001" }