package net.pechorina.kontempl.rest; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.pechorina.kontempl.data.Site; import net.pechorina.kontempl.data.SiteProperty; import net.pechorina.kontempl.service.SiteService; 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.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/api/sites") public class SiteResource { private static final Logger logger = LoggerFactory.getLogger(SiteResource.class); @Autowired private SiteService siteService; @Autowired private Environment env; @RequestMapping(method=RequestMethod.GET) public List<Site> list() { return siteService.listAll(); } @RequestMapping(method = RequestMethod.GET, value = "/{id}") public Site getById(@PathVariable("id") Integer id) { return siteService.findById(id); } @RequestMapping(method = RequestMethod.POST) public ResponseEntity<Site> createSite(@RequestBody Site site, HttpServletRequest request) { Site savedEntity = siteService.save(site); logger.info("SITE CREATE: " + savedEntity + " Src:" + request.getRemoteAddr()); return new ResponseEntity<>(savedEntity, HttpStatus.CREATED); } @RequestMapping(method = RequestMethod.POST, value = "/{id}") public ResponseEntity<Site> createSiteProperty(@PathVariable("id") Integer siteId, @RequestBody SiteProperty siteProperty, HttpServletRequest request) { Site site = siteService.findById(siteId); siteProperty.setSite(site); site.addProperty(siteProperty); Site savedEntity = siteService.save(site); logger.info("SITE PROPERTY CREATE: " + savedEntity + " Src:" + request.getRemoteAddr()); return new ResponseEntity<>(savedEntity, HttpStatus.CREATED); } @RequestMapping(method = RequestMethod.PUT, value = "/{id}/{propId}") public void saveProperty(@PathVariable("id") Integer siteId, @PathVariable("propId") Integer propertyId, @RequestBody SiteProperty siteProperty, HttpServletRequest request, HttpServletResponse response) { Site site = siteService.findById(siteId); // merge updates SiteProperty existingProperty = site.findPropertyById(propertyId); if (existingProperty != null) { existingProperty.setName(siteProperty.getName().trim()); existingProperty.setContent(siteProperty.getContent().trim()); } Site savedEntity = siteService.save(site); logger.info("SITE PROPERTY SAVE: " + savedEntity + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } @RequestMapping(method = RequestMethod.DELETE, value = "/{id}/{propName}") public void deleteProperty(@PathVariable("id") Integer siteId, @PathVariable("propName") String propName, HttpServletRequest request, HttpServletResponse response) { Site site = siteService.findById(siteId); if (site == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } SiteProperty p = site.findPropertyByName(propName); if (p != null) { site.getProperties().removeIf(sp -> sp.getName().equalsIgnoreCase(propName)); } else { response.setStatus(HttpServletResponse.SC_NOT_FOUND); return; } Site savedEntity = siteService.save(site); logger.info("SITE PROPERTY DELETE: " + savedEntity + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } @RequestMapping(method = RequestMethod.PUT, value = "/{id}") public void save(@PathVariable("id") Integer id, @RequestBody Site site, HttpServletRequest request, HttpServletResponse response) { Site existingEntity = siteService.findById(id); // merge data existingEntity.setDomain(site.getDomain()); existingEntity.setTitle(site.getTitle()); existingEntity.setName(site.getName()); existingEntity.setHomePage(site.getHomePage()); Site savedEntity = siteService.save(existingEntity); logger.info("SITE SAVE: " + savedEntity + " 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) { siteService.delete(id); logger.info("SITE DELETE: " + id + " Src:" + request.getRemoteAddr()); response.setStatus(HttpServletResponse.SC_OK); } }