From 5e49837e1c67d5a95cd84e491b2c13f71dfbe87c Mon Sep 17 00:00:00 2001 From: Aditya Agarwal Date: Wed, 14 Aug 2024 16:52:15 +0200 Subject: [PATCH 1/2] feed get request latencies --- .../core/http/OKHTTPClientAdapterTest.java | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/test/java/io/getstream/core/http/OKHTTPClientAdapterTest.java b/src/test/java/io/getstream/core/http/OKHTTPClientAdapterTest.java index 8ba6fd30..f10dc1a6 100644 --- a/src/test/java/io/getstream/core/http/OKHTTPClientAdapterTest.java +++ b/src/test/java/io/getstream/core/http/OKHTTPClientAdapterTest.java @@ -4,6 +4,10 @@ import io.getstream.client.FlatFeed; import io.getstream.core.models.Activity; import java.util.List; + +import io.getstream.core.options.Limit; +import io.getstream.core.options.Offset; +import java8.util.concurrent.CompletableFuture; import okhttp3.OkHttpClient; import org.junit.Test; @@ -22,17 +26,43 @@ public void clientCreation() throws Exception { Client.builder(apiKey, secret).httpClient(new OKHTTPClientAdapter(new OkHttpClient())).build(); } + @Test public void getRequest() throws Exception { Client client = - Client.builder(apiKey, secret) - .httpClient(new OKHTTPClientAdapter(new OkHttpClient())) - .build(); + Client.builder(apiKey, secret) + .httpClient(new OKHTTPClientAdapter()) + .build(); FlatFeed feed = client.flatFeed("flat", "1"); - List result = feed.getActivities().join(); + + long startTime = System.currentTimeMillis(); + List result1 = feed.getActivities().join(); + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + System.out.println("First request time: " + duration + " ms"); + + for (int i=0; i<10; i++){ + startTime = System.currentTimeMillis(); + result1 = feed.getActivities().join(); + endTime = System.currentTimeMillis(); + duration = endTime - startTime; + System.out.println("Request time: " + duration + " ms"); + } } +// First request time: 868 ms +// Request time: 124 ms +// Request time: 135 ms +// Request time: 138 ms +// Request time: 126 ms +// Request time: 133 ms +// Request time: 128 ms +// Request time: 130 ms +// Request time: 130 ms +// Request time: 126 ms +// Request time: 128 ms + @Test public void postRequest() throws Exception { Client client = From e19966fb93c6a763c13e27a7b8073e9659550161 Mon Sep 17 00:00:00 2001 From: Aditya Agarwal Date: Thu, 3 Oct 2024 19:53:31 +0200 Subject: [PATCH 2/2] add mdoeration endpoints --- src/main/java/io/getstream/client/Client.java | 4 + .../io/getstream/client/ModerationClient.java | 56 ++++++++++++++ .../java/io/getstream/core/Moderation.java | 53 +++++++++++++ src/main/java/io/getstream/core/Stream.java | 5 ++ .../java/io/getstream/core/utils/Routes.java | 5 ++ .../client/ModerationClientTest.java | 77 +++++++++++++++++++ 6 files changed, 200 insertions(+) create mode 100644 src/main/java/io/getstream/client/ModerationClient.java create mode 100644 src/main/java/io/getstream/core/Moderation.java create mode 100644 src/test/java/io/getstream/client/ModerationClientTest.java diff --git a/src/main/java/io/getstream/client/Client.java b/src/main/java/io/getstream/client/Client.java index c608597f..aef62d5a 100644 --- a/src/main/java/io/getstream/client/Client.java +++ b/src/main/java/io/getstream/client/Client.java @@ -250,6 +250,10 @@ public ReactionsClient reactions() { return new ReactionsClient(secret, stream.reactions()); } + public ModerationClient moderation() { + return new ModerationClient(secret, stream.moderation()); + } + public FileStorageClient files() { return new FileStorageClient(secret, stream.files()); } diff --git a/src/main/java/io/getstream/client/ModerationClient.java b/src/main/java/io/getstream/client/ModerationClient.java new file mode 100644 index 00000000..9cce7923 --- /dev/null +++ b/src/main/java/io/getstream/client/ModerationClient.java @@ -0,0 +1,56 @@ +package io.getstream.client; + +import com.fasterxml.jackson.core.JsonProcessingException; +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.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.*; + +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); + } +} diff --git a/src/main/java/io/getstream/core/Moderation.java b/src/main/java/io/getstream/core/Moderation.java new file mode 100644 index 00000000..6d62cca5 --- /dev/null +++ b/src/main/java/io/getstream/core/Moderation.java @@ -0,0 +1,53 @@ +package io.getstream.core; + +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.*; + +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; + } + + 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 68b12da1..3f2db229 100644 --- a/src/main/java/io/getstream/core/Stream.java +++ b/src/main/java/io/getstream/core/Stream.java @@ -9,6 +9,7 @@ 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; @@ -59,6 +60,10 @@ public StreamReactions reactions() { return new StreamReactions(key, baseURL, httpClient); } + public Moderation moderation() { + return new Moderation(key, baseURL, httpClient); + } + public StreamFiles files() { return new StreamFiles(key, baseURL, httpClient); } diff --git a/src/main/java/io/getstream/core/utils/Routes.java b/src/main/java/io/getstream/core/utils/Routes.java index 40c6026f..0d29cf8a 100644 --- a/src/main/java/io/getstream/core/utils/Routes.java +++ b/src/main/java/io/getstream/core/utils/Routes.java @@ -18,6 +18,7 @@ public final class Routes { private static final String addToManyPath = "feed/add_to_many/"; private static final String followManyPath = "follow_many/"; private static final String unfollowManyPath = "unfollow_many/"; + private static final String moderationFlagPath = "moderation/flag/"; private static final String collectionsPath = "collections/"; private static final String filesPath = "files/"; private static final String imagesPath = "images/"; @@ -113,6 +114,10 @@ public static URL buildUnfollowManyURL(URL baseURL) throws MalformedURLException return new URL(baseURL, basePath + unfollowManyPath); } + public static URL buildModerationFlagURL(URL baseURL) throws MalformedURLException { + return new URL(baseURL, basePath + moderationFlagPath); + } + public static URL followStatsPath(URL baseURL) throws MalformedURLException { return new URL(baseURL, basePath + followStatsPath); } diff --git a/src/test/java/io/getstream/client/ModerationClientTest.java b/src/test/java/io/getstream/client/ModerationClientTest.java new file mode 100644 index 00000000..5b4abc36 --- /dev/null +++ b/src/test/java/io/getstream/client/ModerationClientTest.java @@ -0,0 +1,77 @@ +package io.getstream.client; + +import io.getstream.client.Client; +import io.getstream.client.ModerationClient; +import io.getstream.core.models.Activity; +import io.getstream.core.models.Data; +import io.getstream.core.models.Reaction; +import io.getstream.core.http.Response; +import static org.junit.Assert.*; + + +import java.net.MalformedURLException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +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"); + + + @Test + public void testFlagUser() throws Exception { + Client client = Client.builder(apiKey, secret).build(); + 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 { + Client client = Client.builder(apiKey, secret).build(); + 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 { + Client client = Client.builder(apiKey, secret).build(); + 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); + } +} \ No newline at end of file