TemplateGroupsService.java

package sk.iway.iwcm.components.template_groups;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.FileTools;
import sk.iway.iwcm.InitServlet;
import sk.iway.iwcm.LabelValueDetails;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.components.templates.TemplateDetailsService;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.doc.TemplateDetails;
import sk.iway.iwcm.doc.TemplatesGroupBean;
import sk.iway.iwcm.doc.TemplatesGroupDB;
import sk.iway.iwcm.i18n.IwayProperties;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.i18n.PropDB;
import sk.iway.iwcm.system.ConfDB;
import sk.iway.iwcm.system.multidomain.MultiDomainFilter;
import sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UsersDB;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class TemplateGroupsService {

    TemplateDetailsService templateDetailsService;

    @Autowired
    public TemplateGroupsService(TemplateDetailsService templateDetailsService) {
        this.templateDetailsService = templateDetailsService;
    }

    List<TemplatesGroupBean> getAllTemplateGroups(HttpServletRequest request) {
        List<TemplatesGroupBean> temp = new ArrayList<>();
        String lng = getLng(request);

        IwayProperties prop = Prop.getChangedProperties(lng, "temp-group-");
        List<TemplatesGroupBean> templateGroupBeans = filterByUser(TemplatesGroupDB.getAllTemplatesGroupsWithCount(), UsersDB.getCurrentUser(request));

        for (TemplatesGroupBean item : templateGroupBeans) {
            item.setProjectName(prop.getProperty("temp-group-" + item.getId() + ".project.name"));
            item.setProjectAuthor(prop.getProperty("temp-group-" + item.getId() + ".project.author"));
            item.setProjectCopyright(prop.getProperty("temp-group-" + item.getId() + ".project.copyright"));
            item.setProjectDeveloper(prop.getProperty("temp-group-" + item.getId() + ".project.developer"));
            item.setProjectGenerator(prop.getProperty("temp-group-" + item.getId() + ".project.generator"));
            item.setProjectFieldA(prop.getProperty("temp-group-" + item.getId() + ".project.field.a"));
            item.setProjectFieldB(prop.getProperty("temp-group-" + item.getId() + ".project.field.b"));
            item.setProjectFieldC(prop.getProperty("temp-group-" + item.getId() + ".project.field.c"));
            item.setProjectFieldD(prop.getProperty("temp-group-" + item.getId() + ".project.field.d"));

            if (InitServlet.isTypeCloud()) {
                //Pre MULTIWEB mozeme zobrazit len nepriradene sablony (id=1) alebo tie, ktore zacinaju na nas domainalias
                if (item.getId() == 1 || item.getProjectName().toLowerCase().startsWith(MultiDomainFilter.getDomainAlias(DocDB.getDomain(request)))) {
                    temp.add(item);
                }
            } else {
                temp.add(item);
            }
        }

        return temp;
    }

    /**
     * If user has only perms for some folders/domains returns only template groups used in his available templates
     * @param user
     * @return
     */
    public List<TemplatesGroupBean> getTemplateGroups(UserDetails user) {
        List<TemplatesGroupBean> all = TemplatesGroupDB.getAllTemplatesGroups();
        return filterByUser(all, user);
    }

    /**
     * If user has only perms for some folders/domains show only template groups used in his available templates
     * @param all
     * @param user
     * @return
     */
    public List<TemplatesGroupBean> filterByUser(List<TemplatesGroupBean> all, UserDetails user) {
        if (Tools.isEmpty(user.getEditableGroups(true))) return all;

        if (CloudToolsForCore.isControllerDomain()) return all;

        List<TemplatesGroupBean> filtered = new ArrayList<>();

        List<TemplateDetails> temps = templateDetailsService.getAllTemplateDetails(user);
        Set<Long> tempGroupIds = new HashSet<>();
        for (TemplateDetails temp : temps) {
            tempGroupIds.add(temp.getTemplatesGroupId());
        }

        for (TemplatesGroupBean group : all) {
            if (tempGroupIds.contains(group.getId())) {
                filtered.add(group);
            }
        }

        return filtered;
    }

    TemplatesGroupBean saveTemplateGroup(TemplatesGroupBean templateGroupBean, HttpServletRequest request) {
        if (InitServlet.isTypeCloud()) {
            String domainAlias = MultiDomainFilter.getDomainAlias(DocDB.getDomain(request));
            //Pre MULTIWEB mozeme zobrazit len tie, ktore zacinaju na domainalias
            if (!templateGroupBean.getProjectName().toLowerCase().startsWith(domainAlias)) {
                templateGroupBean.setProjectName(domainAlias + "-" + templateGroupBean.getProjectName());
            }
        }

        TemplatesGroupBean optionalTemplatesGroupBean = TemplatesGroupDB.getTemplatesGroupByName(templateGroupBean.getName());
        if (null != optionalTemplatesGroupBean) {
            return null;
        }

        if (TemplatesGroupDB.getInstance().save(templateGroupBean)) {
            String prefix = "temp-group-" + templateGroupBean.getId() + ".project";
            IwayProperties iwayProperties = mapIwayProperties(templateGroupBean);
            // defaultne vytvaram novu skupinu pre vychodzi jazyk
            PropDB.save(null, iwayProperties, getLng(request), prefix, null, true);

            Prop.getInstance(true);
        }

        return templateGroupBean;
    }

    TemplatesGroupBean editTemplateGroupBean(TemplatesGroupBean templateGroupBean, long id, HttpServletRequest request) {
        String lng = getLng(request);
        templateGroupBean.setTemplatesGroupId(id);
        TemplatesGroupBean optionalTemplateGroupBean = TemplatesGroupDB.getInstance().getById(templateGroupBean.getId());
        if (null == optionalTemplateGroupBean) {
            return null;
        }

        if (templateGroupBean.save()) {
            String prefix = "temp-group-" + templateGroupBean.getId() + ".project";
            IwayProperties iwayProperties = mapIwayProperties(templateGroupBean);
            PropDB.save(null, iwayProperties, lng, prefix, null, false);

            Prop.getInstance(true);
        }

        return templateGroupBean;
    }

    boolean deleteTemplateGroupBean(long id) {
        String prefixForDelete = "temp-group-" + id + ".project";
        if (TemplatesGroupDB.delete(id)) {
            new SimpleQuery().execute("DELETE FROM " + ConfDB.PROPERTIES_TABLE_NAME + " WHERE prop_key IN (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                    prefixForDelete + ".name",
                    prefixForDelete + ".author",
                    prefixForDelete + ".copyright",
                    prefixForDelete + ".developer",
                    prefixForDelete + ".generator",
                    prefixForDelete + ".field.a",
                    prefixForDelete + ".field.b",
                    prefixForDelete + ".field.c",
                    prefixForDelete + ".field.d");

            return true;
        }

        return false;
    }

    private IwayProperties mapIwayProperties(TemplatesGroupBean templatesGroupBean) {
        IwayProperties iwayProperties = new IwayProperties();
        iwayProperties.setProperty("name", templatesGroupBean.getProjectName());
        iwayProperties.setProperty("author", templatesGroupBean.getProjectAuthor());
        iwayProperties.setProperty("copyright", templatesGroupBean.getProjectCopyright());
        iwayProperties.setProperty("developer", templatesGroupBean.getProjectDeveloper());
        iwayProperties.setProperty("generator", templatesGroupBean.getProjectGenerator());
        iwayProperties.setProperty("field.a", templatesGroupBean.getProjectFieldA());
        iwayProperties.setProperty("field.b", templatesGroupBean.getProjectFieldB());
        iwayProperties.setProperty("field.c", templatesGroupBean.getProjectFieldC());
        iwayProperties.setProperty("field.d", templatesGroupBean.getProjectFieldD());

        return iwayProperties;
    }

    List<LabelValueDetails> getDirectories(){
        List<LabelValueDetails> listOfDirectories = new ArrayList<>();

        for (String dirName : FileTools.getDirsNames("/templates/")) {
            listOfDirectories.add(new LabelValueDetails("/templates/" + dirName, removeInstallName(dirName)) );
            //pridaj aj dalsiu uroven adresarov
            for (String subDirName : FileTools.getDirsNames("/templates/" + dirName)) {
                listOfDirectories.add(new LabelValueDetails("/templates/" + dirName + "/" + subDirName, removeInstallName(dirName+"/"+subDirName)) );
            }
        }

        return listOfDirectories;
    }

    private String removeInstallName(String path) {
        String installName = Constants.getInstallName();
        String logInstallName = Constants.getLogInstallName();
        if (Tools.isEmpty(logInstallName)) logInstallName = installName;

        //ak nezacina na installName ani na logInstallName je to v poriadku
        if (path.startsWith(installName)==false && path.startsWith(logInstallName)==false) return path;

        //z nejakeho dovodu sa presna zhoda uklada ako /
        if (path.equals(installName) || path.equals(installName+"/") || path.equals(logInstallName) || path.equals(logInstallName+"/")) return "/";

        //odstran logInstallName / installName a vrat bez toho, combine to tam automaticky pouzije
        if (path.startsWith(logInstallName+"/")) return path.substring(logInstallName.length()+1);
        return path.substring(installName.length()+1);
    }

    public List<LabelValueDetails> getInlineEditors(Prop prop){
        List<LabelValueDetails> listOfInlineEditors = new ArrayList<>();
        listOfInlineEditors.add(new LabelValueDetails(prop.getText("editor.type_select.standard.js"), ""));
        listOfInlineEditors.add(new LabelValueDetails(prop.getText("editor.type_select.html.js"), "html"));
        listOfInlineEditors.add(new LabelValueDetails(prop.getText("editor.type_select.page_builder.js"), "pageBuilder"));
        listOfInlineEditors.add(new LabelValueDetails(prop.getText("editor.type_select.grid_editor.js"), "gridEditor"));

        return listOfInlineEditors;
    }

    private String getLng(HttpServletRequest request) {
        String lng = request.getParameter("breadcrumbLanguage");
        if (Tools.isEmpty(lng)) lng = Prop.getLngForJavascript(request);
        if ("cs".equals(lng)) lng = "cz";
        return lng;
    }
}