package com.nicusa.controller;
import com.nicusa.assembler.PortfolioAssembler;
import com.nicusa.converter.PortfolioResourceToDomainConverter;
import com.nicusa.domain.Portfolio;
import com.nicusa.resource.PortfolioResource;
import com.nicusa.resource.UserProfileResource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
@RestController
public class PortfolioController {
@PersistenceContext
public EntityManager entityManager;
@Autowired
public PortfolioAssembler portfolioAssembler;
@Autowired
public PortfolioResourceToDomainConverter portfolioResourceToDomainConverter;
@Autowired
public SecurityController securityController;
@Transactional
@ResponseBody
@RequestMapping(value = "/portfolio", method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<?> create(@RequestBody PortfolioResource portfolioResource) {
Long loggedInUserProfileId = securityController.getAuthenticatedUserProfileId();
if(loggedInUserProfileId != null && loggedInUserProfileId != UserProfileResource.ANONYMOUS_USER_PROFILE_ID) {
Portfolio portfolio = portfolioResourceToDomainConverter.convert(portfolioResource);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(linkTo(methodOn(PortfolioController.class).getPortfolio(portfolio.getId())).toUri());
return new ResponseEntity<PortfolioResource>(httpHeaders, HttpStatus.CREATED);
} else {
return new ResponseEntity<PortfolioResource>(HttpStatus.UNAUTHORIZED);
}
}
@ResponseBody
@RequestMapping(value = "/portfolio/{id}", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<PortfolioResource> getPortfolio(@PathVariable("id") Long id) {
Portfolio portfolio = entityManager.find(Portfolio.class, id);
if (portfolio == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(portfolioAssembler.toResource(portfolio), HttpStatus.OK);
}
@Transactional
@ResponseBody
@RequestMapping(value = "/portfolio/{id}", method = RequestMethod.PUT, consumes = "application/json")
public ResponseEntity<?> updatePortfolio(@PathVariable("id") Long id,
@RequestBody PortfolioResource portfolioResource) {
Long loggedInUserProfileId = securityController.getAuthenticatedUserProfileId();
if(loggedInUserProfileId != null && loggedInUserProfileId != UserProfileResource.ANONYMOUS_USER_PROFILE_ID) {
Portfolio portfolio = entityManager.find(Portfolio.class, id);
if (portfolio == null) {
return new ResponseEntity<PortfolioResource>(HttpStatus.NO_CONTENT);
} else {
if(portfolio.getUserProfile() != null && portfolio.getUserProfile().getId() == loggedInUserProfileId) {
Portfolio updatedPortfolio = portfolioResourceToDomainConverter.convert(portfolioResource);
portfolio.setName(updatedPortfolio.getName());
portfolio.setUserProfile(updatedPortfolio.getUserProfile());
portfolio.setDrugs(updatedPortfolio.getDrugs());
portfolio = entityManager.merge(portfolio);
PortfolioResource updatedPortfolioResource = portfolioAssembler.toResource(portfolio);
return new ResponseEntity<>(HttpStatus.OK);
} else {
return new ResponseEntity<PortfolioResource>(HttpStatus.UNAUTHORIZED);
}
}
} else {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
}
@Transactional
@ResponseBody
@RequestMapping(value = "/portfolio/{id}", method = RequestMethod.DELETE, consumes = "application/json")
public ResponseEntity<?> delete(@PathVariable Long id) {
Long loggedInUserProfileId = securityController.getAuthenticatedUserProfileId();
if(loggedInUserProfileId != null && loggedInUserProfileId != UserProfileResource.ANONYMOUS_USER_PROFILE_ID) {
Portfolio portfolio = entityManager.find(Portfolio.class, id);
if (portfolio == null) {
return new ResponseEntity<Object>(HttpStatus.NO_CONTENT);
} else {
if (portfolio.getUserProfile() != null && portfolio.getUserProfile().getId() == loggedInUserProfileId) {
entityManager.remove(portfolio);
return new ResponseEntity<Object>(HttpStatus.OK);
} else {
return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
}
}
} else {
return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
}
}
}