Skip to content

Commit 46a1a57

Browse files
committed
chore: add batch delete activities endpoint
1 parent 31b442c commit 46a1a57

File tree

9 files changed

+209
-5
lines changed

9 files changed

+209
-5
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.getstream.client;
2+
3+
import io.getstream.core.BatchDeleteActivities;
4+
import io.getstream.core.exceptions.StreamException;
5+
import io.getstream.core.http.Token;
6+
import io.getstream.core.models.BatchDeleteActivitiesRequest;
7+
import io.getstream.core.utils.Auth;
8+
import java8.util.concurrent.CompletableFuture;
9+
10+
import static io.getstream.core.utils.Auth.buildDataPrivacyToken;
11+
import static io.getstream.core.utils.Auth.buildModerationToken;
12+
13+
public class BatchDeleteActivitiesClient {
14+
private final String secret;
15+
private final BatchDeleteActivities batchDeleteActivities;
16+
17+
public BatchDeleteActivitiesClient(String secret, BatchDeleteActivities batchDeleteActivities) {
18+
this.secret = secret;
19+
this.batchDeleteActivities = batchDeleteActivities;
20+
}
21+
22+
public CompletableFuture<Object> deleteActivities(BatchDeleteActivitiesRequest request) throws StreamException {
23+
final Token token =buildDataPrivacyToken(secret, Auth.TokenAction.WRITE); // Assuming Token can be created with a secret
24+
25+
return batchDeleteActivities.deleteActivities(token, request);
26+
}
27+
}

src/main/java/io/getstream/client/Client.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ public ExportIDsClient exportIDs() {
259259
return new ExportIDsClient(secret, stream.exportIDs());
260260
}
261261

262+
public BatchDeleteActivitiesClient batchDeleteActivities() {
263+
return new BatchDeleteActivitiesClient(secret, stream.batchDeleteActivities());
264+
}
265+
262266
public FileStorageClient files() {
263267
return new FileStorageClient(secret, stream.files());
264268
}

src/main/java/io/getstream/client/ExportIDsClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.getstream.client;
22

3-
import static io.getstream.core.utils.Auth.buildDataPrivacy;
3+
import static io.getstream.core.utils.Auth.buildDataPrivacyToken;
44
import static io.getstream.core.utils.Serialization.deserialize;
55

66
import io.getstream.core.ExportIDs;
@@ -20,7 +20,7 @@ public class ExportIDsClient {
2020
}
2121

2222
public CompletableFuture<ExportIDsResponse> exportUserActivities(String userId) throws StreamException {
23-
final Token token = buildDataPrivacy(secret, Auth.TokenAction.READ);
23+
final Token token = buildDataPrivacyToken(secret, Auth.TokenAction.READ);
2424
return exportIDs.exportUserActivities(token, userId);
2525
}
26-
}
26+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.getstream.core;
2+
3+
import io.getstream.core.exceptions.StreamException;
4+
import io.getstream.core.http.HTTPClient;
5+
import io.getstream.core.http.Token;
6+
import io.getstream.core.models.BatchDeleteActivitiesRequest;
7+
import java8.util.concurrent.CompletableFuture;
8+
import static io.getstream.core.utils.Routes.*;
9+
import static io.getstream.core.utils.Request.buildPost;
10+
import static io.getstream.core.utils.Serialization.toJSON;
11+
12+
import java.io.BufferedReader;
13+
import java.io.IOException;
14+
import java.io.InputStreamReader;
15+
import java.net.URL;
16+
import java.util.Map;
17+
18+
public class BatchDeleteActivities {
19+
private final String key;
20+
private final URL baseURL;
21+
private final HTTPClient httpClient;
22+
23+
public BatchDeleteActivities(String key, URL baseURL, HTTPClient httpClient) {
24+
this.key = key;
25+
this.baseURL = baseURL;
26+
this.httpClient = httpClient;
27+
}
28+
29+
public CompletableFuture<Object> deleteActivities(Token token, BatchDeleteActivitiesRequest request) throws StreamException {
30+
try {
31+
// final URL url = deleteActivitiesURL(baseURL);
32+
final URL url = deleteActivitiesURL(new URL("https://oregon-api.stream-io-api.com"));//$$ need to deploy proxy
33+
34+
final byte[] payload = toJSON(request);
35+
io.getstream.core.http.Request httpRequest = buildPost(url, key, token, payload);
36+
return httpClient.execute(httpRequest).thenApply(response -> null);
37+
} catch (Exception e) {
38+
throw new StreamException(e);
39+
}
40+
}
41+
}

src/main/java/io/getstream/core/Stream.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ public ExportIDs exportIDs() {
6767
return new ExportIDs(key, baseURL, httpClient);
6868
}
6969

