diff --git a/src/main/java/io/getstream/client/Client.java b/src/main/java/io/getstream/client/Client.java index 49fba80c..6beee690 100644 --- a/src/main/java/io/getstream/client/Client.java +++ b/src/main/java/io/getstream/client/Client.java @@ -47,9 +47,10 @@ public CompletableFuture updateActivityByID(ActivityUpdate update) } public CompletableFuture updateActivityByID( - String id, Map set, String[] unset) throws StreamException { + String id, Map set, String[] unset, RequestOption... options) + throws StreamException { final Token token = buildActivityToken(secret, TokenAction.WRITE); - return stream.updateActivityByID(token, id, set, unset); + return stream.updateActivityByID(token, id, set, unset, options); } public CompletableFuture updateActivityByForeignID( @@ -82,10 +83,10 @@ public CompletableFuture updateActivityByForeignID(ActivityUpdate upda } public CompletableFuture updateActivityByForeignID( - String foreignID, Date timestamp, Map set, String[] unset) - throws StreamException { + String foreignID, Date timestamp, Map set, String[] unset, + RequestOption... options) throws StreamException { final Token token = buildActivityToken(secret, TokenAction.WRITE); - return stream.updateActivityByForeignID(token, foreignID, timestamp, set, unset); + return stream.updateActivityByForeignID(token, foreignID, timestamp, set, unset, options); } public CompletableFuture openGraph(URL url) throws StreamException { @@ -95,24 +96,34 @@ public CompletableFuture openGraph(URL url) throws StreamException { public CompletableFuture> updateActivitiesByID(Iterable updates) throws StreamException { - return updateActivitiesByID(Iterables.toArray(updates, ActivityUpdate.class)); + return updateActivitiesByID(Iterables.toArray(updates, ActivityUpdate.class), new RequestOption[0]); } public CompletableFuture> updateActivitiesByID(ActivityUpdate... updates) throws StreamException { + return updateActivitiesByID(updates, new RequestOption[0]); + } + + public CompletableFuture> updateActivitiesByID( + ActivityUpdate[] updates, RequestOption... options) throws StreamException { final Token token = buildActivityToken(secret, TokenAction.WRITE); - return stream.updateActivitiesByID(token, updates); + return stream.updateActivitiesByID(token, updates, options); } public CompletableFuture> updateActivitiesByForeignID( Iterable updates) throws StreamException { - return updateActivitiesByForeignID(Iterables.toArray(updates, ActivityUpdate.class)); + return updateActivitiesByForeignID(Iterables.toArray(updates, ActivityUpdate.class), new RequestOption[0]); } public CompletableFuture> updateActivitiesByForeignID(ActivityUpdate... updates) throws StreamException { + return updateActivitiesByForeignID(updates, new RequestOption[0]); + } + + public CompletableFuture> updateActivitiesByForeignID( + ActivityUpdate[] updates, RequestOption... options) throws StreamException { final Token token = buildActivityToken(secret, TokenAction.WRITE); - return stream.updateActivitiesByForeignID(token, updates); + return stream.updateActivitiesByForeignID(token, updates, options); } public static final class Builder { @@ -280,15 +291,21 @@ CompletableFuture getEnrichedActivities(FeedID feed, RequestOption... return stream.getEnrichedActivities(token, feed, options); } - CompletableFuture addActivity(FeedID feed, Activity activity) throws StreamException { + CompletableFuture addActivity(FeedID feed, Activity activity, RequestOption... options) + throws StreamException { final Token token = buildFeedToken(secret, feed, TokenAction.WRITE); - return stream.addActivity(token, feed, activity); + return stream.addActivity(token, feed, activity, options); } CompletableFuture addActivities(FeedID feed, Activity... activities) throws StreamException { + return addActivities(feed, activities, new RequestOption[0]); + } + + CompletableFuture addActivities( + FeedID feed, Activity[] activities, RequestOption... options) throws StreamException { final Token token = buildFeedToken(secret, feed, TokenAction.WRITE); - return stream.addActivities(token, feed, activities); + return stream.addActivities(token, feed, activities, options); } CompletableFuture removeActivityByID(FeedID feed, String id) throws StreamException { diff --git a/src/main/java/io/getstream/client/Feed.java b/src/main/java/io/getstream/client/Feed.java index 26cede4d..3fc1d45a 100644 --- a/src/main/java/io/getstream/client/Feed.java +++ b/src/main/java/io/getstream/client/Feed.java @@ -50,9 +50,10 @@ public final String getUserID() { return id.getUserID(); } - public final CompletableFuture addActivity(Activity activity) throws StreamException { + public final CompletableFuture addActivity(Activity activity, RequestOption... options) + throws StreamException { return getClient() - .addActivity(id, activity) + .addActivity(id, activity, options) .thenApply( response -> { try { @@ -63,9 +64,10 @@ public final CompletableFuture addActivity(Activity activity) throws S }); } - public final CompletableFuture addCustomActivity(T activity) throws StreamException { + public final CompletableFuture addCustomActivity(T activity, RequestOption... options) + throws StreamException { return getClient() - .addActivity(id, Activity.builder().fromCustomActivity(activity).build()) + .addActivity(id, Activity.builder().fromCustomActivity(activity).build(), options) .thenApply( response -> { try { @@ -78,7 +80,7 @@ public final CompletableFuture addCustomActivity(T activity) throws Strea public final CompletableFuture> addActivities(Iterable activities) throws StreamException { - return addActivities(Iterables.toArray(activities, Activity.class)); + return addActivities(Iterables.toArray(activities, Activity.class), new RequestOption[0]); } public final CompletableFuture> addCustomActivities(Iterable activities) @@ -88,7 +90,7 @@ public final CompletableFuture> addCustomActivities(Iterable acti .map(activity -> Activity.builder().fromCustomActivity(activity).build()) .toArray(Activity[]::new); return getClient() - .addActivities(id, custom) + .addActivities(id, custom, new RequestOption[0]) .thenApply( response -> { try { @@ -105,8 +107,13 @@ public final CompletableFuture> addCustomActivities(Iterable acti public final CompletableFuture> addActivities(Activity... activities) throws StreamException { + return addActivities(activities, new RequestOption[0]); + } + + public final CompletableFuture> addActivities( + Activity[] activities, RequestOption... options) throws StreamException { return getClient() - .addActivities(id, activities) + .addActivities(id, activities, options) .thenApply( response -> { try { @@ -124,7 +131,7 @@ public final CompletableFuture> addCustomActivities(T... activities) .map(activity -> Activity.builder().fromCustomActivity(activity).build()) .toArray(Activity[]::new); return getClient() - .addActivities(id, custom) + .addActivities(id, custom, new RequestOption[0]) .thenApply( response -> { try { diff --git a/src/main/java/io/getstream/client/ReactionsClient.java b/src/main/java/io/getstream/client/ReactionsClient.java index c2658163..179284fc 100644 --- a/src/main/java/io/getstream/client/ReactionsClient.java +++ b/src/main/java/io/getstream/client/ReactionsClient.java @@ -15,6 +15,7 @@ import io.getstream.core.models.ReactionBatch; import io.getstream.core.options.Filter; import io.getstream.core.options.Limit; +import io.getstream.core.options.RequestOption; import io.getstream.core.utils.Auth.TokenAction; import io.getstream.core.utils.DefaultOptions; import java.util.List; @@ -168,10 +169,18 @@ public CompletableFuture add(String userID, Reaction reaction, FeedID. return reactions.add(token, userID, reaction, targetFeeds); } - public CompletableFuture add(String userID, Reaction reaction, FeedID[] targetFeeds, Map targetFeedsExtraData) + public CompletableFuture add( + String userID, Reaction reaction, FeedID[] targetFeeds, RequestOption... options) throws StreamException { final Token token = buildReactionsToken(secret, TokenAction.WRITE); - return reactions.add(token, userID, reaction, targetFeeds, targetFeedsExtraData); + return reactions.add(token, userID, reaction, targetFeeds, null, options); + } + + public CompletableFuture add( + String userID, Reaction reaction, FeedID[] targetFeeds, + Map targetFeedsExtraData, RequestOption... options) throws StreamException { + final Token token = buildReactionsToken(secret, TokenAction.WRITE); + return reactions.add(token, userID, reaction, targetFeeds, targetFeedsExtraData, options); } public CompletableFuture addChild( @@ -237,6 +246,12 @@ public CompletableFuture update(Reaction reaction, FeedID... targetFeeds) return reactions.update(token, reaction, targetFeeds); } + public CompletableFuture update( + Reaction reaction, FeedID[] targetFeeds, RequestOption... options) throws StreamException { + final Token token = buildReactionsToken(secret, TokenAction.WRITE); + return reactions.update(token, reaction, targetFeeds, options); + } + public CompletableFuture delete(String id) throws StreamException { final Token token = buildReactionsToken(secret, TokenAction.DELETE); return reactions.delete(token, id, false); diff --git a/src/main/java/io/getstream/cloud/CloudClient.java b/src/main/java/io/getstream/cloud/CloudClient.java index e2417ec4..328cb8a4 100644 --- a/src/main/java/io/getstream/cloud/CloudClient.java +++ b/src/main/java/io/getstream/cloud/CloudClient.java @@ -337,13 +337,19 @@ CompletableFuture getEnrichedActivities(FeedID feed, RequestOption... return stream.getEnrichedActivities(token, feed, options); } - CompletableFuture addActivity(FeedID feed, Activity activity) throws StreamException { - return stream.addActivity(token, feed, activity); + CompletableFuture addActivity(FeedID feed, Activity activity, RequestOption... options) + throws StreamException { + return stream.addActivity(token, feed, activity, options); } CompletableFuture addActivities(FeedID feed, Activity... activities) throws StreamException { - return stream.addActivities(token, feed, activities); + return addActivities(feed, activities, new RequestOption[0]); + } + + CompletableFuture addActivities( + FeedID feed, Activity[] activities, RequestOption... options) throws StreamException { + return stream.addActivities(token, feed, activities, options); } CompletableFuture removeActivityByID(FeedID feed, String id) throws StreamException { diff --git a/src/main/java/io/getstream/cloud/CloudFeed.java b/src/main/java/io/getstream/cloud/CloudFeed.java index 07673c01..04506392 100644 --- a/src/main/java/io/getstream/cloud/CloudFeed.java +++ b/src/main/java/io/getstream/cloud/CloudFeed.java @@ -69,9 +69,10 @@ public final String getUserID() { return id.getUserID(); } - public final CompletableFuture addActivity(Activity activity) throws StreamException { + public final CompletableFuture addActivity(Activity activity, RequestOption... options) + throws StreamException { return getClient() - .addActivity(id, activity) + .addActivity(id, activity, options) .thenApply( response -> { try { @@ -82,9 +83,10 @@ public final CompletableFuture addActivity(Activity activity) throws S }); } - public final CompletableFuture addCustomActivity(T activity) throws StreamException { + public final CompletableFuture addCustomActivity(T activity, RequestOption... options) + throws StreamException { return getClient() - .addActivity(id, Activity.builder().fromCustomActivity(activity).build()) + .addActivity(id, Activity.builder().fromCustomActivity(activity).build(), options) .thenApply( response -> { try { @@ -97,7 +99,7 @@ public final CompletableFuture addCustomActivity(T activity) throws Strea public final CompletableFuture> addActivities(Iterable activities) throws StreamException { - return addActivities(Iterables.toArray(activities, Activity.class)); + return addActivities(Iterables.toArray(activities, Activity.class), new RequestOption[0]); } public final CompletableFuture> addCustomActivities(Iterable activities) @@ -107,7 +109,7 @@ public final CompletableFuture> addCustomActivities(Iterable acti .map(activity -> Activity.builder().fromCustomActivity(activity).build()) .toArray(Activity[]::new); return getClient() - .addActivities(id, custom) + .addActivities(id, custom, new RequestOption[0]) .thenApply( (Response response) -> { try { @@ -124,8 +126,13 @@ public final CompletableFuture> addCustomActivities(Iterable acti public final CompletableFuture> addActivities(Activity... activities) throws StreamException { + return addActivities(activities, new RequestOption[0]); + } + + public final CompletableFuture> addActivities( + Activity[] activities, RequestOption... options) throws StreamException { return getClient() - .addActivities(id, activities) + .addActivities(id, activities, options) .thenApply( (Response response) -> { try { @@ -143,7 +150,7 @@ public final CompletableFuture> addCustomActivities(T... activities) .map(activity -> Activity.builder().fromCustomActivity(activity).build()) .toArray(Activity[]::new); return getClient() - .addActivities(id, custom) + .addActivities(id, custom, new RequestOption[0]) .thenApply( (Response response) -> { try { diff --git a/src/main/java/io/getstream/cloud/CloudReactionsClient.java b/src/main/java/io/getstream/cloud/CloudReactionsClient.java index ab04d5a4..099c5187 100644 --- a/src/main/java/io/getstream/cloud/CloudReactionsClient.java +++ b/src/main/java/io/getstream/cloud/CloudReactionsClient.java @@ -12,6 +12,7 @@ import io.getstream.core.models.Reaction; import io.getstream.core.options.Filter; import io.getstream.core.options.Limit; +import io.getstream.core.options.RequestOption; import io.getstream.core.utils.DefaultOptions; import java.util.List; import java.util.Map; @@ -151,9 +152,16 @@ public CompletableFuture add(String userID, Reaction reaction, FeedID. return reactions.add(token, userID, reaction, targetFeeds); } - public CompletableFuture add(String userID, Reaction reaction, FeedID[] targetFeeds, Map targetFeedsExtraData) + public CompletableFuture add( + String userID, Reaction reaction, FeedID[] targetFeeds, RequestOption... options) throws StreamException { - return reactions.add(token, userID, reaction, targetFeeds, targetFeedsExtraData); + return reactions.add(token, userID, reaction, targetFeeds, null, options); + } + + public CompletableFuture add( + String userID, Reaction reaction, FeedID[] targetFeeds, + Map targetFeedsExtraData, RequestOption... options) throws StreamException { + return reactions.add(token, userID, reaction, targetFeeds, targetFeedsExtraData, options); } public CompletableFuture addChild( @@ -218,6 +226,11 @@ public CompletableFuture update(Reaction reaction, FeedID... targetFeeds) return reactions.update(token, reaction, targetFeeds); } + public CompletableFuture update( + Reaction reaction, FeedID[] targetFeeds, RequestOption... options) throws StreamException { + return reactions.update(token, reaction, targetFeeds, options); + } + public CompletableFuture delete(String id) throws StreamException { return reactions.delete(token, id, false); } diff --git a/src/main/java/io/getstream/core/Stream.java b/src/main/java/io/getstream/core/Stream.java index 897817c9..895f5254 100644 --- a/src/main/java/io/getstream/core/Stream.java +++ b/src/main/java/io/getstream/core/Stream.java @@ -72,7 +72,7 @@ public StreamImages images() { } public CompletableFuture> updateActivitiesByID( - Token token, ActivityUpdate[] updates) throws StreamException { + Token token, ActivityUpdate[] updates, RequestOption... options) throws StreamException { checkNotNull(updates, "No updates"); checkArgument(updates.length > 0, "No updates"); for (ActivityUpdate update : updates) { @@ -89,7 +89,7 @@ public CompletableFuture> updateActivitiesByID( }); final URL url = buildActivityUpdateURL(baseURL); return httpClient - .execute(buildPost(url, key, token, payload)) + .execute(buildPost(url, key, token, payload, options)) .thenApply( response -> { try { @@ -104,7 +104,8 @@ public CompletableFuture> updateActivitiesByID( } public CompletableFuture updateActivityByID( - Token token, String id, Map set, String[] unset) throws StreamException { + Token token, String id, Map set, String[] unset, RequestOption... options) + throws StreamException { checkNotNull(id, "No activity to update"); checkNotNull(set, "No activity properties to set"); checkNotNull(unset, "No activity properties to unset"); @@ -123,7 +124,7 @@ public CompletableFuture updateActivityByID( }); final URL url = buildActivityUpdateURL(baseURL); return httpClient - .execute(buildPost(url, key, token, payload)) + .execute(buildPost(url, key, token, payload, options)) .thenApply( response -> { try { @@ -138,7 +139,7 @@ public CompletableFuture updateActivityByID( } public CompletableFuture> updateActivitiesByForeignID( - Token token, ActivityUpdate[] updates) throws StreamException { + Token token, ActivityUpdate[] updates, RequestOption... options) throws StreamException { checkNotNull(updates, "No updates"); checkArgument(updates.length > 0, "No updates"); for (ActivityUpdate update : updates) { @@ -156,7 +157,7 @@ public CompletableFuture> updateActivitiesByForeignID( }); final URL url = buildActivityUpdateURL(baseURL); return httpClient - .execute(buildPost(url, key, token, payload)) + .execute(buildPost(url, key, token, payload, options)) .thenApply( response -> { try { @@ -171,7 +172,12 @@ public CompletableFuture> updateActivitiesByForeignID( } public CompletableFuture updateActivityByForeignID( - Token token, String foreignID, Date timestamp, Map set, String[] unset) + Token token, + String foreignID, + Date timestamp, + Map set, + String[] unset, + RequestOption... options) throws StreamException { checkNotNull(foreignID, "No activity to update"); checkNotNull(timestamp, "Missing timestamp"); @@ -199,7 +205,7 @@ public CompletableFuture updateActivityByForeignID( }); final URL url = buildActivityUpdateURL(baseURL); return httpClient - .execute(buildPost(url, key, token, payload)) + .execute(buildPost(url, key, token, payload, options)) .thenApply( response -> { try { @@ -263,14 +269,14 @@ public CompletableFuture getEnrichedActivities( } } - public CompletableFuture addActivity(Token token, FeedID feed, Activity activity) - throws StreamException { + public CompletableFuture addActivity( + Token token, FeedID feed, Activity activity, RequestOption... options) throws StreamException { checkNotNull(activity, "No activity to add"); try { final byte[] payload = toJSON(activity); final URL url = buildFeedURL(baseURL, feed, "/"); - return httpClient.execute(buildPost(url, key, token, payload)); + return httpClient.execute(buildPost(url, key, token, payload, options)); } catch (JsonProcessingException | MalformedURLException | URISyntaxException e) { throw new StreamException(e); } @@ -278,6 +284,12 @@ public CompletableFuture addActivity(Token token, FeedID feed, Activit public CompletableFuture addActivities( Token token, FeedID feed, Activity... activityObjects) throws StreamException { + return addActivities(token, feed, activityObjects, new RequestOption[0]); + } + + public CompletableFuture addActivities( + Token token, FeedID feed, Activity[] activityObjects, RequestOption... options) + throws StreamException { checkNotNull(activityObjects, "No activities to add"); try { @@ -287,7 +299,7 @@ public CompletableFuture addActivities( public final Activity[] activities = activityObjects; }); final URL url = buildFeedURL(baseURL, feed, "/"); - return httpClient.execute(buildPost(url, key, token, payload)); + return httpClient.execute(buildPost(url, key, token, payload, options)); } catch (JsonProcessingException | MalformedURLException | URISyntaxException e) { throw new StreamException(e); } diff --git a/src/main/java/io/getstream/core/StreamReactions.java b/src/main/java/io/getstream/core/StreamReactions.java index 1bbba031..cb9c7357 100644 --- a/src/main/java/io/getstream/core/StreamReactions.java +++ b/src/main/java/io/getstream/core/StreamReactions.java @@ -208,7 +208,7 @@ public CompletableFuture add( } public CompletableFuture add( - Token token, String userID, Reaction reaction, FeedID[] targetFeeds, Map targetFeedsExtraData) throws StreamException { + Token token, String userID, Reaction reaction, FeedID[] targetFeeds, Map targetFeedsExtraData, RequestOption... options) throws StreamException { checkNotNull(reaction, "Reaction can't be null"); checkArgument( reaction.getActivityID() != null || reaction.getParent() != null, @@ -256,7 +256,7 @@ public CompletableFuture add( final byte[] payload = toJSON(payloadBuilder.build()); final URL url = buildReactionsURL(baseURL); return httpClient - .execute(buildPost(url, key, token, payload)) + .execute(buildPost(url, key, token, payload, options)) .thenApply( response -> { try { @@ -272,6 +272,12 @@ public CompletableFuture add( public CompletableFuture update(Token token, Reaction reaction, FeedID... targetFeeds) throws StreamException { + return update(token, reaction, targetFeeds, new RequestOption[0]); + } + + public CompletableFuture update( + Token token, Reaction reaction, FeedID[] targetFeeds, RequestOption... options) + throws StreamException { checkNotNull(reaction, "Reaction can't be null"); checkNotNull(reaction.getId(), "Reaction id can't be null"); checkArgument(!reaction.getId().isEmpty(), "Reaction id can't be empty"); @@ -291,7 +297,7 @@ public CompletableFuture update(Token token, Reaction reaction, FeedID... final byte[] payload = toJSON(payloadBuilder.build()); final URL url = buildReactionsURL(baseURL, reaction.getId() + '/'); return httpClient - .execute(buildPut(url, key, token, payload)) + .execute(buildPut(url, key, token, payload, options)) .thenApply( response -> { try { diff --git a/src/test/java/io/getstream/client/BatchClientTest.java b/src/test/java/io/getstream/client/BatchClientTest.java index 7a88f8ed..55606d70 100644 --- a/src/test/java/io/getstream/client/BatchClientTest.java +++ b/src/test/java/io/getstream/client/BatchClientTest.java @@ -1,8 +1,13 @@ package io.getstream.client; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import com.google.common.collect.ImmutableMap; import io.getstream.core.KeepHistory; import io.getstream.core.models.*; +import io.getstream.core.options.CustomQueryParameter; import java.text.SimpleDateFormat; import java.util.*; import org.junit.Test; @@ -161,6 +166,138 @@ public void partiallyUpdateActivitiesByForeignID() throws Exception { List result = client.updateActivitiesByForeignID(update).join(); } + @Test + public void partiallyUpdateActivityByIDSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "safe text") + .foreignID(UUID.randomUUID().toString()) + .time(new Date()) + .build(); + Activity created = client.flatFeed("user", "1").addActivity(activity).join(); + assertNotNull(created.getModerationResponse()); + assertEquals("keep", created.getModerationResponse().getRecommendedAction()); + + Activity updated = + client + .updateActivityByID( + created.getID(), + ImmutableMap.of("text", "pissoar"), + new String[0], + new CustomQueryParameter("skip_moderation", "true")) + .join(); + assertEquals("keep", updated.getModerationResponse().getRecommendedAction()); + } + + @Test + public void partiallyUpdateActivitiesByIDSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "safe text") + .foreignID(UUID.randomUUID().toString()) + .time(new Date()) + .build(); + Activity created = client.flatFeed("user", "1").addActivity(activity).join(); + + ActivityUpdate update = + ActivityUpdate.builder() + .id(created.getID()) + .set(ImmutableMap.of("text", "pissoar")) + .unset(Collections.emptyList()) + .build(); + + List result = + client + .updateActivitiesByID( + new ActivityUpdate[] {update}, + new CustomQueryParameter("skip_moderation", "true")) + .join(); + assertEquals(1, result.size()); + assertEquals("keep", result.get(0).getModerationResponse().getRecommendedAction()); + } + + @Test + public void partiallyUpdateActivityByForeignIDSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + String foreignID = UUID.randomUUID().toString(); + Date time = new Date(); + + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "safe text") + .foreignID(foreignID) + .time(time) + .build(); + Activity created = client.flatFeed("user", "1").addActivity(activity).join(); + assertNotNull(created.getModerationResponse()); + assertEquals("keep", created.getModerationResponse().getRecommendedAction()); + + Activity updated = + client + .updateActivityByForeignID( + foreignID, + time, + ImmutableMap.of("text", "pissoar"), + new String[0], + new CustomQueryParameter("skip_moderation", "true")) + .join(); + assertEquals("keep", updated.getModerationResponse().getRecommendedAction()); + } + + @Test + public void partiallyUpdateActivitiesByForeignIDSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + String foreignID = UUID.randomUUID().toString(); + Date time = new Date(); + + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "safe text") + .foreignID(foreignID) + .time(time) + .build(); + client.flatFeed("user", "1").addActivity(activity).join(); + + ActivityUpdate update = + ActivityUpdate.builder() + .foreignID(foreignID) + .time(time) + .set(ImmutableMap.of("text", "pissoar")) + .unset(Collections.emptyList()) + .build(); + + List result = + client + .updateActivitiesByForeignID( + new ActivityUpdate[] {update}, + new CustomQueryParameter("skip_moderation", "true")) + .join(); + assertEquals(1, result.size()); + assertEquals("keep", result.get(0).getModerationResponse().getRecommendedAction()); + } + @Test public void getActivitiesByID() throws Exception { BatchClient client = Client.builder(apiKey, secret).build().batch(); diff --git a/src/test/java/io/getstream/client/FeedTest.java b/src/test/java/io/getstream/client/FeedTest.java index c38dd1d7..4506327e 100644 --- a/src/test/java/io/getstream/client/FeedTest.java +++ b/src/test/java/io/getstream/client/FeedTest.java @@ -1,6 +1,8 @@ package io.getstream.client; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import com.google.common.collect.Lists; import io.getstream.client.entities.FootballMatch; @@ -10,6 +12,8 @@ import io.getstream.core.models.Activity; import io.getstream.core.models.FeedID; import io.getstream.core.models.FollowStats; +import io.getstream.core.models.ModerationResponse; +import io.getstream.core.options.CustomQueryParameter; import java.net.MalformedURLException; import java.util.Collections; import java.util.Date; @@ -50,6 +54,54 @@ public void addActivity() throws Exception { Activity result = feed.addActivity(activity).join(); } + @Test + public void addActivitySkipModeration() throws Exception { + FlatFeed feed = client.flatFeed("user", "1"); + + Activity blocked = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "pissoar") + .foreignID(UUID.randomUUID().toString()) + .time(new Date()) + .build(); + + Activity withModeration = feed.addActivity(blocked).join(); + assertNotNull(withModeration.getModerationResponse()); + assertEquals("remove", withModeration.getModerationResponse().getRecommendedAction()); + + Activity withoutModeration = + feed.addActivity(blocked, new CustomQueryParameter("skip_moderation", "true")).join(); + assertNull(withoutModeration.getModerationResponse()); + } + + @Test + public void addActivitiesSkipModeration() throws Exception { + FlatFeed feed = client.flatFeed("user", "1"); + + Activity blocked = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "pissoar") + .foreignID(UUID.randomUUID().toString()) + .time(new Date()) + .build(); + + List withoutModeration = + feed.addActivities( + new Activity[] {blocked}, + new CustomQueryParameter("skip_moderation", "true")) + .join(); + assertEquals(1, withoutModeration.size()); + assertNull(withoutModeration.get(0).getModerationResponse()); + } + @Test public void addActivities() throws Exception { Activity activity = Activity.builder().actor("test").verb("test").object("test").build(); diff --git a/src/test/java/io/getstream/client/ReactionsClientTest.java b/src/test/java/io/getstream/client/ReactionsClientTest.java index da11c692..a0d32a19 100644 --- a/src/test/java/io/getstream/client/ReactionsClientTest.java +++ b/src/test/java/io/getstream/client/ReactionsClientTest.java @@ -8,11 +8,14 @@ import java.util.function.Function; import java.util.stream.Collectors; +import io.getstream.core.options.CustomQueryParameter; import io.getstream.core.options.Filter; import io.getstream.core.options.Limit; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; public class ReactionsClientTest { private static final String apiKey = @@ -188,6 +191,96 @@ public void update() throws Exception { client.reactions().update(data, new FeedID("flat", "1")).join(); } + @Test + public void addReactionSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + Activity activity = + client + .flatFeed("user", "1") + .addActivity( + Activity.builder().actor("test").verb("test").object("test").build()) + .join(); + + Reaction blocked = + Reaction.builder() + .activityID(activity.getID()) + .kind("like") + .userID("user123") + .extraField("text", "pissoar") + .moderationTemplate("moderation_template_reaction") + .build(); + + Reaction withModeration = client.reactions().add("user", blocked).join(); + assertNotNull(withModeration.getModerationResponse()); + assertEquals("remove", withModeration.getModerationResponse().getRecommendedAction()); + + Reaction skipped = + Reaction.builder() + .activityID(activity.getID()) + .kind("like") + .userID("user123") + .extraField("text", "pissoar") + .moderationTemplate("moderation_template_reaction") + .build(); + Reaction withoutModeration = + client + .reactions() + .add( + "user", + skipped, + new FeedID[0], + new CustomQueryParameter("skip_moderation", "true")) + .join(); + Map moderation = withoutModeration.getModeration(); + if (moderation != null) { + assertNull(moderation.get("response")); + } + } + + @Test + public void updateReactionSkipModeration() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + + Activity activity = + client + .flatFeed("user", "1") + .addActivity( + Activity.builder().actor("test").verb("test").object("test").build()) + .join(); + + Reaction safe = + Reaction.builder() + .activityID(activity.getID()) + .kind("like") + .userID("user123") + .extraField("text", "safe text") + .moderationTemplate("moderation_template_reaction") + .build(); + Reaction created = client.reactions().add("user", safe).join(); + assertNotNull(created.getModerationResponse()); + assertEquals("keep", created.getModerationResponse().getRecommendedAction()); + + Reaction blockedUpdate = + Reaction.builder() + .id(created.getId()) + .kind("like") + .extraField("text", "pissoar") + .moderationTemplate("moderation_template_reaction") + .build(); + client + .reactions() + .update( + blockedUpdate, + new FeedID[0], + new CustomQueryParameter("skip_moderation", "true")) + .join(); + + Reaction fetched = client.reactions().get(created.getId()).join(); + ModerationResponse m = fetched.getModerationResponse(); + assertEquals("keep", m.getRecommendedAction()); + } + @Test public void delete() throws Exception { Client client = Client.builder(apiKey, secret).build();