package net.pechorina.kontempl.rest;
import net.pechorina.kontempl.data.Page;
import net.pechorina.kontempl.data.Site;
import net.pechorina.kontempl.service.PageService;
import net.pechorina.kontempl.service.PageTreeService;
import net.pechorina.kontempl.service.SiteService;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping(value = "/api/pages")
public class PageResource {
static final Logger logger = LoggerFactory.getLogger(PageResource.class);
@Autowired
private SiteService siteService;
@Autowired
private PageService pageService;
@Autowired
private PageTreeService pageTreeService;
@Autowired
private Environment env;
@RequestMapping(method=RequestMethod.GET)
public List<Page> list(@RequestParam(value="siteId", required=true) Integer siteId) {
Site site = siteService.findById(siteId);
return pageService.listBySite(site);
}
@RequestMapping(method = RequestMethod.GET, value = "/{id}")
public Page getById(@PathVariable("id") Integer id) {
return pageService.getPage(id);
}
@RequestMapping(method = RequestMethod.GET, value = "/{id}/namecheck")
public void nameCheck(@PathVariable("id") Integer id,
@RequestParam(value="name", required=true) String pageName,HttpServletResponse response ) {
boolean badName = pageService.findOtherPagesWithSameName(id, pageName);
if (badName) { response.setStatus(HttpServletResponse.SC_CONFLICT); }
else {response.setStatus(HttpServletResponse.SC_OK);}
}
@RequestMapping(method = RequestMethod.GET, value = "/name/{name}")
public Page getByName(@PathVariable("name") String name, @RequestParam(value="siteName", required=true) String siteName) {
Site site = siteService.findByName(siteName);
return pageService.getPage(site, name);
}
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Page> create(@RequestBody Page page, HttpServletRequest request, HttpServletResponse response) {
Site site = siteService.findById(page.getSiteId());
if (site == null) {
logger.error("No site id found for the new page");
return new ResponseEntity<>(HttpStatus.UNPROCESSABLE_ENTITY);
}
Page newPage = new Page();
newPage.setSite(site);
// merge data
newPage.setBody(page.getBody());
newPage.setTitle(page.getTitle());
newPage.setHtmlTitle(page.getHtmlTitle());
newPage.setName(page.getName());
newPage.setDescription(page.getDescription());
newPage.setHideTitle(page.isHideTitle());
newPage.setParentId(page.getParentId());
newPage.setPlaceholder(page.isPlaceholder());
newPage.setPublicPage(page.isPublicPage());
newPage.setAutoName(page.isAutoName());
newPage.setRichText(page.isRichText());
newPage.setSortindex(page.getSortindex());
newPage.setTags(page.getTags());
newPage.setIncludeForm(page.getIncludeForm());
newPage.setFormId(page.getFormId());
Page savedEntity = pageService.savePage(newPage);
pageService.resetPageCache();
logger.info("PAGE SAVE: " + savedEntity + " Src:" + request.getRemoteAddr());
return new ResponseEntity<>(savedEntity, HttpStatus.CREATED);
}
@RequestMapping(method = RequestMethod.PUT, value = "/{id}")
public void save(@PathVariable("id") Integer id, @RequestBody Page page, HttpServletRequest request, HttpServletResponse response) {
Page existingEntity = pageService.getPage(id);
// merge data
existingEntity.setBody(page.getBody());
existingEntity.setTitle(page.getTitle());
existingEntity.setHtmlTitle(page.getHtmlTitle());
existingEntity.setName(page.getName());
existingEntity.setDescription(page.getDescription());
existingEntity.setHideTitle(page.isHideTitle());
existingEntity.setParentId(page.getParentId());
existingEntity.setPlaceholder(page.isPlaceholder());
existingEntity.setPublicPage(page.isPublicPage());
existingEntity.setAutoName(page.isAutoName());
existingEntity.setRichText(page.isRichText());
// existingEntity.setSortindex(page.getSortindex());
existingEntity.setTags(page.getTags());
existingEntity.setUpdated(new DateTime());
existingEntity.setIncludeForm(page.getIncludeForm());
existingEntity.setFormId(page.getFormId());
Page savedEntity = pageService.savePage(existingEntity);
logger.info("PAGE SAVE: " + savedEntity + " Src:" + request.getRemoteAddr());
response.setStatus(HttpServletResponse.SC_OK);
}
@RequestMapping(method = RequestMethod.POST, value = "/{id}/move")
public void save(@PathVariable("id") Integer id, @RequestBody Map<String,String> movement, HttpServletRequest request, HttpServletResponse response) {
Page page = pageService.getPage(id);
logger.debug("Movement: " + movement);
int dstIndex = Integer.parseInt(movement.get("dstIndex"));
int dstParentId = Integer.parseInt(movement.get("dstParentId"));
pageService.movePage(page, dstIndex, dstParentId);
pageService.resetPageCache();
logger.info("PAGE MOVED: " + movement + " Src:" + request.getRemoteAddr());
response.setStatus(HttpServletResponse.SC_OK);
}
@RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
public void remove(@PathVariable("id") Integer id, HttpServletRequest request, HttpServletResponse response) {
pageService.deletePage(id);
pageService.resetPageCache();
logger.info("PAGE DELETE: " + id + " Src:" + request.getRemoteAddr());
response.setStatus(HttpServletResponse.SC_OK);
}
}