Skip to content

Commit 28575f5

Browse files
authored
Merge pull request #65 from TAMULib/sprint6-b03642-idea-feature-proposal
idea feature proposal now bi-directional
2 parents 5503496 + 8ff2f8a commit 28575f5

6 files changed

Lines changed: 86 additions & 23 deletions

File tree

pom.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>edu.tamu.weaver</groupId>
1313
<artifactId>webservice-parent</artifactId>
14-
<version>2.0.0-RC3-SNAPSHOT</version>
14+
<version>2.0.0-RC5-SNAPSHOT</version>
1515
</parent>
1616

1717
<properties>
@@ -36,25 +36,25 @@
3636
<dependency>
3737
<groupId>edu.tamu.weaver</groupId>
3838
<artifactId>auth</artifactId>
39-
<version>2.0.0-RC3-SNAPSHOT</version>
39+
<version>2.0.0-RC5-SNAPSHOT</version>
4040
</dependency>
4141

4242
<dependency>
4343
<groupId>edu.tamu.weaver</groupId>
4444
<artifactId>token-provider</artifactId>
45-
<version>2.0.0-RC3-SNAPSHOT</version>
45+
<version>2.0.0-RC5-SNAPSHOT</version>
4646
</dependency>
4747

4848
<dependency>
4949
<groupId>edu.tamu.weaver</groupId>
5050
<artifactId>validation</artifactId>
51-
<version>2.0.0-RC3-SNAPSHOT</version>
51+
<version>2.0.0-RC5-SNAPSHOT</version>
5252
</dependency>
5353

5454
<dependency>
5555
<groupId>edu.tamu.weaver</groupId>
5656
<artifactId>reporting</artifactId>
57-
<version>2.0.0-RC3-SNAPSHOT</version>
57+
<version>2.0.0-RC5-SNAPSHOT</version>
5858
</dependency>
5959

6060
<dependency>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import javax.persistence.Enumerated;
1515
import javax.persistence.JoinTable;
1616
import javax.persistence.ManyToMany;
17+
import javax.persistence.OneToMany;
1718
import javax.persistence.UniqueConstraint;
1819

1920
import org.hibernate.annotations.Fetch;
@@ -30,8 +31,7 @@
3031
@JsonIgnoreProperties(value = { "voters" }, allowGetters = true)
3132
public class FeatureProposal extends AbstractIdea {
3233

33-
@ManyToMany(fetch = EAGER, cascade = { CascadeType.REFRESH, CascadeType.DETACH, CascadeType.MERGE })
34-
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = { "feature_proposal_id", "ideas_id" }))
34+
@OneToMany(fetch = EAGER, cascade = { CascadeType.REFRESH, CascadeType.DETACH, CascadeType.MERGE }, mappedBy = "featureProposal")
3535
@Fetch(value = SELECT)
3636
private List<Idea> ideas;
3737

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,37 @@
11
package edu.tamu.app.model;
22

3+
import static javax.persistence.FetchType.EAGER;
4+
5+
import javax.persistence.CascadeType;
36
import javax.persistence.Column;
47
import javax.persistence.Entity;
58
import javax.persistence.EnumType;
69
import javax.persistence.Enumerated;
10+
import javax.persistence.ManyToOne;
11+
import javax.persistence.Table;
12+
import javax.persistence.UniqueConstraint;
13+
14+
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
15+
import com.fasterxml.jackson.annotation.JsonIdentityReference;
16+
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
717

818
import edu.tamu.app.enums.IdeaState;
919
import edu.tamu.app.model.request.ServiceRequest;
1020
import edu.tamu.app.model.validation.IdeaValidator;
1121

