Skip to content

Commit 2b8deb6

Browse files
authored
Merge pull request #68 from TAMULib/sprint6-b03625-reject-ideas
Sprint6 b03625 reject ideas
2 parents 7074ac0 + 6f58ee1 commit 2b8deb6

10 files changed

Lines changed: 145 additions & 5 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package edu.tamu.app.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.context.annotation.Profile;
5+
6+
import edu.tamu.weaver.email.config.WeaverEmailConfig;
7+
8+
@Configuration
9+
@Profile("!test")
10+
public class AppEmailConfig extends WeaverEmailConfig {
11+
12+
}

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

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

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

67
import org.springframework.beans.factory.annotation.Autowired;
@@ -52,6 +53,18 @@ public ApiResponse create(@WeaverValidatedModel Idea idea, @WeaverCredentials Cr
5253
public ApiResponse update(@WeaverValidatedModel Idea idea) {
5354
return new ApiResponse(SUCCESS, ideaRepo.update(idea));
5455
}
56+
57+
@RequestMapping("/reject")
58+
@PreAuthorize("hasRole('SERVICE_MANAGER')")
59+
public ApiResponse reject(@WeaverValidatedModel Idea idea) {
60+
ApiResponse response;
61+
if (idea.getFeedback() == null || idea.getFeedback().equals("")) {
62+
response = new ApiResponse(INVALID, "You must provide feedback to reject an idea.");
63+
} else {
64+
response = new ApiResponse(SUCCESS, ideaRepo.reject(idea));
65+
}
66+
return response;
67+
}
5568

5669
@Transactional
5770
@RequestMapping("/remove")

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ 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;
2932

3033
@Column(nullable = true)
3134
private String email;
@@ -48,7 +51,7 @@ public Idea(String title, String description) {
4851

4952
public Idea(String title, String description, String email) {
5053
this(title, description);
51-
this.email = email;
54+
setEmail(email);
5255
}
5356

5457
public Idea(ServiceRequest serviceRequest) {
@@ -64,6 +67,11 @@ public Idea(String title, String description, User author, Service service) {
6467
super(title, description, author, service);
6568
this.state = IdeaState.WAITING_ON_REVIEW;
6669
}
70+
71+
public Idea(String title, String description, User author, Service service, String email) {
72+
this(title, description, author, service);
73+
this.email = email;
74+
}
6775

6876
public IdeaState getState() {
6977
return state;
@@ -73,6 +81,14 @@ public void setState(IdeaState state) {
7381
this.state = state;
7482
}
7583

84+
public String getFeedback() {
85+
return feedback;
86+
}
87+
88+
public void setFeedback(String feedback) {
89+
this.feedback = feedback;
90+
}
91+
7692
public String getEmail() {
7793
return email;
7894
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ public interface IdeaRepoCustom {
1212

1313
public void delete(Idea idea);
1414

15+
public Idea reject(Idea idea);
16+
1517
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,35 @@
44

55
import java.util.Optional;
66

7+
import javax.mail.MessagingException;
8+
79
import org.springframework.beans.factory.annotation.Autowired;
810
import org.springframework.messaging.simp.SimpMessagingTemplate;
911

12+
import edu.tamu.app.enums.IdeaState;
1013
import edu.tamu.app.exception.UserNotFoundException;
1114
import edu.tamu.app.model.Idea;
1215
import edu.tamu.app.model.User;
1316
import edu.tamu.app.model.repo.IdeaRepo;
1417
import edu.tamu.app.model.repo.UserRepo;
1518
import edu.tamu.app.model.repo.custom.IdeaRepoCustom;
1619
import edu.tamu.weaver.auth.model.Credentials;
20+
import edu.tamu.weaver.email.service.EmailSender;
1721
import edu.tamu.weaver.response.ApiResponse;
1822

1923
public class IdeaRepoImpl implements IdeaRepoCustom {
2024

25+
private static final String REJECTION_SUBJECT = "Your idea has been rejected.";
26+
2127
@Autowired
2228
private UserRepo userRepo;
2329

2430
@Autowired
2531
private IdeaRepo ideaRepo;
2632

33+
@Autowired
34+
private EmailSender emailService;
35+
2736
@Autowired
2837
private SimpMessagingTemplate simpMessagingTemplate;
2938

@@ -52,4 +61,17 @@ public void delete(Idea idea) {
5261
simpMessagingTemplate.convertAndSend("/channel/ideas/delete", new ApiResponse(SUCCESS, idea.getId()));
5362
}
5463

64+
public Idea reject(Idea idea) {
65+
idea.setState(IdeaState.REJECTED);
66+
String body = "Your idea " + idea.getTitle() + ", for " + idea.getService().getName() + ", has been rejected for the following reason:\n" + idea.getFeedback();
67+
try {
68+
if (idea.getEmail() != null && !idea.getEmail().isEmpty()) {
69+
emailService.sendEmail(idea.getEmail(), REJECTION_SUBJECT, body);
70+
}
71+
72+
} catch (MessagingException e) {
73+
e.printStackTrace();
74+
}
75+
return ideaRepo.update(idea);
76+
}
5577
}

src/main/java/edu/tamu/app/model/request/ServiceRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ public ServiceRequest() {
1414

1515
public ServiceRequest(RequestType type, String title, String description, Long service) {
1616
super(type, title, description);
17-
this.service = service;
17+
setService(service);
1818
}
1919

2020
public ServiceRequest(RequestType type, String title, String description, Long service, String email) {
2121
this(type, title, description, service);
22-
this.email = email;
22+
setEmail(email);
2323
}
2424

2525
public Long getService() {

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

Lines changed: 22 additions & 0 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 org.junit.Assert.assertEquals;
56
import static org.mockito.Matchers.any;
@@ -23,6 +24,7 @@
2324
import org.springframework.messaging.simp.SimpMessagingTemplate;
2425
import org.springframework.test.context.junit4.SpringRunner;
2526

27+
import edu.tamu.app.enums.IdeaState;
2628
import edu.tamu.app.enums.Status;
2729
import edu.tamu.app.exception.UserNotFoundException;
2830
import edu.tamu.app.model.Idea;
@@ -51,12 +53,15 @@ public class IdeaControllerTest {
5153
private static final String TEST_MODIFIED_IDEA_TITLE = "Modified Idea Title";
5254
private static final String TEST_MODIFIED_IDEA_DESCRIPTION = "Modified Idea Description";
5355
private static final String TEST_SERVICE_NAME = "Test Service";
56+
private static final String TEST_FEEDBACK = "Test Rejection Feedback";
5457

5558
private static Service TEST_SERVICE = new Service(TEST_SERVICE_NAME, Status.UP, false, true, true, "", "");
5659
private static Idea TEST_IDEA1 = new Idea(TEST_IDEA_TITLE1, TEST_IDEA_DESCRIPTION1, TEST_USER1);
5760
private static Idea TEST_IDEA2 = new Idea(TEST_IDEA_TITLE2, TEST_IDEA_DESCRIPTION2, TEST_USER1);
5861
private static Idea TEST_IDEA3 = new Idea(TEST_IDEA_TITLE3, TEST_IDEA_DESCRIPTION3, TEST_USER1);
5962
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);
64+
private Idea rejectedIdea = new Idea(TEST_IDEA_TITLE1, TEST_IDEA_DESCRIPTION1, TEST_USER1);
6065
private static List<Idea> mockIdeaList = new ArrayList<Idea>(Arrays.asList(new Idea[] { TEST_IDEA1, TEST_IDEA2, TEST_IDEA3 }));
6166
private static Page<Idea> mockPageableIdeaList = new PageImpl<Idea>(Arrays.asList(new Idea[] { TEST_IDEA1, TEST_IDEA2, TEST_IDEA3 }));
6267

@@ -85,6 +90,8 @@ public class IdeaControllerTest {
8590
@Before
8691
@SuppressWarnings("unchecked")
8792
public void setup() throws UserNotFoundException {
93+
rejectedIdea.setState(IdeaState.REJECTED);
94+
ideaWtihFeedback.setFeedback(TEST_FEEDBACK);
8895
MockitoAnnotations.initMocks(this);
8996
when(credentials.getUin()).thenReturn("123456789");
9097
when(userRepo.findByUsername(any(String.class))).thenReturn(Optional.of(user));
@@ -93,6 +100,7 @@ public void setup() throws UserNotFoundException {
93100
when(ideaRepo.findOne(any(Long.class))).thenReturn(TEST_IDEA1);
94101
when(ideaRepo.create(any(Idea.class), any(Credentials.class))).thenReturn(TEST_IDEA1);
95102
when(ideaRepo.update(any(Idea.class))).thenReturn(TEST_MODIFIED_IDEA);
103+
when(ideaRepo.reject(TEST_IDEA1)).thenReturn(rejectedIdea);
96104
when(serviceRepo.findOne(any(Long.class))).thenReturn(TEST_SERVICE);
97105
doNothing().when(ideaRepo).delete(any(Idea.class));
98106
doNothing().when(ideaRepo).delete(any(Idea.class));
@@ -132,6 +140,20 @@ public void testUpdate() {
132140
assertEquals("Notification Author was not properly updated", TEST_MODIFIED_IDEA.getAuthor(), idea.getAuthor());
133141
}
134142

143+
@Test
144+
public void testReject() {
145+
response = ideaController.reject(ideaWtihFeedback);
146+
assertEquals("Not successful at rejecting idea", SUCCESS, response.getMeta().getStatus());
147+
Idea idea = (Idea) response.getPayload().get("Idea");
148+
assertEquals("State was not set to Rejected", rejectedIdea.getState(), idea.getState());
149+
}
150+
151+
@Test
152+
public void testInvalidReject() {
153+
response = ideaController.reject(TEST_IDEA1);
154+
assertEquals("Idea without feedback was successfull", INVALID, response.getMeta().getStatus());
155+
}
156+
135157
@Test
136158
public void testRemove() {
137159
response = ideaController.remove(TEST_MODIFIED_IDEA);

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.test.context.junit4.SpringRunner;
1515

1616
import edu.tamu.app.StatusApplication;
17+
import edu.tamu.app.enums.IdeaState;
1718
import edu.tamu.app.enums.Role;
1819
import edu.tamu.app.enums.Status;
1920
import edu.tamu.app.exception.UserNotFoundException;
@@ -35,6 +36,7 @@ public class IdeaTest {
3536
private static final String TEST_ALTERNATIVE_SERVICE_NAME = "Different Service Name";
3637
private static final String TEST_IDEA_DESCRIPTION = "Test Idea Description";
3738
private static final String TEST_ALTERNATIVE_IDEA_DESCRIPTION = "Alternative Idea Description";
39+
private static final String TEST_IDEA_EMAIL = "aggiejack@mailinator.com";
3840
private static final Boolean TEST_IS_AUTO = false;
3941
private static final Boolean TEST_IS_PUBLIC = true;
4042
private static final Boolean TEST_ON_SHORT_LIST = true;
@@ -78,7 +80,7 @@ public void setUp() throws UserNotFoundException {
7880
testUser = userRepo.create(TEST_CREDENTIALS.getUin(), TEST_CREDENTIALS.getEmail(), TEST_CREDENTIALS.getFirstName(), TEST_CREDENTIALS.getLastName(), Role.valueOf(TEST_CREDENTIALS.getRole()));
7981
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));
8082
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));
81-
testIdea = ideaRepo.create(new Idea(TEST_IDEA_TITLE, TEST_IDEA_DESCRIPTION, testUser, service1), TEST_CREDENTIALS);
83+
testIdea = ideaRepo.create(new Idea(TEST_IDEA_TITLE, TEST_IDEA_DESCRIPTION, testUser, service1, TEST_IDEA_EMAIL), TEST_CREDENTIALS);
8284
testFeatureProposal = featureProposalRepo.create(new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE, TEST_FEATURE_PROPOSAL_DESCRIPTION, testUser, service1), TEST_CREDENTIALS);
8385
}
8486

@@ -144,6 +146,20 @@ public void testUpdateFeatureProposal() throws UserNotFoundException {
144146
assertEquals("Feature proposal does not have idea", idea, testFeatureProposal.getIdeas().get(0));
145147
}
146148

149+
@Test
150+
public void testReject() throws UserNotFoundException {
151+
Idea idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);
152+
idea = ideaRepo.reject(idea);
153+
154+
assertEquals("Idea was not rejected", IdeaState.REJECTED, idea.getState());
155+
}
156+
157+
@Test
158+
public void testRejectException() {
159+
Idea idea = new Idea(TEST_IDEA_TITLE, TEST_IDEA_DESCRIPTION, testUser, service1);
160+
ideaRepo.reject(idea);
161+
}
162+
147163
@Test
148164
public void testTimestampSetOnCreate() throws UserNotFoundException {
149165
Idea Idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);

src/test/java/edu/tamu/app/model/impl/ShibTest.java renamed to src/test/java/edu/tamu/app/model/ShibTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package edu.tamu.app.model.impl;
1+
package edu.tamu.app.model;
22

33
import static org.junit.Assert.assertEquals;
44

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package edu.tamu.app.model.request;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import org.junit.Test;
6+
import org.junit.runner.RunWith;
7+
import org.springframework.test.context.junit4.SpringRunner;
8+
9+
import edu.tamu.app.model.request.AbstractRequest.RequestType;
10+
11+
@RunWith(SpringRunner.class)
12+
public class ServiceRequestTest {
13+
14+
private static final RequestType TEST_REQUEST_TYPE = RequestType.FEATURE;
15+
private static final String TEST_TITLE = "Test Request title";
16+
private static final String TEST_DESCRIPTION = "Test Request Description";
17+
private static final Long TEST_SERVICE_ID = 1L;
18+
private static final String TEST_EMAIL = "aggiejack@mailinator.com";
19+
20+
@Test
21+
public void testConstructors() {
22+
// Constructor without email
23+
ServiceRequest serviceRequest = new ServiceRequest(TEST_REQUEST_TYPE, TEST_TITLE, TEST_DESCRIPTION, TEST_SERVICE_ID);
24+
assertEquals("Type was not set", RequestType.FEATURE, serviceRequest.getType());
25+
assertEquals("Title was not set", TEST_TITLE, serviceRequest.getTitle());
26+
assertEquals("Description was not set", TEST_DESCRIPTION, serviceRequest.getDescription());
27+
assertEquals("Service ID was not set", TEST_SERVICE_ID, serviceRequest.getService());
28+
29+
// Constructor with email
30+
ServiceRequest serviceRequestWithEmail = new ServiceRequest(TEST_REQUEST_TYPE, TEST_TITLE, TEST_DESCRIPTION, TEST_SERVICE_ID, TEST_EMAIL);
31+
assertEquals("Type was not set", RequestType.FEATURE, serviceRequestWithEmail.getType());
32+
assertEquals("Title was not set", TEST_TITLE, serviceRequestWithEmail.getTitle());
33+
assertEquals("Description was not set", TEST_DESCRIPTION, serviceRequestWithEmail.getDescription());
34+
assertEquals("Service ID was not set", TEST_SERVICE_ID, serviceRequestWithEmail.getService());
35+
assertEquals("Email was not set", TEST_EMAIL, serviceRequestWithEmail.getEmail());
36+
}
37+
}

0 commit comments

Comments
 (0)