Skip to content

Commit 477a81d

Browse files
authored
Merge pull request #45 from TAMULib/sprint4-b03412-sort-and-filter
Sprint4 b03412 sort and filter
2 parents 7c3a12a + 2369add commit 477a81d

20 files changed

Lines changed: 844 additions & 179 deletions
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package edu.tamu.app.controller;
2+
3+
import static edu.tamu.weaver.response.ApiStatus.SUCCESS;
4+
import static edu.tamu.weaver.validation.model.BusinessValidationType.CREATE;
5+
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.security.access.prepost.PreAuthorize;
8+
import org.springframework.transaction.annotation.Transactional;
9+
import org.springframework.web.bind.annotation.PathVariable;
10+
import org.springframework.web.bind.annotation.RequestBody;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
import edu.tamu.app.exception.UserNotFoundException;
15+
import edu.tamu.app.model.FeatureProposal;
16+
import edu.tamu.app.model.Idea;
17+
import edu.tamu.app.model.User;
18+
import edu.tamu.app.model.repo.FeatureProposalRepo;
19+
import edu.tamu.app.model.request.FilteredPageRequest;
20+
import edu.tamu.weaver.auth.annotation.WeaverCredentials;
21+
import edu.tamu.weaver.auth.annotation.WeaverUser;
22+
import edu.tamu.weaver.auth.model.Credentials;
23+
import edu.tamu.weaver.response.ApiResponse;
24+
import edu.tamu.weaver.validation.aspect.annotation.WeaverValidatedModel;
25+
import edu.tamu.weaver.validation.aspect.annotation.WeaverValidation;
26+
27+
@RestController
28+
@RequestMapping("/feature-proposals")
29+
public class FeatureProposalController {
30+
31+
@Autowired
32+
private FeatureProposalRepo featureProposalRepo;
33+
34+
@RequestMapping("/page")
35+
@PreAuthorize("hasRole('ANONYMOUS')")
36+
public ApiResponse getAllFeatureProposalsByService(@RequestBody FilteredPageRequest filteredPageRequest) {
37+
return new ApiResponse(SUCCESS, featureProposalRepo.findAll(filteredPageRequest.getFeatureProposalSpecification(), filteredPageRequest.getPageRequest()));
38+
}
39+
40+
@RequestMapping("/{id}")
41+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
42+
public ApiResponse getFeatureProposal(@PathVariable Long id) {
43+
return new ApiResponse(SUCCESS, featureProposalRepo.findOne(id));
44+
}
45+
46+
@RequestMapping("/create")
47+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
48+
@WeaverValidation(business = { @WeaverValidation.Business(value = CREATE) })
49+
public ApiResponse create(@WeaverValidatedModel FeatureProposal featureProposal, @WeaverCredentials Credentials credentials) throws UserNotFoundException {
50+
return new ApiResponse(SUCCESS, featureProposalRepo.create(featureProposal, credentials));
51+
}
52+
53+
@RequestMapping("/elevate")
54+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
55+
public ApiResponse elevate(@WeaverValidatedModel Idea idea) throws UserNotFoundException {
56+
return new ApiResponse(SUCCESS, featureProposalRepo.create(idea));
57+
}
58+
59+
@RequestMapping("/update")
60+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
61+
public ApiResponse update(@WeaverValidatedModel FeatureProposal featureProposal) {
62+
return new ApiResponse(SUCCESS, featureProposalRepo.update(featureProposal));
63+
}
64+
65+
@Transactional
66+
@RequestMapping("/remove")
67+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
68+
public ApiResponse remove(@WeaverValidatedModel FeatureProposal featureProposal) {
69+
featureProposalRepo.delete(featureProposal);
70+
return new ApiResponse(SUCCESS);
71+
}
72+
73+
@RequestMapping("/{id}/vote")
74+
@PreAuthorize("hasRole('USER')")
75+
public ApiResponse vote(@PathVariable Long id, @WeaverUser User voter) {
76+
FeatureProposal featureProposal = featureProposalRepo.findOne(id);
77+
featureProposal.addVoter(voter);
78+
return new ApiResponse(SUCCESS, featureProposalRepo.update(featureProposal));
79+
}
80+
81+
}

