CookieManagerRestController.java

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

import java.util.ArrayList;
import java.util.Date;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.RequestBean;
import sk.iway.iwcm.SetCharacterEncodingFilter;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.components.gdpr.CookieManagerBean;
import sk.iway.iwcm.components.gdpr.CookieManagerDB;
import sk.iway.iwcm.components.translation_keys.jpa.TranslationKeyEntity;
import sk.iway.iwcm.components.translation_keys.rest.TranslationKeyService;
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;
import sk.iway.iwcm.system.datatable.json.LabelValue;
import sk.iway.iwcm.system.multidomain.MultiDomainFilter;
import sk.iway.iwcm.users.UsersDB;

/**
 * Sprava cookies - #53881
 * Specifikom je to, ze cookie moze mat opis vo viacerych jazykoch a tieto texty su ukladane do prekladovych klucov
 */
@RestController
@RequestMapping("/admin/rest/cookies")
@PreAuthorize("@WebjetSecurityService.hasPermission('menuGDPR')")
@Datatable
public class CookieManagerRestController extends DatatableRestControllerV2<CookieManagerBean, Long>{

    private TranslationKeyService translationKeyService;

    @Autowired
    public CookieManagerRestController(TranslationKeyService translationKeyService) {
        super(null);
        this.translationKeyService = translationKeyService;
    }

    @Override
    public Page<CookieManagerBean> getAllItems(Pageable pageable) {

        int domainId = CloudToolsForCore.getDomainId();

        CookieManagerDB cookieMangerDB = new CookieManagerDB();

        List<CookieManagerBean> items = cookieMangerDB.findByDomainId(domainId);

        String language = getRequest().getParameter("breadcrumbLanguage");
        Prop prop = Prop.getInstance(language);
        for(CookieManagerBean item : items) {
            setTranslationKeysIntoEntity(item, prop);
        }

        DatatablePageImpl<CookieManagerBean> page = new DatatablePageImpl<>(items);

        //vygeneruj moznosti pre klasifikaciu
        List<LabelValue> classifications = new ArrayList<>();
        for(String classificator: Tools.getTokens(Constants.getString("gdprCookieClassifications"), ",")){
            LabelValue lv = new LabelValue(getProp().getText("components.cookies.cookie_manager.classification."+classificator), classificator);
            classifications.add(lv);
        }
        page.addOptions("classification", classifications, "label", "value", false);

        return page;
    }

    @Override
    public CookieManagerBean getOneItem(long id) {

        CookieManagerDB cookieMangerDB = new CookieManagerDB();

        String language = getRequest().getParameter("breadcrumbLanguage");

        Prop prop = Prop.getInstance(language);

        CookieManagerBean entity;

        if(id != -1) {
            entity = cookieMangerDB.getById((int) id);
            int domainId = CloudToolsForCore.getDomainId();
            if(entity.getDomainId() != domainId) {
                return null;
            }
            setTranslationKeysIntoEntity(entity, prop);
        } else {
            entity = new CookieManagerBean();
        }

        return entity;
    }

    /**
     * V databaze sa neukladaju hodnoty s opisom, poskytovatelom a platnostou, pretoze su to textove udaje.
     * Tie sa ukladaju do prekladovych klucov, preto je tu komplikovane spracovanie.
     */
    @Override
    public CookieManagerBean insertItem(CookieManagerBean entity) {

        CookieManagerDB cookieMangerDB = new CookieManagerDB();

        createEditTranslationKeysFromEntity(entity);

        entity.setDomainId(CloudToolsForCore.getDomainId());

        //Temporaly save values
        String provider = entity.getProvider();
        String purpouse = entity.getPurpouse();
        String validity = entity.getValidity();

        //Set key values to NULL
        entity.setProvider(null);
        entity.setPurpouse(null);
        entity.setValidity(null);

        //Validity, provider and purpouse are set as NULL (we dont want save them to table)
        cookieMangerDB.save(entity);

        //Set validity, provider and purpouse back to entity (to return) from temporal variables
        entity.setProvider(provider);
        entity.setPurpouse(purpouse);
        entity.setValidity(validity);

        return entity;
    }

