SuggestEventsRestController.java

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

import java.util.Calendar;
import java.util.Date;
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.SuggestEventEntity;
import sk.iway.iwcm.components.calendar.jpa.SuggestEventsRepository;
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-suggest-events")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_calendar')")
@Datatable
public class SuggestEventsRestController extends DatatableRestControllerV2<SuggestEventEntity, Long> {

    private final SuggestEventsRepository suggestEventsRepository;
    private final CalendarTypesRepository calendarTypesRepository;

    @Autowired
    public SuggestEventsRestController(SuggestEventsRepository suggestEventsRepository, CalendarTypesRepository calendarTypesRepository) {
        super(suggestEventsRepository);
        this.suggestEventsRepository = suggestEventsRepository;
        this.calendarTypesRepository = calendarTypesRepository;
    }

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

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

        return page;
    }

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

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);

        predicates.add(builder.greaterThanOrEqualTo(root.get("dateFrom"), cal.getTime())); //Only future events

        predicates.add(builder.equal(root.get("approve"), 1)); //Only approved events
    }

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

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

    @Override
    public boolean processAction(SuggestEventEntity entity, String action) {
        if ("suggestEvent".equals(action)) {
            //Approve
            int updatedRow = suggestEventsRepository.updateSuggest(entity.getId(), true, CloudToolsForCore.getDomainId());

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

            return true;
        } else if ("notSuggestEvent".equals(action)) {
            //Reject (dis-approve)
            int updatedRow = suggestEventsRepository.updateSuggest(entity.getId(), false, CloudToolsForCore.getDomainId());

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

            return true;
        }

        //Uknown action
        return false;
    }
}