package net.pechorina.kontempl.service;
import com.google.common.io.Files;
import net.pechorina.kontempl.data.DocFile;
import net.pechorina.kontempl.data.Page;
import net.pechorina.kontempl.repos.DocFileRepo;
import net.pechorina.kontempl.utils.CloneFactory;
import net.pechorina.kontempl.utils.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Service
public class DocFileService {
static final Logger logger = LoggerFactory.getLogger(DocFileService.class);
@Autowired
private DocFileRepo docFileRepo;
@Autowired
private Environment env;
@Autowired
private PageService pageService;
@Transactional
public List<DocFile> listDocsForPage(Integer pageId) {
return docFileRepo.findByPageId(pageId);
}
@Transactional
public List<DocFile> listDocsForPageOrdered(Integer pageId) {
return docFileRepo.getPageDocsOrdered(pageId);
}
@Transactional
public DocFile save(DocFile im) {
return docFileRepo.saveAndFlush(im);
}
@Transactional
public void removeAllDocsForPage(Page page) {
List<DocFile> docs = docFileRepo.findByPageId(page.getId());
docs.forEach(this::deleteDoc);
String pageDocsDir = env.getProperty("fileStoragePath") + File.separator
+ page.getSiteId() + File.separator + page.getId() + File.separator + "docs";
File dir = new File(pageDocsDir);
FileUtils.deleteDirectory(dir);
}
@Transactional
public DocFile getDocById(Integer id) {
return docFileRepo.findOne(id);
}
@Transactional
public boolean deleteDoc(DocFile d) {
Page page = pageService.getPage(d.getPageId());
String filename = env.getProperty("fileStoragePath") + File.separator
+ page.getSiteId() + d.getAbsolutePath();
boolean success = FileUtils.deleteFileByName( filename );
// check if file still exists
if (!success) {
logger.debug("Checking if file still exists: " + filename);
File f = new File(filename);
if (!f.exists()) {
logger.debug("File does not exists");
success = true;
}
else {
logger.debug("File does exists, can't remove it");
}
}
if (success) {
docFileRepo.delete(d);
logger.debug("docFile DB record removed");
}
else {
logger.debug("Will not remove DocFile DB record as can't delete the file from the disk");
}
logger.debug("deleteImage success=" + success);
return success;
}
@Transactional
public int getMaxDocIndex(Integer pageId) {
Integer idx = docFileRepo.getMaxSortIndex(pageId);
if (idx == null) {
idx = 0;
}
logger.debug("Max index: " + idx + " for page id: " + pageId);
return idx;
}
@Transactional
public int getNextDocSortIndex(Integer pageId) {
Integer idx = docFileRepo.getMaxSortIndex(pageId);
if (idx == null) {
idx = 0;
}
logger.debug("Max index: " + idx + " for page id: " + pageId);
idx++;
logger.debug("Nextindex: " + idx + " for page id: " + pageId);
return idx;
}
@Transactional
public long countDocsForPage(Integer pageId) {
Long n = docFileRepo.countDocsForPage(pageId);
if (n == null) {
n = 0l;
}
logger.debug("Total images: " + n + " for page id: " + pageId);
return n;
}
@Transactional
public void moveDoc(DocFile df, String direction) {
logger.debug("moveDoc: " + df.getId() + "/" + df.getName() + " " + direction);
Integer pageId = df.getPageId();
List<DocFile> files = docFileRepo.getPageDocsOrdered(pageId);
int idx = files.indexOf(df);
int newIdx = 0;
if (direction.equalsIgnoreCase("UP")) {
// moving element up the list
if (idx > 0) {
newIdx = idx -1;
}
}
else {
// moving element down the list
if (idx < (files.size() - 1)) {
newIdx = idx + 1;
}
else {
newIdx = idx;
}
}
logger.debug("Old index: " + idx + " New index: " + newIdx + " Total elements: " + files.size());
DocFile element = files.remove(idx);
files.add(newIdx, element);
// renumber all elements
int i = 1;
for(DocFile docFile: files) {
docFile.setSortIndex(i);
docFileRepo.save(docFile);
i++;
}
}
@Transactional
public DocFile copyFileToPage(DocFile src, Page srcPage, Page targetPage) {
DocFile target = CloneFactory.copyDocFile(src);
target.setPageId(targetPage.getId());
DocFile savedFile = null;
logger.debug("Copy " + src.getName() + " file from page #" + srcPage.getId() + " to page #" + targetPage.getId());
try {
File srcFile = new File(env.getProperty("fileStoragePath") + File.separator
+ srcPage.getSiteId() + src.getAbsolutePath());
File targetFile = new File(env.getProperty("fileStoragePath") + File.separator
+ srcPage.getSiteId() + target.getAbsolutePath());
String targetDir = env.getProperty("fileStoragePath") + File.separator
+ srcPage.getSiteId() + target.getDirectoryPath();
File d = new File(targetDir);
if (!d.exists()) {
logger.debug("new file directory does not exists, create new: " + targetDir);
Files.createParentDirs(targetFile);
}
logger.debug("Src file: " + srcFile);
logger.debug("Trg file: " + targetFile);
Files.copy(srcFile, targetFile);
logger.debug("Copy op completed");
savedFile = save(target);
logger.debug("New file saved: " + savedFile);
} catch(IOException e) {
logger.error("Error! Can't copy file: " + e);
}
return savedFile;
}
}