From 9cb7df6e43595272de8e94bf73f65c509a7fc922 Mon Sep 17 00:00:00 2001 From: Bo Lee Date: Sat, 7 Apr 2018 23:32:32 -0400 Subject: [PATCH] complete --- .../controller/ComputeResultController.java | 47 ++++++++++ .../controller/PollController.java | 80 +++++++++++++++++ .../controller/VoteController.java | 45 ++++++++++ .../domain/Option.java | 45 ++++++++++ .../domain/Poll.java | 50 +++++++++++ .../domain/Vote.java | 32 +++++++ .../dto/OptionCount.java | 23 +++++ .../dto/VoteResult.java | 25 ++++++ .../dto/error/ErrorDetail.java | 64 +++++++++++++ .../dto/error/RestExceptionHandler.java | 72 +++++++++++++++ .../dto/error/ValidationError.java | 25 ++++++ .../exception/ResourceNotFoundException.java | 20 +++++ .../repositories/OptionRepository.java | 7 ++ .../repositories/PollRepository.java | 7 ++ .../repositories/VoteRepository.java | 15 ++++ src/main/resources/import.sql | 90 +++++++++++++++++++ src/main/resources/messages.properties | 2 + 17 files changed, 649 insertions(+) create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/controller/ComputeResultController.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/controller/PollController.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/controller/VoteController.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/domain/Option.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/domain/Poll.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/domain/Vote.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/dto/OptionCount.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/dto/VoteResult.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/dto/error/ErrorDetail.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/dto/error/RestExceptionHandler.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/dto/error/ValidationError.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/exception/ResourceNotFoundException.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/repositories/OptionRepository.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/repositories/PollRepository.java create mode 100644 src/main/java/io/zipcoder/tc_spring_poll_application/repositories/VoteRepository.java create mode 100644 src/main/resources/import.sql create mode 100644 src/main/resources/messages.properties diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/controller/ComputeResultController.java b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/ComputeResultController.java new file mode 100644 index 0000000..a804beb --- /dev/null +++ b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/ComputeResultController.java @@ -0,0 +1,47 @@ +package io.zipcoder.tc_spring_poll_application.controller; + +import io.zipcoder.tc_spring_poll_application.domain.Vote; +import io.zipcoder.tc_spring_poll_application.dto.OptionCount; +import io.zipcoder.tc_spring_poll_application.dto.VoteResult; +import io.zipcoder.tc_spring_poll_application.repositories.VoteRepository; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +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 javax.inject.Inject; +import java.util.HashMap; +import java.util.Map; + +@RestController +public class ComputeResultController { + + @Inject + private VoteRepository voteRepository; + + @RequestMapping(value = "/computeresult", method = RequestMethod.GET) + public ResponseEntity computeResult(@RequestParam Long pollId) { + VoteResult voteResult = new VoteResult(); + Iterable allVotes = voteRepository.findVotesByPoll(pollId); + + int totalVotes = 0; + Map tempMap = new HashMap<>(); + for(Vote v : allVotes){ + totalVotes++; + OptionCount optionCount = tempMap.get(v.getOption().getId()); + if(optionCount == null){ + optionCount = new OptionCount(); + optionCount.setOptionId(v.getOption().getId()); + tempMap.put(v.getOption().getId(), optionCount); + } + optionCount.setCount(optionCount.getCount()+1); + } + voteResult.setTotalVotes(totalVotes); + voteResult.setResults(tempMap.values()); + + + return new ResponseEntity(voteResult, HttpStatus.OK); + } +} diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/controller/PollController.java b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/PollController.java new file mode 100644 index 0000000..250f8fd --- /dev/null +++ b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/PollController.java @@ -0,0 +1,80 @@ +package io.zipcoder.tc_spring_poll_application.controller; + +import io.zipcoder.tc_spring_poll_application.domain.Poll; +import io.zipcoder.tc_spring_poll_application.exception.ResourceNotFoundException; +import io.zipcoder.tc_spring_poll_application.repositories.PollRepository; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.inject.Inject; +import javax.validation.Valid; +import java.net.URI; + +@RestController +public class PollController { + + @Inject + private PollRepository pollRepository; + + + //GET verb implementation for polls + @RequestMapping(value = "/polls", method= RequestMethod.GET) + public ResponseEntity> getAllPolls(){ + Iterable allPolls = pollRepository.findAll(); + return new ResponseEntity<>(allPolls, HttpStatus.OK); + } + + + //implementation to create new poll + @RequestMapping(value="/polls", method=RequestMethod.POST) + public ResponseEntity createPoll(@Valid @RequestBody Poll poll){ + poll = pollRepository.save(poll); + + //Set the location header for the newly created resource + HttpHeaders responseHeaders = new HttpHeaders(); + URI newPollUri = ServletUriComponentsBuilder + .fromCurrentRequest() + .path("/{id}") + .buildAndExpand(poll.getId()) + .toUri(); + responseHeaders.setLocation(newPollUri); + + return new ResponseEntity<>(null, responseHeaders, HttpStatus.CREATED); + } + + @RequestMapping(value="/polls/{pollId}", method=RequestMethod.GET) + public ResponseEntity getPoll(@PathVariable Long pollId) { + verifyPoll(pollId); + Poll p = pollRepository.findOne(pollId); + return new ResponseEntity<>(p, HttpStatus.OK); + } + + + @RequestMapping(value="/polls/{pollId}", method=RequestMethod.PUT) + public ResponseEntity updatePoll(@Valid @RequestBody Poll poll, @PathVariable Long pollId){ + //save the entity + verifyPoll(pollId); + Poll p = pollRepository.save(poll); + return new ResponseEntity<>(HttpStatus.OK); + } + + + @RequestMapping(value="/polls/{pollId}", method=RequestMethod.DELETE) + public ResponseEntity deletePoll(@PathVariable Long pollId){ + verifyPoll(pollId); + pollRepository.delete(pollId); + return new ResponseEntity<>(HttpStatus.OK); + } + + void verifyPoll(Long pollId) throws ResourceNotFoundException{ + Poll poll = pollRepository.findOne(pollId); + if (poll == null){ + throw new ResourceNotFoundException("Poll with id "+ pollId + " not found"); + } + } + + +} diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/controller/VoteController.java b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/VoteController.java new file mode 100644 index 0000000..57ef34e --- /dev/null +++ b/src/main/java/io/zipcoder/tc_spring_poll_application/controller/VoteController.java @@ -0,0 +1,45 @@ +package io.zipcoder.tc_spring_poll_application.controller; + +import io.zipcoder.tc_spring_poll_application.domain.Vote; +import io.zipcoder.tc_spring_poll_application.repositories.VoteRepository; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import javax.inject.Inject; + +@RestController +public class VoteController { + @Inject + private VoteRepository voteRepository; + + @RequestMapping(value = "/polls/{pollId}/votes", method = RequestMethod.POST) + public ResponseEntity createVote(@PathVariable Long pollId, @RequestBody Vote + vote) { + vote = voteRepository.save(vote); + // Set the headers for the newly created resource + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setLocation(ServletUriComponentsBuilder. + fromCurrentRequest().path("/{id}").buildAndExpand(vote.getId()).toUri()); + return new ResponseEntity<>(null, responseHeaders, HttpStatus.CREATED); + } + + @RequestMapping(value="/polls/votes", method=RequestMethod.GET) + public Iterable getAllVotes() { + return voteRepository.findAll(); + } + + + @RequestMapping(value="/polls/{pollId}/votes", method=RequestMethod.GET) + public Iterable getVote(@PathVariable Long pollId) { + return voteRepository.findVotesByPoll(pollId); + } + + +} + + + + diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Option.java b/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Option.java new file mode 100644 index 0000000..3c2634f --- /dev/null +++ b/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Option.java @@ -0,0 +1,45 @@ +package io.zipcoder.tc_spring_poll_application.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Option { + + @Id + @GeneratedValue + @Column(name = "OPTION_ID") + private Long id; + + @Column(name = "OPTION_VALUE") + private String value; + + @Column(name = "POLL_ID") + private Long pollId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Long getPollId() { + return pollId; + } + + public void setPollId(Long pollId) { + this.pollId = pollId; + } +} diff --git a/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Poll.java b/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Poll.java new file mode 100644 index 0000000..8f5c4a5 --- /dev/null +++ b/src/main/java/io/zipcoder/tc_spring_poll_application/domain/Poll.java @@ -0,0 +1,50 @@ +package io.zipcoder.tc_spring_poll_application.domain; + +import org.hibernate.validator.constraints.NotEmpty; + +import javax.persistence.*; +import javax.validation.constraints.Size; +import java.util.Set; + +@Entity +public class Poll { + + @Id + @GeneratedValue + @Column(name = "POLL_ID") + private Long id; + + @Column(name = "QUESTION") + @NotEmpty + private String question; + + @OneToMany(cascade = CascadeType.ALL) + @JoinColumn(name = "POLL_ID") + @OrderBy + @Size(min=2, max=6) + private Set