NonApprovedEventsRestController.java

package sk.iway.iwcm.components.calendar.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.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.common.CloudToolsForCore;
import sk.iway.iwcm.components.calendar.jpa.CalendarTypesEntity;
import sk.iway.iwcm.components.calendar.jpa.CalendarTypesRepository;
import sk.iway.iwcm.components.calendar.jpa.NonApprovedEventEntity;
import sk.iway.iwcm.components.calendar.jpa.NonApprovedEventsRepository;
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.NotifyBean;
import sk.iway.iwcm.system.datatable.NotifyBean.NotifyType;

@RestController
@RequestMapping("/admin/rest/calendar/non-approved-events")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_calendar')")
@Datatable
public class NonApprovedEventsRestController extends DatatableRestControllerV2<NonApprovedEventEntity, Long> {

    private final NonApprovedEventsRepository nonApprovedEventsRepository;
    private final CalendarTypesRepository calendarTypesRepository;
    private static final String TYPE_ID = "typeId";

    @Autowired
    public NonApprovedEventsRestController(NonApprovedEventsRepository nonApprovedEventsRepository, CalendarTypesRepository calendarTypesRepository) {
        super(nonApprovedEventsRepository);
        this.nonApprovedEventsRepository = nonApprovedEventsRepository;
        this.calendarTypesRepository = calendarTypesRepository;
    }

    @Override
    public Page<NonApprovedEventEntity> getAllItems(Pageable pageable) {
        DatatablePageImpl<NonApprovedEventEntity> page = new DatatablePageImpl<>( super.getAllItemsIncludeSpecSearch(new NonApprovedEventEntity(), pageable) );

        List<CalendarTypesEntity> calendarTypes = calendarTypesRepository.findAllByDomainId(CloudToolsForCore.getDomainId());
        for(CalendarTypesEntity type : calendarTypes) {
            page.addOption(TYPE_ID, type.getName(), type.getId().toString(), false);
        }

        return page;
    }

    @Override
    public void addSpecSearch(Map<String, String> params, List<Predicate> predicates, Root<NonApprovedEventEntity> root, CriteriaBuilder builder) {
        super.addSpecSearch(params, predicates, root, builder);

        List<Integer> approvingTypes = calendarTypesRepository.getTypeIdsByApproverAndDomain(getUser().getUserId(), CloudToolsForCore.getDomainId());

        if(approvingTypes.isEmpty()) //Set unreal value -> return nothing
            predicates.add(builder.equal(root.get(TYPE_ID), -1));
        else {
            predicates.add(root.get(TYPE_ID).in(approvingTypes));
            predicates.add(builder.equal(root.get("approve"), -1)); //Approve = -1 -> waiting for approval
        }
    }

    //Needed for DatatableRestControllerV2 -> when calling action from FE
    @Override
    public NonApprovedEventEntity getOneItem(long id) {
        if(id < 1) throwError("");

        return nonApprovedEventsRepository.findFirstByIdAndDomainId(id, CloudToolsForCore.getDomainId()).orElse(null);
    }

    @Override
    public boolean processAction(NonApprovedEventEntity entity, String action) {
        if ("approveEvent".equals(action)) {
            //Approve
            int updatedRow = nonApprovedEventsRepository.updateApprove(entity.getId(), 1, CloudToolsForCore.getDomainId());

            if(updatedRow == 1) {
                addNotify(new NotifyBean(getProp().getText("calendar.approve_event_action"), getProp().getText("calendar.approve_event_action_success", entity.getTitle()), NotifyType.SUCCESS, 15000));
            } else {
                addNotify(new NotifyBean(getProp().getText("calendar.approve_event_action"), getProp().getText("calendar.approve_event_action_failed", entity.getTitle()), NotifyType.ERROR, 15000));
            }

            return true;
        } else if ("rejectEvent".equals(action)) {
            //Reject (dis-approve)
            int updatedRow = nonApprovedEventsRepository.updateApprove(entity.getId(), 0, CloudToolsForCore.getDomainId());

            if(updatedRow == 1) {
                addNotify(new NotifyBean(getProp().getText("calendar.disapprove_event_action"), getProp().getText("calendar.disapprove_event_action_success", entity.getTitle()), NotifyType.SUCCESS, 15000));
            } else {
                addNotify(new NotifyBean(getProp().getText("calendar.disapprove_event_action"), getProp().getText("calendar.disapprove_event_action_failed", entity.getTitle()), NotifyType.ERROR, 15000));
            }

            return true;
        }

        //Uknown action
        return false;
    }
}