package net.pechorina.kontempl.rest;
import com.google.common.io.Files;
import net.pechorina.kontempl.data.DocFile;
import net.pechorina.kontempl.data.FileMeta;
import net.pechorina.kontempl.data.Page;
import net.pechorina.kontempl.service.DocFileService;
import net.pechorina.kontempl.service.PageService;
import net.pechorina.kontempl.service.SiteService;
import net.pechorina.kontempl.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@RestController
@RequestMapping(value = "/api/pages/{pageId}/files")
public class DocFileResource {
static final Logger logger = LoggerFactory.getLogger(DocFileResource.class);
@Autowired
private SiteService siteService;
@Autowired
private PageService pageService;
@Autowired
private DocFileService docFileService;
@Autowired
private Environment env;
@RequestMapping(method=RequestMethod.GET)
public List<DocFile> list(@PathVariable("pageId") Integer pageId) {
return docFileService.listDocsForPageOrdered(pageId);
}
@RequestMapping(method = RequestMethod.GET, value = "/{id}")
public DocFile getById(@PathVariable("pageId") Integer pageId, @PathVariable("id") Integer id) {
return docFileService.getDocById(id);
}
@RequestMapping(method = RequestMethod.POST, value = "/{id}/moveup")
public void moveFileUp(@PathVariable("pageId") Integer pageId, @PathVariable("id") Integer id, HttpServletResponse response) {
DocFile d = docFileService.getDocById(id);
docFileService.moveDoc(d, "up");
pageService.resetPageCache();
response.setStatus(HttpServletResponse.SC_OK);
}
@RequestMapping(method = RequestMethod.POST, value = "/{id}/movedown")
public void moveFileDown(@PathVariable("pageId") Integer pageId, @PathVariable("id") Integer id, HttpServletResponse response) {
DocFile d = docFileService.getDocById(id);
docFileService.moveDoc(d, "down");
pageService.resetPageCache();
response.setStatus(HttpServletResponse.SC_OK);
}
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody
LinkedList<FileMeta> upload(@PathVariable("pageId") Integer pageId,
MultipartHttpServletRequest request, HttpServletResponse response) {
Page page = pageService.getPage(pageId);
LinkedList<FileMeta> files = new LinkedList<>();
Iterator<String> itr = request.getFileNames();
MultipartFile mpf = null;
while (itr.hasNext()) {
mpf = request.getFile(itr.next());
System.out.println(mpf.getOriginalFilename() + " uploaded! "
+ files.size());
FileMeta fileMeta = new FileMeta();
fileMeta.setFileName(StringUtils.prettifyFilename( mpf.getOriginalFilename().toLowerCase() ) );
fileMeta.setFileSize(mpf.getSize());
fileMeta.setFileType(mpf.getContentType());
try {
fileMeta.setBytes(mpf.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
files.add(fileMeta);
}
if (files.size() > 0) {
for (FileMeta fm : files) {
DocFile df = new DocFile();
df.setPropertiesFromFileMeta(fm);
df.setPageId(pageId);
String filePath = env.getProperty("fileStoragePath") + File.separator
+ page.getSiteId() + df.getAbsolutePath();
String dirPath = env.getProperty("fileStoragePath") + File.separator
+ page.getSiteId() + df.getDirectoryPath();
boolean success = false;
try {
File f = new File(filePath);
File d = new File(dirPath);
if (!d.exists()) {
logger.debug("Image directory do not exists, create new: "
+ dirPath);
Files.createParentDirs(f);
}
Files.write(fm.getBytes(), f);
success = true;
} catch (IOException e) {
logger.error("Can't write doc to file: " + e);
success = false;
}
if (success) {
int sortIndex = docFileService.getNextDocSortIndex(pageId);
df.setSortIndex(sortIndex);
DocFile docFile = docFileService.save(df);
pageService.resetPageCache();
logger.debug("Document " + filePath + " saved: " + docFile);
}
}
}
return files;
}
@RequestMapping(method = RequestMethod.PUT, value = "/{id}")
public void save(@PathVariable("pageId") Integer pageId, @PathVariable("id") Integer id,
@RequestBody DocFile df, HttpServletRequest request, HttpServletResponse response) {
DocFile existingEntity = docFileService.getDocById(id);
// merge data
existingEntity.setTitle(df.getTitle());
existingEntity.setName(df.getName());
existingEntity.setSortIndex(df.getSortIndex());
DocFile savedEntity = docFileService.save(existingEntity);
pageService.resetPageCache();
logger.info("DOCFILE UPDATE/SAVE: " + savedEntity + " Src:" + request.getRemoteAddr());
response.setStatus(HttpServletResponse.SC_OK);
}
@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
public void remove(@PathVariable("pageId") Integer pageId, @PathVariable("id") Integer id,
HttpServletRequest request, HttpServletResponse response) {
DocFile existingEntity = docFileService.getDocById(id);
docFileService.deleteDoc(existingEntity);
pageService.resetPageCache();
logger.info("FILE DELETE: " + existingEntity + " Src:" + request.getRemoteAddr());
response.setStatus(HttpServletResponse.SC_OK);
}
}