diff --git a/src/main/java/io/getstream/client/ModerationClient.java b/src/main/java/io/getstream/client/ModerationClient.java index 9cce7923..c44aabc2 100644 --- a/src/main/java/io/getstream/client/ModerationClient.java +++ b/src/main/java/io/getstream/client/ModerationClient.java @@ -1,56 +1,51 @@ package io.getstream.client; -import com.fasterxml.jackson.core.JsonProcessingException; +import static io.getstream.core.utils.Auth.buildReactionsToken; +import static io.getstream.core.utils.Routes.*; +import static io.getstream.core.utils.Serialization.*; + import io.getstream.core.Moderation; -import io.getstream.core.StreamBatch; import io.getstream.core.exceptions.StreamException; -import io.getstream.core.http.HTTPClient; +import io.getstream.core.http.Response; import io.getstream.core.http.Token; import io.getstream.core.utils.Auth; -import java8.util.concurrent.CompletableFuture; -import java8.util.concurrent.CompletionException; -import io.getstream.core.http.Response; - -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.Arrays; import java.util.Map; - -import static io.getstream.core.utils.Auth.buildReactionsToken; -import static io.getstream.core.utils.Routes.*; - -import java.io.IOException; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static io.getstream.core.utils.Request.buildPost; -import static io.getstream.core.utils.Serialization.*; +import java8.util.concurrent.CompletableFuture; public class ModerationClient { - private final String secret; - private final Moderation mod; - - ModerationClient(String secret, Moderation mod) { - this.secret = secret; - this.mod = mod; - } - - public CompletableFuture flagUser(String flaggedUserId, String reason, Map options)throws StreamException { - return flag("stream:user", flaggedUserId, "", reason, options); - } - - public CompletableFuture flagActivity(String entityId, String entityCreatorId, String reason, Map options) throws StreamException{ - return flag("stream:feeds:v2:activity", entityId, entityCreatorId, reason, options); - } - - public CompletableFuture flagReaction(String entityId, String entityCreatorId, String reason, Map options) throws StreamException{ - return flag("stream:feeds:v2:reaction", entityId, entityCreatorId, reason, options); - } - - private CompletableFuture flag(String entityType, String entityId, String entityCreatorId, - String reason, Map options)throws StreamException { - final Token token = buildReactionsToken(secret, Auth.TokenAction.WRITE); - return mod.flag(token, entityType, entityId, entityCreatorId, reason, options); - } + private final String secret; + private final Moderation mod; + + ModerationClient(String secret, Moderation mod) { + this.secret = secret; + this.mod = mod; + } + + public CompletableFuture flagUser( + String flaggedUserId, String reason, Map options) throws StreamException { + return flag("stream:user", flaggedUserId, "", reason, options); + } + + public CompletableFuture flagActivity( + String entityId, String entityCreatorId, String reason, Map options) + throws StreamException { + return flag("stream:feeds:v2:activity", entityId, entityCreatorId, reason, options); + } + + public CompletableFuture flagReaction( + String entityId, String entityCreatorId, String reason, Map options) + throws StreamException { + return flag("stream:feeds:v2:reaction", entityId, entityCreatorId, reason, options); + } + + private CompletableFuture flag( + String entityType, + String entityId, + String entityCreatorId, + String reason, + Map options) + throws StreamException { + final Token token = buildReactionsToken(secret, Auth.TokenAction.WRITE); + return mod.flag(token, entityType, entityId, entityCreatorId, reason, options); + } } diff --git a/src/main/java/io/getstream/core/Moderation.java b/src/main/java/io/getstream/core/Moderation.java index 6d62cca5..d607774e 100644 --- a/src/main/java/io/getstream/core/Moderation.java +++ b/src/main/java/io/getstream/core/Moderation.java @@ -1,53 +1,54 @@ package io.getstream.core; +import static io.getstream.core.utils.Request.buildPost; +import static io.getstream.core.utils.Routes.*; +import static io.getstream.core.utils.Serialization.*; + import com.fasterxml.jackson.core.JsonProcessingException; import io.getstream.core.exceptions.StreamException; import io.getstream.core.http.HTTPClient; import io.getstream.core.http.Response; -import io.getstream.core.models.Activity; -import java8.util.concurrent.CompletableFuture; -import java8.util.concurrent.CompletionException; import io.getstream.core.http.Token; - import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; -import java.util.Arrays; import java.util.Map; -import static io.getstream.core.utils.Routes.*; - -import static io.getstream.core.utils.Request.buildPost; -import static io.getstream.core.utils.Serialization.*; +import java8.util.concurrent.CompletableFuture; +import java8.util.concurrent.CompletionException; public class Moderation { - private final String key; - private final URL baseURL; - private final HTTPClient httpClient; - - public Moderation(String key, URL baseURL, HTTPClient httpClient) { - this.key = key; - this.baseURL = baseURL; - this.httpClient = httpClient; + private final String key; + private final URL baseURL; + private final HTTPClient httpClient; + + public Moderation(String key, URL baseURL, HTTPClient httpClient) { + this.key = key; + this.baseURL = baseURL; + this.httpClient = httpClient; + } + + public CompletableFuture flag( + Token token, + String entityType, + String entityId, + String entityCreatorId, + String reason, + Map options) + throws StreamException { + try { + final byte[] payload = + toJSON( + new Object() { + public final String UserId = entityCreatorId; + public final String EntityType = entityType; + public final String EntityId = entityId; + public final String Reason = reason; + }); + + final URL url = buildModerationFlagURL(baseURL); + return httpClient.execute(buildPost(url, key, token, payload)); + } catch (JsonProcessingException | MalformedURLException | URISyntaxException e) { + throw new CompletionException(e); } - - public CompletableFuture flag(Token token, String entityType, String entityId, String entityCreatorId, - String reason, Map options) throws StreamException { - try { - final byte[] payload = - toJSON( - new Object() { - public final String UserId = entityCreatorId; - public final String EntityType = entityType; - public final String EntityId = entityId; - public final String Reason = reason; - }); - - - final URL url = buildModerationFlagURL(baseURL); - return httpClient.execute(buildPost(url, key, token, payload)); - } catch (JsonProcessingException | MalformedURLException | URISyntaxException e) { - throw new CompletionException(e); - } - } - + } } diff --git a/src/main/java/io/getstream/core/Stream.java b/src/main/java/io/getstream/core/Stream.java index 3f2db229..0eb9d413 100644 --- a/src/main/java/io/getstream/core/Stream.java +++ b/src/main/java/io/getstream/core/Stream.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.OptBoolean; import com.fasterxml.jackson.core.JsonProcessingException; -import io.getstream.client.ModerationClient; import io.getstream.core.exceptions.StreamException; import io.getstream.core.http.HTTPClient; import io.getstream.core.http.Response; diff --git a/src/main/java/io/getstream/core/StreamReactions.java b/src/main/java/io/getstream/core/StreamReactions.java index f2a98a70..c58c20ff 100644 --- a/src/main/java/io/getstream/core/StreamReactions.java +++ b/src/main/java/io/getstream/core/StreamReactions.java @@ -287,26 +287,29 @@ public CompletableFuture update(Token token, Reaction reaction, FeedID... } } - public CompletableFuture delete(Token token, String id, Boolean soft) throws StreamException { + public CompletableFuture delete(Token token, String id, Boolean soft) + throws StreamException { checkNotNull(id, "Reaction id can't be null"); checkArgument(!id.isEmpty(), "Reaction id can't be empty"); try { final URL url = buildReactionsURL(baseURL, id + '/'); - - final Request deleteRequest = soft ? buildDelete(url, key, token, new CustomQueryParameter("soft", "true")) - : buildDelete(url, key, token); + + final Request deleteRequest = + soft + ? buildDelete(url, key, token, new CustomQueryParameter("soft", "true")) + : buildDelete(url, key, token); return httpClient - .execute(deleteRequest) - .thenApply( - response -> { - try { - return deserializeError(response); - } catch (StreamException | IOException e) { - throw new CompletionException(e); - } - }); + .execute(deleteRequest) + .thenApply( + response -> { + try { + return deserializeError(response); + } catch (StreamException | IOException e) { + throw new CompletionException(e); + } + }); } catch (MalformedURLException | URISyntaxException e) { throw new StreamException(e); } diff --git a/src/main/java/io/getstream/core/http/Request.java b/src/main/java/io/getstream/core/http/Request.java index 7b58d618..b5b6d40d 100644 --- a/src/main/java/io/getstream/core/http/Request.java +++ b/src/main/java/io/getstream/core/http/Request.java @@ -155,4 +155,4 @@ public Request build() throws MalformedURLException, URISyntaxException { return new Request(this); } } -} +} diff --git a/src/main/java/io/getstream/core/models/APIError.java b/src/main/java/io/getstream/core/models/APIError.java index 9588c980..c21e2871 100644 --- a/src/main/java/io/getstream/core/models/APIError.java +++ b/src/main/java/io/getstream/core/models/APIError.java @@ -4,33 +4,34 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class APIError { - private String Code; - private String Message; - private String Status; + private String Code; + private String Message; + private String Status; - public String toString() { - return "{Code='" + Code + "', Message=" + Message + "}"; - } - // Default constructor - public APIError() {} + public String toString() { + return "{Code='" + Code + "', Message=" + Message + "}"; + } - // Constructor with parameters - @JsonCreator - public APIError( - @JsonProperty("code") String code, - @JsonProperty("message") String message, - @JsonProperty("status") String status) { - this.Code = code; - this.Message = message; - this.Status = status; - } + // Default constructor + public APIError() {} - // Getters - public String getCode() { - return Code; - } + // Constructor with parameters + @JsonCreator + public APIError( + @JsonProperty("code") String code, + @JsonProperty("message") String message, + @JsonProperty("status") String status) { + this.Code = code; + this.Message = message; + this.Status = status; + } - public String getMessage() { - return Message; - } + // Getters + public String getCode() { + return Code; + } + + public String getMessage() { + return Message; + } } diff --git a/src/main/java/io/getstream/core/models/Activity.java b/src/main/java/io/getstream/core/models/Activity.java index 62109b7d..1a41127b 100644 --- a/src/main/java/io/getstream/core/models/Activity.java +++ b/src/main/java/io/getstream/core/models/Activity.java @@ -205,11 +205,10 @@ public Builder foreignID(String foreignID) { @JsonProperty("moderation") public Builder setModerationResponse(ModerationResponse mod) { - this.moderationResponse=mod; + this.moderationResponse = mod; return this; } - public Builder target(String target) { this.target = target; return this; @@ -297,4 +296,4 @@ public Activity build() { return new Activity(this); } } -} \ No newline at end of file +} diff --git a/src/main/java/io/getstream/core/models/ModerationResponse.java b/src/main/java/io/getstream/core/models/ModerationResponse.java index 7c955a0c..b7cb091c 100644 --- a/src/main/java/io/getstream/core/models/ModerationResponse.java +++ b/src/main/java/io/getstream/core/models/ModerationResponse.java @@ -4,41 +4,41 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class ModerationResponse { - private String Status; - private String RecommendedAction; - private APIError APIError; - private String OriginFeed; - - // Default constructor - public ModerationResponse() {} - - // Constructor with parameters - @JsonCreator - public ModerationResponse( - @JsonProperty("status") String status, - @JsonProperty("recommended_action") String recommendedAction, - @JsonProperty("api_error") APIError apiError, - @JsonProperty("origin_feed") String originFeed) { - this.Status = status; - this.RecommendedAction = recommendedAction; - this.APIError = apiError; - this.OriginFeed = originFeed; - } - - // Getters - public String getStatus() { - return Status; - } - - public String getRecommendedAction() { - return RecommendedAction; - } - - public APIError getAPIError() { - return APIError; - } - - public String getOriginFeed() { - return OriginFeed; - } + private String Status; + private String RecommendedAction; + private APIError APIError; + private String OriginFeed; + + // Default constructor + public ModerationResponse() {} + + // Constructor with parameters + @JsonCreator + public ModerationResponse( + @JsonProperty("status") String status, + @JsonProperty("recommended_action") String recommendedAction, + @JsonProperty("api_error") APIError apiError, + @JsonProperty("origin_feed") String originFeed) { + this.Status = status; + this.RecommendedAction = recommendedAction; + this.APIError = apiError; + this.OriginFeed = originFeed; + } + + // Getters + public String getStatus() { + return Status; + } + + public String getRecommendedAction() { + return RecommendedAction; + } + + public APIError getAPIError() { + return APIError; + } + + public String getOriginFeed() { + return OriginFeed; + } } diff --git a/src/main/java/io/getstream/core/models/Reaction.java b/src/main/java/io/getstream/core/models/Reaction.java index 95101032..0f605998 100644 --- a/src/main/java/io/getstream/core/models/Reaction.java +++ b/src/main/java/io/getstream/core/models/Reaction.java @@ -113,7 +113,7 @@ public Map getModeration() { return moderation; } - public ModerationResponse getModerationResponse()throws Exception { + public ModerationResponse getModerationResponse() throws Exception { String key = "response"; if (moderation != null && moderation.containsKey(key)) { return convert(moderation.get(key), ModerationResponse.class); @@ -320,4 +320,4 @@ public Reaction build() { return new Reaction(this); } } -} \ No newline at end of file +} diff --git a/src/test/java/io/getstream/client/ModerationClientTest.java b/src/test/java/io/getstream/client/ModerationClientTest.java index 8beb329a..e57cbc2e 100644 --- a/src/test/java/io/getstream/client/ModerationClientTest.java +++ b/src/test/java/io/getstream/client/ModerationClientTest.java @@ -1,124 +1,135 @@ package io.getstream.client; +import static org.junit.Assert.*; + +import io.getstream.core.http.Response; import io.getstream.core.models.*; import io.getstream.core.models.Activity; -import io.getstream.core.http.Response; -import static org.junit.Assert.*; import java.util.Date; import java.util.UUID; import org.junit.*; public class ModerationClientTest { - private static final String apiKey = - System.getenv("STREAM_KEY") != null - ? System.getenv("STREAM_KEY") - : System.getProperty("STREAM_KEY"); - private static final String secret = - System.getenv("STREAM_SECRET") != null - ? System.getenv("STREAM_SECRET") - : System.getProperty("STREAM_SECRET"); - - Client client; - @Before - public void setUp()throws Exception { - client = Client.builder(apiKey, secret).build(); - } - @Test - public void testFlagUser() throws Exception { - - ModerationClient moderationClient = client.moderation(); - - String userId = UUID.randomUUID().toString(); - User user = client.user(userId); - user.getOrCreate().join(); - Data result = user.get().join(); - - Response flagResponse = moderationClient.flagUser(userId, "blood", null).join(); - assertNotNull(flagResponse); - } - - @Test - public void testFlagActivity() throws Exception { - ModerationClient moderationClient = client.moderation(); - - Activity activity = Activity.builder().actor("test").verb("test").object("test").build(); - - Activity activityResponse = client.flatFeed("flat", "1").addActivity(activity).join(); - assertNotNull(activityResponse); - - Response flagResponse = moderationClient.flagActivity(activityResponse.getID(), "vishal", "blood", null).join(); - assertNotNull(flagResponse); - } - - @Test - public void testFlagReaction() throws Exception { - ModerationClient moderationClient = client.moderation(); - - Activity activity = Activity.builder().actor("test").verb("test").object("test").build(); - - Activity activityResponse = client.flatFeed("flat", "1").addActivity(activity).join(); - assertNotNull(activityResponse); - - Reaction reactionResponse = client.reactions().add("user123","like", activityResponse.getID()).join(); - assertNotNull(reactionResponse); - - Response flagResponse = moderationClient.flagReaction(reactionResponse.getId(), "bobby", "blood", null).join(); - assertNotNull(flagResponse); - } - @Test - public void testActivityModerated() throws Exception { - - ModerationClient moderationClient = client.moderation(); - - String[] images = new String[] { "image1", "image2" }; - Activity activity = Activity.builder(). - actor("test"). - verb("test"). - object("test"). - moderationTemplate("moderation_template_activity"). - extraField("text", "pissoar"). - extraField("attachment", images). - foreignID("for"). - time(new Date()). - build(); - - Activity activityResponse = client.flatFeed("user", "1").addActivity(activity).join(); - assertNotNull(activityResponse); - ModerationResponse m=activityResponse.getModerationResponse(); - assertEquals(m.getStatus(), "complete"); - assertEquals(m.getRecommendedAction(), "remove"); - } - @Test - public void testActivityModeratedReactions() throws Exception { - - ModerationClient moderationClient = client.moderation(); - - String[] images = new String[] { "image1", "image2" }; - Activity activity = Activity.builder(). - actor("test"). - verb("test"). - object("test"). - extraField("text", "pissoar"). - extraField("attachment", images). - foreignID("for"). - time(new Date()). - build(); - - Activity activityResponse = client.flatFeed("user", "1").addActivity(activity).join(); - assertNotNull(activityResponse); - - Reaction r=Reaction.builder(). - kind("like"). - activityID(activityResponse.getID()). - userID("user123"). - extraField("text","pissoar"). - moderationTemplate("moderation_template_reaction"). - build(); - - Reaction reactionResponse = client.reactions().add("user", r).join(); - ModerationResponse m=reactionResponse.getModerationResponse(); - assertEquals(m.getStatus(), "complete"); - assertEquals(m.getRecommendedAction(), "remove"); - } + private static final String apiKey = + System.getenv("STREAM_KEY") != null + ? System.getenv("STREAM_KEY") + : System.getProperty("STREAM_KEY"); + private static final String secret = + System.getenv("STREAM_SECRET") != null + ? System.getenv("STREAM_SECRET") + : System.getProperty("STREAM_SECRET"); + + Client client; + + @Before + public void setUp() throws Exception { + client = Client.builder(apiKey, secret).build(); + } + + @Test + public void testFlagUser() throws Exception { + + ModerationClient moderationClient = client.moderation(); + + String userId = UUID.randomUUID().toString(); + User user = client.user(userId); + user.getOrCreate().join(); + Data result = user.get().join(); + + Response flagResponse = moderationClient.flagUser(userId, "blood", null).join(); + assertNotNull(flagResponse); + } + + @Test + public void testFlagActivity() throws Exception { + ModerationClient moderationClient = client.moderation(); + + Activity activity = Activity.builder().actor("test").verb("test").object("test").build(); + + Activity activityResponse = client.flatFeed("flat", "1").addActivity(activity).join(); + assertNotNull(activityResponse); + + Response flagResponse = + moderationClient.flagActivity(activityResponse.getID(), "vishal", "blood", null).join(); + assertNotNull(flagResponse); + } + + @Test + public void testFlagReaction() throws Exception { + ModerationClient moderationClient = client.moderation(); + + Activity activity = Activity.builder().actor("test").verb("test").object("test").build(); + + Activity activityResponse = client.flatFeed("flat", "1").addActivity(activity).join(); + assertNotNull(activityResponse); + + Reaction reactionResponse = + client.reactions().add("user123", "like", activityResponse.getID()).join(); + assertNotNull(reactionResponse); + + Response flagResponse = + moderationClient.flagReaction(reactionResponse.getId(), "bobby", "blood", null).join(); + assertNotNull(flagResponse); + } + + @Test + public void testActivityModerated() throws Exception { + + ModerationClient moderationClient = client.moderation(); + + String[] images = new String[] {"image1", "image2"}; + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .moderationTemplate("moderation_template_activity") + .extraField("text", "pissoar") + .extraField("attachment", images) + .foreignID("for") + .time(new Date()) + .build(); + + Activity activityResponse = client.flatFeed("user", "1").addActivity(activity).join(); + assertNotNull(activityResponse); + ModerationResponse m = activityResponse.getModerationResponse(); + assertEquals(m.getStatus(), "complete"); + assertEquals(m.getRecommendedAction(), "remove"); + } + + @Test + public void testActivityModeratedReactions() throws Exception { + + ModerationClient moderationClient = client.moderation(); + + String[] images = new String[] {"image1", "image2"}; + Activity activity = + Activity.builder() + .actor("test") + .verb("test") + .object("test") + .extraField("text", "pissoar") + .extraField("attachment", images) + .foreignID("for") + .time(new Date()) + .build(); + + Activity activityResponse = client.flatFeed("user", "1").addActivity(activity).join(); + assertNotNull(activityResponse); + + Reaction r = + Reaction.builder() + .kind("like") + .activityID(activityResponse.getID()) + .userID("user123") + .extraField("text", "pissoar") + .moderationTemplate("moderation_template_reaction") + .build(); + + Reaction reactionResponse = client.reactions().add("user", r).join(); + ModerationResponse m = reactionResponse.getModerationResponse(); + assertEquals(m.getStatus(), "complete"); + assertEquals(m.getRecommendedAction(), "remove"); + } }