package org.dicadeveloper.weplantaforest.admin.project;
import java.io.IOException;
import java.util.List;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.admin.FileSystemInjector;
import org.dicadeveloper.weplantaforest.admin.support.Uris;
import org.dicadeveloper.weplantaforest.admin.tree.TreeRepository;
import org.dicadeveloper.weplantaforest.admin.views.Views;
import org.dicadeveloper.weplantaforest.common.image.ImageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.annotation.JsonView;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired) )
public class ProjectController {
private @NonNull ProjectRepository _projectRepository;
private @NonNull ProjectArticleRepository _projectArticleRepository;
private @NonNull ProjectImageRepository _projectImageRepository;
private @NonNull PriceRepository _priceRepository;
private @NonNull TreeRepository _treeRepository;
private @NonNull ImageHelper _imageHelper;
@RequestMapping(value = Uris.PROJECTS, method = RequestMethod.GET)
@JsonView(Views.ProjectNameAndId.class)
public ResponseEntity<?> getAllProjects() {
try {
Iterable<Project> projects = _projectRepository.findAll();
return new ResponseEntity<>(projects, HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.PROJECT, method = RequestMethod.GET)
@JsonView(Views.ProjectData.class)
public ResponseEntity<?> getProject(@RequestParam long projectId) {
try {
Project project = _projectRepository.findOne(projectId);
return new ResponseEntity<>(project, HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.ARTICLES, method = RequestMethod.GET)
@JsonView(Views.ProjectArticle.class)
public ResponseEntity<?> getArticlesForProject(@RequestParam long projectId) {
try {
List<ProjectArticle> articles = _projectArticleRepository.findByProjectId(projectId);
return new ResponseEntity<>(articles, HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.IMAGES, method = RequestMethod.GET)
@JsonView(Views.ProjectImage.class)
public ResponseEntity<?> getImagesForProject(@RequestParam long projectId) {
try {
List<ProjectImage> articles = _projectImageRepository.findProjectImagesToProjectByProjectId(projectId);
return new ResponseEntity<>(articles, HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.PROJECT_EDIT, method = RequestMethod.POST)
public ResponseEntity<?> editProject(@RequestBody Project project) {
try {
project = _projectRepository.save(project);
if (project.getArticles() != null) {
for (ProjectArticle article : project.getArticles()) {
Price updatedPrice = article.getPrice();
if (updatedPrice != null) {
_priceRepository.save(updatedPrice);
}
article.setProject(project);
_projectArticleRepository.save(article);
}
}
return new ResponseEntity<>(project.getId(),HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.PROJECT_CREATE, method = RequestMethod.POST)
public ResponseEntity<?> createProject(@RequestBody Project project) {
try {
_projectRepository.save(project);
return new ResponseEntity<>(HttpStatus.OK);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.PROJECT_DELETE, method = RequestMethod.DELETE)
public ResponseEntity<?> deleteProject(@RequestParam Long id) {
try {
if (_projectRepository.exists(id)) {
Project project = _projectRepository.findOne(id);
List<ProjectArticle> articles = _projectArticleRepository.findByProject(project);
List<ProjectImage> images = _projectImageRepository.findProjectImagesToProjectByProjectId(id);
_projectImageRepository.delete(images);
_projectArticleRepository.delete(articles);
_projectRepository.delete(id);
return new ResponseEntity<>(HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = Uris.PROJECT_REMOVE_ARTICLE, method = RequestMethod.POST)
public ResponseEntity<?> removeArticle(@RequestParam Long articleId) {
if (_treeRepository.countAlreadyPlantedTreesByProjectArticleId(articleId) > 0) {
return new ResponseEntity<>("Du kannst diesen Projektartikel nicht löschen, da davon schon Bäume gepflanzt wurden.", HttpStatus.BAD_REQUEST);
} else {
_projectArticleRepository.delete(articleId);
return new ResponseEntity<>(HttpStatus.OK);
}
}
@RequestMapping(value = Uris.PROJECT_IMAGE_CREATE_EDIT, method = RequestMethod.POST)
@Transactional
public ResponseEntity<?> createEditProjectImageData(@RequestBody ProjectImageRequest projectImageRequest) {
Project project = _projectRepository.findOne(projectImageRequest.getProjectId());
if (project == null) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
else{
ProjectImage projectImage;
if(projectImageRequest.getImageId() != null){
projectImage = _projectImageRepository.findOne(projectImageRequest.getImageId());
projectImage.setTitle(projectImageRequest.getTitle());
projectImage.setDescription(projectImageRequest.getDescription());
}else{
projectImage = new ProjectImage(projectImageRequest.getTitle(), projectImageRequest.getDescription(),System.currentTimeMillis());
}
projectImage.setProject(project);
_projectImageRepository.save(projectImage);
return new ResponseEntity<>(projectImage.getImageId(), HttpStatus.OK);
}
}
@RequestMapping(value = Uris.PROJECT_IMAGE_UPLOAD, method = RequestMethod.POST)
@Transactional
public ResponseEntity<?> uploadUserImage(@RequestParam Long imageId, @RequestParam("file") MultipartFile file) {
ProjectImage projectImage = _projectImageRepository.findOne(imageId);
String imageFolder = FileSystemInjector.getImageFolderForProjects();
String imageName ;
if(projectImage.getImageFileName() != null){
imageName = projectImage.getImageFileName();
}else{
imageName = "project_" + projectImage.getProject().getId() + "image_1";
}
if (!file.isEmpty()) {
try {
imageName = _imageHelper.storeImage(file, imageFolder, imageName, false);
projectImage.setImageFileName(imageName);
_projectImageRepository.save(projectImage);
return new ResponseEntity<>(HttpStatus.OK);
} catch (IOException e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
} else {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
@RequestMapping(value = Uris.PROJECT_IMAGE_DELETE, method = RequestMethod.POST)
public ResponseEntity<?> removeProjectImage(@RequestParam Long projectImageId, @RequestParam String imageFileName) {
_projectImageRepository.delete(projectImageId);
//TODO: delete image file on filesystem
return new ResponseEntity<>(HttpStatus.OK);
}
}