InquiryStatRestController.java
package sk.iway.iwcm.components.inquiry.rest;
import java.util.List;
import java.util.Map;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.json.JSONObject;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.components.inquiry.jpa.InquiryAnswerRepository;
import sk.iway.iwcm.components.inquiry.jpa.InquiryRepository;
import sk.iway.iwcm.components.inquiry.jpa.InquiryUsersVoteEntity;
import sk.iway.iwcm.components.inquiry.jpa.InquiryUsersVoteRepository;
import sk.iway.iwcm.components.users.userdetail.UserDetailsRepository;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;
import sk.iway.iwcm.system.datatable.json.LabelValueInteger;
@RestController
@RequestMapping("/admin/rest/inquiry-stat")
@PreAuthorize("@WebjetSecurityService.hasPermission('menuInquiry')")
@Datatable
public class InquiryStatRestController extends DatatableRestControllerV2<InquiryUsersVoteEntity, Long> {
private final InquiryRepository ir;
private final InquiryAnswerRepository iar;
private final InquiryUsersVoteRepository iuvr;
private final UserDetailsRepository udr;
@Autowired
public InquiryStatRestController(InquiryUsersVoteRepository iuvr, InquiryRepository ir, InquiryAnswerRepository iar, UserDetailsRepository udr) {
super(iuvr);
this.ir = ir;
this.iar = iar;
this.iuvr = iuvr;
this.udr = udr;
}
@Override
public Page<InquiryUsersVoteEntity> getAllItems(Pageable pageable) {
Page<InquiryUsersVoteEntity> page = super.getAllItemsIncludeSpecSearch(new InquiryUsersVoteEntity(), null);
int questionId = Tools.getIntValue(getRequest().getParameter(InquiryStatService.QUESTION_ID), -1);
return InquiryStatService.getPreparedPage(questionId, page, iar, iuvr, udr);
}
@Override
public void addSpecSearch(Map<String, String> params, List<Predicate> predicates, Root<InquiryUsersVoteEntity> root, CriteriaBuilder builder) {
InquiryStatService.getTableData(params, predicates, root, builder);
super.addSpecSearch(params, predicates, root, builder);
}
@Override
public Page<InquiryUsersVoteEntity> searchItem(Map<String, String> params, Pageable pageable, InquiryUsersVoteEntity search) {
Page<InquiryUsersVoteEntity> page = super.searchItem(params, pageable, search);
int questionId = Tools.getIntValue(getRequest().getParameter(InquiryStatService.QUESTION_ID), -1);
return InquiryStatService.getPreparedPage(questionId, page, iar, iuvr, udr);
}
@GetMapping(value = "/supportValues", produces = "application/json; charset=UTF-8")
public String getStatSupportValues(@RequestParam Long questionId) {
JSONObject statSupportValues = new JSONObject();
//Question text
statSupportValues.put("questionText", ir.getQuestionTextById(questionId));
//Answers
statSupportValues.put("answers", InquiryStatService.getPreparedAnswers(questionId, iar));
//Users that answered (voted)
statSupportValues.put("users", InquiryStatService.getPrepareUsersNames(questionId, iuvr, udr));
return statSupportValues.toString();
}
@RequestMapping(
value="/pieChartData",
params={InquiryStatService.QUESTION_ID, InquiryStatService.DAY_DATE, InquiryStatService.ANSWER_ID, InquiryStatService.USER_ID})
public List<LabelValueInteger> getPieChartData(
@RequestParam(InquiryStatService.QUESTION_ID) Long questionId,
@RequestParam(InquiryStatService.DAY_DATE) String dayDate,
@RequestParam(InquiryStatService.ANSWER_ID) Long answerId,
@RequestParam(InquiryStatService.USER_ID) Long userId ) {
//We need it as DatatablePageImpl, so we can access the options
DatatablePageImpl<InquiryUsersVoteEntity> page = new DatatablePageImpl<>( super.getAllItemsIncludeSpecSearch(new InquiryUsersVoteEntity(), null) );
return InquiryStatService.getPieChartData(page);
}
@RequestMapping(
value="/lineChartData",
params={InquiryStatService.QUESTION_ID, InquiryStatService.DAY_DATE, InquiryStatService.ANSWER_ID, InquiryStatService.USER_ID})
public Map<String, List<InquiryStatService.LineChartData>> getLineChartData(
@RequestParam(InquiryStatService.QUESTION_ID) Long questionId,
@RequestParam(InquiryStatService.DAY_DATE) String dayDate,
@RequestParam(InquiryStatService.ANSWER_ID) Long answerId,
@RequestParam(InquiryStatService.USER_ID) Long userId ) {
//We need it as DatatablePageImpl, so we can access the options
DatatablePageImpl<InquiryUsersVoteEntity> page = new DatatablePageImpl<>( super.getAllItemsIncludeSpecSearch(new InquiryUsersVoteEntity(), null) );
return InquiryStatService.getLineChartData(page, dayDate);
}
}