From 6e5c41431aec4eeccf81f07f8ee5ace2b9b4a7c5 Mon Sep 17 00:00:00 2001 From: Samy Avrillon Date: Sun, 15 Jun 2025 15:29:17 +0200 Subject: [PATCH] Added question blocking --- .../java/com/bernard/misael/model/Quizz.java | 7 +++---- .../misael/repository/QuizzRepository.java | 2 +- .../bernard/misael/service/QuizzManagerImpl.java | 12 +++++++----- .../com/bernard/misael/web/AuthController.java | 1 - .../bernard/misael/web/QuestionsController.java | 1 - .../db/migration/V6__complex_public_column.sql | 2 ++ src/main/resources/templates/form.html | 16 +++++++++++----- 7 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/db/migration/V6__complex_public_column.sql diff --git a/src/main/java/com/bernard/misael/model/Quizz.java b/src/main/java/com/bernard/misael/model/Quizz.java index d2ed260..07d623c 100644 --- a/src/main/java/com/bernard/misael/model/Quizz.java +++ b/src/main/java/com/bernard/misael/model/Quizz.java @@ -29,10 +29,6 @@ public class Quizz { @JoinColumn(name="owner") private User owner; - @Column(nullable=false) - @ColumnDefault("false") - private boolean isPublic; - @Column(nullable=false) @ColumnDefault("false") private boolean isComplete; @@ -43,4 +39,7 @@ public class Quizz { @OneToMany(mappedBy="quizz") private Set questions; + + @Column(nullable=true) + private Integer publicQuestionCount; } diff --git a/src/main/java/com/bernard/misael/repository/QuizzRepository.java b/src/main/java/com/bernard/misael/repository/QuizzRepository.java index d03f686..d15f96f 100644 --- a/src/main/java/com/bernard/misael/repository/QuizzRepository.java +++ b/src/main/java/com/bernard/misael/repository/QuizzRepository.java @@ -13,7 +13,7 @@ public interface QuizzRepository extends JpaRepository { public @NonNull Optional findById(@NonNull Long id); - public @NonNull Set findByIsPublicTrueAndIsCompleteTrue(); + public @NonNull Set findByPublicQuestionCountIsNotNullAndIsCompleteTrue(); public @NonNull Set findByOwnerAndIsCompleteTrue(@NonNull User owner); public @NonNull Set findByOwnerAndIsCompleteFalse(@NonNull User owner); diff --git a/src/main/java/com/bernard/misael/service/QuizzManagerImpl.java b/src/main/java/com/bernard/misael/service/QuizzManagerImpl.java index 030fa8f..19aca16 100644 --- a/src/main/java/com/bernard/misael/service/QuizzManagerImpl.java +++ b/src/main/java/com/bernard/misael/service/QuizzManagerImpl.java @@ -26,9 +26,7 @@ import com.bernard.misael.service.exception.MalformedAnswerException; import com.bernard.misael.service.exception.MalformedClientAnswerException; import com.bernard.misael.service.exception.QuestionTypeException; import com.bernard.misael.web.QuestionsController; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -83,6 +81,8 @@ public class QuizzManagerImpl implements QuizzManager { if(qindex != data.get("index").intValue()) return errorNode("You are not answering the right question (you answer question "+data.get("index").intValue() +" where you should answer question "+qindex+")"); + if(qindex >= quizz.getPublicQuestionCount()) + return errorNode("La question suivante est encore bloquée"); Question q = questionRepository.findByQuizzAndIndex(quizz,qindex); if(q == null) return errorNode("Could not find question "+qindex); @@ -143,6 +143,8 @@ public class QuizzManagerImpl implements QuizzManager { if(qf.isDone()) return errorNode("No more questions"); int qindex = qf.getCurrentQuestion(); + if(qindex >= quizz.getPublicQuestionCount()) + return errorNode("La question suivante est encore bloquée"); Question q = questionRepository.findByQuizzAndIndex(quizz,qindex); if(q == null) return errorNode("Could not find question "+qindex); @@ -206,7 +208,7 @@ public class QuizzManagerImpl implements QuizzManager { public boolean canAccessQuizz(User user, long quizzId) { try{ Quizz quizz = qRepository.getReferenceById(quizzId); - return quizz.isPublic() || quizz.getOwner().equals(user); + return quizz.getPublicQuestionCount()!=null || quizz.getOwner().equals(user); } catch (EntityNotFoundException e) { return false; } @@ -215,7 +217,7 @@ public class QuizzManagerImpl implements QuizzManager { @Override public List answerableQuizz(User user) { Set ownQuizz = qRepository.findByOwnerAndIsCompleteTrue(user); - Set publicQuizz = qRepository.findByIsPublicTrueAndIsCompleteTrue(); + Set publicQuizz = qRepository.findByPublicQuestionCountIsNotNullAndIsCompleteTrue(); publicQuizz.removeAll(ownQuizz); return Stream.concat( @@ -534,7 +536,7 @@ public class QuizzManagerImpl implements QuizzManager { nq.setName(q.getName() + "("+ Integer.toHexString((int)(Math.random()*0xFFFFFFF)) +")"); nq.setOwner(q.getOwner()); nq.setQuestionCount(q.getQuestionCount()); - nq.setPublic(q.isPublic()); + nq.setPublicQuestionCount(q.getPublicQuestionCount()); nq.setComplete(q.isComplete()); nq = qRepository.save(nq); diff --git a/src/main/java/com/bernard/misael/web/AuthController.java b/src/main/java/com/bernard/misael/web/AuthController.java index 1887986..8428f2b 100644 --- a/src/main/java/com/bernard/misael/web/AuthController.java +++ b/src/main/java/com/bernard/misael/web/AuthController.java @@ -6,7 +6,6 @@ import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.annotation.Secured; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; diff --git a/src/main/java/com/bernard/misael/web/QuestionsController.java b/src/main/java/com/bernard/misael/web/QuestionsController.java index 89e8687..e6b816d 100644 --- a/src/main/java/com/bernard/misael/web/QuestionsController.java +++ b/src/main/java/com/bernard/misael/web/QuestionsController.java @@ -10,7 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Controller; diff --git a/src/main/resources/db/migration/V6__complex_public_column.sql b/src/main/resources/db/migration/V6__complex_public_column.sql new file mode 100644 index 0000000..b8d2a4e --- /dev/null +++ b/src/main/resources/db/migration/V6__complex_public_column.sql @@ -0,0 +1,2 @@ +alter table if exists quizz add column public_question_count integer default NULL; +alter table if exists quizz drop column is_public; \ No newline at end of file diff --git a/src/main/resources/templates/form.html b/src/main/resources/templates/form.html index 9c7821a..d0c38be 100644 --- a/src/main/resources/templates/form.html +++ b/src/main/resources/templates/form.html @@ -47,6 +47,9 @@ console.log(txt) $("#error-textbox").text(txt) } + function clearerror() { + $("#error-textbox").text("") + } function next() { $.ajax({ url: "/questions/question/"+qid, @@ -61,6 +64,7 @@ error(res["message"]) return } + clearerror() $("#question-counter").text((res["index"]+1)+"/"+qlength) $("#question-text").text(res["data"]["text"]) if(qstep==0){ @@ -108,6 +112,7 @@ success: function(res) { console.log(res) if(res["success"]){ + clearerror() next() } else { error(res["message"]) @@ -130,14 +135,15 @@ success: function(res) { console.log(res) if(res["success"]){ + clearerror() + $("#answer-select").hide() + $("#answer-duo").hide() + $("#answer-carre").hide() + $("#answer-cache").hide() if(qindex+1 >= qlength) { $("#question-text").text("Plus de questions !") - $("#answer-select").hide() - $("#answer-duo").hide() - $("#answer-carre").hide() - $("#answer-cache").hide() - } else { + $("#question-text").text("Question suivante ...") next() } } else {