Skip to content

Commit e21fc96

Browse files
authored
Merge pull request #49 from GetStream/feature/updateToTargets
Feature/update to targets
2 parents 6067878 + 5841bc5 commit e21fc96

File tree

14 files changed

+556
-9
lines changed

14 files changed

+556
-9
lines changed

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050

5151
<properties>
5252
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
53+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
5354
<slf4j-api.version>1.6.6</slf4j-api.version>
5455
<logback.version>1.1.2</logback.version>
5556
<guava.version>18.0</guava.version>
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package io.getstream.client.model.activities;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
5+
import java.util.List;
6+
7+
/**
8+
* <b>update_to_targets</b>'s response wrapper class.
9+
* @param <T> Type of the activity in scope.
10+
*/
11+
public class UpdateTargetResponse<T extends BaseActivity> {
12+
13+
private T activity;
14+
private String duration;
15+
16+
@JsonProperty("added")
17+
private List<String> addedTargets;
18+
19+
@JsonProperty("removed")
20+
private List<String> removedTargets;
21+
22+
@JsonProperty("new")
23+
private List<String> newTargets;
24+
25+
public void setDuration(String duration) {
26+
this.duration = duration;
27+
}
28+
29+
/**
30+
* Duration of the operation.
31+
* @return Duration in human-readable format.
32+
*/
33+
public String getDuration() {
34+
return duration;
35+
}
36+
37+
public T getActivity() {
38+
return activity;
39+
}
40+
41+
public void setActivity(T activity) {
42+
this.activity = activity;
43+
}
44+
45+
/**
46+
* Get a list of added target(s).
47+
* @return List of added target(s)
48+
*/
49+
public List<String> getAddedTargets() {
50+
return addedTargets;
51+
}
52+
53+
public void setAddedTargets(List<String> addedTargets) {
54+
this.addedTargets = addedTargets;
55+
}
56+
57+
/**
58+
* Get a list of removed target(s).
59+
* @return List of remove target(s)
60+
*/
61+
public List<String> getRemovedTargets() {
62+
return removedTargets;
63+
}
64+
65+
public void setRemovedTargets(List<String> removedTargets) {
66+
this.removedTargets = removedTargets;
67+
}
68+
69+
/**
70+
* Get a list of newly created target(s).
71+
* @return List of newly created target(s)
72+
*/
73+
public List<String> getNewTargets() {
74+
return newTargets;
75+
}
76+
77+
public void setNewTargets(List<String> newTargets) {
78+
this.newTargets = newTargets;
79+
}
80+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package io.getstream.client.model.beans;
2+
3+
import com.google.common.collect.ImmutableList;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
/**
9+
* This class acts as container for a list of operations intended to alter the target(s) of a given activity.
10+
* A {@link Targets.Builder} is required in order to build a {@link Targets} object.
11+
*
12+
*/
13+
public class Targets {
14+
15+
private ImmutableList<String> newTargets;
16+
private ImmutableList<String> addedTargets;
17+
private ImmutableList<String> removedTargets;
18+
19+
public Targets(List<String> newTargets, List<String> addedTargets, List<String> removedTargets) {
20+
if (!newTargets.isEmpty()) {
21+
this.newTargets = ImmutableList.copyOf(newTargets);
22+
}
23+
24+
if (!addedTargets.isEmpty()) {
25+
this.addedTargets = ImmutableList.copyOf(addedTargets);
26+
}
27+
28+
if (!removedTargets.isEmpty()) {
29+
this.removedTargets = ImmutableList.copyOf(removedTargets);
30+
}
31+
}
32+
33+
public List<String> getNewTargets() {
34+
return newTargets;
35+
}
36+
37+
public List<String> getAddedTargets() {
38+
return addedTargets;
39+
}
40+
41+
public List<String> getRemovedTargets() {
42+
return removedTargets;
43+
}
44+
45+
/**
46+
* Builder class for the {@link Targets} object.
47+
*/
48+
public static class Builder {
49+
50+
private List<String> newTargets = new ArrayList<>();
51+
private List<String> addedTargets = new ArrayList<>();
52+
private List<String> removedTargets = new ArrayList<>();
53+
54+
/**
55+
* Set a list of new target(s).
56+
* @param newTargets New target(s)
57+
* @return This builder
58+
*/
59+
public Builder setNewTargets(List<String> newTargets) {
60+
this.newTargets = newTargets;
61+
return this;
62+
}
63+
64+
/**
65+
* Set a list of target(s) to add.
66+
* @param addedTargets Target(s) to add.
67+
* @return This builder
68+
*/
69+
public Builder setAddedTargets(List<String> addedTargets) {
70+
this.addedTargets = addedTargets;
71+
return this;
72+
}
73+
74+
/**
75+
* Set a list of target(s) to be removed.
76+
* @param removedTargets Target(s) to be removed.
77+
* @return This builder
78+
*/
79+
public Builder setRemovedTargets(List<String> removedTargets) {
80+
this.removedTargets = removedTargets;
81+
return this;
82+
}
83+
84+
/**
85+
* Change the existing target by specifying a new one.
86+
* @param target New target.
87+
* @return This builder
88+
*/
89+
public Builder addNewTarget(String target) {
90+
this.newTargets.add(target);
91+
return this;
92+
}
93+
94+
/**
95+
* Add a new target to be added.
96+
* @param target Target to be added.
97+
* @return This builder
98+
*/
99+
public Builder addTargetToAdd(String target) {
100+
this.addedTargets.add(target);
101+
return this;
102+
}
103+
104+
/**
105+
* Add a target to be removed.
106+
* @param target Target to be removed.
107+
* @return This builder
108+
*/
109+
public Builder addTargetToRemove(String target) {
110+
this.removedTargets.add(target);
111+
return this;
112+
}
113+
114+
/**
115+
* Build a {@link Targets} object.
116+
* You can specify either new targets or added targets or removed targets or a combinations of added and removed targets.
117+
* @return A valid {@link Targets} object.
118+
*/
119+
public Targets build() {
120+
if (!newTargets.isEmpty() && (!addedTargets.isEmpty() || !removedTargets.isEmpty())) {
121+
throw new IllegalArgumentException("You can specify either new targets or added targets or removed targets or a combinations of added and removed targets.");
122+
}
123+
return new Targets(newTargets, addedTargets, removedTargets);
124+
}
125+
}
126+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package io.getstream.client.model.beans;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import io.getstream.client.model.activities.BaseActivity;
6+
7+
import java.util.List;
8+
9+
/**
10+
* This custom activity is required to perform the <b>update_to_targets</b> operation.
11+
*/
12+
public class UpdateTo extends BaseActivity {
13+
14+
@JsonInclude(JsonInclude.Include.NON_NULL)
15+
@JsonProperty("new_targets")
16+
private List<String> newTargets;
17+
18+
@JsonInclude(JsonInclude.Include.NON_NULL)
19+
@JsonProperty("added_targets")
20+
private List<String> addedTargets;
21+
22+
@JsonInclude(JsonInclude.Include.NON_NULL)
23+
@JsonProperty("removed_targets")
24+
private List<String> removedTargets;
25+
26+
public List<String> getNewTargets() {
27+
return newTargets;
28+
}
29+
30+
public void setNewTargets(List<String> newTargets) {
31+
this.newTargets = newTargets;
32+
}
33+
34+
public List<String> getAddedTargets() {
35+
return addedTargets;
36+
}
37+
38+
public void setAddedTargets(List<String> addedTargets) {
39+
this.addedTargets = addedTargets;
40+
}
41+
42+
public List<String> getRemovedTargets() {
43+
return removedTargets;
44+
}
45+
46+
public void setRemovedTargets(List<String> removedTargets) {
47+
this.removedTargets = removedTargets;
48+
}
49+
}

stream-core/src/main/java/io/getstream/client/repo/StreamRepository.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import io.getstream.client.model.activities.AggregatedActivity;
55
import io.getstream.client.model.activities.BaseActivity;
66
import io.getstream.client.model.activities.NotificationActivity;
7+
import io.getstream.client.model.activities.UpdateTargetResponse;
78
import io.getstream.client.model.beans.FeedFollow;
89
import io.getstream.client.model.beans.FollowMany;
910
import io.getstream.client.model.beans.MarkedActivity;
1011
import io.getstream.client.model.beans.StreamActivitiesResponse;
1112
import io.getstream.client.model.beans.StreamResponse;
13+
import io.getstream.client.model.beans.Targets;
1214
import io.getstream.client.model.beans.UnfollowMany;
1315
import io.getstream.client.model.feeds.BaseFeed;
1416
import io.getstream.client.model.filters.FeedFilter;
@@ -163,6 +165,18 @@ public interface StreamRepository {
163165
*/
164166
<T extends BaseActivity> StreamActivitiesResponse<T> updateActivities(BaseFeed feed, Class<T> type, List<T> activities) throws IOException, StreamClientException;
165167

168+
/**
169+
* Update the <b>to</b> target(s) of a given {@link T} activity.
170+
* @param feed Feed which the activity belong to
171+
* @param activity The activity in scope.
172+
* @param targets A container for the operations that need to be performed on the <b>to</b> field.
173+
* @param <T> The type of the activity.
174+
* @return Response containing the modified activity and a summary of the actions performed to the <b>to</b> field.
175+
* @throws IOException in case of network/socket exceptions
176+
* @throws StreamClientException in case of functional or server-side exception
177+
*/
178+
<T extends BaseActivity> UpdateTargetResponse<T> updateToTargets(BaseFeed feed, BaseActivity activity, Targets targets) throws StreamClientException, IOException;
179+
166180
/**
167181
* Add a new activity of type {@link T} to multiple feeds.
168182
*

stream-core/src/main/java/io/getstream/client/service/AbstractActivityService.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import io.getstream.client.exception.StreamClientException;
44
import io.getstream.client.model.activities.BaseActivity;
5+
import io.getstream.client.model.activities.UpdateTargetResponse;
56
import io.getstream.client.model.beans.StreamActivitiesResponse;
7+
import io.getstream.client.model.beans.Targets;
68
import io.getstream.client.model.feeds.BaseFeed;
79
import io.getstream.client.repo.StreamRepository;
810

@@ -67,6 +69,19 @@ public StreamActivitiesResponse<T> updateActivities(List<T> activities) throws I
6769
return streamRepository.updateActivities(this.feed, type, activities);
6870
}
6971

72+
/**
73+
* Update the <b>to</b> target(s) of a given {@link T} activity.
74+
* @param activity The activity in scope.
75+
* @param targets A container for the operations that need to be performed on the <b>to</b> field.
76+
* @param <T> The type of the activity.
77+
* @return Response containing the modified activity and a summary of the actions performed to the <b>to</b> field.
78+
* @throws IOException in case of network/socket exceptions
79+
* @throws StreamClientException in case of functional or server-side exception
80+
*/
81+
public <T extends BaseActivity> UpdateTargetResponse<T> updateToTargets(BaseActivity activity, Targets targets) throws IOException, StreamClientException {
82+
return streamRepository.updateToTargets(feed, activity, targets);
83+
}
84+
7085
/**
7186
* Add a new activity of type {@link T} to multiple feeds.
7287
*
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.getstream.client.model.beans;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Collections;
6+
7+
import static org.hamcrest.CoreMatchers.hasItem;
8+
import static org.junit.Assert.assertThat;
9+
10+
public class TargetsTest {
11+
12+
@Test
13+
public void shouldBuildTheTargetWithNewTargets() {
14+
Targets targets = new Targets.Builder()
15+
.setNewTargets(Collections.singletonList("user:newUser1"))
16+
.build();
17+
18+
assertThat(targets.getNewTargets(), hasItem("user:newUser1"));
19+
}
20+
21+
@Test
22+
public void shouldBuildTheTargetWithAddAndRemoveTargets() {
23+
Targets targets = new Targets.Builder()
24+
.setAddedTargets(Collections.singletonList("user:newUser1"))
25+
.setRemovedTargets(Collections.singletonList("user:newUser2"))
26+
.build();
27+
28+
assertThat(targets.getAddedTargets(), hasItem("user:newUser1"));
29+
assertThat(targets.getRemovedTargets(), hasItem("user:newUser2"));
30+
}
31+
32+
@Test(expected = IllegalArgumentException.class)
33+
public void shouldFailBuildingTargets() {
34+
Targets targets = new Targets.Builder()
35+
.setNewTargets(Collections.singletonList("user:newUser1"))
36+
.setRemovedTargets(Collections.singletonList("user:newUser2"))
37+
.build();
38+
}
39+
}

0 commit comments

Comments
 (0)