package org.dicadeveloper.weplantaforest.reports.projects; import java.io.IOException; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dicadeveloper.weplantaforest.FileSystemInjector; import org.dicadeveloper.weplantaforest.common.image.ImageHelper; import org.dicadeveloper.weplantaforest.projects.ProjectArticle; import org.dicadeveloper.weplantaforest.projects.ProjectArticleRepository; import org.dicadeveloper.weplantaforest.projects.ProjectImage; import org.dicadeveloper.weplantaforest.projects.ProjectImageRepository; import org.dicadeveloper.weplantaforest.support.Uris; import org.dicadeveloper.weplantaforest.trees.TreeRepository; import org.dicadeveloper.weplantaforest.views.Views; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.repository.query.Param; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.annotation.JsonView; import lombok.NonNull; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor(onConstructor = @__(@Autowired) ) public class ProjectReportController { protected final Log LOG = LogFactory.getLog(ProjectReportController.class.getName()); private @NonNull ProjectReportRepository _projectReportRepository; private @NonNull ProjectImageRepository _projectImageRepository; private @NonNull ProjectArticleRepository _projectArticleRepository; private @NonNull TreeRepository _treeRepository; private @NonNull ImageHelper _imageHelper; @RequestMapping(value = Uris.REPORT_ALL_PROJECTS, method = RequestMethod.GET) public ResponseEntity<?> getAllProjects(@Param(value = "page") int page, @Param(value = "size") int size) { Page<ProjectReportData> projectReports = _projectReportRepository.getAllProjects(new PageRequest(page, size)); return new ResponseEntity<>(projectReports, HttpStatus.OK); } @RequestMapping(value = Uris.REPORT_ACTIVE_PROJECTS, method = RequestMethod.GET) public ResponseEntity<?> getActiveProjects() { List<ProjectReportData> projectReports = _projectReportRepository.getActiveProjects(); return new ResponseEntity<>(projectReports, HttpStatus.OK); } @RequestMapping(value = Uris.REPORT_INACTIVE_PROJECTS, method = RequestMethod.GET) public ResponseEntity<?> getInActiveProjects(@Param(value = "page") int page, @Param(value = "size") int size) { Page<ProjectReportData> projectReports = _projectReportRepository.getInActiveProjects(new PageRequest(page, size)); return new ResponseEntity<>(projectReports, HttpStatus.OK); } @RequestMapping(value = Uris.PROJECT_SEARCH_NAME + "{projectName}", method = RequestMethod.GET) public ResponseEntity<?> getProjectDataByName(@PathVariable(value = "projectName") String projectName) { ProjectReportData projectReportData = _projectReportRepository.getProjectDataByProjectName(projectName); return new ResponseEntity<>(projectReportData, HttpStatus.OK); } @RequestMapping(value = Uris.PROJECT_SEARCH_NAME + "/extended/" + "{projectName}", method = RequestMethod.GET) public ResponseEntity<?> getExtendedProjectDataByName(@PathVariable(value = "projectName") String projectName) { ProjectReportExtendedData projectReportExtendedData = new ProjectReportExtendedData(); ProjectReportData projectReportData = _projectReportRepository.getProjectDataByProjectName(projectName); List<ProjectImage> images = _projectImageRepository.findProjectImagesToProjectByProjectId(projectReportData.getProjectId()); projectReportExtendedData.setProjectReportData(projectReportData); projectReportExtendedData.setImages(images); return new ResponseEntity<>(projectReportExtendedData, HttpStatus.OK); } @RequestMapping(value = Uris.PROJECT_IMAGE + "{imageName:.+}/{width}/{height}", method = RequestMethod.GET, headers = "Accept=image/jpeg, image/jpg, image/png, image/gif") public ResponseEntity<?> getProjectImage(HttpServletResponse response, @PathVariable(value = "imageName") String imageName, @PathVariable int width, @PathVariable int height) { String filePath = FileSystemInjector.getImageFolderForProjects() + "/" + imageName; try { _imageHelper.writeImageToOutputStream(response.getOutputStream(), filePath, width, height); return new ResponseEntity<>(HttpStatus.OK); } catch (IOException e) { LOG.error("Error occured while trying to get image " + imageName + " in folder: " + filePath, e); return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } } @RequestMapping(value = Uris.PROJECT_ARTICLES, method = RequestMethod.GET) @JsonView(Views.ProjectArticle.class) public List<ProjectArticle> getProjectArticles(@RequestParam String projectName) { List<ProjectArticle> articles = _projectArticleRepository.findByProjectName(projectName); for (ProjectArticle article : articles) { article.setAlreadyPlanted(_treeRepository.countAlreadyPlantedTreesByProjectArticle(article)); } return articles; } }