Skip to content

Commit

Permalink
Fix infinite recursion regression
Browse files Browse the repository at this point in the history
  • Loading branch information
jultty committed Mar 9, 2024
1 parent 089c1aa commit b0498a0
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 2 deletions.
27 changes: 26 additions & 1 deletion docs/v0.1.2/relatorio_02.md
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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<OptionDTO>();
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.
13 changes: 13 additions & 0 deletions src/main/java/mirante/api/exercise/ExerciseController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -26,6 +29,16 @@ List<ExerciseDTO> getExercises() {
dto.id = e.getId();
dto.instruction = e.getInstruction();
dto.set = e.getSetId();
dto.options = new HashSet<OptionDTO>();
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);
});

Expand Down
5 changes: 5 additions & 0 deletions src/main/java/mirante/api/exercise/ExerciseDTO.java
Original file line number Diff line number Diff line change
@@ -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<OptionDTO> options;
}
2 changes: 1 addition & 1 deletion src/test/hurl/v0.1.2/A1-option-single.hurl
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
Expand Down

0 comments on commit b0498a0

Please sign in to comment.