Skip to content

Commit 74f0156

Browse files
authored
Merge pull request #72 from TAMULib/sprint6-b03633-feature_proposal-reject_reason
Sprint6 b03633 Add "feedback" field to feature proposal to accept reason for reject action
2 parents 15a8a6c + b9c6464 commit 74f0156

9 files changed

Lines changed: 90 additions & 31 deletions

File tree

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package edu.tamu.app.controller;
22

3+
import static edu.tamu.weaver.response.ApiStatus.INVALID;
34
import static edu.tamu.weaver.response.ApiStatus.SUCCESS;
45
import static edu.tamu.weaver.validation.model.BusinessValidationType.CREATE;
56

@@ -11,7 +12,6 @@
1112
import org.springframework.web.bind.annotation.RequestMapping;
1213
import org.springframework.web.bind.annotation.RestController;
1314

14-
import edu.tamu.app.enums.FeatureProposalState;
1515
import edu.tamu.app.exception.UserNotFoundException;
1616
import edu.tamu.app.model.FeatureProposal;
1717
import edu.tamu.app.model.Idea;
@@ -63,6 +63,18 @@ public ApiResponse update(@WeaverValidatedModel FeatureProposal featureProposal)
6363
return new ApiResponse(SUCCESS, featureProposalRepo.update(featureProposal));
6464
}
6565

66+
@RequestMapping("/reject")
67+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
68+
public ApiResponse reject(@WeaverValidatedModel FeatureProposal featureProposal) {
69+
ApiResponse response;
70+
if (featureProposal.getFeedback() == null || featureProposal.getFeedback().equals("")) {
71+
response = new ApiResponse(INVALID, "You must provide feedback to reject a feature proposal.");
72+
} else {
73+
response = new ApiResponse(SUCCESS, featureProposalRepo.reject(featureProposal));
74+
}
75+
return response;
76+
}
77+
6678
@Transactional
6779
@RequestMapping("/remove")
6880
@PreAuthorize("hasRole('SERVICE_MANAGER')")
@@ -79,12 +91,4 @@ public ApiResponse vote(@PathVariable Long id, @WeaverUser User voter) {
7991
return new ApiResponse(SUCCESS, featureProposalRepo.update(featureProposal));
8092
}
8193

82-
@RequestMapping("/{id}/reject")
83-
@PreAuthorize("hasRole('SERVICE_MANAGER')")
84-
public ApiResponse reject(@PathVariable Long id, @WeaverUser User voter) {
85-
FeatureProposal featureProposal = featureProposalRepo.findOne(id);
86-
featureProposal.setState(FeatureProposalState.REJECTED);
87-
return new ApiResponse(SUCCESS, featureProposalRepo.update(featureProposal));
88-
}
89-
9094
}

