Skip to content

Commit ffbdf96

Browse files
authored
Match WS events against filters (#81)
* Add capabilities for matching filters locally * Apply local filtering in feed state on activity added & updated * Add KDoc to new public code * Remove wrong notEqual/notIn mentions from filter fields doc * Rename FollowStatus.string to FollowStatus.value
1 parent 9028598 commit ffbdf96

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+611
-697
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ moshi = "1.15.2"
2626
navigationCompose = "2.9.3"
2727
okhttp = "4.12.0"
2828
retrofit = "2.12.0"
29-
streamAndroidCore = "0.2.0"
29+
streamAndroidCore = "1.0.0"
3030
symbolProcessingApi = "2.2.0-2.0.2"
3131
lifecycleProcess = "2.9.1"
3232
lifecycleViewModelCompose = "2.4.0"

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/model/FollowData.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ public data class FollowData(
7575
/**
7676
* Sealed class representing the status of a follow relationship.
7777
*
78-
* @property string The string representation of the follow status.
78+
* @property value The string representation of the follow status.
7979
*/
80-
public sealed class FollowStatus(public val string: String) {
80+
public sealed class FollowStatus(public val value: String) {
8181

8282
/** Represents a follow relationship that has been accepted. */
8383
public object Accepted : FollowStatus("accepted")

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/model/QueryConfiguration.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ package io.getstream.feeds.android.client.api.model
1717

1818
import io.getstream.android.core.api.filter.Filter
1919
import io.getstream.android.core.api.filter.FilterField
20-
import io.getstream.android.core.api.filter.Sort
20+
import io.getstream.android.core.api.sort.Sort
2121

2222
/**
2323
* Wrapper around the query configuration consisting of a [Filter] and a list of [Sort] operations.
2424
*
2525
* @property filter The filter for the query.
2626
* @property sort The list of sorting operations for the query.
2727
*/
28-
internal data class QueryConfiguration<F : FilterField, S : Sort<*>>(
29-
val filter: Filter<F>?,
28+
internal data class QueryConfiguration<T, F : FilterField<T>, S : Sort<T>>(
29+
val filter: Filter<T, F>?,
3030
val sort: List<S>?,
3131
)

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/state/query/ActivitiesQuery.kt

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ package io.getstream.feeds.android.client.api.state.query
1717

1818
import io.getstream.android.core.api.filter.Filter
1919
import io.getstream.android.core.api.filter.FilterField
20-
import io.getstream.android.core.api.filter.Sort
21-
import io.getstream.android.core.api.filter.SortDirection
22-
import io.getstream.android.core.api.filter.SortField
2320
import io.getstream.android.core.api.filter.toRequest
21+
import io.getstream.android.core.api.sort.Sort
22+
import io.getstream.android.core.api.sort.SortDirection
23+
import io.getstream.android.core.api.sort.SortField
2424
import io.getstream.feeds.android.client.api.model.ActivityData
25+
import io.getstream.feeds.android.client.api.model.QueryConfiguration
2526
import io.getstream.feeds.android.client.internal.model.mapping.toRequest
2627
import io.getstream.feeds.android.network.models.QueryActivitiesRequest
2728

@@ -60,73 +61,97 @@ public data class ActivitiesQuery(
6061
public val previous: String? = null,
6162
)
6263

63-
public typealias ActivitiesFilter = Filter<ActivitiesFilterField>
64+
/**
65+
* A type alias representing a filter specifically for [ActivityData] using [ActivitiesFilterField].
66+
*/
67+
public typealias ActivitiesFilter = Filter<ActivityData, ActivitiesFilterField>
68+
69+
internal typealias ActivitiesQueryConfig =
70+
QueryConfiguration<ActivityData, ActivitiesFilterField, ActivitiesSort>
6471

65-
public data class ActivitiesFilterField(override val remote: String) : FilterField {
72+
/** Represents a field that can be used to filter activities. */
73+
public data class ActivitiesFilterField(
74+
override val remote: String,
75+
override val localValue: (ActivityData) -> Any?,
76+
) : FilterField<ActivityData> {
6677
public companion object {
6778
/**
6879
* Filter by activity creation timestamp.
6980
*
7081
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
7182
*/
72-
public val createdAt: ActivitiesFilterField = ActivitiesFilterField("created_at")
83+
public val createdAt: ActivitiesFilterField =
84+
ActivitiesFilterField("created_at", ActivityData::createdAt)
7385

7486
/**
7587
* Filter by activity ID.
7688
*
7789
* Supported operators: `equal`, `in`
7890
*/
79-
public val id: ActivitiesFilterField = ActivitiesFilterField("id")
91+
public val id: ActivitiesFilterField = ActivitiesFilterField("id", ActivityData::id)
8092

8193
/**
8294
* Filter by activity filter tags.
8395
*
8496
* Supported operators: `equal`, `in`, `contains`
8597
*/
86-
public val filterTags: ActivitiesFilterField = ActivitiesFilterField("filter_tags")
98+
public val filterTags: ActivitiesFilterField =
99+
ActivitiesFilterField("filter_tags", ActivityData::filterTags)
87100

88101
/**
89102
* Filter by activity popularity score.
90103
*
91104
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
92105
*/
93-
public val popularity: ActivitiesFilterField = ActivitiesFilterField("popularity")
106+
public val popularity: ActivitiesFilterField =
107+
ActivitiesFilterField("popularity", ActivityData::popularity)
94108

95109
/**
96110
* Filter by activity search data.
97111
*
98-
* Supported operators: `equal`, `q`, `autocomplete`
112+
* Supported operators: `q`, `autocomplete`
99113
*/
100-
public val searchData: ActivitiesFilterField = ActivitiesFilterField("search_data")
114+
public val searchData: ActivitiesFilterField =
115+
ActivitiesFilterField("search_data", ActivityData::searchData)
101116

102117
/**
103118
* Filter by activity text content.
104119
*
105120
* Supported operators: `equal`, `q`, `autocomplete`
106121
*/
107-
public val text: ActivitiesFilterField = ActivitiesFilterField("text")
122+
public val text: ActivitiesFilterField = ActivitiesFilterField("text", ActivityData::text)
108123

109124
/**
110125
* Filter by activity type.
111126
*
112127
* Supported operators: `equal`, `in`
113128
*/
114-
public val type: ActivitiesFilterField = ActivitiesFilterField("type")
129+
public val type: ActivitiesFilterField =
130+
ActivitiesFilterField("activity_type", ActivityData::type)
115131

116132
/**
117133
* Filter by user ID who created the activity.
118134
*
119135
* Supported operators: `equal`, `in`
120136
*/
121-
public val userId: ActivitiesFilterField = ActivitiesFilterField("user_id")
137+
public val userId: ActivitiesFilterField = ActivitiesFilterField("user_id") { it.user.id }
122138

123139
/**
124140
* Filter by activity expiration timestamp.
125141
*
126-
* Supported operators: `equal`, `notEqual`, `greater`, `greaterOrEqual`, `less`,
127-
* `lessOrEqual`, `exists`
142+
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`,
143+
* `exists`
144+
*/
145+
public val expiresAt: ActivitiesFilterField =
146+
ActivitiesFilterField("expires_at", ActivityData::expiresAt)
147+
148+
/**
149+
* Filter by activity interest tags.
150+
*
151+
* Supported operators: `equal`, `in`, `contains`
128152
*/
129-
public val expiresAt: ActivitiesFilterField = ActivitiesFilterField("expires_at")
153+
public val interestTags: ActivitiesFilterField =
154+
ActivitiesFilterField("interest_tags", ActivityData::interestTags)
130155
}
131156
}
132157

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/state/query/ActivityReactionsQuery.kt

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ package io.getstream.feeds.android.client.api.state.query
1717

1818
import io.getstream.android.core.api.filter.Filter
1919
import io.getstream.android.core.api.filter.FilterField
20-
import io.getstream.android.core.api.filter.Sort
21-
import io.getstream.android.core.api.filter.SortDirection
22-
import io.getstream.android.core.api.filter.SortField
2320
import io.getstream.android.core.api.filter.toRequest
21+
import io.getstream.android.core.api.sort.Sort
22+
import io.getstream.android.core.api.sort.SortDirection
23+
import io.getstream.android.core.api.sort.SortField
2424
import io.getstream.feeds.android.client.api.model.FeedsReactionData
25+
import io.getstream.feeds.android.client.api.model.QueryConfiguration
2526
import io.getstream.feeds.android.client.internal.model.mapping.toRequest
2627
import io.getstream.feeds.android.network.models.QueryActivityReactionsRequest
2728

@@ -53,32 +54,44 @@ public data class ActivityReactionsQuery(
5354
public val sort: List<ActivityReactionsSort>? = null,
5455
)
5556

56-
public typealias ActivityReactionsFilter = Filter<ActivityReactionsFilterField>
57+
/**
58+
* A type alias representing a filter specifically for [FeedsReactionData] using
59+
* [ActivityReactionsFilterField].
60+
*/
61+
public typealias ActivityReactionsFilter = Filter<FeedsReactionData, ActivityReactionsFilterField>
62+
63+
internal typealias ActivityReactionsQueryConfig =
64+
QueryConfiguration<FeedsReactionData, ActivityReactionsFilterField, ActivityReactionsSort>
5765

58-
public data class ActivityReactionsFilterField(override val remote: String) : FilterField {
66+
/** Represents a field that can be used to filter activity reactions. */
67+
public data class ActivityReactionsFilterField(
68+
override val remote: String,
69+
override val localValue: (FeedsReactionData) -> Any?,
70+
) : FilterField<FeedsReactionData> {
5971
public companion object {
6072
/**
6173
* Filter by reaction type.
6274
*
6375
* Supported operators: `equal`, `in`
6476
*/
6577
public val reactionType: ActivityReactionsFilterField =
66-
ActivityReactionsFilterField("reaction_type")
78+
ActivityReactionsFilterField("reaction_type", FeedsReactionData::type)
6779

6880
/**
6981
* Filter by user ID who created the reaction.
7082
*
7183
* Supported operators: `equal`, `in`
7284
*/
73-
public val userId: ActivityReactionsFilterField = ActivityReactionsFilterField("user_id")
85+
public val userId: ActivityReactionsFilterField =
86+
ActivityReactionsFilterField("user_id") { it.user.id }
7487

7588
/**
7689
* Filter by creation timestamp.
7790
*
7891
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
7992
*/
8093
public val createdAt: ActivityReactionsFilterField =
81-
ActivityReactionsFilterField("created_at")
94+
ActivityReactionsFilterField("created_at", FeedsReactionData::createdAt)
8295
}
8396
}
8497

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/state/query/BookmarkFoldersQuery.kt

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ package io.getstream.feeds.android.client.api.state.query
1717

1818
import io.getstream.android.core.api.filter.Filter
1919
import io.getstream.android.core.api.filter.FilterField
20-
import io.getstream.android.core.api.filter.Sort
21-
import io.getstream.android.core.api.filter.SortDirection
22-
import io.getstream.android.core.api.filter.SortField
2320
import io.getstream.android.core.api.filter.toRequest
21+
import io.getstream.android.core.api.sort.Sort
22+
import io.getstream.android.core.api.sort.SortDirection
23+
import io.getstream.android.core.api.sort.SortField
2424
import io.getstream.feeds.android.client.api.model.BookmarkFolderData
25+
import io.getstream.feeds.android.client.api.model.QueryConfiguration
2526
import io.getstream.feeds.android.client.internal.model.mapping.toRequest
2627
import io.getstream.feeds.android.network.models.QueryBookmarkFoldersRequest
2728

@@ -51,45 +52,44 @@ public data class BookmarkFoldersQuery(
5152
public val previous: String? = null,
5253
)
5354

54-
public typealias BookmarkFoldersFilter = Filter<BookmarkFoldersFilterField>
55+
/**
56+
* A type alias representing a filter specifically for [BookmarkFolderData] using
57+
* [BookmarkFoldersFilterField].
58+
*/
59+
public typealias BookmarkFoldersFilter = Filter<BookmarkFolderData, BookmarkFoldersFilterField>
5560

56-
public data class BookmarkFoldersFilterField(override val remote: String) : FilterField {
57-
public companion object {
58-
/**
59-
* Filter by folder ID.
60-
*
61-
* Supported operators: `equal`, `in`
62-
*/
63-
public val folderId: BookmarkFoldersFilterField = BookmarkFoldersFilterField("folder_id")
61+
internal typealias BookmarkFoldersQueryConfig =
62+
QueryConfiguration<BookmarkFolderData, BookmarkFoldersFilterField, BookmarkFoldersSort>
6463

64+
/** Represents a field that can be used to filter bookmark folders. */
65+
public data class BookmarkFoldersFilterField(
66+
override val remote: String,
67+
override val localValue: (BookmarkFolderData) -> Any?,
68+
) : FilterField<BookmarkFolderData> {
69+
public companion object {
6570
/**
6671
* Filter by folder name.
6772
*
6873
* Supported operators: `equal`, `in`, `contains`
6974
*/
7075
public val folderName: BookmarkFoldersFilterField =
71-
BookmarkFoldersFilterField("folder_name")
72-
73-
/**
74-
* Filter by user ID.
75-
*
76-
* Supported operators: `equal`, `in`
77-
*/
78-
public val userId: BookmarkFoldersFilterField = BookmarkFoldersFilterField("user_id")
76+
BookmarkFoldersFilterField("folder_name", BookmarkFolderData::name)
7977

8078
/**
8179
* Filter by creation timestamp.
8280
*
8381
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
8482
*/
85-
public val createdAt: BookmarkFoldersFilterField = BookmarkFoldersFilterField("created_at")
83+
public val createdAt: BookmarkFoldersFilterField =
84+
BookmarkFoldersFilterField("created_at", BookmarkFolderData::createdAt)
8685

8786
/**
8887
* Filter by last update timestamp.
8988
*
9089
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
9190
*/
92-
public val updatedAt: BookmarkFoldersFilterField = BookmarkFoldersFilterField("updated_at")
91+
public val updatedAt: BookmarkFoldersFilterField =
92+
BookmarkFoldersFilterField("updated_at", BookmarkFolderData::updatedAt)
9393
}
9494
}
9595

stream-feeds-android-client/src/main/kotlin/io/getstream/feeds/android/client/api/state/query/BookmarksQuery.kt

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ package io.getstream.feeds.android.client.api.state.query
1717

1818
import io.getstream.android.core.api.filter.Filter
1919
import io.getstream.android.core.api.filter.FilterField
20-
import io.getstream.android.core.api.filter.Sort
21-
import io.getstream.android.core.api.filter.SortDirection
22-
import io.getstream.android.core.api.filter.SortField
2320
import io.getstream.android.core.api.filter.toRequest
21+
import io.getstream.android.core.api.sort.Sort
22+
import io.getstream.android.core.api.sort.SortDirection
23+
import io.getstream.android.core.api.sort.SortField
2424
import io.getstream.feeds.android.client.api.model.BookmarkData
25+
import io.getstream.feeds.android.client.api.model.QueryConfiguration
2526
import io.getstream.feeds.android.client.internal.model.mapping.toRequest
2627
import io.getstream.feeds.android.network.models.QueryBookmarksRequest
2728

@@ -51,44 +52,58 @@ public data class BookmarksQuery(
5152
public val previous: String? = null,
5253
)
5354

54-
public typealias BookmarksFilter = Filter<BookmarksFilterField>
55+
/**
56+
* A type alias representing a filter specifically for [BookmarkData] using [BookmarksFilterField].
57+
*/
58+
public typealias BookmarksFilter = Filter<BookmarkData, BookmarksFilterField>
59+
60+
internal typealias BookmarksQueryConfig =
61+
QueryConfiguration<BookmarkData, BookmarksFilterField, BookmarksSort>
5562

56-
public data class BookmarksFilterField(override val remote: String) : FilterField {
63+
/** Represents a field that can be used to filter bookmarks. */
64+
public data class BookmarksFilterField(
65+
override val remote: String,
66+
override val localValue: (BookmarkData) -> Any?,
67+
) : FilterField<BookmarkData> {
5768
public companion object {
5869
/**
5970
* Filter by activity ID.
6071
*
6172
* Supported operators: `equal`, `in`
6273
*/
63-
public val activityId: BookmarksFilterField = BookmarksFilterField("activity_id")
74+
public val activityId: BookmarksFilterField =
75+
BookmarksFilterField("activity_id") { it.activity.id }
6476

6577
/**
6678
* Filter by folder ID.
6779
*
6880
* Supported operators: `equal`, `in`, `exists`
6981
*/
70-
public val folderId: BookmarksFilterField = BookmarksFilterField("folder_id")
82+
public val folderId: BookmarksFilterField =
83+
BookmarksFilterField("folder_id") { it.folder?.id }
7184

7285
/**
7386
* Filter by user ID.
7487
*
7588
* Supported operators: `equal`, `in`
7689
*/
77-
public val userId: BookmarksFilterField = BookmarksFilterField("user_id")
90+
public val userId: BookmarksFilterField = BookmarksFilterField("user_id") { it.user.id }
7891

7992
/**
8093
* Filter by creation timestamp.
8194
*
8295
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
8396
*/
84-
public val createdAt: BookmarksFilterField = BookmarksFilterField("created_at")
97+
public val createdAt: BookmarksFilterField =
98+
BookmarksFilterField("created_at", BookmarkData::createdAt)
8599

86100
/**
87101
* Filter by last update timestamp.
88102
*
89103
* Supported operators: `equal`, `greater`, `greaterOrEqual`, `less`, `lessOrEqual`
90104
*/
91-
public val updatedAt: BookmarksFilterField = BookmarksFilterField("updated_at")
105+
public val updatedAt: BookmarksFilterField =
106+
BookmarksFilterField("updated_at", BookmarkData::updatedAt)
92107
}
93108
}
94109

0 commit comments

Comments
 (0)