    /**
     * V databaze sa neukladaju hodnoty s opisom, poskytovatelom a platnostou, pretoze su to textove udaje.
     * Tie sa ukladaju do prekladovych klucov, preto je tu komplikovane spracovanie.
     */
    @Override
    public CookieManagerBean editItem(CookieManagerBean entity, long id) {

        CookieManagerDB cookieMangerDB = new CookieManagerDB();

        createEditTranslationKeysFromEntity(entity);

        entity.setDomainId(CloudToolsForCore.getDomainId());

        //Temporaly save values
        String provider = entity.getProvider();
        String purpouse = entity.getPurpouse();
        String validity = entity.getValidity();

        //Set key values to NULL
        entity.setProvider(null);
        entity.setPurpouse(null);
        entity.setValidity(null);

        //Validity, provider and purpouse are set as NULL (we dont want save them to table)
        cookieMangerDB.save(entity);

        //Set validity, provider and purpouse back to entity (to return) from temporal variables
        entity.setProvider(provider);
        entity.setPurpouse(purpouse);
        entity.setValidity(validity);

        return entity;
    }

    void setTranslationKeysIntoEntity(CookieManagerBean entity, Prop prop) {
        String providerKey = "components.gdpr.cookies." + entity.getCookieName() + ".provider";
        String purpouseKey = "components.gdpr.cookies." + entity.getCookieName() + ".purpouse";
        String validityKey = "components.gdpr.cookies." + entity.getCookieName() + ".validity";

        String text = prop.getText(providerKey);
        entity.setProvider(text);

        text = prop.getText(purpouseKey);
        entity.setPurpouse(text);

        text = prop.getText(validityKey);
        entity.setValidity(text);
    }

    void createEditTranslationKeysFromEntity(CookieManagerBean entity) {

        Identity user = UsersDB.getCurrentUser(getRequest());
        TranslationKeyEntity translationKeyEntity = new TranslationKeyEntity();
        String prefix = null;

        String language = getRequest().getParameter("breadcrumbLanguage");
        translationKeyEntity.setLng(language);

        String providerKey;
        String purpouseKey;
        String validityKey;

        if(Constants.getBoolean("constantsAliasSearch")) {

            RequestBean requestBean = SetCharacterEncodingFilter.getCurrentRequestBean();

            if(requestBean!=null && Tools.isNotEmpty(requestBean.getDomain())) {

                prefix = MultiDomainFilter.getDomainAlias(requestBean.getDomain());
            }
        }

        if(Tools.isNotEmpty(prefix)) {
            providerKey = prefix + "-" + "components.gdpr.cookies." + entity.getCookieName() + ".provider";
            purpouseKey = prefix + "-" + "components.gdpr.cookies." + entity.getCookieName() + ".purpouse";
            validityKey = prefix + "-" + "components.gdpr.cookies." + entity.getCookieName() + ".validity";
        } else {
            providerKey = "components.gdpr.cookies." + entity.getCookieName() + ".provider";
            purpouseKey = "components.gdpr.cookies." + entity.getCookieName() + ".purpouse";
            validityKey = "components.gdpr.cookies." + entity.getCookieName() + ".validity";
        }

        //Provider Key
        translationKeyEntity.setKey(providerKey);
        translationKeyEntity.setValue(entity.getProvider());
        translationKeyService.createOrEditTranslationKeySingleLanguage(user, translationKeyEntity, false);

        //Purpouse key
        translationKeyEntity.setKey(purpouseKey);
        translationKeyEntity.setValue(entity.getPurpouse());
        translationKeyService.createOrEditTranslationKeySingleLanguage(user, translationKeyEntity, false);

        //Validity key
        translationKeyEntity.setKey(validityKey);
        translationKeyEntity.setValue(entity.getValidity());
        translationKeyService.createOrEditTranslationKeySingleLanguage(user, translationKeyEntity, true);
    }

    @Override
    public void beforeSave(CookieManagerBean entity) {
        entity.setSaveDate(new Date(Tools.getNow()));
        entity.setUserId(getUser().getUserId());
    }

    @Override
    public boolean deleteItem(CookieManagerBean entity, long id) {

        CookieManagerDB cookieMangerDB = new CookieManagerDB();

        if(cookieMangerDB.delete(entity)) return true;

        return false;
    }
}