@ApiOperation(
     value = StackOpDescription.POST_PUBLIC,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "account/stacks", method = RequestMethod.POST)
 @ResponseBody
 public ResponseEntity<IdJson> createAccountStack(
     @ModelAttribute("user") CbUser user, @RequestBody @Valid StackRequest stackRequest) {
   MDCBuilder.buildUserMdcContext(user);
   return createStack(user, stackRequest, true);
 }
 @ApiOperation(
     value = StackOpDescription.GET_PRIVATE,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "user/stacks", method = RequestMethod.GET)
 @ResponseBody
 public ResponseEntity<Set<StackResponse>> getPrivateStacks(@ModelAttribute("user") CbUser user) {
   MDCBuilder.buildUserMdcContext(user);
   Set<Stack> stacks = stackService.retrievePrivateStacks(user);
   return new ResponseEntity<>(convertStacks(stacks), HttpStatus.OK);
 }
 @ApiOperation(
     value = StackOpDescription.GET_STATUS_BY_ID,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "stacks/{id}/status", method = RequestMethod.GET)
 @ResponseBody
 public ResponseEntity<Map<String, Object>> getStackStatus(
     @ModelAttribute("user") CbUser user, @PathVariable Long id) {
   MDCBuilder.buildUserMdcContext(user);
   Map<String, Object> statusMap = conversionService.convert(stackService.get(id), Map.class);
   return new ResponseEntity<>(statusMap, HttpStatus.OK);
 }
 @ApiOperation(
     value = StackOpDescription.GET_PUBLIC_BY_NAME,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "account/stacks/{name}", method = RequestMethod.GET)
 @ResponseBody
 public ResponseEntity<StackResponse> getStackInPublic(
     @ModelAttribute("user") CbUser user, @PathVariable String name) {
   MDCBuilder.buildUserMdcContext(user);
   Stack stack = stackService.getPublicStack(name, user);
   StackResponse stackJson = conversionService.convert(stack, StackResponse.class);
   return new ResponseEntity<>(stackJson, HttpStatus.OK);
 }
 @ApiOperation(
     value = EventOpDescription.GET_BY_TIMESTAMP,
     produces = ContentType.JSON,
     notes = Notes.EVENT_NOTES)
 @RequestMapping(method = RequestMethod.GET, value = "/events")
 @ResponseBody
 public ResponseEntity<List<CloudbreakEventsJson>> events(
     @ModelAttribute("user") CbUser user,
     @RequestParam(value = "since", required = false) Long since) {
   MDCBuilder.buildUserMdcContext(user);
   List<CloudbreakEventsJson> cloudbreakEvents =
       cloudbreakEventsFacade.retrieveEvents(user.getUserId(), since);
   return new ResponseEntity<>(cloudbreakEvents, HttpStatus.OK);
 }
 @ApiOperation(
     value = StackOpDescription.VALIDATE,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "stacks/validate", method = RequestMethod.POST)
 @ResponseBody
 public ResponseEntity<IdJson> validateStack(
     @ModelAttribute("user") CbUser user,
     @RequestBody @Valid StackValidationRequest stackValidationRequest) {
   MDCBuilder.buildUserMdcContext(user);
   StackValidation stackValidation =
       conversionService.convert(stackValidationRequest, StackValidation.class);
   stackService.validateStack(stackValidation);
   return new ResponseEntity<>(HttpStatus.OK);
 }
 @ApiOperation(
     value = StackOpDescription.DELETE_PUBLIC_BY_NAME,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "account/stacks/{name}", method = RequestMethod.DELETE)
 @ResponseBody
 public ResponseEntity<TemplateResponse> deletePublicStack(
     @ModelAttribute("user") CbUser user,
     @PathVariable String name,
     @RequestParam(value = "forced", required = false, defaultValue = "false") Boolean forced) {
   MDCBuilder.buildUserMdcContext(user);
   if (forced) {
     stackService.forceDelete(name, user);
   } else {
     stackService.delete(name, user);
   }
   return new ResponseEntity<>(HttpStatus.NO_CONTENT);
 }
 @ApiOperation(
     value = StackOpDescription.PUT_BY_ID,
     produces = ContentType.JSON,
     notes = Notes.STACK_NOTES)
 @RequestMapping(value = "stacks/{id}", method = RequestMethod.PUT)
 @ResponseBody
 public ResponseEntity<String> updateStack(
     @ModelAttribute("user") CbUser user,
     @PathVariable Long id,
     @Valid @RequestBody UpdateStackJson updateRequest) {
   MDCBuilder.buildUserMdcContext(user);
   if (updateRequest.getStatus() != null) {
     stackService.updateStatus(id, updateRequest.getStatus());
     return new ResponseEntity<>(HttpStatus.NO_CONTENT);
   } else {
     Integer scalingAdjustment = updateRequest.getInstanceGroupAdjustment().getScalingAdjustment();
     validateAccountPreferences(id, scalingAdjustment);
     stackService.updateNodeCount(id, updateRequest.getInstanceGroupAdjustment());
     return new ResponseEntity<>(HttpStatus.NO_CONTENT);
   }
 }