1222
@Entity
23+
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "id", "feature_proposal_id" }))
1324
public class Idea extends AbstractIdea {
1425

1526
@Enumerated(EnumType.STRING)
1627
@Column(nullable = false)
1728
private IdeaState state;
1829

30+
@ManyToOne(fetch = EAGER, cascade = { CascadeType.REFRESH, CascadeType.DETACH }, optional = true)
31+
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, scope = FeatureProposal.class, property = "id")
32+
@JsonIdentityReference(alwaysAsId = true)
33+
private FeatureProposal featureProposal;
34+
1935
public Idea() {
2036
super();
2137
this.modelValidator = new IdeaValidator();
@@ -48,6 +64,13 @@ public IdeaState getState() {
4864
public void setState(IdeaState state) {
4965
this.state = state;
5066
}
51-
}
5267

68+
public FeatureProposal getFeatureProposal() {
69+
return featureProposal;
70+
}
71+
72+
public void setFeatureProposal(FeatureProposal featureProposal) {
73+
this.featureProposal = featureProposal;
74+
}
5375

76+
}

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@ public FeatureProposal create(FeatureProposal featureProposal, Credentials crede
3838
Optional<User> user = userRepo.findByUsername(credentials.getUin());
3939
if (user.isPresent()) {
4040
featureProposal.setAuthor(user.get());
41-
featureProposal.getIdeas().forEach(idea -> {
41+
featureProposal = featureProposalRepo.save(featureProposal);
42+
for (Idea idea : featureProposal.getIdeas()) {
4243
idea.setState(IdeaState.ELEVATED);
44+
idea.setFeatureProposal(featureProposal);
4345
idea = ideaRepo.save(idea);
4446
simpMessagingTemplate.convertAndSend("/channel/ideas/update", new ApiResponse(SUCCESS, idea));
45-
});
47+
}
4648
featureProposal = featureProposalRepo.save(featureProposal);
4749
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/create", new ApiResponse(SUCCESS, featureProposal));
4850
return featureProposal;
@@ -52,33 +54,37 @@ public FeatureProposal create(FeatureProposal featureProposal, Credentials crede
5254

5355
@Override
5456
public FeatureProposal create(Idea idea) {
57+
FeatureProposal featureProposal = featureProposalRepo.save(new FeatureProposal(idea));
5558
idea.setState(IdeaState.ELEVATED);
59+
idea.setFeatureProposal(featureProposal);
5660
idea = ideaRepo.save(idea);
5761
simpMessagingTemplate.convertAndSend("/channel/ideas/update", new ApiResponse(SUCCESS, idea));
58-
FeatureProposal featureProposal = featureProposalRepo.save(new FeatureProposal(idea));
59-
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/create", new ApiResponse(SUCCESS, featureProposal));
62+
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/create", new ApiResponse(SUCCESS, featureProposalRepo.findOne(featureProposal.getId())));
6063
return featureProposal;
6164
}
6265

6366
@Override
6467
public FeatureProposal update(FeatureProposal featureProposal) {
65-
featureProposal.getIdeas().forEach(idea -> {
68+
for (Idea idea : featureProposal.getIdeas()) {
6669
idea.setState(IdeaState.ELEVATED);
70+
idea.setFeatureProposal(featureProposal);
6771
idea = ideaRepo.save(idea);
6872
simpMessagingTemplate.convertAndSend("/channel/ideas/update", new ApiResponse(SUCCESS, idea));
69-
});
73+
}
7074
featureProposal = featureProposalRepo.save(featureProposal);
7175
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/update", new ApiResponse(SUCCESS, featureProposal));
7276
return featureProposal;
7377
}
7478

7579
@Override
7680
public void delete(FeatureProposal featureProposal) {
77-
featureProposal.getIdeas().forEach(idea -> {
78-
idea.setState(IdeaState.WAITING_ON_REVIEW);
81+
for (Idea idea : featureProposal.getIdeas()) {
82+
idea.setState(IdeaState.ELEVATED);
83+
idea.setFeatureProposal(featureProposal);
7984
idea = ideaRepo.save(idea);
8085
simpMessagingTemplate.convertAndSend("/channel/ideas/update", new ApiResponse(SUCCESS, idea));
81-
});
86+
}
87+
featureProposal = featureProposalRepo.save(featureProposal);
8288
featureProposalRepo.delete(featureProposal.getId());
8389
simpMessagingTemplate.convertAndSend("/channel/feature-proposals/delete", new ApiResponse(SUCCESS, featureProposal.getId()));
8490
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,8 @@ public void testDelete() throws UserNotFoundException {
232232

233233
@After
234234
public void cleanUp() {
235-
featureProposalRepo.deleteAll();
236235
ideaRepo.deleteAll();
236+
featureProposalRepo.deleteAll();
237237
serviceRepo.deleteAll();
238238
userRepo.deleteAll();
239239
}

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

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import edu.tamu.app.enums.Role;
1818
import edu.tamu.app.enums.Status;
1919
import edu.tamu.app.exception.UserNotFoundException;
20+
import edu.tamu.app.model.repo.FeatureProposalRepo;
2021
import edu.tamu.app.model.repo.IdeaRepo;
2122
import edu.tamu.app.model.repo.ServiceRepo;
2223
import edu.tamu.app.model.repo.UserRepo;
@@ -38,6 +39,10 @@ public class IdeaTest {
3839
private static final Boolean TEST_IS_PUBLIC = true;
3940
private static final Boolean TEST_ON_SHORT_LIST = true;
4041
private static final Status TEST_SERVICE_STATUS = Status.UP;
42+
43+
private static final String TEST_FEATURE_PROPOSAL_TITLE = "Feature Proposal Title";
44+
private static final String TEST_FEATURE_PROPOSAL_DESCRIPTION = "Test Feature Proposal Description";
45+
4146
private Service service1;
4247
private Service service2;
4348

@@ -54,21 +59,27 @@ public class IdeaTest {
5459

5560
private Idea testIdea;
5661

62+
private FeatureProposal testFeatureProposal;
63+
5764
@Autowired
5865
private IdeaRepo ideaRepo;
5966

6067
@Autowired
6168
private ServiceRepo serviceRepo;
6269

6370
@Autowired
64-
private UserRepo appUserRepo;
71+
private UserRepo userRepo;
72+
73+
@Autowired
74+
private FeatureProposalRepo featureProposalRepo;
6575

6676
@Before
6777
public void setUp() throws UserNotFoundException {
68-
testUser = appUserRepo.create(TEST_CREDENTIALS.getUin(), TEST_CREDENTIALS.getEmail(), TEST_CREDENTIALS.getFirstName(), TEST_CREDENTIALS.getLastName(), Role.valueOf(TEST_CREDENTIALS.getRole()));
78+
testUser = userRepo.create(TEST_CREDENTIALS.getUin(), TEST_CREDENTIALS.getEmail(), TEST_CREDENTIALS.getFirstName(), TEST_CREDENTIALS.getLastName(), Role.valueOf(TEST_CREDENTIALS.getRole()));
6979
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));
7080
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));
7181
testIdea = ideaRepo.create(new Idea(TEST_IDEA_TITLE, TEST_IDEA_DESCRIPTION, testUser, service1), TEST_CREDENTIALS);
82+
testFeatureProposal = featureProposalRepo.create(new FeatureProposal(TEST_FEATURE_PROPOSAL_TITLE, TEST_FEATURE_PROPOSAL_DESCRIPTION, testUser, service1), TEST_CREDENTIALS);
7283
}
7384

7485
@Test
@@ -120,6 +131,19 @@ public void testUpdateDescription() throws UserNotFoundException {
120131
assertEquals("Idea body not updated", TEST_ALTERNATIVE_IDEA_DESCRIPTION, idea.getDescription());
121132
}
122133

134+
@Test
135+
public void testUpdateFeatureProposal() throws UserNotFoundException {
136+
Idea idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);
137+
testFeatureProposal.addIdea(idea);
138+
testFeatureProposal = featureProposalRepo.save(testFeatureProposal);
139+
idea.setFeatureProposal(testFeatureProposal);
140+
idea = ideaRepo.save(idea);
141+
142+
assertEquals("Idea does not have feature proposal", testFeatureProposal, idea.getFeatureProposal());
143+
assertEquals("Feature proposal does not have expedted number of ideas", 1, testFeatureProposal.getIdeas().size());
144+
assertEquals("Feature proposal does not have idea", idea, testFeatureProposal.getIdeas().get(0));
145+
}
146+
123147
@Test
124148
public void testTimestampSetOnCreate() throws UserNotFoundException {
125149
Idea Idea = ideaRepo.create(testIdea, TEST_CREDENTIALS);
@@ -146,17 +170,27 @@ public void testTimestampSetOnUpdate() throws InterruptedException, UserNotFound
146170
@Test
147171
public void testDelete() throws UserNotFoundException {
148172
long initalCount = ideaRepo.count();
149-
Idea Idea = ideaRepo.create(new Idea(TEST_ALTERNATIVE_IDEA_TITLE, TEST_ALTERNATIVE_IDEA_DESCRIPTION, testUser, service2), TEST_CREDENTIALS);
173+
Idea idea = ideaRepo.create(new Idea(TEST_ALTERNATIVE_IDEA_TITLE, TEST_ALTERNATIVE_IDEA_DESCRIPTION, testUser, service2), TEST_CREDENTIALS);
150174
assertEquals("Idea not created", initalCount + 1, ideaRepo.count());
151-
ideaRepo.delete(Idea);
175+
testFeatureProposal.addIdea(idea);
176+
testFeatureProposal = featureProposalRepo.save(testFeatureProposal);
177+
idea.setFeatureProposal(testFeatureProposal);
178+
idea = ideaRepo.save(idea);
179+
180+
assertEquals("Idea does not have feature proposal", testFeatureProposal, idea.getFeatureProposal());
181+
assertEquals("Feature proposal does not have expedted number of ideas", 1, testFeatureProposal.getIdeas().size());
182+
assertEquals("Feature proposal does not have idea", idea, testFeatureProposal.getIdeas().get(0));
183+
184+
ideaRepo.delete(idea);
152185
assertEquals("Idea not deleted", initalCount, ideaRepo.count());
153186

154187
}
155188

156189
@After
157190
public void cleanUp() {
158191
ideaRepo.deleteAll();
192+
featureProposalRepo.deleteAll();
159193
serviceRepo.deleteAll();
160-
appUserRepo.deleteAll();
194+
userRepo.deleteAll();
161195
}
162196
}

0 commit comments

Comments
 (0)