FormsController.java

package sk.iway.iwcm.components.forms;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.CryptoFactory;
import sk.iway.iwcm.InitServlet;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.database.SimpleQuery;
import sk.iway.iwcm.form.FormDB;
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.DatatableRequest;
import sk.iway.iwcm.system.datatable.DatatableResponse;
import sk.iway.iwcm.system.datatable.DatatableRestControllerV2;
import sk.iway.iwcm.system.datatable.json.LabelValue;

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

import javax.servlet.http.HttpServletRequest;

@RestController
@Datatable
@RequestMapping(value = "/admin/rest/forms-list")
@PreAuthorize(value = "@WebjetSecurityService.hasPermission('cmp_form')")
public class FormsController extends DatatableRestControllerV2<FormsEntity, Long> {

    private final FormsServiceImpl formsService;

    @Autowired
    public FormsController(FormsRepository formsRepository, FormsServiceImpl formsService) {
        super(formsRepository);
        this.formsService = formsService;
    }

    @Override
    public Page<FormsEntity> getAllItems(Pageable pageable) {
        Page<FormsEntity> page = new DatatablePageImpl<>(formsService.getFormsList(getUser()));
        return page;
    }

    @Override
    public FormsEntity getOneItem(long id) {
        FormsEntity entity = formsService.getById(id);
        if (entity == null) return null;
        if (formsService.isFormAccessible(entity.getFormName(), getUser())) return entity;
        return null;
    }

    @GetMapping(path = "/columns/{formName}", produces = MediaType.APPLICATION_JSON_VALUE)
    public FormColumns getColumnNames(@PathVariable String formName) {
        return formsService.getColumnNames(formName, getUser());
    }

    @GetMapping(path = "/data/{formName}", produces = MediaType.APPLICATION_JSON_VALUE)
    public Page<FormsEntity> getSubList(@PathVariable String formName, @RequestParam Map<String, String> params, Pageable pageable) {
        Page<FormsEntity> data;
        if (getRequest().getParameter("size")==null) data = formsService.findInDataByColumns(formName, getUser(), params, null);
        else data = formsService.findInDataByColumns(formName, getUser(), params, pageable);

        if ("true".equals(getRequest().getParameter("export"))) {
            formsService.setExportDate(data.getContent());
        }

        return data;
    }

    @GetMapping(path = "/data/{formName}/search/findByColumns")
    public Page<FormsEntity> findInDataByColumns(@PathVariable String formName, @RequestParam Map<String, String> params, Pageable pageable, FormsEntity search) {

        Page<FormsEntity> data = formsService.findInDataByColumns(formName, getUser(), params, pageable);

        if ("true".equals(getRequest().getParameter("export"))) {
            formsService.setExportDate(data.getContent());
        }

        return data;
    }

    @PreAuthorize(value = "@WebjetSecurityService.checkAccessAllowedOnController(this)")
	@PostMapping(value = "/data/{formName}/editor", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<DatatableResponse<FormsEntity>> handleEditorFormDetail(@PathVariable String formName, HttpServletRequest request, @RequestBody DatatableRequest<Long, FormsEntity> datatableRequest) {
        return super.handleEditor(request, datatableRequest);
    }

    @PreAuthorize(value = "@WebjetSecurityService.checkAccessAllowedOnController(this)")
	@PostMapping(value = "/data/{formName}/action/{action}")
    @Override
	public ResponseEntity<DatatableResponse<FormsEntity>> action(@PathVariable String action, @RequestParam(value = "ids[]") Long[] ids) {
        return super.action(action, ids);
    }

    /**
     * Get all regular expressions.
     * Available to all admins (it's used on variety of apps like webpages, news, etc)
     */
    @GetMapping(path="/regexps")
    @PreAuthorize(value = "@WebjetSecurityService.isAdmin()")
    public List<LabelValue> getAllRegularExpression() {
        Prop prop = getProp();
        List<LabelValue> regexps = new ArrayList<>();
        List<String[]> all = FormDB.getInstance().getAllRegularExpression();
        for (String[] regexp : all) {
            regexps.add(new LabelValue(prop.getText(regexp[0]), regexp[1]));
        }
        return regexps;
    }

    @GetMapping(path="/html")
    public String getHtml(@RequestParam long id) {
        FormsEntity entity = formsService.getById(id);
        if (entity == null || Tools.isEmpty(entity.getFormName())) return null;

        if (formsService.isFormAccessible(entity.getFormName(), getUser())==false) return null;

        //html kod necitame v entite, musime ziskat takto
        String html = (new SimpleQuery()).forString("SELECT html FROM forms WHERE id=?", id);
        html = CryptoFactory.decrypt(html);
        if (html.contains("<body")==false) {
            html = Tools.replace(html, "\n", "\n<br/>");
        }
        return html;
    }

    @Override
    public FormsEntity editItem(FormsEntity entity, long id) {
        String note = entity.getNote();

        formsService.updateNote(note, id);

        return formsService.getById(id);
    }

    @Override
    public boolean deleteItem(FormsEntity entity, long id) {
        return formsService.deleteItem(entity, id);
    }

    @Override
    public boolean processAction(FormsEntity entity, String action) {
        String formName = entity.getFormName();
        if ("archiveForm".equals(action)) {
            boolean success = FormDB.setFormName(formName, "Archiv-"+formName);
            Adminlog.add(Adminlog.TYPE_FORM_ARCHIVE, "Archivacia formularu: "+formName, -1, -1);
            return success;
        } else if ("archiveFormDetail".equals(action) && entity.getId()!=null) {
            String idsQuery = String.valueOf(entity.getId());
            int smallestId = entity.getId().intValue();
            boolean success = FormDB.setFormName(formName, "Archiv-"+formName, (" AND id IN (" + idsQuery + ")"), smallestId, false);
			Adminlog.add(Adminlog.TYPE_FORM_ARCHIVE, "Archivacia formularu: "+formName, -1, -1);
            return success;
        }
        return false;
    }

    @Override
    public boolean checkItemPerms(FormsEntity entity, Long id) {
        if (InitServlet.isTypeCloud()) {
            if (entity.getDomainId()!=CloudToolsForCore.getDomainId()) return false;
            FormsEntity old = getRepo().getById(entity.getId());
            if (old != null && old.getDomainId()!=CloudToolsForCore.getDomainId()) return false;
        }
        return true;
    }
}