70+
public BatchDeleteActivities batchDeleteActivities() {
71+
return new BatchDeleteActivities(key, baseURL, httpClient);
72+
}
73+
7074
public StreamFiles files() {
7175
return new StreamFiles(key, baseURL, httpClient);
7276
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.getstream.core.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import java.util.List;
6+
7+
@JsonInclude(JsonInclude.Include.NON_NULL)
8+
public class BatchDeleteActivitiesRequest {
9+
10+
private final List<ActivityToDelete> activities;
11+
12+
public BatchDeleteActivitiesRequest(List<ActivityToDelete> activities) {
13+
this.activities = activities;
14+
}
15+
16+
public List<ActivityToDelete> getActivities() {
17+
return activities;
18+
}
19+
20+
public static class ActivityToDelete {
21+
private final String id;
22+
private final List<String> removeFromFeeds;
23+
24+
public ActivityToDelete(
25+
@JsonProperty("id") String id,
26+
@JsonProperty("remove_from_feeds") List<String> removeFromFeeds) {
27+
this.id = id;
28+
this.removeFromFeeds = removeFromFeeds;
29+
}
30+
31+
public String getId() {
32+
return id;
33+
}
34+
35+
public List<String> getRemoveFromFeeds() {
36+
return removeFromFeeds;
37+
}
38+
}
39+
}

src/main/java/io/getstream/core/utils/Auth.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public static Token buildModerationToken(String secret, TokenAction action) {
104104
return buildBackendToken(secret, TokenResource.MODERATION, action, "*");
105105
}
106106

107-
public static Token buildDataPrivacy(String secret, TokenAction action) {
107+
public static Token buildDataPrivacyToken(String secret, TokenAction action) {
108108
return buildBackendToken(secret, TokenResource.DATAPRIVACY, action, "*");
109109
}
110110

src/main/java/io/getstream/core/utils/Routes.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public final class Routes {
1919
private static final String followManyPath = "follow_many/";
2020
private static final String unfollowManyPath = "unfollow_many/";
2121
private static final String moderationFlagPath = "moderation/flag/";
22-
private static final String exportIDsPath = "data_privacy/export_ids/";
2322
private static final String collectionsPath = "collections/";
2423
private static final String filesPath = "files/";
2524
private static final String imagesPath = "images/";
@@ -29,6 +28,9 @@ public final class Routes {
2928
private static final String usersPath = "user/";
3029
private static final String followStatsPath = "stats/follow/";
3130

31+
private static final String exportIDsPath = "data_privacy/export_ids/";
32+
private static final String deleteActivitiesPath = "data_privacy/delete_activities/";
33+
3234
private Routes() {
3335
/* nothing to see here */
3436
}
@@ -123,6 +125,10 @@ public static URL buildExportIDsURL(URL baseURL, String userID) throws Malformed
123125
return new URL(baseURL, basePath + exportIDsPath+userID);
124126
}
125127

128+
public static URL deleteActivitiesURL(URL baseURL) throws MalformedURLException {
129+
return new URL(baseURL, basePath + deleteActivitiesPath);
130+
}
131+
126132
public static URL followStatsPath(URL baseURL) throws MalformedURLException {
127133
return new URL(baseURL, basePath + followStatsPath);
128134
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package io.getstream.client;
2+
3+
import static org.junit.Assert.*;
4+
5+
import io.getstream.core.BatchDeleteActivities;
6+
import io.getstream.core.http.HTTPClient;
7+
import io.getstream.core.models.BatchDeleteActivitiesRequest;
8+
import io.getstream.core.models.BatchDeleteActivitiesRequest.ActivityToDelete;
9+
import io.getstream.core.models.Activity;
10+
import java8.util.concurrent.CompletableFuture;
11+
import org.junit.*;
12+
13+
import java.net.URL;
14+
import java.util.Arrays;
15+
import java.util.List;
16+
17+
public class BatchDeleteActivitiesTest {
18+
19+
private static final String apiKey =
20+
System.getenv("STREAM_KEY") != null
21+
? System.getenv("STREAM_KEY")
22+
: System.getProperty("STREAM_KEY");
23+
private static final String secret =
24+
System.getenv("STREAM_SECRET") != null
25+
? System.getenv("STREAM_SECRET")
26+
: System.getProperty("STREAM_SECRET");
27+
28+
private Client client;
29+
30+
@Before
31+
public void setUp() throws Exception {
32+
client = Client.builder(apiKey, secret).build();
33+
}
34+
35+
@Test
36+
public void testDeleteActivities() throws Exception {
37+
BatchDeleteActivitiesClient batchDeleteClient = client.batchDeleteActivities();
38+
39+
// Insert some activities
40+
Activity activity1 = Activity.builder()
41+
.actor("user1")
42+
.verb("post")
43+
.object("object1")
44+
.build();
45+
Activity activity1Res = client.flatFeed("user", "user1").addActivity(activity1).join();
46+
47+
Activity activity2 = Activity.builder()
48+
.actor("user1")
49+
.verb("like")
50+
.object("object2")
51+
.build();
52+
Activity activity2Res = client.flatFeed("user", "user1").addActivity(activity2).join();
53+
54+
// Create delete request
55+
List<ActivityToDelete> activities = Arrays.asList(
56+
new ActivityToDelete(activity1Res.getID(), Arrays.asList("user1")),
57+
new ActivityToDelete(activity2Res.getID(), Arrays.asList("user1"))
58+
);
59+
BatchClient clientBatch = Client.builder(apiKey, secret).build().batch();
60+
61+
// Verify activities are inserted
62+
List<Activity> activity1Resp = clientBatch.getActivitiesByID(activity1Res.getID()).join();
63+
assertEquals(1, activity1Resp.size());
64+
65+
List<Activity> activity2Resp = clientBatch.getActivitiesByID(activity2Res.getID()).join();
66+
assertEquals(1, activity2Resp.size());
67+
68+
BatchDeleteActivitiesRequest request = new BatchDeleteActivitiesRequest(activities);
69+
70+
// Delete activities
71+
CompletableFuture<Object> future = batchDeleteClient.deleteActivities(request);
72+
future.join();
73+
74+
assertTrue(future.isDone());
75+
76+
// Verify activities are deleted
77+
List<Activity> deletedActivity1 = clientBatch.getActivitiesByID(activity1Res.getID()).join();
78+
assertEquals(0, deletedActivity1.size());
79+
80+
List<Activity> deletedActivity2 = clientBatch.getActivitiesByID(activity2Res.getID()).join();
81+
assertEquals(0, deletedActivity2.size());
82+
}
83+
}

0 commit comments

Comments
 (0)