src/main/java/edu/tamu/app/model/AbstractIdea.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ public abstract class AbstractIdea extends ValidatingBaseEntity {
2525
@Column(columnDefinition = "text", nullable = true)
2626
private String description;
2727

28+
@Column(nullable = true)
29+
private String feedback;
30+
2831
@Temporal(TemporalType.TIMESTAMP)
2932
@UpdateTimestamp
3033
private Calendar lastModified;
@@ -37,6 +40,7 @@ public abstract class AbstractIdea extends ValidatingBaseEntity {
3740

3841
public AbstractIdea() {
3942
super();
43+
this.feedback = "";
4044
}
4145

4246
public AbstractIdea(String title, String description) {
@@ -75,6 +79,14 @@ public void setDescription(String description) {
7579
this.description = description;
7680
}
7781

82+
public String getFeedback() {
83+
return feedback;
84+
}
85+
86+
public void setFeedback(String feedback) {
87+
this.feedback = feedback;
88+
}
89+
7890
public Calendar getLastModified() {
7991
return lastModified;
8092
}

src/main/java/edu/tamu/app/model/Idea.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ public class Idea extends AbstractIdea {
2626
@Enumerated(EnumType.STRING)
2727
@Column(nullable = false)
2828
private IdeaState state;
29-
30-
@Column(nullable = true)
31-
private String feedback;
3229

3330
@Column(nullable = true)
3431
private String email;
@@ -67,7 +64,7 @@ public Idea(String title, String description, User author, Service service) {
6764
super(title, description, author, service);
6865
this.state = IdeaState.WAITING_ON_REVIEW;
6966
}
70-
67+
7168
public Idea(String title, String description, User author, Service service, String email) {
7269
this(title, description, author, service);
7370
this.email = email;
@@ -81,14 +78,6 @@ public void setState(IdeaState state) {
8178
this.state = state;
8279
}
8380

84-
public String getFeedback() {
85-
return feedback;
86-
}
87-
88-
public void setFeedback(String feedback) {
89-
this.feedback = feedback;
90-
}
91-
9281
public String getEmail() {
9382
return email;
9483
}

src/main/java/edu/tamu/app/model/repo/custom/FeatureProposalRepoCustom.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public interface FeatureProposalRepoCustom {
1515

1616
public void delete(FeatureProposal featureProposal);
1717

18+
public FeatureProposal reject(FeatureProposal featureProposal);
19+
1820
}

src/main/java/edu/tamu/app/model/repo/impl/FeatureProposalRepoImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.beans.factory.annotation.Autowired;
88
import org.springframework.messaging.simp.SimpMessagingTemplate;
99

10+
import edu.tamu.app.enums.FeatureProposalState;
1011
import edu.tamu.app.enums.IdeaState;
1112
import edu.tamu.app.exception.UserNotFoundException;
1213
import edu.tamu.app.model.FeatureProposal;
@@ -89,4 +90,9 @@ public void delete(FeatureProposal featureProposal) {
8990
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/delete", new ApiResponse(SUCCESS, featureProposal.getId()));
9091
}
9192

93+
public FeatureProposal reject(FeatureProposal featureProposal) {
94+
featureProposal.setState(FeatureProposalState.REJECTED);
95+
return featureProposalRepo.update(featureProposal);
96+
}
97+
9298
}

src/test/java/edu/tamu/app/controller/FeatureProposalControllerTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.messaging.simp.SimpMessagingTemplate;
2424
import org.springframework.test.context.junit4.SpringRunner;
2525

26+
import edu.tamu.app.enums.FeatureProposalState;
2627
import edu.tamu.app.enums.Status;
2728
import edu.tamu.app.exception.UserNotFoundException;
2829
import edu.tamu.app.model.FeatureProposal;
@@ -52,15 +53,19 @@ public class FeatureProposalControllerTest {
5253
private static final String TEST_MODIFIED_FEATURE_PROPOSAL_TITLE = "Modified Feature Proposal Title";
5354
private static final String TEST_MODIFIED_FEATURE_PROPOSAL_DESCRIPTION = "Modified Feature Proposal Description";
5455
private static final String TEST_SERVICE_NAME = "Test Service";
56+
private static final String TEST_FEEDBACK = "Test Rejection Feedback";
5557

5658
private static Service TEST_SERVICE = new Service(TEST_SERVICE_NAME, Status.UP, false, true, true, "", "");
5759
private static FeatureProposal TEST_FEATURE_PROPOSAL1 = new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE1, TEST_FEATURE_PROPOSAL_DESCRIPTION1, TEST_USER1);
5860
private static FeatureProposal TEST_FEATURE_PROPOSAL2 = new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE2, TEST_FEATURE_PROPOSAL_DESCRIPTION2, TEST_USER1);
5961
private static FeatureProposal TEST_FEATURE_PROPOSAL3 = new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE3, TEST_FEATURE_PROPOSAL_DESCRIPTION3, TEST_USER1);
6062
private static FeatureProposal TEST_MODIFIED_FEATURE_PROPOSAL = new FeatureProposal(TEST_MODIFIED_FEATURE_PROPOSAL_TITLE, TEST_MODIFIED_FEATURE_PROPOSAL_DESCRIPTION, TEST_USER2, TEST_SERVICE);
63+
private static FeatureProposal featureProposalWithFeedback = new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE1, TEST_FEATURE_PROPOSAL_DESCRIPTION1, TEST_USER1);
6164
private static List<FeatureProposal> mockFeatureProposalList = new ArrayList<FeatureProposal>(Arrays.asList(new FeatureProposal[] { TEST_FEATURE_PROPOSAL1, TEST_FEATURE_PROPOSAL2, TEST_FEATURE_PROPOSAL3 }));
6265
private static Page<FeatureProposal> mockPageableFeatureProposalList = new PageImpl<FeatureProposal>(Arrays.asList(new FeatureProposal[] { TEST_FEATURE_PROPOSAL1, TEST_FEATURE_PROPOSAL2, TEST_FEATURE_PROPOSAL3 }));
6366

67+
private FeatureProposal rejectedFeatureProposal = new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE1, TEST_FEATURE_PROPOSAL_DESCRIPTION1, TEST_USER1);
68+
6469
private static User user = new User("123456789");
6570

