Line data Source code
1 : import 'package:dio/dio.dart';
2 : import 'package:stream_feed_dart/src/core/api/feed_api.dart';
3 : import 'package:stream_feed_dart/src/core/http/token.dart';
4 : import 'package:stream_feed_dart/src/core/models/activity.dart';
5 : import 'package:stream_feed_dart/src/core/models/activity_update.dart';
6 : import 'package:stream_feed_dart/src/core/models/feed_id.dart';
7 : import 'package:stream_feed_dart/src/core/models/follow.dart';
8 : import 'package:stream_feed_dart/src/core/util/default.dart';
9 :
10 : import 'package:stream_feed_dart/src/client/flat_feed.dart';
11 : import 'package:stream_feed_dart/src/core/util/token_helper.dart';
12 :
13 : /// Manage api calls for specific feeds
14 : /// The feed object contains convenient functions
15 : /// such add activity, remove activity etc
16 : class Feed {
17 : ///Initialize a feed object
18 5 : Feed(this.feedId, this.feed, {this.userToken, this.secret})
19 : : assert(
20 0 : userToken != null || secret != null,
21 : 'At least a secret or userToken must be provided',
22 : );
23 :
24 : /// Your API secret
25 : final String? secret;
26 : final Token? userToken;
27 :
28 : /// The feed id
29 : final FeedId feedId;
30 :
31 : ///The stream client this feed is constructed from
32 : final FeedApi feed;
33 :
34 : /// Adds the given [Activity] to the feed
35 : /// parameters:
36 : /// [activity] : The activity to add
37 : /// Example
38 : /// ```dart
39 : /// final activity = Activity(
40 : /// actor: user.id,
41 : /// verb: 'tweet',
42 : /// object: '1',
43 : /// extraData: {
44 : /// 'tweet': message,
45 : /// },
46 : /// );
47 : /// await userFeed.addActivity(activity);
48 : /// ```
49 : ///
50 : /// API docs: [adding-activities-basic](https://getstream.io/activity-feeds/docs/flutter-dart/adding_activities/?language=dart#adding-activities-basic)
51 1 : Future<Activity> addActivity(Activity activity) {
52 1 : final token = userToken ??
53 0 : TokenHelper.buildFeedToken(secret!, TokenAction.write, feedId);
54 3 : return feed.addActivity(token, feedId, activity);
55 : }
56 :
57 : /// Adds the given activities to the feed
58 : ///
59 : /// Usage :
60 : /// ```dart
61 : /// final activities = <Activity>[
62 : /// const Activity(
63 : /// actor: 'user:1',
64 : /// verb: 'tweet',
65 : /// object: 'tweet:1',
66 : /// ),
67 : /// const Activity(
68 : /// actor: 'user:2',
69 : /// verb: 'watch',
70 : /// object: 'movie:1',
71 : /// ),
72 : /// ];
73 : /// await userFeed.addActivities(activities);
74 : /// ```
75 : /// API docs : [batch-add-activities](https://getstream.io/activity-feeds/docs/flutter-dart/add_many_activities/?language=dart#batch-add-activities)
76 1 : Future<List<Activity>> addActivities(Iterable<Activity> activities) {
77 1 : final token = userToken ??
78 0 : TokenHelper.buildFeedToken(secret!, TokenAction.write, feedId);
79 3 : return feed.addActivities(token, feedId, activities);
80 : }
81 :
82 : /// Removes the activity by activityId or foreignId
83 : ///
84 : /// parameters
85 : /// [id] : activityId Identifier of activity to remove
86 : ///
87 : /// Usage:
88 : /// ```dart
89 : /// await userFeed.removeActivityById('e561de8f-00f1-11e4-b400-0cc47a024be0');
90 : /// ```
91 : /// API docs: [removing-activities](https://getstream.io/activity-feeds/docs/flutter-dart/adding_activities/?language=dart#removing-activities)
92 1 : Future<void> removeActivityById(String id) {
93 : //TODO: named removeActivity in js
94 : //TODO: should return response
95 1 : final token = userToken ??
96 0 : TokenHelper.buildFeedToken(secret!, TokenAction.delete, feedId);
97 3 : return feed.removeActivityById(token, feedId, id);
98 : }
99 :
100 : /// Remove an Activity by referencing its foreign_id
101 : ///
102 : /// Parameters:
103 : /// [foreignId]: Identifier of activity to remove
104 : ///
105 : /// For example :
106 : ///```dart
107 : /// final chris = client.flatFeed('user', 'chris');
108 : /// await chris.removeActivityByForeignId('picture:10');
109 : /// ```
110 : ///
111 : /// API docs: [removing-activities](https://getstream.io/activity-feeds/docs/flutter-dart/adding_activities/?language=dart#removing-activities)
112 1 : Future<void> removeActivityByForeignId(String foreignId) {
113 1 : final token = userToken ??
114 0 : TokenHelper.buildFeedToken(secret!, TokenAction.delete, feedId);
115 3 : return feed.removeActivityByForeignId(token, feedId, foreignId);
116 : }
117 :
118 : /// Follows the given target feed
119 : ///
120 : /// Parameters:
121 : ///
122 : /// [flatFeet] : Slug of the target feed
123 : /// [activityCopyLimit] : Limit the amount of activities copied over on follow
124 : ///
125 : /// For example to create a following relationship
126 : /// between Jack's "timeline" feed and Chris' "user" feed
127 : /// you'd do the following
128 : /// ```dart
129 : /// final jack = client.flatFeed('timeline', 'jack');
130 : /// await jack.follow(chris);
131 : /// ```
132 : ///
133 : /// API docs: [following](https://getstream.io/activity-feeds/docs/flutter-dart/following/?language=dart)
134 0 : Future<Response> follow(
135 : FlatFeed flatFeed, {
136 : int? activityCopyLimit,
137 : }) async {
138 : //TODO: should return API response
139 0 : final token = userToken ??
140 0 : TokenHelper.buildFollowToken(secret!, TokenAction.write, feedId);
141 0 : final targetToken = userToken ??
142 0 : TokenHelper.buildFeedToken(secret!, TokenAction.read, flatFeed.feedId);
143 0 : return feed.follow(token, targetToken, feedId, flatFeed.feedId,
144 : activityCopyLimit ?? Default.activityCopyLimit);
145 : }
146 :
147 : /// List the followers of this feed
148 : ///
149 : /// Parameters:
150 : /// [offset] : pagination offset
151 : /// [limit] : limit offset
152 : ///
153 : /// Usage:
154 : /// ```dart
155 : /// final followers = await userFeed.getFollowers(limit: 10, offset: 0);
156 : /// ```
157 : ///
158 : /// API docs: [reading-feed-followers](https://getstream.io/activity-feeds/docs/flutter-dart/following/?language=dart#reading-feed-followers)
159 1 : Future<List<Follow>> getFollowers({
160 : Iterable<FeedId>? feedIds,
161 : int? limit,
162 : int? offset,
163 : }) {
164 1 : final token = userToken ??
165 0 : TokenHelper.buildFollowToken(secret!, TokenAction.read, feedId);
166 3 : return feed.getFollowers(token, feedId, limit ?? Default.limit,
167 0 : offset ?? Default.offset, feedIds ?? []);
168 : }
169 :
170 : /// List which feeds this feed is following
171 : ///
172 : /// - Retrieve last 10 feeds followed by user
173 : /// ```dart
174 : /// var followed = await userFeed.getFollowed(limit: 10, offset: 0);
175 : ///```
176 : ///
177 : /// - Retrieve 10 feeds followed by user starting from the 11th
178 : /// ```dart
179 : /// followed = await userFeed.getFollowed(limit: 10, offset: 10);
180 : ///```
181 : ///
182 : /// - Check if user follows specific feeds
183 : /// ```dart
184 : /// followed = await userFeed.getFollowed(limit: 2, offset: 0, feedIds: [
185 : /// FeedId.id('user:42'),
186 : /// FeedId.id('user:43'),
187 : ///]);
188 : ///```
189 : ///
190 : /// API docs: [reading-followed-feeds](https://getstream.io/activity-feeds/docs/flutter-dart/following/?language=dart#reading-followed-feeds)
191 1 : Future<List<Follow>> getFollowed({
192 : Iterable<FeedId>? feedIds,
193 : int? limit,
194 : int? offset,
195 : }) {
196 1 : final token = userToken ??
197 0 : TokenHelper.buildFollowToken(secret!, TokenAction.read, feedId);
198 3 : return feed.getFollowed(token, feedId, limit ?? Default.limit,
199 0 : offset ?? Default.offset, feedIds ?? []);
200 : }
201 :
202 : /// Unfollow the given feed
203 : ///
204 : /// Parameters:
205 : /// - [flatFeet] : Slug of the target feed
206 : /// - [keepHistory] when provided the activities from target
207 : /// feed will not be kept in the feed
208 : ///
209 : /// For example:
210 : /// - Stop following feed user:user_42
211 : /// ```dart
212 : /// await timeline.unfollow(user);
213 : /// ```
214 : /// - Stop following feed user:user_42 but keep history of activities
215 : /// ```dart
216 : /// await timeline.unfollow(user, keepHistory: true);
217 : /// ```
218 : ///
219 : /// API docs: [unfollowing-feeds](https://getstream.io/activity-feeds/docs/flutter-dart/following/?language=dart#unfollowing-feeds)
220 :
221 1 : Future<void> unfollow(
222 : FlatFeed flatFeet, {
223 : bool? keepHistory,
224 : }) {
225 1 : final token = userToken ??
226 0 : TokenHelper.buildFollowToken(secret!, TokenAction.delete, feedId);
227 4 : return feed.unfollow(token, feedId, flatFeet.feedId, keepHistory ?? false);
228 : }
229 :
230 : /// Updates an activity's [Activity.to] fields
231 : ///
232 : /// Parameters:
233 : ///
234 : /// - [update]: the [Activity] to update
235 : /// - [remove]: Remove these targets from the activity
236 : /// - [add] : Add these new targets to the activity
237 : ///
238 : /// For example:
239 : /// ```dart
240 : /// final add = <FeedId>[];
241 : /// final remove = <FeedId>[];
242 : /// await userFeed.updateActivityToTargets(update, add, remove);
243 : /// ```
244 : ///
245 : /// API docs: [targeting](https://getstream.io/activity-feeds/docs/flutter-dart/targeting/?language=dart)
246 1 : Future<void> updateActivityToTargets(
247 : ActivityUpdate update, Iterable<FeedId> add, Iterable<FeedId> remove) {
248 1 : final token = userToken ??
249 0 : TokenHelper.buildToTargetUpdateToken(
250 0 : secret!, TokenAction.write, feedId);
251 3 : return feed.updateActivityToTargets(token, feedId, update,
252 : add: add, remove: remove);
253 : }
254 :
255 : /// Replace [Activity.to] Targets
256 : /// Usage:
257 : /// ```dart
258 : /// await userFeed.replaceActivityToTargets(update, newTargets);
259 : /// ```
260 1 : Future<void> replaceActivityToTargets(
261 : ActivityUpdate update, Iterable<FeedId> newTargets) {
262 1 : final token = userToken ??
263 0 : TokenHelper.buildToTargetUpdateToken(
264 0 : secret!, TokenAction.write, feedId);
265 3 : return feed.updateActivityToTargets(token, feedId, update,
266 : replace: newTargets);
267 : }
268 :
269 : /// Update Activities By Id
270 1 : Future<List<Activity>> updateActivitiesById(
271 : Iterable<ActivityUpdate> updates) {
272 : //TODO: further document that thing
273 : final token =
274 1 : userToken ?? TokenHelper.buildActivityToken(secret!, TokenAction.write);
275 2 : return feed.updateActivitiesById(token, updates);
276 : }
277 :
278 : /// Partial update by activity ID
279 : ///
280 : /// For example
281 : /// First, prepare the set operations
282 : /// ```dart
283 : /// final set = {
284 : /// 'product.price': 19.99,
285 : /// 'shares': {
286 : /// 'facebook': '...',
287 : /// 'twitter': '...',
288 : /// }
289 : /// };
290 : /// ```
291 : /// Prepare the unset operations
292 : /// ```dart
293 : /// final unset = ['daily_likes', 'popularity'];
294 : /// const id = '54a60c1e-4ee3-494b-a1e3-50c06acb5ed4';
295 : /// final update = ActivityUpdate.withId(id, set, unset);
296 : /// await userFeed.updateActivityById(update);
297 : /// ```
298 1 : Future<Activity> updateActivityById(ActivityUpdate update) {
299 : final token =
300 1 : userToken ?? TokenHelper.buildActivityToken(secret!, TokenAction.write);
301 2 : return feed.updateActivityById(token, update);
302 : }
303 :
304 : /// Update Activities By ForeignId
305 1 : Future<List<Activity>> updateActivitiesByForeignId(
306 : Iterable<ActivityUpdate> updates) {
307 : final token =
308 1 : userToken ?? TokenHelper.buildActivityToken(secret!, TokenAction.write);
309 2 : return feed.updateActivitiesByForeignId(token, updates);
310 : }
311 :
312 : /// Update [Activity.foreignId] By ForeignId
313 : ///
314 : /// Usage:
315 : ///```dart
316 : ///await userFeed.updateActivityByForeignId(update);
317 : ///```
318 1 : Future<Activity> updateActivityByForeignId(ActivityUpdate update) {
319 : final token =
320 1 : userToken ?? TokenHelper.buildActivityToken(secret!, TokenAction.write);
321 :
322 2 : return feed.updateActivityByForeignId(token, update);
323 : }
324 : }
|