src/main/java/edu/tamu/app/controller/IdeaController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ public class IdeaController {
3030

3131
@RequestMapping("/page")
3232
@PreAuthorize("hasRole('SERVICE_MANAGER')")
33-
public ApiResponse getAllIdeasByService(@RequestBody FilteredPageRequest filteredPageRequest) {
33+
public ApiResponse page(@RequestBody FilteredPageRequest filteredPageRequest) {
3434
return new ApiResponse(SUCCESS, ideaRepo.findAll(filteredPageRequest.getIdeaSpecification(), filteredPageRequest.getPageRequest()));
3535
}
3636

3737
@RequestMapping("/{id}")
3838
@PreAuthorize("hasRole('SERVICE_MANAGER')")
39-
public ApiResponse getIdea(@PathVariable Long id) {
39+
public ApiResponse getById(@PathVariable Long id) {
4040
return new ApiResponse(SUCCESS, ideaRepo.findOne(id));
4141
}
4242

src/main/java/edu/tamu/app/controller/NoteController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ public class NoteController {
3030

3131
@RequestMapping("/page")
3232
@PreAuthorize("hasRole('ANONYMOUS')")
33-
public ApiResponse getAllNotesByService(@RequestBody FilteredPageRequest filteredPageRequest) {
33+
public ApiResponse page(@RequestBody FilteredPageRequest filteredPageRequest) {
3434
return new ApiResponse(SUCCESS, noteRepo.findAll(filteredPageRequest.getNoteSpecification(), filteredPageRequest.getPageRequest()));
3535
}
3636

3737
@RequestMapping("/{id}")
3838
@PreAuthorize("hasRole('ANONYMOUS')")
39-
public ApiResponse getNote(@PathVariable Long id) {
39+
public ApiResponse getById(@PathVariable Long id) {
4040
return new ApiResponse(SUCCESS, noteRepo.findOne(id));
4141
}
4242

src/main/java/edu/tamu/app/controller/NotificationController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public ApiResponse getAllNotifications() {
3535

3636
@RequestMapping("/{id}")
3737
@PreAuthorize("hasRole('STAFF')")
38-
public ApiResponse getNotification(@PathVariable Long id) {
38+
public ApiResponse getById(@PathVariable Long id) {
3939
return new ApiResponse(SUCCESS, notificationRepo.findOne(id));
4040
}
4141

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package edu.tamu.app.model;
2+
3+
import static javax.persistence.CascadeType.MERGE;
4+
import static javax.persistence.CascadeType.REFRESH;
5+
import static javax.persistence.FetchType.EAGER;
6+
7+
import java.util.Calendar;
8+
9+
import javax.persistence.Column;
10+
import javax.persistence.ManyToOne;
11+
import javax.persistence.MappedSuperclass;
12+
import javax.persistence.Temporal;
13+
import javax.persistence.TemporalType;
14+
15+
import org.hibernate.annotations.UpdateTimestamp;
16+
17+
import edu.tamu.app.model.request.ServiceRequest;
18+
import edu.tamu.app.model.validation.IdeaValidator;
19+
import edu.tamu.weaver.validation.model.ValidatingBaseEntity;
20+
21+
@MappedSuperclass
22+
public abstract class AbstractIdea extends ValidatingBaseEntity {
23+
24+
@Column(nullable = false)
25+
private String title;
26+
27+
@Column(columnDefinition = "text", nullable = true)
28+
private String description;
29+
30+
@Temporal(TemporalType.TIMESTAMP)
31+
@UpdateTimestamp
32+
private Calendar lastModified;
33+
34+
@ManyToOne(fetch = EAGER, cascade = MERGE, optional = false)
35+
private Service service;
36+
37+
@ManyToOne(cascade = REFRESH, optional = false)
38+
private User author;
39+
40+
public AbstractIdea() {
41+
super();
42+
this.modelValidator = new IdeaValidator();
43+
}
44+
45+
public AbstractIdea(String title, String description) {
46+
this();
47+
this.title = title;
48+
this.description = description;
49+
}
50+
51+
public AbstractIdea(ServiceRequest serviceRequest) {
52+
this(serviceRequest.getTitle(), serviceRequest.getDescription());
53+
}
54+
55+
public AbstractIdea(String title, String description, User author) {
56+
this(title, description);
57+
this.author = author;
58+
}
59+
60+
public AbstractIdea(String title, String description, User author, Service service) {
61+
this(title, description, author);
62+
this.service = service;
63+
}
64+
65+
public String getTitle() {
66+
return title;
67+
}
68+
69+
public void setTitle(String title) {
70+
this.title = title;
71+
}
72+
73+
public String getDescription() {
74+
return description;
75+
}
76+
77+
public void setDescription(String description) {
78+
this.description = description;
79+
}
80+
81+
public Calendar getLastModified() {
82+
return lastModified;
83+
}
84+
85+
public void setLastModified(Calendar lastModified) {
86+
this.lastModified = lastModified;
87+
}
88+
89+
public Service getService() {
90+
return service;
91+
}
92+
93+
public void setService(Service service) {
94+
this.service = service;
95+
}
96+
97+
public User getAuthor() {
98+
return author;
99+
}
100+
101+
public void setAuthor(User author) {
102+
this.author = author;
103+
}
104+
105+
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package edu.tamu.app.model;
2+
3+
import static javax.persistence.FetchType.EAGER;
4+
import static org.hibernate.annotations.FetchMode.SELECT;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import javax.persistence.CascadeType;
10+
import javax.persistence.Entity;
11+
import javax.persistence.JoinTable;
12+
import javax.persistence.OneToMany;
13+
import javax.persistence.UniqueConstraint;
14+
15+
import org.hibernate.annotations.Fetch;
16+
17+
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
18+
import com.fasterxml.jackson.annotation.JsonIdentityReference;
19+
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
20+
21+
@Entity
22+
public class FeatureProposal extends AbstractIdea {
23+
24+
@OneToMany(fetch = EAGER, cascade = { CascadeType.REFRESH, CascadeType.DETACH, CascadeType.MERGE })
25+
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { "feature_proposal_id", "ideas_id" }))
26+
@Fetch(value = SELECT)
27+
private List<Idea> ideas;
28+
29+
@OneToMany(fetch = EAGER, cascade = { CascadeType.REFRESH, CascadeType.DETACH, CascadeType.MERGE })
30+
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, scope = User.class, property = "id")
31+
@JsonIdentityReference(alwaysAsId = true)
32+
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { "feature_proposal_id", "voters_id" }))
33+
@Fetch(value = SELECT)
34+
private List<User> voters;
35+
36+
public FeatureProposal() {
37+
super();
38+
setup();
39+
}
40+
41+
public FeatureProposal(String title, String description) {
42+
super(title, description);
43+
setup();
44+
}
45+
46+
public FeatureProposal(String title, String description, User author) {
47+
super(title, description, author);
48+
setup();
49+
}
50+
51+
public FeatureProposal(String title, String description, User author, Service service) {
52+
super(title, description, author, service);
53+
setup();
54+
}
55+
56+
public FeatureProposal(Idea idea) {
57+
super(idea.getTitle(), idea.getDescription(), idea.getAuthor(), idea.getService());
58+
setup();
59+
addIdea(idea);
60+
}
61+
62+
private void setup() {
63+
this.ideas = new ArrayList<Idea>();
64+
this.voters = new ArrayList<User>();
65+
}
66+
67+
public List<Idea> getIdeas() {
68+
return ideas;
69+
}
70+
71+
public void setIdeas(List<Idea> ideas) {
72+
this.ideas.forEach(idea -> {
73+
removeVoter(idea.getAuthor());
74+
});
75+
this.ideas = ideas;
76+
this.ideas.forEach(idea -> {
77+
addVoter(idea.getAuthor());
78+
});
79+
}
80+
81+
public void addIdea(Idea idea) {
82+
if (!this.ideas.contains(idea)) {
83+
this.ideas.add(idea);
84+
addVoter(idea.getAuthor());
85+
}
86+
}
87+
88+
public void removeIdea(Idea idea) {
89+
this.ideas.remove(idea);
90+
removeVoter(idea.getAuthor());
91+
}
92+
93+
public List<User> getVoters() {
94+
return voters;
95+
}
96+
97+
public void setVoters(List<User> voters) {
98+
this.voters = voters;
99+
}
100+
101+
public void addVoter(User voter) {
102+
if (!this.voters.contains(voter)) {
103+
this.voters.add(voter);
104+
}
105+
}
106+
107+
public void removeVoter(User voter) {
108+
this.voters.remove(voter);
109+
}
110+
111+
public int getVotes() {
112+
return this.voters.size();
113+
}
114+
115+
}

0 commit comments

Comments
 (0)