Skip to content

Commit 7ea10bc

Browse files
authored
Add option for batch update on activities (#18)
1 parent e2b1ad5 commit 7ea10bc

File tree

5 files changed

+103
-25
lines changed

5 files changed

+103
-25
lines changed

docs_code_snippets/03_01_activities.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,7 @@ Future<void> updatingAndDeletingActivities() async {
100100

101101
// Batch delete activities
102102
await client.deleteActivities(
103-
request: const DeleteActivitiesRequest(
104-
ids: ['123', '456'],
105-
hardDelete: false,
106-
),
103+
ids: ['123', '456'],
104+
hardDelete: false,
107105
);
108106
}

docs_code_snippets/04_01_feeds.dart

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,28 @@ Future<void> feedPagination() async {
8585
Future<void> filteringExamples() async {
8686
// Add a few activities
8787
const feedId = FeedId(group: 'user', id: 'john');
88-
await client.upsertActivities([
89-
ActivityRequest(
90-
feeds: [feedId.rawValue],
91-
filterTags: const ['green', 'blue'],
92-
text: 'first',
93-
type: 'post',
94-
),
95-
ActivityRequest(
96-
feeds: [feedId.rawValue],
97-
filterTags: const ['yellow', 'blue'],
98-
text: 'second',
99-
type: 'post',
100-
),
101-
ActivityRequest(
102-
feeds: [feedId.rawValue],
103-
filterTags: const ['orange'],
104-
text: 'third',
105-
type: 'activity',
106-
),
107-
]);
108-
88+
await client.upsertActivities(
89+
activities: [
90+
ActivityRequest(
91+
feeds: [feedId.rawValue],
92+
filterTags: const ['green', 'blue'],
93+
text: 'first',
94+
type: 'post',
95+
),
96+
ActivityRequest(
97+
feeds: [feedId.rawValue],
98+
filterTags: const ['yellow', 'blue'],
99+
text: 'second',
100+
type: 'post',
101+
),
102+
ActivityRequest(
103+
feeds: [feedId.rawValue],
104+
filterTags: const ['orange'],
105+
text: 'third',
106+
type: 'activity',
107+
),
108+
],
109+
);
109110
// Now read the feed, this will fetch activity 1 and 2
110111
final query = FeedQuery(
111112
fid: feedId,

packages/stream_feeds/lib/src/client/feeds_client_impl.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,26 @@ class StreamFeedsClientImpl implements StreamFeedsClient {
318318
);
319319
}
320320

321+
@override
322+
Future<Result<List<ActivityData>>> upsertActivities({
323+
required List<api.ActivityRequest> activities,
324+
}) {
325+
return _activitiesRepository.upsertActivities(activities);
326+
}
327+
328+
@override
329+
Future<Result<api.DeleteActivitiesResponse>> deleteActivities({
330+
required List<String> ids,
331+
bool? hardDelete,
332+
}) {
333+
return _activitiesRepository.deleteActivities(
334+
deleteActivitiesRequest: api.DeleteActivitiesRequest(
335+
ids: ids,
336+
hardDelete: hardDelete,
337+
),
338+
);
339+
}
340+
321341
@override
322342
ActivityReactionList activityReactionList(ActivityReactionsQuery query) {
323343
return ActivityReactionList(

packages/stream_feeds/lib/src/feeds_client.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:stream_core/stream_core.dart';
33
import 'client/feeds_client_impl.dart';
44
import 'client/moderation_client.dart';
55
import 'generated/api/api.dart' as api;
6+
import 'models/activity_data.dart';
67
import 'models/app_data.dart';
78
import 'models/feed_id.dart';
89
import 'models/feeds_config.dart';
@@ -327,6 +328,51 @@ abstract interface class StreamFeedsClient {
327328
/// activities.
328329
ActivityList activityList(ActivitiesQuery query);
329330

331+
/// Upserts (inserts or updates) multiple activities.
332+
///
333+
/// Creates or updates the provided [activities] in a single batch operation.
334+
///
335+
/// Example:
336+
/// ```dart
337+
/// final upsertedActivities = await client.upsertActivities(
338+
/// activities: [
339+
/// const ActivityRequest(
340+
/// feeds: ['user:123'],
341+
/// id: '1',
342+
/// text: 'hi',
343+
/// type: 'post',
344+
/// ),
345+
/// const ActivityRequest(
346+
/// feeds: ['user:456'],
347+
/// id: '2',
348+
/// text: 'hi',
349+
/// type: 'post',
350+
/// ),
351+
/// ],
352+
/// );
353+
///```
354+
///
355+
/// Returns a [Result] containing the list of upserted [ActivityData] or an error.
356+
Future<Result<List<ActivityData>>> upsertActivities({
357+
required List<api.ActivityRequest> activities,
358+
});
359+
360+
/// Deletes multiple activities.
361+
///
362+
/// Deletes the provided [ids] in a single batch operation.
363+
///
364+
///```dart
365+
///await client.deleteActivities(
366+
/// ids: ['123', '456'],
367+
/// hardDelete: false,
368+
///);
369+
///
370+
/// Returns a [Result] containing the list of deleted activity ids or an error.
371+
Future<Result<api.DeleteActivitiesResponse>> deleteActivities({
372+
required List<String> ids,
373+
bool? hardDelete,
374+
});
375+
330376
/// Creates an activity reaction list instance based on the provided [query].
331377
///
332378
/// Creates an [ActivityReactionList] object that represents a collection of reactions

packages/stream_feeds/lib/src/repository/activities_repository.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,19 @@ class ActivitiesRepository {
107107
);
108108
}
109109

110+
/// Deletes multiple activities.
111+
///
112+
/// Deletes the provided [deleteActivitiesRequest.ids] in a single batch operation.
113+
///
114+
/// Returns a [Result] containing the list of deleted activity ids or an error.
115+
Future<Result<api.DeleteActivitiesResponse>> deleteActivities({
116+
required api.DeleteActivitiesRequest deleteActivitiesRequest,
117+
}) {
118+
return _api.deleteActivities(
119+
deleteActivitiesRequest: deleteActivitiesRequest,
120+
);
121+
}
122+
110123
/// Pins an activity to a feed.
111124
///
112125
/// Pins the activity with [activityId] to the specified [fid] feed.

0 commit comments

Comments
 (0)