QuizResultRestController.java

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

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import sk.iway.iwcm.Tools;
import sk.iway.iwcm.components.quiz.jpa.QuizResultEntity;
import sk.iway.iwcm.components.quiz.jpa.QuizResultRepository;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;

@RestController
@RequestMapping("/admin/rest/quiz/result")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_quiz')")
@Datatable
public class QuizResultRestController extends DatatableRestControllerV2<QuizResultEntity, Long> {
    
    private final QuizResultRepository quizResultRepository;

    @Autowired
    public QuizResultRestController(QuizResultRepository quizResultRepository) {
        super(quizResultRepository);
        this.quizResultRepository = quizResultRepository;
    }

    @Override
    public Page<QuizResultEntity> getAllItems(Pageable pageable) { 
        Integer quizId = Tools.getIntValue(getRequest().getParameter("quizId"), -1);
        //-userId questions that are made under quiz, that is not saved yet
        if(quizId == -1) quizId = -getUser().getUserId();
        DatatablePageImpl<QuizResultEntity> page = new DatatablePageImpl<>( quizResultRepository.findAllByQuizId(quizId) );
        return page;
    }

    @Override
    public void beforeSave(QuizResultEntity entity) { 
        //CREATE
        if(entity.getId() == null || entity.getId() < 1) { 
            //If quizId == null -> new quiz (tmp set -userId)
            if(entity.getQuizId() == null) entity.setQuizId( -getUser().getUserId() );

            //set sortOrder (position) as MAX(sortOrder) + 1
            Optional<QuizResultEntity> qr = quizResultRepository.findTopByQuizIdOrderByPositionDesc( entity.getQuizId() );
            if(qr.isPresent()) entity.setPosition( qr.get().getSortOrder() + 10 );
            else entity.setPosition( 10 );
        }
    }
}