GdprSearchRestController.java

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

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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.components.gdpr.GdprModule;
import sk.iway.iwcm.components.gdpr.GdprSearchEntity;
import sk.iway.iwcm.components.gdpr.model.GdprRegExpBean;
import sk.iway.iwcm.components.gdpr.model.GdprResult;
import sk.iway.iwcm.components.gdpr.model.GdprResults;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;

/**
 * Vyhladavanie v aplikaciach/moduloch pre GDPR
 */
@RestController
@RequestMapping("/admin/rest/gdpr/search")
@PreAuthorize("@WebjetSecurityService.hasPermission('menuGDPRregexp')")
@Datatable
public class GdprSearchRestController extends DatatableRestControllerV2<GdprSearchEntity, Long>{

    @Autowired
    public GdprSearchRestController() {
        super(null);
    }

    @Override
    public Page<GdprSearchEntity> getAllItems(Pageable pageable) {
        //all vracia prazdny zoznam, az spustenie vyhladavania findByColumns nieco realne vykona

        List<GdprSearchEntity> items = new ArrayList<>();
        return new DatatablePageImpl<>(items);
    }

    @Override
    public Page<GdprSearchEntity> searchItem(Map<String, String> params, Pageable pageable, GdprSearchEntity entity) {

        List<GdprRegExpBean> regexps;
        List<GdprModule> modules = new ArrayList<>();
        List<GdprSearchEntity> searchList = new ArrayList<>();

        //We will search default in all modules
        modules.add(GdprModule.WEB_STRANKY);
        modules.add(GdprModule.FORMULARE);
        modules.add(GdprModule.QA);
        modules.add(GdprModule.FORUM);

        //Get filtring param searchValue
        String searchValue = params.get("searchValue");

        //Set regexp (searchValue is used as regexp value and also regexp name)
        regexps = new ArrayList<>();
        GdprRegExpBean gdprBean = new GdprRegExpBean();
        gdprBean.setRegexpValue(searchValue);
        gdprBean.setRegexpName(searchValue);
        regexps.add(gdprBean);

        //Fill result list for every module
        GdprResults results = new GdprResults();
        for (GdprModule module : modules) {

            //Find regexps for specific modul
            //Result list format is Map<GdprModule, List<GdprResult>>
            results.put(module, module.getDB().search(regexps, getRequest()));
        }

        //Loop all moduls
        for(GdprModule module : modules) {

            //For modul get list of GdprResult from result(Map<GdprModule, List<GdprResult>>)
            List<GdprResult> list = results.get(module);

            //Call getModuleName proc to obtain modul name from translation-key text
            String moduleName = getModuleName(module);

            //Loop list of returned GdprResult entities
            for(GdprResult listEntity : list) {

                //Create temporal GdprSearchEntity and copy value from original GdprResult entity to temporal GdprSearchEntity
                GdprSearchEntity tmp = new GdprSearchEntity();

                tmp.setId( Long.valueOf(listEntity.getId()) );
                tmp.setName(listEntity.getName());
                tmp.setModul(moduleName);
                tmp.setValue(listEntity.getText());

                String url = listEntity.getLink();
                if (url.startsWith("/admin/formlist.do")) {
                    url = "/apps/form/admin/?id="+listEntity.getId()+"#/detail/"+listEntity.getName();
                } else if (url.startsWith("/components/qa/admin_answer.jsp")) {
                    url = "/apps/qa/admin/?id="+listEntity.getId();
                } else if (url.startsWith("/admin/webpages")) {
                    url = "/admin/v9/webpages/web-pages-list/?docid="+listEntity.getId();
                }

                tmp.setUrl(url);

                //This  temporal GdprSearchEntity add inside searchList
                searchList.add(tmp);
            }
        }

        //Convert searchList into page and return it
        DatatablePageImpl<GdprSearchEntity> page;
        page = new DatatablePageImpl<>(searchList);

        for (GdprModule module : modules) {
            String name = getModuleName(module);
            page.addOption("modul", name, name, null);
        }

        return page;
    }

    //Return translation-key text, of set proc param (GdprModule)
    String getModuleName(GdprModule modul) {

        Prop prop = Prop.getInstance();

        if(modul == GdprModule.WEB_STRANKY) {
            return prop.getText("components.gdpr.search.module.web_stranky");
        } else if(modul == GdprModule.FORMULARE) {
            return prop.getText("components.gdpr.search.module.forms");
        } else if(modul == GdprModule.QA) {
            return prop.getText("components.gdpr.search.module.qa");
        } else if(modul == GdprModule.FORUM) {
            return prop.getText("components.gdpr.search.module.forum");
        }

        return "";
    }


    //Bonus security
    //Preventing user from editing/inserting/deleting entity
    @Override
	public GdprSearchEntity editItem(GdprSearchEntity entity, long logId) {
		throwError("datatables.error.recordIsNotEditable");
        return null;
	}

    @Override
	public GdprSearchEntity insertItem(GdprSearchEntity entity) {
		throwError("datatables.error.recordIsNotEditable");
        return null;
	}

	@Override
    public boolean beforeDelete(GdprSearchEntity entity) {
        return false;
    }
}