TemplatesController.java

package sk.iway.iwcm.components.templates;

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

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.Constants;
import sk.iway.iwcm.InitServlet;
import sk.iway.iwcm.LabelValueDetails;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.admin.layout.LayoutService;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.components.template_groups.TemplateGroupsService;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.doc.DocDetails;
import sk.iway.iwcm.doc.TemplateDetailEditorFields;
import sk.iway.iwcm.doc.TemplateDetails;
import sk.iway.iwcm.doc.TemplatesDB;
import sk.iway.iwcm.editor.service.WebpagesService;
import sk.iway.iwcm.system.datatable.Datatable;
import sk.iway.iwcm.system.datatable.DatatablePageImpl;
import sk.iway.iwcm.system.datatable.DatatableRestControllerAvailableGroups;

@RestController
@Datatable
@RequestMapping(value = "/admin/rest/templates/temps-list")
@PreAuthorize(value = "@WebjetSecurityService.hasPermission('menuTemplates')")
public class TemplatesController extends DatatableRestControllerAvailableGroups<TemplateDetails, Long> {

    private final TemplateDetailsService templateDetailsService;
    private final TemplateGroupsService templateGroupsService;

    @Autowired
    public TemplatesController(TemplateDetailsService templateDetailsService, TemplateGroupsService templateGroupsService) {
        super(null, "tempId", "availableGroups");
        this.templateDetailsService = templateDetailsService;
        this.templateGroupsService = templateGroupsService;
    }

    @Override
    public Page<TemplateDetails> getAllItems(Pageable pageable) {
        DatatablePageImpl<TemplateDetails> page = new DatatablePageImpl<>(templateDetailsService.getAllTemplateDetails(getUser()));
        LayoutService ls = new LayoutService(getRequest());
        WebpagesService ws = new WebpagesService(-1, getUser(), getProp(), getRequest());
        List<DocDetails> headerFooterDocs = ws.addEmptyDoc(ws.getHeaderList(false), -1);
        List<DocDetails> menuDocs = ws.addEmptyDoc(ws.getMenuList(false), -1);

        List<DocDetails> headerFooterMenuDocs = ws.getHeaderFooterMenuList(false);

        for (TemplateDetails temp : page.getContent()) {
            checkDocInList(headerFooterDocs, temp.getHeaderDocId());
            checkDocInList(headerFooterDocs, temp.getFooterDocId());

            checkDocInList(menuDocs, temp.getMenuDocId());
            checkDocInList(menuDocs, temp.getRightMenuDocId());

            checkDocInList(headerFooterMenuDocs, temp.getObjectADocId());
            checkDocInList(headerFooterMenuDocs, temp.getObjectBDocId());
            checkDocInList(headerFooterMenuDocs, temp.getObjectCDocId());
            checkDocInList(headerFooterMenuDocs, temp.getObjectDDocId());

            //Init editor fields
            if(temp.getEditorFields() == null) temp.setEditorFields(new TemplateDetailEditorFields());
        }

        page.addOption("editorFields.mergeToTempId", "", "-1", null);
        page.addOptions("editorFields.mergeToTempId", page.getContent(), "tempName", "tempId", false);

        page.addOptions("lng", ls.getLanguages(false, true), "label", "value", false);
        page.addOptions("templatesGroupId", templateGroupsService.getTemplateGroups(getUser()), "name", "templatesGroupId", false);
        page.addOptions("headerDocId,footerDocId", headerFooterDocs, "title", "docId", false);
        page.addOptions("menuDocId,rightMenuDocId", menuDocs, "title", "docId", false);
        page.addOptions("objectADocId,objectBDocId,objectCDocId,objectDDocId", ws.addEmptyDoc(headerFooterMenuDocs, -1), "title", "docId", false);

        List<LabelValueDetails> inlineEditingModes = new ArrayList<>();
        inlineEditingModes.add(new LabelValueDetails(getProp().getText("template.inline_editing_mode.byTemplateGroup"), ""));
        for (LabelValueDetails lvd : templateGroupsService.getInlineEditors(getProp())) {
            String mode = lvd.getValue();
            if (Tools.isEmpty(mode)) mode="default"; //we must distinguish between byTemplateGroup and default
            inlineEditingModes.add(new LabelValueDetails(lvd.getLabel(), mode));
        }
        page.addOptions("inlineEditingMode", inlineEditingModes, "label", "value", false);
        return page;
    }

    /**
     * Overi ci v zozname je dane docId, ak nie, prida (aby sa nestalo, ze nemame vo vyberovom poli danu stranku)
     * @param list
     * @param docId
     */
    private void checkDocInList(List<DocDetails> list, int docId)
    {
        if (docId<1) return;

        boolean docFound = false;
        for (DocDetails doc : list)
        {
            if (doc.getDocId()==docId)
            {
                docFound = true;
                break;
            }
        }

        if (docFound == false)
        {
            DocDetails doc = DocDB.getInstance().getBasicDocDetails(docId, false);
            if (doc != null)
            {
                list.add(0, doc);
            }
        }
    }

    @Override
    public TemplateDetails insertItem(TemplateDetails templateDetails) {
        if (null == templateDetails) {
            throw new IllegalArgumentException("TemplateDetailsDto cannot be null.");
        }
        //reload options in editor
        setForceReload(true);

        return templateDetailsService.insertTemplateDetail(templateDetails);
    }

    //
    @Override
    public TemplateDetails editItem(TemplateDetails templateDetails, long id) {

        //Check if we want merge templates
        TemplateDetailEditorFields ef = templateDetails.getEditorFields();
        if(id > 0 && ef != null && ef.getMergeToTempId() > 0 && ef.isMergeTemplates()) {
            //Check loop error
            if(id == ef.getMergeToTempId()) throw new IllegalArgumentException(getProp().getText("template.temps-list.loop_error"));

            templateDetailsService.mergeTemplate(id, ef.getMergeToTempId());
            //Refresh
            setForceReload(true);
            return null;
        }

        return templateDetailsService.editTemplateDetail(templateDetails, id);
    }

    @Override
    public boolean deleteItem(TemplateDetails entity, long id) {
        boolean deleted = templateDetailsService.deleteTemplateDetails(id);
        return deleted;
    }

    @Override
    public void beforeSave(TemplateDetails entity) {
        //in multiweb set at least root group as available group for template
        if (InitServlet.isTypeCloud() && CloudToolsForCore.isControllerDomain()==false && "cloud".equals(Constants.getInstallName())==false) {
      	    if (Tools.isEmpty(entity.getAvailableGroups())) entity.setAvailableGroups(CloudToolsForCore.getRootGroupIds());
        }
    }

    @Override
    public TemplateDetails getOneItem(long id) {
        if (id < 1) return new TemplateDetails();
        TemplateDetails old = TemplatesDB.getInstance().getTemplate((int)id);
        if (old == null) return new TemplateDetails();

        List<TemplateDetails> list = new ArrayList<>();
        list.add(old);
        list = templateDetailsService.filterByCurrentDomainAndUser(getUser(), list);
        if (list.isEmpty()) return null;

        return old;
    }

    @GetMapping("/autocomplete")
    public List<String> getAutocomplete(@RequestParam String term, @RequestParam(required = false, name="DTE_Field_templatesGroupId") Integer templatesGroupId, @RequestParam(required = false, name="DTE_Field_templateInstallName") String installName) {
        List<String> forwards = templateDetailsService.getTemplateForwards(installName, templatesGroupId, term);
        return forwards;
    }
}