6671
private static ApiResponse response;
@@ -86,6 +91,8 @@ public class FeatureProposalControllerTest {
8691
@Before
8792
@SuppressWarnings("unchecked")
8893
public void setup() throws UserNotFoundException {
94+
rejectedFeatureProposal.setState(FeatureProposalState.REJECTED);
95+
featureProposalWithFeedback.setFeedback(TEST_FEEDBACK);
8996
MockitoAnnotations.initMocks(this);
9097
when(credentials.getUin()).thenReturn("123456789");
9198
when(userRepo.findByUsername(any(String.class))).thenReturn(Optional.of(user));
@@ -95,6 +102,7 @@ public void setup() throws UserNotFoundException {
95102
when(featureProposalRepo.create(any(FeatureProposal.class), any(Credentials.class))).thenReturn(TEST_FEATURE_PROPOSAL1);
96103
when(featureProposalRepo.create(any(Idea.class))).thenReturn(TEST_FEATURE_PROPOSAL1);
97104
when(featureProposalRepo.update(any(FeatureProposal.class))).thenReturn(TEST_MODIFIED_FEATURE_PROPOSAL);
105+
when(featureProposalRepo.reject(TEST_FEATURE_PROPOSAL1)).thenReturn(rejectedFeatureProposal);
98106
when(serviceRepo.findOne(any(Long.class))).thenReturn(TEST_SERVICE);
99107
doNothing().when(featureProposalRepo).delete(any(FeatureProposal.class));
100108
doNothing().when(featureProposalRepo).delete(any(FeatureProposal.class));
@@ -141,6 +149,14 @@ public void testUpdate() {
141149
assertEquals("Notification Author was not properly updated", TEST_MODIFIED_FEATURE_PROPOSAL.getAuthor(), featureProposal.getAuthor());
142150
}
143151

152+
@Test
153+
public void testReject() {
154+
response = featureProposalController.reject(featureProposalWithFeedback);
155+
assertEquals("Not successful at rejecting feature proposal", SUCCESS, response.getMeta().getStatus());
156+
FeatureProposal featureProposal = (FeatureProposal) response.getPayload().get("FeatureProposal");
157+
assertEquals("State was not set to Rejected", rejectedFeatureProposal.getState(), featureProposal.getState());
158+
}
159+
144160
@Test
145161
public void testRemove() {
146162
response = featureProposalController.remove(TEST_MODIFIED_FEATURE_PROPOSAL);

src/test/java/edu/tamu/app/controller/IdeaControllerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class IdeaControllerTest {
6060
private static Idea TEST_IDEA2 = new Idea(TEST_IDEA_TITLE2, TEST_IDEA_DESCRIPTION2, TEST_USER1);
6161
private static Idea TEST_IDEA3 = new Idea(TEST_IDEA_TITLE3, TEST_IDEA_DESCRIPTION3, TEST_USER1);
6262
private static Idea TEST_MODIFIED_IDEA = new Idea(TEST_MODIFIED_IDEA_TITLE, TEST_MODIFIED_IDEA_DESCRIPTION, TEST_USER2, TEST_SERVICE);
63-
private static Idea ideaWtihFeedback = new Idea(TEST_IDEA_TITLE1, TEST_IDEA_DESCRIPTION1, TEST_USER1);
63+
private static Idea ideaWithFeedback = new Idea(TEST_IDEA_TITLE1, TEST_IDEA_DESCRIPTION1, TEST_USER1);
6464
private Idea rejectedIdea = new Idea(TEST_IDEA_TITLE1, TEST_IDEA_DESCRIPTION1, TEST_USER1);
6565
private static List<Idea> mockIdeaList = new ArrayList<Idea>(Arrays.asList(new Idea[] { TEST_IDEA1, TEST_IDEA2, TEST_IDEA3 }));
6666
private static Page<Idea> mockPageableIdeaList = new PageImpl<Idea>(Arrays.asList(new Idea[] { TEST_IDEA1, TEST_IDEA2, TEST_IDEA3 }));
@@ -91,7 +91,7 @@ public class IdeaControllerTest {
9191
@SuppressWarnings("unchecked")
9292
public void setup() throws UserNotFoundException {
9393
rejectedIdea.setState(IdeaState.REJECTED);
94-
ideaWtihFeedback.setFeedback(TEST_FEEDBACK);
94+
ideaWithFeedback.setFeedback(TEST_FEEDBACK);
9595
MockitoAnnotations.initMocks(this);
9696
when(credentials.getUin()).thenReturn("123456789");
9797
when(userRepo.findByUsername(any(String.class))).thenReturn(Optional.of(user));
@@ -142,7 +142,7 @@ public void testUpdate() {
142142

143143
@Test
144144
public void testReject() {
145-
response = ideaController.reject(ideaWtihFeedback);
145+
response = ideaController.reject(ideaWithFeedback);
146146
assertEquals("Not successful at rejecting idea", SUCCESS, response.getMeta().getStatus());
147147
Idea idea = (Idea) response.getPayload().get("Idea");
148148
assertEquals("State was not set to Rejected", rejectedIdea.getState(), idea.getState());

src/test/java/edu/tamu/app/model/FeatureProposalTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ public class FeatureProposalTest {
3131

3232
private static final String TEST_FEATURE_PROPOSAL_TITLE = "Feature Proposal Title";
3333
private static final String TEST_FEATURE_PROPOSAL_DESCRIPTION = "Test Feature Proposal Description";
34+
private static final String TEST_FEATURE_PROPOSAL_FEEDBACK = "Feature Proposal Feedback";
3435

3536
private static final String TEST_SERVICE_NAME = "Test Service Name";
3637
private static final String TEST_SERVICE_URL = "https://library.tamu.edu";
3738
private static final String TEST_SERVICE_DESCRIPTION = "Test Service Description";
3839

3940
private static final String TEST_ALTERNATIVE_FEATURE_PROPOSAL_TITLE = "Alternative Feature Proposal Title";
4041
private static final String TEST_ALTERNATIVE_FEATURE_PROPOSAL_DESCRIPTION = "Alternative Feature Proposal Description";
42+
private static final String TEST_ALTERNATIVE_FEATURE_PROPOSAL_FEEDBACK = "Alternative Feature Proposal Feedback";
4143

4244
private static final String TEST_ALTERNATIVE_SERVICE_NAME = "Different Service Name";
4345

@@ -197,6 +199,17 @@ public void testUpdateDescription() throws UserNotFoundException {
197199
assertEquals("FeatureProposal body not updated", TEST_ALTERNATIVE_FEATURE_PROPOSAL_DESCRIPTION, featureProposal.getDescription());
198200
}
199201

202+
@Test
203+
public void testUpdateFeedback() throws UserNotFoundException {
204+
FeatureProposal featureProposal = featureProposalRepo.create(testFeatureProposal, TEST_CREDENTIALS);
205+
featureProposal.setFeedback(TEST_FEATURE_PROPOSAL_FEEDBACK);
206+
featureProposal = featureProposalRepo.save(featureProposal);
207+
assertEquals("FeatureProposal feedback not set", TEST_FEATURE_PROPOSAL_FEEDBACK, featureProposal.getFeedback());
208+
featureProposal.setFeedback(TEST_ALTERNATIVE_FEATURE_PROPOSAL_FEEDBACK);
209+
featureProposal = featureProposalRepo.save(featureProposal);
210+
assertEquals("FeatureProposal feedback not updated", TEST_ALTERNATIVE_FEATURE_PROPOSAL_FEEDBACK, featureProposal.getFeedback());
211+
}
212+
200213
@Test
201214
public void testTimestampSetOnCreate() throws UserNotFoundException {
202215
FeatureProposal FeatureProposal = featureProposalRepo.create(testFeatureProposal, TEST_CREDENTIALS);

src/test/java/edu/tamu/app/model/IdeaTest.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,20 @@
2929
public class IdeaTest {
3030

3131
private static final String TEST_IDEA_TITLE = "Idea Title";
32+
private static final String TEST_IDEA_DESCRIPTION = "Test Idea Description";
33+
private static final String TEST_IDEA_FEEDBACK = "Idea Feedback";
34+
private static final String TEST_IDEA_EMAIL = "aggiejack@mailinator.com";
35+
36+
private static final String TEST_SERVICE_NAME = "Test Service Name";
3237
private static final String TEST_SERVICE_URL = "https://library.tamu.edu";
33-
private static final String TEST_DESCRIPTION = "Test Service Description";
38+
private static final String TEST_SERVICE_DESCRIPTION = "Test Service Description";
39+
3440
private static final String TEST_ALTERNATIVE_IDEA_TITLE = "Alternative Idea Title";
35-
private static final String TEST_SERVICE_NAME = "Test Service Name";
36-
private static final String TEST_ALTERNATIVE_SERVICE_NAME = "Different Service Name";
37-
private static final String TEST_IDEA_DESCRIPTION = "Test Idea Description";
41+
private static final String TEST_ALTERNATIVE_IDEA_FEEDBACK = "Alternative Idea Feedback";
3842
private static final String TEST_ALTERNATIVE_IDEA_DESCRIPTION = "Alternative Idea Description";
39-
private static final String TEST_IDEA_EMAIL = "aggiejack@mailinator.com";
43+
44+
private static final String TEST_ALTERNATIVE_SERVICE_NAME = "Different Service Name";
45+
4046
private static final Boolean TEST_IS_AUTO = false;
4147
private static final Boolean TEST_IS_PUBLIC = true;
4248
private static final Boolean TEST_ON_SHORT_LIST = true;
@@ -78,8 +84,8 @@ public class IdeaTest {
7884
@Before
7985
public void setUp() throws UserNotFoundException {
8086
testUser = userRepo.create(TEST_CREDENTIALS.getUin(), TEST_CREDENTIALS.getEmail(), TEST_CREDENTIALS.getFirstName(), TEST_CREDENTIALS.getLastName(), Role.valueOf(TEST_CREDENTIALS.getRole()));
81-
service1 = serviceRepo.create(new Service(TEST_SERVICE_NAME, TEST_SERVICE_STATUS, TEST_IS_AUTO, TEST_IS_PUBLIC, TEST_ON_SHORT_LIST, TEST_SERVICE_URL, TEST_DESCRIPTION));
82-
service2 = serviceRepo.create(new Service(TEST_ALTERNATIVE_SERVICE_NAME, TEST_SERVICE_STATUS, TEST_IS_AUTO, TEST_IS_PUBLIC, TEST_ON_SHORT_LIST, TEST_SERVICE_URL, TEST_DESCRIPTION));
87+
service1 = serviceRepo.create(new Service(TEST_SERVICE_NAME, TEST_SERVICE_STATUS, TEST_IS_AUTO, TEST_IS_PUBLIC, TEST_ON_SHORT_LIST, TEST_SERVICE_URL, TEST_SERVICE_DESCRIPTION));
88+
service2 = serviceRepo.create(new Service(TEST_ALTERNATIVE_SERVICE_NAME, TEST_SERVICE_STATUS, TEST_IS_AUTO, TEST_IS_PUBLIC, TEST_ON_SHORT_LIST, TEST_SERVICE_URL, TEST_SERVICE_DESCRIPTION));
8389
testIdea = ideaRepo.create(new Idea(TEST_IDEA_TITLE, TEST_IDEA_DESCRIPTION, testUser, service1, TEST_IDEA_EMAIL), TEST_CREDENTIALS);
8490
testFeatureProposal = featureProposalRepo.create(new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE, TEST_FEATURE_PROPOSAL_DESCRIPTION, testUser, service1), TEST_CREDENTIALS);
8591
}
@@ -133,6 +139,17 @@ public void testUpdateDescription() throws UserNotFoundException {
133139
assertEquals("Idea body not updated", TEST_ALTERNATIVE_IDEA_DESCRIPTION, idea.getDescription());
134140
}
135141

142+
@Test
143+
public void testUpdateFeedback() throws UserNotFoundException {
144+
Idea idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);
145+
idea.setFeedback(TEST_IDEA_FEEDBACK);
146+
idea = ideaRepo.save(idea);
147+
assertEquals("Idea feedback not set", TEST_IDEA_FEEDBACK, idea.getFeedback());
148+
idea.setFeedback(TEST_ALTERNATIVE_IDEA_FEEDBACK);
149+
idea = ideaRepo.save(idea);
150+
assertEquals("Idea feedback not updated", TEST_ALTERNATIVE_IDEA_FEEDBACK, idea.getFeedback());
151+
}
152+
136153
@Test
137154
public void testUpdateFeatureProposal() throws UserNotFoundException {
138155
Idea idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);

0 commit comments

Comments
 (0)