QuizQuestionEntity.java

package sk.iway.iwcm.components.quiz.jpa;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import lombok.Getter;
import lombok.Setter;
import sk.iway.iwcm.system.adminlog.EntityListenersType;
import sk.iway.iwcm.system.datatable.DataTableColumnType;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumn;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditor;
import sk.iway.iwcm.system.datatable.annotations.DataTableColumnEditorAttr;
import sk.iway.iwcm.system.jpa.AllowHtmlAttributeConverter;
import sk.iway.iwcm.system.jpa.AllowSafeHtmlAttributeConverter;

@Entity
@Table(name = "quiz_questions")
@Getter
@Setter
@EntityListeners(sk.iway.iwcm.system.adminlog.AuditEntityListener.class)
@EntityListenersType(sk.iway.iwcm.Adminlog.TYPE_QUIZ)
public class QuizQuestionEntity implements Serializable {
    
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "S_quiz_questions")
    @DataTableColumn(inputType = DataTableColumnType.ID, title="ID")
    private Long id;

    @Column(name = "question")
	@NotBlank
    @DataTableColumn(
        inputType = DataTableColumnType.OPEN_EDITOR,
        title = "components.quiz.statistics.table.question",
        editor = {
			@DataTableColumnEditor(
				type = "quill"
			)
		}
    )
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    @Size(max = 500)
    private String question;

    @Column(name = "right_answer")
    @DataTableColumn(
        inputType = DataTableColumnType.SELECT,
        title = "components.quiz.type.right_answer",
        editor = {
			@DataTableColumnEditor(
				options = {
					@DataTableColumnEditorAttr(key = "components.quiz.option_1", value = "1"),
					@DataTableColumnEditorAttr(key = "components.quiz.option_2", value = "2"),
					@DataTableColumnEditorAttr(key = "components.quiz.option_3", value = "3"),
					@DataTableColumnEditorAttr(key = "components.quiz.option_4", value = "4"),
					@DataTableColumnEditorAttr(key = "components.quiz.option_5", value = "5"),
					@DataTableColumnEditorAttr(key = "components.quiz.option_6", value = "6")
				}
			)
		}
    )
    @NotNull
	private Integer rightAnswer;

    @Column(name = "image_url")
    @DataTableColumn(inputType = DataTableColumnType.ELFINDER, 
        title = "components.quiz.result.imageUrl",
		className = "image",
		renderFormat = "dt-format-image"
	)
	@javax.persistence.Convert(converter = AllowHtmlAttributeConverter.class)
    @Size(max = 255)
    private String imageUrl;

    @Column(name = "sort_order")
    @DataTableColumn( 
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.position",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
    @NotNull
	private Integer position;

    //
        @Column(name = "quiz_id")
        @DataTableColumn( inputType = DataTableColumnType.HIDDEN )
        private Integer quizId;

        //JOIN with QuizEntity (tabel quiz)
        @ManyToOne
        @JoinColumn(name="quiz_id", insertable=false, updatable=false)
        @JsonIgnore
        private QuizEntity quiz;

    //
        @JsonIgnore
        @JsonManagedReference(value="quizQuestion")
        @OneToMany(mappedBy = "quizQuestion", fetch = FetchType.LAZY, cascade={CascadeType.ALL}, orphanRemoval = true)
        private List<QuizAnswerEntity> quizAnswers;

    //Options and rates (aka answers and points)
    @Column(name = "option1")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_1"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option1;

    @Column(name = "rate1")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_1",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
	private Integer rate1;

    @Column(name = "option2")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_2"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option2;

    @Column(name = "rate2")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_2",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
	private Integer rate2;

    @Column(name = "option3")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_3"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option3;

    @Column(name = "rate3")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_3",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
	private Integer rate3;

    @Column(name = "option4")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_4"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option4;

    @Column(name = "rate4")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_4",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
	private Integer rate4;

    @Column(name = "option5")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_5"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option5;

    @Column(name = "rate5")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_5",
        editor = {
			@DataTableColumnEditor(
				attr = { @DataTableColumnEditorAttr(key = "data-dt-field-hr", value = "after") }
			)
		}
    )
    @Min(0)
	private Integer rate5;

    @Column(name = "option6")
    @DataTableColumn(
        inputType = DataTableColumnType.QUILL,
        title = "components.quiz.option_6"
    )
    @Size(max = 255)
    @javax.persistence.Convert(converter = AllowSafeHtmlAttributeConverter.class)
    private String option6;

    @Column(name = "rate6")
    @DataTableColumn(
        inputType = DataTableColumnType.NUMBER,
        title = "components.quiz.rate_6"
    )
    @Min(0)
	private Integer rate6;

    public int getMaxRate() {
        int maxRate = 0;
        for(int i = 1; i <= 6; i++) {
            if(maxRate < getRate(i)) {
                maxRate = getRate(i);
            }
        }
        return maxRate;
    }

    public int getRate(int index) {
        Integer rate;
		switch (index) {
			case 1: rate = getRate1(); break;
			case 2: rate = getRate2(); break;
			case 3: rate = getRate3(); break;
			case 4: rate = getRate4(); break;
			case 5: rate = getRate5(); break;
			case 6: rate = getRate6(); break;
			default: return 0;
		}
        return rate == null ? 0 : rate;
	}

    public String getOption(int index) {
        switch (index) {
            case 1: return getOption1();
            case 2: return getOption2();
            case 3: return getOption3();
            case 4: return getOption4();
            case 5: return getOption5();
            case 6: return getOption6();
            default: return "";
        }
    }

    public int getSortOrder() {
        return position == null ? 0 : position;
    }
}