FileHistoryRestController.java

package sk.iway.iwcm.system.elfinder;

import java.util.ArrayList;
import java.util.HashMap;
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.FileTools;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.io.IwcmFile;
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.NotifyBean;
import sk.iway.iwcm.system.datatable.NotifyBean.NotifyType;
import sk.iway.iwcm.users.UserDetails;
import sk.iway.iwcm.users.UsersDB;

@RestController
@RequestMapping("/admin/rest/elfinder/file-history/")
@PreAuthorize("@WebjetSecurityService.hasPermission('cmp_elfinder')")
@Datatable
public class FileHistoryRestController extends DatatableRestControllerV2<FileHistoryEntity, Long> {
    
    private final FileHistoryRepository fileHistoryRepository;

    @Autowired
    public FileHistoryRestController(FileHistoryRepository fileHistoryRepository) {
        super(fileHistoryRepository);
        this.fileHistoryRepository = fileHistoryRepository;
    }

    @Override
    public Page<FileHistoryEntity> getAllItems(Pageable pageable) {
        String filePath = Tools.getStringValue(getRequest().getParameter("filePath"), null);

        //Without filePath, return empty page
        if(filePath == null) return new DatatablePageImpl<>(new ArrayList<>());

        //Get data based on filePath and domainId
        Page<FileHistoryEntity> page = fileHistoryRepository.findAllByFileUrlAndDomainIdOrderByChangeDateDesc(filePath, CloudToolsForCore.getDomainId(), pageable);

        Map<Integer, String> usersMap = new HashMap<>();
        for(FileHistoryEntity entity : page.getContent()) {
            if(usersMap.get(entity.getUserId()) == null) {
               UserDetails user = UsersDB.getUser(entity.getUserId());
               usersMap.put(entity.getUserId(), user == null ? "" : user.getFullName());
            }

            entity.setUserName(usersMap.get(entity.getUserId()));
        }

        return page;
    }

    @Override
    public boolean processAction(FileHistoryEntity entity, String action) {
        if ("rollBack".equals(action)) {
            IwcmFile historyFile = new IwcmFile( Tools.getRealPath( entity.getHistoryPath() + entity.getId() ) );
            
            if(historyFile.exists() == false){
                addNotify(new NotifyBean(getProp().getText("elfinder.file_prop.rollback.title"), getProp().getText("elfinder.file_prop.rollback.src_file_not_found.err"), NotifyType.ERROR, 15000));
                return true;
            }

            IwcmFile currentFile = new IwcmFile( Tools.getRealPath( entity.getFileUrl() ) );
            if(currentFile.exists() == false) {
                addNotify(new NotifyBean(getProp().getText("elfinder.file_prop.rollback.title"), getProp().getText("elfinder.file_prop.rollback.src_file_not_found.err"), NotifyType.ERROR, 15000));
                return true;
            }
            
            if(FileTools.copyFile(historyFile, currentFile) == true) addNotify(new NotifyBean(getProp().getText("elfinder.file_prop.rollback.title"), getProp().getText("elfinder.file_prop.rollback.success"), NotifyType.SUCCESS, 15000));
            else addNotify(new NotifyBean(getProp().getText("elfinder.file_prop.rollback.title"), getProp().getText("elfinder.file_prop.rollback.error"), NotifyType.ERROR, 15000));
            
            return true;
        }

        return false;
    }
}