From a5c6c746a41be3747dfdacf1c7df680b27998819 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vitor?= Date: Mon, 9 Sep 2024 01:47:33 -0300 Subject: [PATCH 1/3] refactor: redesign homepage --- .../controller/CursoController.java | 266 ++++------------ .../java/springboot/enums/CourseType.java | 6 + .../java/springboot/service/CursoService.java | 297 ++++++++++++++++++ 3 files changed, 364 insertions(+), 205 deletions(-) create mode 100644 backend/src/main/java/springboot/enums/CourseType.java create mode 100644 backend/src/main/java/springboot/service/CursoService.java diff --git a/backend/src/main/java/springboot/controller/CursoController.java b/backend/src/main/java/springboot/controller/CursoController.java index 8261ece6..d3c5ee06 100644 --- a/backend/src/main/java/springboot/controller/CursoController.java +++ b/backend/src/main/java/springboot/controller/CursoController.java @@ -1,6 +1,5 @@ package springboot.controller; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -15,21 +14,20 @@ import org.springframework.http.MediaType; import springboot.dto.output.CursoOutput; import springboot.dto.output.ModuloCursoOutput; -import springboot.dto.output.QuestaoOutput; +import springboot.enums.CourseType; import springboot.enums.EstadoQuestao; import springboot.exception.data.RegisterNotFoundException; import springboot.model.*; import springboot.model.ModuloCurso.EstadoModulo; import springboot.repository.CompetenciaRepository; import springboot.service.AvaliacaoService; +import springboot.service.CursoService; import springboot.service.QuestaoService; import springboot.service.UsuarioService; -import java.io.IOException; import java.util.ArrayList; import java.util.List; - @Controller @RestController @RequestMapping(value = "/api") @@ -49,7 +47,6 @@ public class CursoController { "COMP_SIMULAÇÃO" }; - @Autowired private CompetenciaRepository competenciaRepository; @@ -65,134 +62,60 @@ public class CursoController { @Autowired private AvaliacaoService avaliacaoService; + private CursoService cursoService; + @ApiOperation("Permite pegar a tela atual do usuário no curso de avaliação.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoAvaliacao/", method = RequestMethod.GET) - public ResponseEntity getCursoAvaliacoes(@RequestAttribute(name="usuario") Usuario usuario) { - return auxCursoAvaliacoes(usuario, null); - } - - - public ResponseEntity auxCursoAvaliacoes(@RequestAttribute(name="usuario") Usuario usuario, String mensagem) { - if (usuario.getCursoAvaliacao() == null || usuario.getCursoAvaliacao().size() == 0) { - return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - } - - List ret = new ArrayList<>(); - - boolean ativo = false; - for (int i = 0; i < usuario.getCursoAvaliacao().size()-1; i++) { - ModuloCurso modulo = usuario.getCursoAvaliacao().get(i); - Curso c = competenciaRepository.findById(modulo.getNome()).get().getCursoAvaliacao(); - ModuloCursoOutput moduloOutput = new ModuloCursoOutput(); - moduloOutput.setNome(modulo.getNome()); - moduloOutput.setDescricao(c.getDescricao()); - moduloOutput.setEstado(modulo.getEstado()); - moduloOutput.setVideo(c.getVideo()); - if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { - modulo.setNumeroExemplo((modulo.getNumeroExemplo()+1) % c.getExemplos().size()); - int index = modulo.getNumeroExemplo(); - moduloOutput.getExemplos().add(c.getExemplos().get(index)); - moduloOutput.getTextoExemplos().add(c.getTextoExemplos().get(index)); - } - if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { - int index = modulo.getNumeroExemplo(); - moduloOutput.getExemplos().add(c.getExemplos().get(index)); - moduloOutput.getTextoExemplos().add(c.getTextoExemplos().get(index)); - modulo.setQuestoes(new ArrayList<>()); - // Get 2 samples of questions (one with an one without competencia) unordered - List samples = questaoService.getSamples(modulo.getNome()); - - for(Questao q : samples) { - modulo.getQuestoes().add(q.getId()); - moduloOutput.getQuestoes().add(q.getEnunciado()); - } - } - if (modulo.getEstado().equals(EstadoModulo.FINALIZADO)) { - moduloOutput.setExemplos(c.getExemplos()); - moduloOutput.setTextoExemplos(c.getTextoExemplos()); - } - if (ativo) { - moduloOutput.setEstado(EstadoModulo.INATIVO); - } - if (moduloOutput.getEstado() != EstadoModulo.FINALIZADO) { - ativo = true; - } - usuario.getCursoAvaliacao().set(i, modulo); - ret.add(moduloOutput); - } - - ModuloCurso modAvaliacao = usuario.getCursoAvaliacao().get(10); - ModuloCursoOutput outputAvaliacao = new ModuloCursoOutput(); - outputAvaliacao.setNome(modAvaliacao.getNome()); - outputAvaliacao.setEstado(modAvaliacao.getEstado()); - - if (modAvaliacao.getEstado().equals(EstadoModulo.PRATICA)) { - modAvaliacao.setQuestoes(new ArrayList<>()); - for(String comp : COMP_NAMES) { - // Get 2 samples of questions (one with an one without competencia) unordered - Questao sample = questaoService.getSample(comp); - modAvaliacao.getQuestoes().add(sample.getId()); - outputAvaliacao.getQuestoes().add(sample.getEnunciado()); - } - } - - if (ativo) { - outputAvaliacao.setEstado(EstadoModulo.INATIVO); - } - - usuario.getCursoAvaliacao().set(10, modAvaliacao); - ret.add(outputAvaliacao); - - usuario = usuarioService.update(usuario, usuario.getEmail()); - - return new ResponseEntity(new CursoOutput(mensagem, ret, null), HttpStatus.OK); + public ResponseEntity getCursoAvaliacoes(@RequestAttribute(name = "usuario") Usuario usuario) { + return cursoService.auxCursoAvaliacoes(usuario, null); } + /** + * Cria e retorna novos cursos para o usuário logado, incluindo módulos de + * avaliação e criação. + * + * Este método verifica se o usuário possui cursos de avaliação e criação + * configurados. Se não tiver, ele inicializa essas listas com módulos padrão e + * os atualiza no banco de dados. Em seguida, retorna uma resposta contendo a + * lista atualizada de módulos de avaliação e criação. + * + * @param user O usuário para o qual os novos cursos serão criados. É + * esperado que o usuário esteja autenticado e que o atributo + * "usuario" esteja presente na requisição. + * @return Um `ResponseEntity` contendo um `CursoOutput` com as listas de módulo + * de avaliação e criação atualizadas, e um status HTTP de sucesso (OK). + */ @ApiOperation("Cria novos cursos para o usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursos/", method = RequestMethod.GET) - public ResponseEntity novosCursos(@RequestAttribute(name="usuario") Usuario usuario) { + public ResponseEntity novosCursos(@RequestAttribute(name = "usuario") Usuario user) { + try { + if (cursoService.isCourseListEmpty(user.getCursoAvaliacao())) + cursoService.initializeCourses(user, CourseType.AVALIACAO); - if (usuario.getCursoAvaliacao() == null || usuario.getCursoAvaliacao().size() == 0) { - usuario.setCursoAvaliacao(new ArrayList<>()); + if (cursoService.isCourseListEmpty(user.getCursoCriacao())) + cursoService.initializeCourses(user, CourseType.CRIACAO); - usuario.getCursoAvaliacao().add(new ModuloCurso("COMP_INTRODUÇÃO")); + List cursoAvaliacao = cursoService.processModules(user.getCursoAvaliacao(), CourseType.AVALIACAO); + List cursoCriacao = cursoService.processModules(user.getCursoCriacao(), CourseType.CRIACAO); - for(String comp : COMP_NAMES) { - usuario.getCursoAvaliacao().add(new ModuloCurso(comp)); - } - usuario.getCursoAvaliacao().add(new ModuloCurso("COMP_AVALIAÇÃO FINAL")); - usuario.getCursoAvaliacao().get(10).setEstado(EstadoModulo.PRATICA); + user = usuarioService.update(user, user.getEmail()); - usuario = usuarioService.update(usuario, usuario.getEmail()); - } + CursoOutput moduleStats = new CursoOutput(null, cursoAvaliacao, cursoCriacao); - if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { - usuario.setCursoCriacao(new ArrayList<>()); - - usuario.getCursoCriacao().add(new ModuloCurso("COMP_INTRODUÇÃO")); - - for(String comp : COMP_NAMES) { - usuario.getCursoCriacao().add(new ModuloCurso(comp)); - } - //TODO mudar visualização da avaliação final - ModuloCurso finalModule = new ModuloCurso("COMP_AVALIAÇÃO FINAL"); - usuario.getCursoCriacao().add(finalModule); - usuario.getCursoCriacao().get(10).setEstado(EstadoModulo.PRATICA); - usuario = usuarioService.update(usuario, usuario.getEmail()); + return new ResponseEntity<>(moduleStats, HttpStatus.OK); + } catch (Exception e) { + // TODO: tratar melhor futuramente + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } - - List avaliacaoOutput = auxCursoAvaliacoes(usuario, null).getBody().getCursoAvaliacao(); - List criacaoOutput = auxCursoCriacao(usuario, null).getBody().getCursoCriacao(); - - return new ResponseEntity(new CursoOutput(null, avaliacaoOutput, criacaoOutput), HttpStatus.OK); } @ApiOperation("Avança no curso de avaliação para o usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoAvaliacao/", method = RequestMethod.POST) - public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name="usuario") Usuario usuario, @RequestBody List respostas) { + public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name = "usuario") Usuario usuario, + @RequestBody List respostas) { if (usuario.getCursoAvaliacao() == null || usuario.getCursoAvaliacao().size() == 0) { return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); @@ -216,17 +139,18 @@ public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name } } else if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { modulo.setEstado(EstadoModulo.PRATICA); - }else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { + } else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { int total = 0; int erros = 0; - if (i == usuario.getCursoAvaliacao().size()-1) { + if (i == usuario.getCursoAvaliacao().size() - 1) { total = 9; if (respostas == null || respostas.size() != 9) { erros += 9; } else { int j = 0; for (String comp : COMP_NAMES) { - if (!respostas.get(j).equals(questaoService.evaluateQuestao(comp,modulo.getQuestoes().get(j)))) + if (!respostas.get(j) + .equals(questaoService.evaluateQuestao(comp, modulo.getQuestoes().get(j)))) erros++; j++; } @@ -238,11 +162,11 @@ public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name erros++; } } - //Verifica se errou no máximo 30% - if (100*erros <= total*30) { + // Verifica se errou no máximo 30% + if (100 * erros <= total * 30) { modulo.setEstado(EstadoModulo.FINALIZADO); modulo.zeraErros(); - } else if (i == usuario.getCursoAvaliacao().size()-1) { + } else if (i == usuario.getCursoAvaliacao().size() - 1) { mensagem = "Você obteve menos de 70% de acerto, tente novamente ou volte e estude mais um pouco sobre as competências!"; } else { modulo.addErro(); @@ -254,7 +178,7 @@ public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name sendToBack = true; modulo.zeraErros(); modulo.setEstado(EstadoModulo.DESCRICAO); - //processa devido ao numero de erros + // processa devido ao numero de erros } else { mensagem = "Você não conseguiu identificar a presença ou ausência da competência nas questões apresentadas, tente novamente!"; } @@ -273,92 +197,21 @@ public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name } } - return auxCursoAvaliacoes(usuario, mensagem); + return cursoService.auxCursoAvaliacoes(usuario, mensagem); } @ApiOperation("Permite pegar a tela atual do usuário no curso de criação de questões.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoCriacao/", method = RequestMethod.GET) - public ResponseEntity getCursoCriacao(@RequestAttribute(name="usuario") Usuario usuario) { - return auxCursoCriacao(usuario, null); - } - - public ResponseEntity auxCursoCriacao(@RequestAttribute(name="usuario") Usuario usuario, String mensagem) { - if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { - return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - } - - List ret = new ArrayList<>(); - - boolean ativo = false; - for (int i = 0; i < usuario.getCursoCriacao().size()-1; i++) { - ModuloCurso modulo = usuario.getCursoCriacao().get(i); - Curso c = competenciaRepository.findById(modulo.getNome()).get().getCursoCriacao(); - ModuloCursoOutput moduloOutput = new ModuloCursoOutput(); - moduloOutput.setNome(modulo.getNome()); - moduloOutput.setDescricao(c.getDescricao()); - moduloOutput.setEstado(modulo.getEstado()); - moduloOutput.setVideo(c.getVideo()); - if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { - modulo.setNumeroExemplo((modulo.getNumeroExemplo()+1) % c.getExemplos().size()); - int index = modulo.getNumeroExemplo(); - moduloOutput.getExemplos().add(c.getExemplos().get(index)); - moduloOutput.getTextoExemplos().add(c.getTextoExemplos().get(index)); - } - if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { - int index = modulo.getNumeroExemplo(); - moduloOutput.getExemplos().add(c.getExemplos().get(index)); - moduloOutput.getTextoExemplos().add(c.getTextoExemplos().get(index)); - } - if (modulo.getEstado().equals(EstadoModulo.FINALIZADO)) { - moduloOutput.setExemplos(c.getExemplos()); - moduloOutput.setTextoExemplos(c.getTextoExemplos()); - } - if (ativo) { - moduloOutput.setEstado(EstadoModulo.INATIVO); - } - if (moduloOutput.getEstado() != EstadoModulo.FINALIZADO) { - ativo = true; - } - usuario.getCursoCriacao().set(i, modulo); - ret.add(moduloOutput); - } - - - ModuloCursoOutput outputAvaliacao = new ModuloCursoOutput(); - - ModuloCurso modAvaliacao = usuario.getCursoCriacao().get(10); - outputAvaliacao.setNome(modAvaliacao.getNome()); - outputAvaliacao.setEstado(modAvaliacao.getEstado()); - - if (modAvaliacao.getEstado().equals(EstadoModulo.PRATICA)) { - if (modAvaliacao.getQuestoes().size() > 0) { - try { - String questao = modAvaliacao.getQuestoes().get(0); - outputAvaliacao.getQuestoesDetalhadas().add(questionSearchController.getById(usuario, questao)); - outputAvaliacao.getQuestoes().add(questao); - } catch (Exception e) { - usuario.getCursoCriacao().get(10).getQuestoes().clear(); - } - } - } - - if (ativo) { - outputAvaliacao.setEstado(EstadoModulo.INATIVO); - } - - - ret.add(outputAvaliacao); - - usuario = usuarioService.update(usuario, usuario.getEmail()); - - return new ResponseEntity(new CursoOutput(mensagem, null, ret), HttpStatus.OK); + public ResponseEntity getCursoCriacao(@RequestAttribute(name = "usuario") Usuario usuario) { + return cursoService.auxCursoCriacao(usuario, null); } @ApiOperation("Avança no curso de criação de questões para o usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoCriacao/", method = RequestMethod.POST) - public ResponseEntity avancarCursoCriacao(@RequestAttribute(name="usuario") Usuario usuario, @RequestBody List respostas) { + public ResponseEntity avancarCursoCriacao(@RequestAttribute(name = "usuario") Usuario usuario, + @RequestBody List respostas) { if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); @@ -382,11 +235,13 @@ public ResponseEntity avancarCursoCriacao(@RequestAttribute(name="u } } else if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { modulo.setEstado(EstadoModulo.PRATICA); - }else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { + } else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { if (i != 10) { try { - Boolean hasCompetencia = questaoService.hasCompetencia(competencia, questaoService.getSetCompetencias(respostas.get(0))); - if(!hasCompetencia) { + Boolean hasCompetencia = true; + // Boolean hasCompetencia = questaoService.hasCompetencia(competencia, + // questaoService.getSetCompetencias(respostas.get(0))); + if (!hasCompetencia) { modulo.addErro(); if (modulo.getErros() == 2) { mensagem = "Percebemos que você teve dificuldade com essa competência, então volte e veja algum exemplo"; @@ -396,7 +251,7 @@ public ResponseEntity avancarCursoCriacao(@RequestAttribute(name="u sendToBack = true; modulo.zeraErros(); modulo.setEstado(EstadoModulo.DESCRICAO); - //processa devido ao numero de erros + // processa devido ao numero de erros } else { mensagem = "Não conseguimos identificar a presença da competência atual no enunciado, tente novamente!"; } @@ -419,7 +274,7 @@ public ResponseEntity avancarCursoCriacao(@RequestAttribute(name="u } else { Avaliacao avaliacaoAutor = null; List avaliacoes = avaliacaoService.getAllByQuestao(questao); - for(Avaliacao a : avaliacoes) { + for (Avaliacao a : avaliacoes) { if (a.getAutor().equals(usuario.getEmail())) { avaliacaoAutor = a; break; @@ -451,13 +306,14 @@ public ResponseEntity avancarCursoCriacao(@RequestAttribute(name="u } } - return auxCursoCriacao(usuario, mensagem); + return cursoService.auxCursoCriacao(usuario, mensagem); } @ApiOperation("Registra questão criada na avaliação final do usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoCriacao/newQuestion", method = RequestMethod.POST) - public ResponseEntity registraCriacaoQuestao(@RequestAttribute(name="usuario") Usuario usuario, @RequestBody String questao) { + public ResponseEntity registraCriacaoQuestao(@RequestAttribute(name = "usuario") Usuario usuario, + @RequestBody String questao) { if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); @@ -476,7 +332,7 @@ public ResponseEntity registraCriacaoQuestao(@RequestAttribute(name mensagem = "A questão especificada não existe"; } - return auxCursoCriacao(usuario, mensagem); + return cursoService.auxCursoCriacao(usuario, mensagem); } public class NewQuestion { diff --git a/backend/src/main/java/springboot/enums/CourseType.java b/backend/src/main/java/springboot/enums/CourseType.java new file mode 100644 index 00000000..92521d54 --- /dev/null +++ b/backend/src/main/java/springboot/enums/CourseType.java @@ -0,0 +1,6 @@ +package springboot.enums; + +public enum CourseType { + AVALIACAO, + CRIACAO +} diff --git a/backend/src/main/java/springboot/service/CursoService.java b/backend/src/main/java/springboot/service/CursoService.java new file mode 100644 index 00000000..21d69723 --- /dev/null +++ b/backend/src/main/java/springboot/service/CursoService.java @@ -0,0 +1,297 @@ +package springboot.service; + +import org.springframework.stereotype.Service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import springboot.controller.QuestionSearchController; +import springboot.dto.output.CursoOutput; +import springboot.dto.output.ModuloCursoOutput; +import springboot.enums.CourseType; +import springboot.model.*; +import springboot.model.ModuloCurso.EstadoModulo; +import springboot.repository.CompetenciaRepository; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class CursoService { + public static final String COMP_NAMES[] = new String[] { + "COMP_ABSTRAÇÃO", + "COMP_ALGORITMOS", + "COMP_ANÁLISE", + "COMP_AUTOMAÇÃO", + "COMP_COLETA", + "COMP_DECOMPOSIÇÃO", + "COMP_PARALELIZAÇÃO", + "COMP_REPRESENTAÇÃO", + "COMP_SIMULAÇÃO" + }; + + @Autowired + private CompetenciaRepository competenciaRepository; + + @Autowired + private UsuarioService usuarioService; + + @Autowired + QuestionSearchController questionSearchController; + + @Autowired + private QuestaoService questaoService; + + /** + * Processa a lista de módulos e gera uma lista de objetos de saída + * correspondentes. + * + * @param modules Lista de módulos a ser processada. + * @return Lista de objetos `ModuloCursoOutput` gerados a partir dos módulos. + */ + public List processModules(List modules, CourseType courseType) { + List outputList = new ArrayList<>(); + boolean active = false; + + for (int i = 0; i < modules.size() - 1; i++) { + ModuloCurso module = modules.get(i); + @SuppressWarnings("unlikely-arg-type") + Curso course = courseType.equals("AVALIACAO") + ? competenciaRepository.findById(module.getNome()).get().getCursoAvaliacao() + : competenciaRepository.findById(module.getNome()).get().getCursoCriacao(); + ModuloCursoOutput moduleOutput = createCourseModuleOutput(module, course, courseType); + + if (active) + moduleOutput.setEstado(EstadoModulo.INATIVO); + + if (moduleOutput.getEstado() != EstadoModulo.FINALIZADO) + active = true; + + modules.set(i, module); + outputList.add(moduleOutput); + } + + // Processar o último módulo + ModuloCurso evaluationMod = modules.get(10); + ModuloCursoOutput evaluationOutput = processFinalModule(evaluationMod); + + if (active) + evaluationOutput.setEstado(EstadoModulo.INATIVO); + + modules.set(10, evaluationMod); + outputList.add(evaluationOutput); + + return outputList; + } + + /** + * Processa o módulo final do curso e adiciona detalhes das questões se + * disponível. + * + * @param evaluationMod O módulo final de avaliação. + * @return Um objeto `ModuloCursoOutput` com as informações do módulo final. + */ + private ModuloCursoOutput processFinalModule(ModuloCurso evaluationMod) { + ModuloCursoOutput evaluationOutput = new ModuloCursoOutput(); + evaluationOutput.setNome(evaluationMod.getNome()); + evaluationOutput.setEstado(evaluationMod.getEstado()); + + if (evaluationMod.getEstado().equals(EstadoModulo.PRATICA)) { + /********** Dois tratamentos distintos *********** TODO */ + // CURSO CRIAÇÃO + // if (evaluationMod.getQuestoes().size() > 0) { + + // try { + + // String questao = evaluationMod.getQuestoes().get(0); + + // evaluationOutput.getQuestoesDetalhadas().add(questionSearchController.getById(usuario, + // questao)); + + // evaluationOutput.getQuestoes().add(questao); + + // } catch (Exception e) { + + // usuario.getCursoCriacao().get(10).getQuestoes().clear(); + + // } + + /********** CURSO AVALIAÇÃO ****************8 */ + + // evaluationMod.setQuestoes(new ArrayList<>()); + + // for(String comp : COMP_NAMES) { + + // // Get 2 samples of questions (one with an one without competencia) unordered + + // Questao sample = questaoService.getSample(comp); + + // evaluationMod.getQuestoes().add(sample.getId()); + + // evaluationOutput.getQuestoes().add(sample.getEnunciado()); + } + + return evaluationOutput; + } + + /** + * Cria um objeto `ModuloCursoOutput` a partir de um módulo de curso e seu + * respectivo `Curso`. + * + * @param module O módulo de curso a ser convertido. + * @param course O curso associado ao módulo. + * @return Um objeto `ModuloCursoOutput` com as informações do módulo. + */ + private ModuloCursoOutput createCourseModuleOutput(ModuloCurso module, Curso course, CourseType courseType) { + ModuloCursoOutput output = new ModuloCursoOutput(); + output.setNome(module.getNome()); + output.setDescricao(course.getDescricao()); + output.setEstado(module.getEstado()); + output.setVideo(course.getVideo()); + + switch (module.getEstado()) { + case EXEMPLOS: + updateExamples(module, course, output); + break; + case PRATICA: + addPracticeDetails(module, course, output, courseType); + break; + case FINALIZADO: + addExamplesAndTexts(module, course, output); + break; + default: + break; + } + + return output; + } + + /** + * Atualiza os exemplos do módulo de curso no estado EXEMPLOS. + * + * @param module O módulo de curso a ser atualizado. + * @param course O curso associado ao módulo. + * @param output O objeto de saída a ser atualizado. + */ + private void updateExamples(ModuloCurso module, Curso course, ModuloCursoOutput output) { + int index = (module.getNumeroExemplo() + 1) % course.getExemplos().size(); + module.setNumeroExemplo(index); + output.getExemplos().add(course.getExemplos().get(index)); + output.getTextoExemplos().add(course.getTextoExemplos().get(index)); + } + + /** + * Adiciona exemplos e textos ao objeto `ModuloCursoOutput` com base no módulo. + * + * @param module O módulo de curso que contém os exemplos e textos. + * @param course + * @param output O objeto `ModuloCursoOutput` onde os exemplos e textos serão + * adicionados. + */ + private void addExamplesAndTexts(ModuloCurso module, Curso course, ModuloCursoOutput output) { + output.setExemplos(course.getExemplos()); + output.setTextoExemplos(course.getTextoExemplos()); + } + + /** + * Adiciona detalhes da prática ao módulo de curso no estado PRATICA. + * + * @param modulo O módulo de curso a ser atualizado. + * @param curso O curso associado ao módulo. + * @param output O objeto de saída a ser atualizado. + * @param courseType O tipo de curso acessado. + */ + @SuppressWarnings("unlikely-arg-type") + private void addPracticeDetails(ModuloCurso modulo, Curso curso, ModuloCursoOutput output, CourseType courseType) { + int index = modulo.getNumeroExemplo(); + output.getExemplos().add(curso.getExemplos().get(index)); + output.getTextoExemplos().add(curso.getTextoExemplos().get(index)); + + if (courseType.equals("AVALIACAO")) { + List samples = questaoService.getSamples(modulo.getNome()); + + for (Questao q : samples) { + modulo.getQuestoes().add(q.getId()); + output.getQuestoes().add(q.getEnunciado()); + } + } + } + + /** + * Processa e retorna a lista de módulos de avaliação do curso para um usuário. + * + * @param user O usuário cujos módulos de avaliação serão processados. + * @param message Mensagem adicional a ser incluída na resposta. + * @return Um `ResponseEntity` contendo um `CursoOutput` com a lista de módulos + * de avaliação processados e um status HTTP. + */ + public ResponseEntity auxCursoAvaliacoes(@RequestAttribute(name = "usuario") Usuario user, + String message) { + if (isCourseListEmpty(user.getCursoAvaliacao())) + return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); + + List outputList = processModules(user.getCursoAvaliacao(), CourseType.AVALIACAO); + + user = usuarioService.update(user, user.getEmail()); + + return new ResponseEntity<>(new CursoOutput(message, outputList, null), HttpStatus.OK); + } + + /** + * Verifica se a lista de cursos está vazia ou é nula. + * + * @param courses Lista de módulos de curso a ser verificada. + * @return `true` se a lista estiver vazia ou nula, `false` caso contrário. + */ + public boolean isCourseListEmpty(List courses) { + return courses == null || courses.isEmpty(); + } + + /** + * Inicializa a lista de módulos de curso para um usuário, com base no tipo de + * curso especificado. + * + * Este método cria uma lista de módulos padrão para o usuário, dependendo do + * tipo de curso (avaliação ou criação). Os módulos incluem uma introdução, + * competências padrão e uma avaliação final. O estado do módulo de avaliação + * final é definido como `PRATICA`. + * + * @param user O usuário cujos cursos serão inicializados. + * @param type O tipo de curso a ser inicializado. Pode ser + * `UsuarioCursoType.AVALIACAO` para módulos de avaliação ou + * `UsuarioCursoType.CRIACAO` para módulos de criação. + * @return Uma lista de módulos de curso inicializada com os módulos padrão. + */ + public void initializeCourses(Usuario user, CourseType type) { + List courses = new ArrayList<>(); + courses.add(new ModuloCurso("COMP_INTRODUÇÃO")); + + for (String competence : COMP_NAMES) + courses.add(new ModuloCurso(competence)); + + ModuloCurso finalModule = new ModuloCurso("COMP_AVALIAÇÃO FINAL"); + finalModule.setEstado(EstadoModulo.PRATICA); + courses.add(finalModule); + + if (type == CourseType.AVALIACAO) + user.setCursoAvaliacao(courses); + else if (type == CourseType.CRIACAO) + user.setCursoCriacao(courses); + + usuarioService.update(user, user.getEmail()); + } + + public ResponseEntity auxCursoCriacao(@RequestAttribute(name = "usuario") Usuario user, + String message) { + if (isCourseListEmpty(user.getCursoCriacao())) + return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); + + List outputList = processModules(user.getCursoCriacao(), CourseType.CRIACAO); + + user = usuarioService.update(user, user.getEmail()); + + return new ResponseEntity(new CursoOutput(message, null, outputList), HttpStatus.OK); + } +} From 6474a0bd027063981a1ab2f05f7dc42fb7bad326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vitor?= Date: Tue, 10 Sep 2024 01:09:18 -0300 Subject: [PATCH 2/3] =?UTF-8?q?fefactor:=20implementando=20padr=C3=A3o=20g?= =?UTF-8?q?rasp=20+=20javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CursoController.java | 355 +++++--------- .../java/springboot/service/CursoService.java | 457 ++++++++++++++++-- 2 files changed, 520 insertions(+), 292 deletions(-) diff --git a/backend/src/main/java/springboot/controller/CursoController.java b/backend/src/main/java/springboot/controller/CursoController.java index d3c5ee06..797c4fd1 100644 --- a/backend/src/main/java/springboot/controller/CursoController.java +++ b/backend/src/main/java/springboot/controller/CursoController.java @@ -3,7 +3,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; @@ -15,20 +14,16 @@ import springboot.dto.output.CursoOutput; import springboot.dto.output.ModuloCursoOutput; import springboot.enums.CourseType; -import springboot.enums.EstadoQuestao; import springboot.exception.data.RegisterNotFoundException; import springboot.model.*; import springboot.model.ModuloCurso.EstadoModulo; -import springboot.repository.CompetenciaRepository; -import springboot.service.AvaliacaoService; import springboot.service.CursoService; import springboot.service.QuestaoService; import springboot.service.UsuarioService; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; -@Controller @RestController @RequestMapping(value = "/api") @CrossOrigin(origins = "+") @@ -47,58 +42,54 @@ public class CursoController { "COMP_SIMULAÇÃO" }; - @Autowired - private CompetenciaRepository competenciaRepository; - @Autowired private UsuarioService usuarioService; - @Autowired - QuestionSearchController questionSearchController; - @Autowired private QuestaoService questaoService; @Autowired - private AvaliacaoService avaliacaoService; - private CursoService cursoService; + /** + * Retorna a tela atual do usuário no curso de avaliação. + * + * @param user Usuário logado no sistema, injetado pelo framework. + * @return ResponseEntity contendo o estado atual do curso de avaliação. + */ @ApiOperation("Permite pegar a tela atual do usuário no curso de avaliação.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoAvaliacao/", method = RequestMethod.GET) - public ResponseEntity getCursoAvaliacoes(@RequestAttribute(name = "usuario") Usuario usuario) { - return cursoService.auxCursoAvaliacoes(usuario, null); + public ResponseEntity getReviewCourse(@RequestAttribute(name = "usuario") Usuario user) { + return cursoService.auxCursoAvaliacoes(user, null); } /** - * Cria e retorna novos cursos para o usuário logado, incluindo módulos de - * avaliação e criação. - * + * Cria novos cursos para o usuário logado. + * * Este método verifica se o usuário possui cursos de avaliação e criação - * configurados. Se não tiver, ele inicializa essas listas com módulos padrão e - * os atualiza no banco de dados. Em seguida, retorna uma resposta contendo a - * lista atualizada de módulos de avaliação e criação. - * - * @param user O usuário para o qual os novos cursos serão criados. É - * esperado que o usuário esteja autenticado e que o atributo - * "usuario" esteja presente na requisição. - * @return Um `ResponseEntity` contendo um `CursoOutput` com as listas de módulo - * de avaliação e criação atualizadas, e um status HTTP de sucesso (OK). + * configurados. Se não tiver, inicializa estas listas com módulos padrão e + * os atualiza no banco de dados. + * + * @param user Usuário autenticado, para o qual os cursos serão criados. + * @return Um ResponseEntity contendo o CursoOutput atualizado e status HTTP de + * sucesso. */ - @ApiOperation("Cria novos cursos para o usuário logado.\r\n") + @ApiOperation("Cria novos cursos para o usuário logado.") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) - @RequestMapping(value = "/cursos/", method = RequestMethod.GET) - public ResponseEntity novosCursos(@RequestAttribute(name = "usuario") Usuario user) { + @GetMapping(value = "/cursos/") + public ResponseEntity newCourses(@RequestAttribute(name = "usuario") Usuario user) { try { if (cursoService.isCourseListEmpty(user.getCursoAvaliacao())) cursoService.initializeCourses(user, CourseType.AVALIACAO); if (cursoService.isCourseListEmpty(user.getCursoCriacao())) - cursoService.initializeCourses(user, CourseType.CRIACAO); + cursoService.initializeCourses(user, CourseType.CRIACAO); - List cursoAvaliacao = cursoService.processModules(user.getCursoAvaliacao(), CourseType.AVALIACAO); - List cursoCriacao = cursoService.processModules(user.getCursoCriacao(), CourseType.CRIACAO); + List cursoAvaliacao = cursoService.processModules(user.getCursoAvaliacao(), + CourseType.AVALIACAO, user); + List cursoCriacao = cursoService.processModules(user.getCursoCriacao(), + CourseType.CRIACAO, user); user = usuarioService.update(user, user.getEmail()); @@ -111,248 +102,132 @@ public ResponseEntity novosCursos(@RequestAttribute(name = "usuario } } + /** + * Avança no curso de avaliação para o usuário logado. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @return ResponseEntity contendo o resultado da operação. + */ @ApiOperation("Avança no curso de avaliação para o usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoAvaliacao/", method = RequestMethod.POST) - public ResponseEntity avancarCursoAvaliacoes(@RequestAttribute(name = "usuario") Usuario usuario, - @RequestBody List respostas) { + public ResponseEntity advanceReviewCourse(@RequestAttribute(name = "usuario") Usuario user, + @RequestBody List answers) { - if (usuario.getCursoAvaliacao() == null || usuario.getCursoAvaliacao().size() == 0) { + if (cursoService.isCourseListEmpty(user.getCursoAvaliacao())) return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - } - String mensagem = null; - - for (int i = 0; i < usuario.getCursoAvaliacao().size(); i++) { - ModuloCurso modulo = usuario.getCursoAvaliacao().get(i); - if (!modulo.getEstado().equals(EstadoModulo.FINALIZADO)) { - boolean sendToBack = false; - Curso c = new Curso(); - if (i != 10) - c = competenciaRepository.findById(modulo.getNome()).get().getCursoAvaliacao(); - String competencia = modulo.getNome(); - if (modulo.getEstado().equals(EstadoModulo.DESCRICAO)) { - if (i == 0) { - modulo.setEstado(EstadoModulo.FINALIZADO); - } else { - modulo.setEstado(EstadoModulo.EXEMPLOS); - } - } else if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { - modulo.setEstado(EstadoModulo.PRATICA); - } else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { - int total = 0; - int erros = 0; - if (i == usuario.getCursoAvaliacao().size() - 1) { - total = 9; - if (respostas == null || respostas.size() != 9) { - erros += 9; - } else { - int j = 0; - for (String comp : COMP_NAMES) { - if (!respostas.get(j) - .equals(questaoService.evaluateQuestao(comp, modulo.getQuestoes().get(j)))) - erros++; - j++; - } - } - } else { - List l1 = questaoService.evaluateQuestoes(competencia, modulo.getQuestoes()); - total = 2; - if (respostas == null || respostas.size() != 2 || !l1.equals(respostas)) { - erros++; - } - } - // Verifica se errou no máximo 30% - if (100 * erros <= total * 30) { - modulo.setEstado(EstadoModulo.FINALIZADO); - modulo.zeraErros(); - } else if (i == usuario.getCursoAvaliacao().size() - 1) { - mensagem = "Você obteve menos de 70% de acerto, tente novamente ou volte e estude mais um pouco sobre as competências!"; - } else { - modulo.addErro(); - if (modulo.getErros() == 2) { - mensagem = "Percebemos que você novamente teve dificuldade em identificar a competência nas questões apresentadas, por isso deve voltar e ver mais um exemplo!"; - modulo.setEstado(EstadoModulo.EXEMPLOS); - } else if (modulo.getErros() == 3) { - mensagem = "Como você não conseguiu identificar bem a presença ou ausência da competência nas questões apresentadas, veja uma nova competência e depois tentaremos essa novamente!"; - sendToBack = true; - modulo.zeraErros(); - modulo.setEstado(EstadoModulo.DESCRICAO); - // processa devido ao numero de erros - } else { - mensagem = "Você não conseguiu identificar a presença ou ausência da competência nas questões apresentadas, tente novamente!"; - } - } - - } - usuario.getCursoAvaliacao().set(i, modulo); - if (sendToBack) { - usuario.getCursoAvaliacao().add(usuario.getCursoAvaliacao().get(10)); - usuario.getCursoAvaliacao().remove(i); - - usuario.getCursoAvaliacao().set(9, modulo); - } - usuario = usuarioService.update(usuario, usuario.getEmail()); + String message = null; + + for (int i = 0; i < user.getCursoAvaliacao().size(); i++) { + ModuloCurso module = user.getCursoAvaliacao().get(i); + + if (!module.getEstado().equals(EstadoModulo.FINALIZADO)) { + message = cursoService.processEvaluationModule(user, answers, i, module); break; } } - return cursoService.auxCursoAvaliacoes(usuario, mensagem); + return cursoService.auxCursoAvaliacoes(user, message); } - @ApiOperation("Permite pegar a tela atual do usuário no curso de criação de questões.\r\n") - @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) - @RequestMapping(value = "/cursoCriacao/", method = RequestMethod.GET) - public ResponseEntity getCursoCriacao(@RequestAttribute(name = "usuario") Usuario usuario) { - return cursoService.auxCursoCriacao(usuario, null); + /** + * Obtém a tela atual do usuário no curso de criação de questões. + * + * Este endpoint permite que o usuário logado obtenha a tela atual do + * curso de criação de questões, retornando um estado atual do curso. + * + * @param user Usuário logado no sistema. + * @return ResponseEntity contendo o estado atual do curso de criação + * ou um erro caso ocorra alguma falha. + */ + @ApiOperation("Obtém a tela atual do usuário no curso de criação de questões.") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK", response = CursoOutput.class), + @ApiResponse(code = 404, message = "Curso de criação de questões não encontrado", response = CursoOutput.class) + }) + @GetMapping("/cursoCriacao/") + public ResponseEntity getCreationCourse(@RequestAttribute(name = "usuario") Usuario user) { + return cursoService.auxCursoCriacao(user, null); } + /** + * Avança o curso de criação de questões para o usuário logado. + * + * Este método percorre os módulos do curso de criação do usuário, processando + * o primeiro módulo cujo estado não seja "FINALIZADO". Utiliza o serviço de + * curso para verificar a validade da lista de cursos e avançar o estado do + * módulo. + * + * @param user Usuário logado no sistema, injetado pelo framework. + * @param answers Lista de respostas fornecidas pelo usuário. + * @return ResponseEntity com o resultado do avanço no curso de criação. + */ @ApiOperation("Avança no curso de criação de questões para o usuário logado.\r\n") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoCriacao/", method = RequestMethod.POST) - public ResponseEntity avancarCursoCriacao(@RequestAttribute(name = "usuario") Usuario usuario, - @RequestBody List respostas) { + public ResponseEntity advanceCreationCourse(@RequestAttribute(name = "usuario") Usuario user, + @RequestBody List answers) { - if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { + if (cursoService.isCourseListEmpty(user.getCursoCriacao())) return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - } - String mensagem = null; - - for (int i = 0; i < usuario.getCursoCriacao().size(); i++) { - ModuloCurso modulo = usuario.getCursoCriacao().get(i); - if (!modulo.getEstado().equals(EstadoModulo.FINALIZADO)) { - boolean sendToBack = false; - Curso c = new Curso(); - if (i != 10) - c = competenciaRepository.findById(modulo.getNome()).get().getCursoCriacao(); - String competencia = modulo.getNome(); - if (modulo.getEstado().equals(EstadoModulo.DESCRICAO)) { - if (i == 0) { - modulo.setEstado(EstadoModulo.FINALIZADO); - } else { - modulo.setEstado(EstadoModulo.EXEMPLOS); - } - } else if (modulo.getEstado().equals(EstadoModulo.EXEMPLOS)) { - modulo.setEstado(EstadoModulo.PRATICA); - } else if (modulo.getEstado().equals(EstadoModulo.PRATICA)) { - if (i != 10) { - try { - Boolean hasCompetencia = true; - // Boolean hasCompetencia = questaoService.hasCompetencia(competencia, - // questaoService.getSetCompetencias(respostas.get(0))); - if (!hasCompetencia) { - modulo.addErro(); - if (modulo.getErros() == 2) { - mensagem = "Percebemos que você teve dificuldade com essa competência, então volte e veja algum exemplo"; - modulo.setEstado(EstadoModulo.EXEMPLOS); - } else if (modulo.getErros() == 3) { - mensagem = "Como você não conseguiu identificar bem a competência, veja uma nova competência e depois voltamos para essa"; - sendToBack = true; - modulo.zeraErros(); - modulo.setEstado(EstadoModulo.DESCRICAO); - // processa devido ao numero de erros - } else { - mensagem = "Não conseguimos identificar a presença da competência atual no enunciado, tente novamente!"; - } - } else { - modulo.setEstado(EstadoModulo.FINALIZADO); - modulo.zeraErros(); - } - } catch (Exception e) { - mensagem = "Problema interno ao classificar questão, tente novamente!"; - } - } else { - try { - Questao q; - String questao = modulo.getQuestoes().get(0); - q = questaoService.getById(questao); - if (!q.getAutor().equals(usuario.getEmail())) { - mensagem = "A questão precisa ser de sua autoria!"; - } else if (q.getEstado() != EstadoQuestao.PUBLICADA) { - mensagem = "Você deve criar uma nova questão para prosseguir!"; - } else { - Avaliacao avaliacaoAutor = null; - List avaliacoes = avaliacaoService.getAllByQuestao(questao); - for (Avaliacao a : avaliacoes) { - if (a.getAutor().equals(usuario.getEmail())) { - avaliacaoAutor = a; - break; - } - } - - if (avaliacaoAutor == null) { - mensagem = "Sua questão não foi avaliada apropriadamente!"; - } else if (!avaliacaoAutor.getCompetencias().equals(q.getCompetencias())) { - mensagem = "Você deve criar uma nova questão para prosseguir!"; - } else { - modulo.setEstado(EstadoModulo.FINALIZADO); - } - } - } catch (Exception e) { - mensagem = "Você deve criar uma nova questão para prosseguir!"; - } - } - } - usuario.getCursoCriacao().set(i, modulo); - if (sendToBack) { - usuario.getCursoCriacao().add(usuario.getCursoCriacao().get(10)); - usuario.getCursoCriacao().remove(i); - - usuario.getCursoCriacao().set(9, modulo); - } - usuario = usuarioService.update(usuario, usuario.getEmail()); + String message = null; + + for (int i = 0; i < user.getCursoCriacao().size(); i++) { + ModuloCurso module = user.getCursoCriacao().get(i); + + if (!module.getEstado().equals(EstadoModulo.FINALIZADO)) { + message = cursoService.processModuleCreation(user, answers, i, module); break; } } - return cursoService.auxCursoCriacao(usuario, mensagem); + return cursoService.auxCursoCriacao(user, message); } - @ApiOperation("Registra questão criada na avaliação final do usuário logado.\r\n") + /** + * Registra uma nova questão criada pelo usuário logado no curso de criação. + * + * Este método verifica se a questão fornecida existe e, se existir, adiciona a + * questão ao curso de criação do usuário. Caso contrário, retorna uma mensagem + * de erro indicando que a questão especificada não foi encontrada. + * + * @param user Usuário logado no sistema, injetado pelo framework. + * @param question ID da questão a ser registrada. + * @return ResponseEntity com o resultado do registro da questão no curso de + * criação. + */ + @ApiOperation("Registra uma nova questão criada na avaliação final do usuário logado.") @ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = Usuario.class) }) @RequestMapping(value = "/cursoCriacao/newQuestion", method = RequestMethod.POST) - public ResponseEntity registraCriacaoQuestao(@RequestAttribute(name = "usuario") Usuario usuario, - @RequestBody String questao) { + public ResponseEntity registraCriacaoQuestao( + @RequestAttribute(name = "usuario") Usuario user, + @RequestBody String question) { - if (usuario.getCursoCriacao() == null || usuario.getCursoCriacao().size() == 0) { - return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); + // Verifica se o curso de criação do usuário está presente e não está vazio. + if (cursoService.isCourseListEmpty(user.getCursoCriacao())) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new CursoOutput()); } - List modulo = new ArrayList<>(); - modulo.add(questao); - - String mensagem = null; + String message = null; try { - questaoService.getById(questao); - usuario.getCursoCriacao().get(10).setQuestoes(modulo); - usuario = usuarioService.update(usuario, usuario.getEmail()); - } catch (RegisterNotFoundException e) { - mensagem = "A questão especificada não existe"; - } - - return cursoService.auxCursoCriacao(usuario, mensagem); - } - - public class NewQuestion { - private int competencia; - private String questao; + // Verifica se a questão existe no sistema. + questaoService.getById(question); - public int getCompetencia() { - return competencia; - } - - public void setCompetencia(int competencia) { - this.competencia = competencia; - } + // Adiciona a questão ao módulo apropriado no curso de criação do usuário. + user.getCursoCriacao().get(10).setQuestoes(Collections.singletonList(question)); + user = usuarioService.update(user, user.getEmail()); - public String getQuestao() { - return questao; + } catch (RegisterNotFoundException e) { + // Define mensagem de erro caso a questão não seja encontrada. + message = "A questão especificada não existe."; } - public void setQuestao(String questao) { - this.questao = questao; - } + // Retorna o resultado do processamento do curso de criação. + return cursoService.auxCursoCriacao(user, message); } + } diff --git a/backend/src/main/java/springboot/service/CursoService.java b/backend/src/main/java/springboot/service/CursoService.java index 21d69723..3b5ae562 100644 --- a/backend/src/main/java/springboot/service/CursoService.java +++ b/backend/src/main/java/springboot/service/CursoService.java @@ -11,6 +11,7 @@ import springboot.dto.output.CursoOutput; import springboot.dto.output.ModuloCursoOutput; import springboot.enums.CourseType; +import springboot.enums.EstadoQuestao; import springboot.model.*; import springboot.model.ModuloCurso.EstadoModulo; import springboot.repository.CompetenciaRepository; @@ -36,27 +37,32 @@ public class CursoService { private CompetenciaRepository competenciaRepository; @Autowired - private UsuarioService usuarioService; + private AvaliacaoService avaliacaoService; @Autowired - QuestionSearchController questionSearchController; + private UsuarioService usuarioService; @Autowired private QuestaoService questaoService; + private QuestionSearchController questionSearchController; + /** * Processa a lista de módulos e gera uma lista de objetos de saída * correspondentes. * - * @param modules Lista de módulos a ser processada. + * @param modules Lista de módulos a ser processada. + * @param courseType + * @param user * @return Lista de objetos `ModuloCursoOutput` gerados a partir dos módulos. */ - public List processModules(List modules, CourseType courseType) { + public List processModules(List modules, CourseType courseType, Usuario user) { List outputList = new ArrayList<>(); boolean active = false; for (int i = 0; i < modules.size() - 1; i++) { ModuloCurso module = modules.get(i); + @SuppressWarnings("unlikely-arg-type") Curso course = courseType.equals("AVALIACAO") ? competenciaRepository.findById(module.getNome()).get().getCursoAvaliacao() @@ -75,7 +81,7 @@ public List processModules(List modules, CourseT // Processar o último módulo ModuloCurso evaluationMod = modules.get(10); - ModuloCursoOutput evaluationOutput = processFinalModule(evaluationMod); + ModuloCursoOutput evaluationOutput = processFinalModule(evaluationMod, courseType, user); if (active) evaluationOutput.setEstado(EstadoModulo.INATIVO); @@ -90,47 +96,40 @@ public List processModules(List modules, CourseT * Processa o módulo final do curso e adiciona detalhes das questões se * disponível. * + * @param courseType + * @param user * @param evaluationMod O módulo final de avaliação. * @return Um objeto `ModuloCursoOutput` com as informações do módulo final. */ - private ModuloCursoOutput processFinalModule(ModuloCurso evaluationMod) { + private ModuloCursoOutput processFinalModule(ModuloCurso evaluationMod, CourseType type, Usuario user) { ModuloCursoOutput evaluationOutput = new ModuloCursoOutput(); evaluationOutput.setNome(evaluationMod.getNome()); evaluationOutput.setEstado(evaluationMod.getEstado()); if (evaluationMod.getEstado().equals(EstadoModulo.PRATICA)) { - /********** Dois tratamentos distintos *********** TODO */ - // CURSO CRIAÇÃO - // if (evaluationMod.getQuestoes().size() > 0) { - - // try { - - // String questao = evaluationMod.getQuestoes().get(0); - - // evaluationOutput.getQuestoesDetalhadas().add(questionSearchController.getById(usuario, - // questao)); - - // evaluationOutput.getQuestoes().add(questao); - - // } catch (Exception e) { - - // usuario.getCursoCriacao().get(10).getQuestoes().clear(); - - // } - - /********** CURSO AVALIAÇÃO ****************8 */ - - // evaluationMod.setQuestoes(new ArrayList<>()); - - // for(String comp : COMP_NAMES) { - - // // Get 2 samples of questions (one with an one without competencia) unordered - - // Questao sample = questaoService.getSample(comp); - - // evaluationMod.getQuestoes().add(sample.getId()); - - // evaluationOutput.getQuestoes().add(sample.getEnunciado()); + if (type.equals("CRIACAO")) { + if (evaluationMod.getQuestoes().size() > 0) { + + try { + String question = evaluationMod.getQuestoes().get(0); + evaluationOutput.getQuestoesDetalhadas().add(questionSearchController.getById(user, + question)); + + evaluationOutput.getQuestoes().add(question); + + } catch (Exception e) { + user.getCursoCriacao().get(10).getQuestoes().clear(); + } + } + } else { + evaluationMod.setQuestoes(new ArrayList<>()); + + for (String comp : COMP_NAMES) { + Questao sample = questaoService.getSample(comp); + evaluationMod.getQuestoes().add(sample.getId()); + evaluationOutput.getQuestoes().add(sample.getEnunciado()); + } + } } return evaluationOutput; @@ -140,8 +139,9 @@ private ModuloCursoOutput processFinalModule(ModuloCurso evaluationMod) { * Cria um objeto `ModuloCursoOutput` a partir de um módulo de curso e seu * respectivo `Curso`. * - * @param module O módulo de curso a ser convertido. - * @param course O curso associado ao módulo. + * @param module O módulo de curso a ser convertido. + * @param course O curso associado ao módulo. + * @param courseType O tipo do curso (AVALIACAO ou CRIACAO). * @return Um objeto `ModuloCursoOutput` com as informações do módulo. */ private ModuloCursoOutput createCourseModuleOutput(ModuloCurso module, Curso course, CourseType courseType) { @@ -186,7 +186,7 @@ private void updateExamples(ModuloCurso module, Curso course, ModuloCursoOutput * Adiciona exemplos e textos ao objeto `ModuloCursoOutput` com base no módulo. * * @param module O módulo de curso que contém os exemplos e textos. - * @param course + * @param course O curso associado ao módulo. * @param output O objeto `ModuloCursoOutput` onde os exemplos e textos serão * adicionados. */ @@ -198,22 +198,22 @@ private void addExamplesAndTexts(ModuloCurso module, Curso course, ModuloCursoOu /** * Adiciona detalhes da prática ao módulo de curso no estado PRATICA. * - * @param modulo O módulo de curso a ser atualizado. - * @param curso O curso associado ao módulo. - * @param output O objeto de saída a ser atualizado. + * @param module O módulo de curso a ser atualizado. + * @param course O curso associado ao módulo. + * @param output O objeto de saída a ser atualizado. * @param courseType O tipo de curso acessado. */ @SuppressWarnings("unlikely-arg-type") - private void addPracticeDetails(ModuloCurso modulo, Curso curso, ModuloCursoOutput output, CourseType courseType) { - int index = modulo.getNumeroExemplo(); - output.getExemplos().add(curso.getExemplos().get(index)); - output.getTextoExemplos().add(curso.getTextoExemplos().get(index)); + private void addPracticeDetails(ModuloCurso module, Curso course, ModuloCursoOutput output, CourseType courseType) { + int index = module.getNumeroExemplo(); + output.getExemplos().add(course.getExemplos().get(index)); + output.getTextoExemplos().add(course.getTextoExemplos().get(index)); if (courseType.equals("AVALIACAO")) { - List samples = questaoService.getSamples(modulo.getNome()); + List samples = questaoService.getSamples(module.getNome()); for (Questao q : samples) { - modulo.getQuestoes().add(q.getId()); + module.getQuestoes().add(q.getId()); output.getQuestoes().add(q.getEnunciado()); } } @@ -232,7 +232,7 @@ public ResponseEntity auxCursoAvaliacoes(@RequestAttribute(name = " if (isCourseListEmpty(user.getCursoAvaliacao())) return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - List outputList = processModules(user.getCursoAvaliacao(), CourseType.AVALIACAO); + List outputList = processModules(user.getCursoAvaliacao(), CourseType.AVALIACAO, user); user = usuarioService.update(user, user.getEmail()); @@ -283,15 +283,368 @@ else if (type == CourseType.CRIACAO) usuarioService.update(user, user.getEmail()); } + /** + * Processa e retorna a lista de módulos de criação do curso para um usuário. + * + * @param user O usuário cujos módulos de avaliação serão processados. + * @param message Mensagem adicional a ser incluída na resposta. + * @return Um `ResponseEntity` contendo um `CursoOutput` com a lista de módulos + * de criação processados e um status HTTP. + */ public ResponseEntity auxCursoCriacao(@RequestAttribute(name = "usuario") Usuario user, String message) { if (isCourseListEmpty(user.getCursoCriacao())) return new ResponseEntity(new CursoOutput(), HttpStatus.NOT_FOUND); - List outputList = processModules(user.getCursoCriacao(), CourseType.CRIACAO); + List outputList = processModules(user.getCursoCriacao(), CourseType.CRIACAO, user); user = usuarioService.update(user, user.getEmail()); return new ResponseEntity(new CursoOutput(message, null, outputList), HttpStatus.OK); } + + /** + * Processa o módulo de avaliação do usuário. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @param index Índice do módulo atual. + * @param module Módulo do curso a ser processado. + * @return Mensagem de feedback para o usuário. + */ + public String processEvaluationModule(Usuario user, List answers, int index, ModuloCurso module) { + String message = null; + boolean sendToBack = false; + + switch (module.getEstado()) { + case DESCRICAO: + processStateDescription(module, index); + break; + case EXEMPLOS: + module.setEstado(EstadoModulo.PRATICA); + break; + case PRATICA: + message = processStatePractice(user, answers, index, module); + sendToBack = checkNeedReturn(module); + break; + default: + break; + } + + user.getCursoAvaliacao().set(index, module); + + if (sendToBack) { + reorderModules(user.getCursoAvaliacao(), module, index); + } + + usuarioService.update(user, user.getEmail()); + return message; + } + + /** + * Processa o módulo de criação do usuário. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @param index Índice do módulo atual. + * @param module Módulo do curso a ser processado. + * @return Mensagem de feedback para o usuário. + */ + public String processModuleCreation(Usuario user, List answers, int index, ModuloCurso module) { + boolean sendToBack = false; + String message = null; + + switch (module.getEstado()) { + case DESCRICAO: + processStateDescription(module, index); + break; + case EXEMPLOS: + module.setEstado(EstadoModulo.PRATICA); + break; + case PRATICA: + message = processStatePractice(user, answers, module, index); + sendToBack = checkNeedReturn(module); + break; + default: + break; + } + + user.getCursoCriacao().set(index, module); + + if (sendToBack) { + reorderModules(user.getCursoCriacao(), module, index); + } + + usuarioService.update(user, user.getEmail()); + return message; + } + + /** + * Processa o estado "DESCRICAO" do módulo. + * + * @param module Módulo do curso. + * @param index Índice do módulo atual. + */ + private void processStateDescription(ModuloCurso module, int index) { + if (index == 0) { + module.setEstado(EstadoModulo.FINALIZADO); + } else { + module.setEstado(EstadoModulo.EXEMPLOS); + } + } + + /** + * Processa o estado "PRATICA" do módulo. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @param index Índice do módulo atual. + * @param module Módulo do curso. + * @return Mensagem de feedback para o usuário. + */ + private String processStatePractice(Usuario user, List answers, int index, ModuloCurso module) { + String message = null; + int total = 0; + int errors = 0; + + if (index == user.getCursoAvaliacao().size() - 1) { + total = 9; + errors = evaluateFinalAnswers(answers, module, total); + } else { + total = 2; + errors = evaluateIntermediateResponses(answers, module, total); + } + + message = checkForErrors(user, module, total, errors, index); + return message; + } + + /** + * Processa o estado "PRATICA" do módulo. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @param module Módulo do curso. + * @param index Índice do módulo atual. + * @return Mensagem de feedback para o usuário. + */ + private String processStatePractice(Usuario user, List answers, ModuloCurso module, int index) { + String message = null; + + if (index != 10) { + message = evaluateCompetence(user, answers, module); + } else { + message = evaluateFinalQuestion(user, module); + } + + return message; + } + + /** + * Avalia as respostas finais do usuário. + * + * @param answers Lista de respostas fornecidas pelo usuário. + * @param module Módulo do curso. + * @param total Total de questões avaliadas. + * @return Quantidade de erros cometidos pelo usuário. + */ + private int evaluateFinalAnswers(List answers, ModuloCurso module, int total) { + int errors = 0; + if (answers == null || answers.size() != total) { + return total; // Erro total + } + for (int j = 0; j < total; j++) { + if (!answers.get(j).equals(questaoService.evaluateQuestao(COMP_NAMES[j], module.getQuestoes().get(j)))) { + errors++; + } + } + return errors; + } + + /** + * Avalia as respostas intermediárias do usuário. + * + * @param answers Lista de respostas fornecidas pelo usuário. + * @param module Módulo do curso. + * @param total Total de questões avaliadas. + * @return Quantidade de erros cometidos pelo usuário. + */ + private int evaluateIntermediateResponses(List answers, ModuloCurso module, int total) { + int errors = 0; + List respostasEsperadas = questaoService.evaluateQuestoes(module.getNome(), module.getQuestoes()); + if (answers == null || answers.size() != total || !respostasEsperadas.equals(answers)) { + errors++; + } + return errors; + } + + /** + * Verifica se o número de erros permite o avanço ou se o usuário precisa + * revisar. + * + * @param user Usuário logado no sistema. + * @param module Módulo do curso. + * @param total Total de questões avaliadas. + * @param errors Número de erros cometidos. + * @param index Índice do módulo atual. + * @return Mensagem de feedback para o usuário. + */ + private String checkForErrors(Usuario user, ModuloCurso module, int total, int errors, int index) { + String message = null; + + if (100 * errors <= total * 30) { // Erros <= 30% + module.setEstado(EstadoModulo.FINALIZADO); + module.zeraErros(); + } else if (index == user.getCursoAvaliacao().size() - 1) { + message = "Você obteve menos de 70% de acerto, tente novamente ou volte e estude mais um pouco sobre as competências!"; + } else { + message = handleErrorModule(module, "Modulo"); + } + + return message; + } + + /** + * Lida com os erros do módulo e define o estado adequado. + * + * @param module Módulo do curso. + * @param context Contexto de erro (ex.: "Modulo" ou "Competencia"). + * @return Mensagem de feedback para o usuário. + */ + private String handleErrorModule(ModuloCurso module, String context) { + String message; + module.addErro(); + + if (module.getErros() == 2) { + message = String.format( + "Percebemos que você teve dificuldade %s, por isso deve voltar e ver mais um exemplo!", + context.equals("Competencia") ? "com essa competência" + : "em identificar a competência nas questões apresentadas"); + module.setEstado(EstadoModulo.EXEMPLOS); + } else if (module.getErros() == 3) { + message = String.format( + "Como você não conseguiu identificar bem %s, veja uma nova competência e depois tentaremos essa novamente!", + context.equals("Competencia") ? "a competência" + : "a presença ou ausência da competência nas questões apresentadas"); + module.zeraErros(); + module.setEstado(EstadoModulo.DESCRICAO); + } else { + message = String.format("%s, tente novamente!", + context.equals("Competencia") + ? "Não conseguimos identificar a presença da competência atual no enunciado a presença da competência atual no enunciado" + : "Você não conseguiu identificar a presença ou ausência da competência nas questões apresentadas"); + } + + return message; + } + + /** + * Verifica se o módulo deve ser enviado para o final da lista de avaliação. + * + * @param module Módulo do curso. + * @return True se o módulo deve ser enviado para o final, False caso contrário. + */ + private boolean checkNeedReturn(ModuloCurso module) { + return module.getErros() == 3; + } + + /** + * Reordena os módulos de avaliação do usuário, enviando o módulo atual para o + * final. + * + * @param course O curso associado ao módulo. + * @param module Módulo do curso. + * @param index Índice do módulo atual. + */ + private void reorderModules(List course, ModuloCurso module, int index) { + course.add(course.get(10)); + course.remove(index); + course.set(9, module); + } + + /** + * Valida a avaliação da questão. + * + * @param user Usuário logado no sistema. + * @param question Questão a ser avaliada. + * @param module Módulo do curso. + * @return Mensagem de feedback para o usuário. + */ + private String validateEvaluationQuestion(Usuario user, Questao question, ModuloCurso module) { + String message = null; + Avaliacao authorReview = null; + + List reviews = avaliacaoService.getAllByQuestao(question.getId()); + for (Avaliacao a : reviews) { + if (a.getAutor().equals(user.getEmail())) { + authorReview = a; + break; + } + } + + if (authorReview == null) { + message = "Sua questão não foi avaliada apropriadamente!"; + } else if (!authorReview.getCompetencias().equals(question.getCompetencias())) { + message = "Você deve criar uma nova questão para prosseguir!"; + } else { + module.setEstado(EstadoModulo.FINALIZADO); + } + + return message; + } + + /** + * Avalia a questão final do usuário. + * + * @param user Usuário logado no sistema. + * @param module Módulo do curso. + * @return Mensagem de feedback para o usuário. + */ + private String evaluateFinalQuestion(Usuario user, ModuloCurso module) { + String message = null; + + try { + Questao question = questaoService.getById(module.getQuestoes().get(0)); + if (!question.getAutor().equals(user.getEmail())) { + message = "A questão precisa ser de sua autoria!"; + } else if (question.getEstado() != EstadoQuestao.PUBLICADA) { + message = "Você deve criar uma nova questão para prosseguir!"; + } else { + message = validateEvaluationQuestion(user, question, module); + } + } catch (Exception e) { + message = "Você deve criar uma nova questão para prosseguir!"; + } + + return message; + } + + /** + * Avalia a competência do módulo. + * + * @param user Usuário logado no sistema. + * @param answers Lista de respostas fornecidas pelo usuário. + * @param module Módulo do curso. + * @return Mensagem de feedback para o usuário. + */ + private String evaluateCompetence(Usuario user, List answers, ModuloCurso module) { + String message = null; + + try { + // TODO: Classificador indisponível + // Boolean hasCompetence = questaoService.hasCompetencia(module.getNome(), + // questaoService.getSetCompetencias(respostas.get(0))); + Boolean hasCompetence = true; + if (!hasCompetence) { + message = handleErrorModule(module, "Competencia"); + } else { + module.setEstado(EstadoModulo.FINALIZADO); + module.zeraErros(); + } + } catch (Exception e) { + message = "Problema interno ao classificar questão, tente novamente!"; + } + + return message; + } } From 1b9284840c3828d4407f80c2bb48238cc508bd6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vitor?= Date: Tue, 10 Sep 2024 22:02:55 -0300 Subject: [PATCH 3/3] resolve warning --- backend/src/main/java/springboot/service/CursoService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/springboot/service/CursoService.java b/backend/src/main/java/springboot/service/CursoService.java index 3b5ae562..b63a8553 100644 --- a/backend/src/main/java/springboot/service/CursoService.java +++ b/backend/src/main/java/springboot/service/CursoService.java @@ -101,6 +101,7 @@ public List processModules(List modules, CourseT * @param evaluationMod O módulo final de avaliação. * @return Um objeto `ModuloCursoOutput` com as informações do módulo final. */ + @SuppressWarnings("unlikely-arg-type") private ModuloCursoOutput processFinalModule(ModuloCurso evaluationMod, CourseType type, Usuario user) { ModuloCursoOutput evaluationOutput = new ModuloCursoOutput(); evaluationOutput.setNome(evaluationMod.getNome());