Skip to content
Snippets Groups Projects
Commit 3fe63736 authored by Jan Tymel's avatar Jan Tymel
Browse files

Change questionnaires REST API according to Rename QuestionnaireLevel to the new design

parent e91192ec
No related branches found
No related tags found
No related merge requests found
Showing
with 264 additions and 148 deletions
......@@ -43,7 +43,7 @@ public class Question {
private List<QuestionChoice> choices = new ArrayList<>();
@ManyToMany(mappedBy = "questions", fetch = FetchType.LAZY)
private Set<QuestionnairePhaseRelation> questionnairePhaseRelations = new HashSet<>();
private Set<QuestionPhaseRelation> questionPhaseRelations = new HashSet<>();
public Long getId() {
return id;
......@@ -93,15 +93,15 @@ public class Question {
this.choices = choices;
}
public Set<QuestionnairePhaseRelation> getQuestionPhaseRelations() {
return Collections.unmodifiableSet(questionnairePhaseRelations);
public Set<QuestionPhaseRelation> getQuestionPhaseRelations() {
return Collections.unmodifiableSet(questionPhaseRelations);
}
public void setQuestionPhaseRelations(Set<QuestionnairePhaseRelation> questionnairePhaseRelations) {
this.questionnairePhaseRelations = questionnairePhaseRelations;
public void setQuestionPhaseRelations(Set<QuestionPhaseRelation> questionPhaseRelations) {
this.questionPhaseRelations = questionPhaseRelations;
}
public void addQuestionPhaseRelation(QuestionnairePhaseRelation questionnairePhaseRelation) {
this.questionnairePhaseRelations.add(questionnairePhaseRelation);
public void addQuestionPhaseRelation(QuestionPhaseRelation questionPhaseRelation) {
this.questionPhaseRelations.add(questionPhaseRelation);
}
}
......@@ -13,7 +13,7 @@ import javax.persistence.ManyToOne;
import java.util.Set;
@Entity
public class QuestionnairePhaseRelation {
public class QuestionPhaseRelation {
@Id
@GeneratedValue
......@@ -26,7 +26,7 @@ public class QuestionnairePhaseRelation {
private QuestionnairePhase relatedPhase;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(name = "questionnaire_phase_relation_question",
@JoinTable(name = "question_phase_relation_question",
joinColumns = @JoinColumn(name = "question_phase_id"),
inverseJoinColumns = @JoinColumn(name = "question_id")
)
......
......@@ -23,7 +23,7 @@ public class QuestionnairePhase extends AbstractPhase {
@OrderBy
@OneToMany(mappedBy = "relatedPhase", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<QuestionnairePhaseRelation> questionnairePhaseRelations;
private List<QuestionPhaseRelation> questionPhaseRelations;
public List<Question> getQuestions() {
return questions;
......@@ -41,11 +41,11 @@ public class QuestionnairePhase extends AbstractPhase {
this.questionnaireType = questionnaireType;
}
public List<QuestionnairePhaseRelation> getQuestionnairePhaseRelations() {
return questionnairePhaseRelations;
public List<QuestionPhaseRelation> getQuestionPhaseRelations() {
return questionPhaseRelations;
}
public void setQuestionnairePhaseRelations(List<QuestionnairePhaseRelation> questionnairePhaseRelations) {
this.questionnairePhaseRelations = questionnairePhaseRelations;
public void setQuestionPhaseRelations(List<QuestionPhaseRelation> questionPhaseRelations) {
this.questionPhaseRelations = questionPhaseRelations;
}
}
package com.example.demo.dto;
import com.example.demo.enums.QuestionType;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
public abstract class AbstractQuestionDto implements Serializable {
@ApiModelProperty(value = "Order of question", required = true, example = "0")
@NotNull(message = "Question order must be specified")
private int order;
@ApiModelProperty(value = "The question that will be displayed to a player", required = true, example = "What's the capital of Canada?")
@NotEmpty(message = "Text of question must not be blank")
private String text;
@ApiModelProperty(value = "It defines the type of the question", allowableValues = "FFQ, MCQ, RFQ", required = true, example = "MCQ")
@NotNull(message = "Question type must be specified")
private QuestionType type;
@ApiModelProperty(value = "Choices that are distributed with the question", required = true)
private List<QuestionChoiceDto> choices;
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public QuestionType getType() {
return type;
}
public void setType(QuestionType type) {
this.type = type;
}
public List<QuestionChoiceDto> getChoices() {
return choices;
}
public void setChoices(List<QuestionChoiceDto> choices) {
this.choices = choices;
}
}
package com.example.demo.dto;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
public class QuestionChoiceDto implements Serializable {
@ApiModelProperty(value = "Question choice ID. Leave blank if new choice is added", required = true, example = "1")
private Long id;
@ApiModelProperty(value = "Short description of question choice", required = true, example = "An answer")
@NotEmpty(message = "Task title must not be blank")
private String text;
private boolean correct;
@ApiModelProperty(value = "It defines whether this answer is correct or not", required = true, example = "true")
@NotNull(message = "It must be specified whether a question choice is correct")
private Boolean correct;
@ApiModelProperty(value = "Order of question choice", required = true, example = "0")
@NotNull(message = "Question choice order must be specified")
private Integer order;
public Long getId() {
......@@ -25,11 +39,11 @@ public class QuestionChoiceDto implements Serializable {
this.text = text;
}
public boolean isCorrect() {
public Boolean isCorrect() {
return correct;
}
public void setCorrect(boolean correct) {
public void setCorrect(Boolean correct) {
this.correct = correct;
}
......
package com.example.demo.dto;
public class QuestionChoiceUpdateDto {
private Long id;
private String text;
private boolean correct;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isCorrect() {
return correct;
}
public void setCorrect(boolean correct) {
this.correct = correct;
}
@Override
public String toString() {
return "QuestionChoiceUpdateDto{" +
"id=" + id +
", text='" + text + '\'' +
", correct=" + correct +
'}';
}
}
package com.example.demo.dto;
import com.example.demo.enums.QuestionType;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.List;
public class QuestionDto implements Serializable {
public class QuestionDto extends AbstractQuestionDto implements Serializable {
@ApiModelProperty(value = "Question ID. Leave blank if a new question is added", required = true, example = "1")
private Long id;
private QuestionType questionType;
private String text;
private Integer points;
private Integer penalty;
private boolean required;
private Integer order;
private List<QuestionChoiceDto> choices;
private List<Long> relatedPhasesId;
public Long getId() {
return id;
}
......@@ -25,68 +16,4 @@ public class QuestionDto implements Serializable {
public void setId(Long id) {
this.id = id;
}
public QuestionType getQuestionType() {
return questionType;
}
public void setQuestionType(QuestionType questionType) {
this.questionType = questionType;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Integer getPoints() {
return points;
}
public void setPoints(Integer points) {
this.points = points;
}
public Integer getPenalty() {
return penalty;
}
public void setPenalty(Integer penalty) {
this.penalty = penalty;
}
public boolean isRequired() {
return required;
}
public void setRequired(boolean required) {
this.required = required;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public List<QuestionChoiceDto> getChoices() {
return choices;
}
public void setChoices(List<QuestionChoiceDto> choices) {
this.choices = choices;
}
public List<Long> getRelatedPhasesId() {
return relatedPhasesId;
}
public void setRelatedPhasesId(List<Long> relatedPhasesId) {
this.relatedPhasesId = relatedPhasesId;
}
}
package com.example.demo.dto;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.Set;
public class QuestionPhaseRelationDto {
@ApiModelProperty(value = "Question-Phase relation ID. Leave blank if a new one is added", required = true, example = "1")
private Long id;
@ApiModelProperty(value = "Order of question", required = true, example = "0")
@NotNull(message = "Question order must be specified")
private Integer order;
@Valid
@ApiModelProperty(value = "Set of questions related to the specified questionnaire")
private Set<QuestionRequiredIdDto> questions;
@ApiModelProperty(value = "Percentage that defines whether a player was successful or not ", required = true, example = "50")
@Min(value = 0, message = "Success rate must not be lower than 0 %")
@Max(value = 100, message = "Success rate must not be higher than 100 %")
private int successRate;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getOrder() {
return order;
}
public void setOrder(Integer order) {
this.order = order;
}
public Set<QuestionRequiredIdDto> getQuestions() {
return questions;
}
public void setQuestions(Set<QuestionRequiredIdDto> questions) {
this.questions = questions;
}
public int getSuccessRate() {
return successRate;
}
public void setSuccessRate(int successRate) {
this.successRate = successRate;
}
}
package com.example.demo.dto;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
public class QuestionRequiredIdDto extends AbstractQuestionDto {
@ApiModelProperty(value = "Question ID. Leave blank if a new question is added", required = true, example = "1")
@NotNull(message = "Question ID must be specified")
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
package com.example.demo.dto;
import com.example.demo.enums.QuestionnaireType;
import java.util.List;
public class QuestionnairePhaseDto extends AbstractPhaseDto {
private List<QuestionDto> questions;
private QuestionnaireType questionnaireType;
private List<QuestionPhaseRelationDto> phaseRelations;
public List<QuestionDto> getQuestions() {
return questions;
......@@ -13,4 +17,20 @@ public class QuestionnairePhaseDto extends AbstractPhaseDto {
public void setQuestions(List<QuestionDto> questions) {
this.questions = questions;
}
public QuestionnaireType getQuestionnaireType() {
return questionnaireType;
}
public void setQuestionnaireType(QuestionnaireType questionnaireType) {
this.questionnaireType = questionnaireType;
}
public List<QuestionPhaseRelationDto> getPhaseRelations() {
return phaseRelations;
}
public void setPhaseRelations(List<QuestionPhaseRelationDto> phaseRelations) {
this.phaseRelations = phaseRelations;
}
}
package com.example.demo.dto;
import com.example.demo.enums.QuestionnaireType;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
public class QuestionnaireUpdateDto {
private Long id;
@ApiModelProperty(value = "Title of questionnaire", required = true, example = "Entrance test")
@NotEmpty(message = "Questionnaire title must not be blank")
private String title;
public Long getId() {
return id;
}
@ApiModelProperty(value = "Type of questionnaire", required = true, allowableValues = "ADAPTIVE, GENERAL", example = "ADAPTIVE")
@NotNull(message = "Questionnaire type must be specified")
private QuestionnaireType questionnaireType;
public void setId(Long id) {
this.id = id;
}
@Valid
@ApiModelProperty(value = "Questions in the questionnaire", required = true)
private List<QuestionDto> questions;
@Valid
@ApiModelProperty(value = "The relation between questions in the questionnaire and phases in the training definition", required = true)
private List<QuestionPhaseRelationDto> phaseRelations;
public String getTitle() {
return title;
......@@ -21,11 +34,37 @@ public class QuestionnaireUpdateDto {
this.title = title;
}
public QuestionnaireType getQuestionnaireType() {
return questionnaireType;
}
public void setQuestionnaireType(QuestionnaireType questionnaireType) {
this.questionnaireType = questionnaireType;
}
public List<QuestionDto> getQuestions() {
return questions;
}
public void setQuestions(List<QuestionDto> questions) {
this.questions = questions;
}
public List<QuestionPhaseRelationDto> getPhaseRelations() {
return phaseRelations;
}
public void setPhaseRelations(List<QuestionPhaseRelationDto> phaseRelations) {
this.phaseRelations = phaseRelations;
}
@Override
public String toString() {
return "QuestionnaireUpdateDto{" +
"id=" + id +
", title='" + title + '\'' +
"title='" + title + '\'' +
", questionnaireType=" + questionnaireType +
", questions=" + questions +
", phaseRelations=" + phaseRelations +
'}';
}
}
......@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.PositiveOrZero;
import java.util.List;
public class TaskUpdateDto {
......
......@@ -3,6 +3,7 @@ package com.example.demo.mapper;
import com.example.demo.domain.AbstractPhase;
import com.example.demo.domain.DecisionMatrixRow;
import com.example.demo.domain.InfoPhase;
import com.example.demo.domain.QuestionPhaseRelation;
import com.example.demo.domain.QuestionnairePhase;
import com.example.demo.domain.TrainingPhase;
import com.example.demo.domain.Question;
......@@ -12,10 +13,11 @@ import com.example.demo.dto.AbstractPhaseDto;
import com.example.demo.dto.DecisionMatrixRowDto;
import com.example.demo.dto.InfoPhaseDto;
import com.example.demo.dto.InfoPhaseUpdateDto;
import com.example.demo.dto.QuestionPhaseRelationDto;
import com.example.demo.dto.QuestionRequiredIdDto;
import com.example.demo.dto.TrainingPhaseDto;
import com.example.demo.dto.TrainingPhaseUpdateDto;
import com.example.demo.dto.QuestionChoiceDto;
import com.example.demo.dto.QuestionChoiceUpdateDto;
import com.example.demo.dto.QuestionDto;
import com.example.demo.dto.QuestionUpdateDto;
import com.example.demo.dto.QuestionnairePhaseDto;
......@@ -81,19 +83,25 @@ public interface BeanMapper {
QuestionChoice toEntity(QuestionChoiceDto questionChoiceDto);
QuestionChoice toEntity(QuestionChoiceUpdateDto questionChoiceDto);
QuestionChoiceDto toDto(QuestionChoice questionChoice);
Question toEntity(QuestionDto questionDto);
Question toEntity(QuestionRequiredIdDto questionDto);
Question toEntity(QuestionUpdateDto questionUpdateDto);
QuestionDto toDto(Question question);
@Mapping(target = "questionPhaseRelations", source = "phaseRelations")
QuestionnairePhase toEntity(QuestionnaireUpdateDto questionnaireUpdateDto);
QuestionnairePhase toEntity(QuestionnairePhaseDto questionnairePhaseDto);
@Mapping(target = "phaseRelations", source = "questionPhaseRelations")
QuestionnairePhaseDto toDto(QuestionnairePhase questionnairePhase);
QuestionPhaseRelation toEntity(QuestionPhaseRelationDto questionnairePhaseDto);
QuestionPhaseRelationDto toDto(QuestionPhaseRelation questionnairePhase);
}
package com.example.demo.service;
import com.example.demo.domain.Question;
import com.example.demo.domain.QuestionnairePhase;
import com.example.demo.dto.QuestionnairePhaseDto;
import com.example.demo.dto.QuestionnaireUpdateDto;
......@@ -10,6 +11,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Optional;
......@@ -68,7 +70,16 @@ public class QuestionnairePhaseService {
questionnairePhase.setTrainingDefinitionId(persistedQuestionnairePhase.getTrainingDefinitionId());
questionnairePhase.setOrder(persistedQuestionnairePhase.getOrder());
// TODO questions, their choices and realtions among questions and training phases must be set here
if (!CollectionUtils.isEmpty(questionnairePhase.getQuestionPhaseRelations())) {
questionnairePhase.getQuestionPhaseRelations().forEach(x -> x.setRelatedPhase(questionnairePhase));
}
if (!CollectionUtils.isEmpty(questionnairePhase.getQuestions())) {
questionnairePhase.getQuestions().forEach(x -> x.setQuestionnairePhase(questionnairePhase));
for (Question question : questionnairePhase.getQuestions()) {
question.getChoices().forEach(x -> x.setQuestion(question));
}
}
QuestionnairePhase savedEntity = questionnairePhaseRepository.save(questionnairePhase);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment