Skip to content

Commit 0be3b0b

Browse files
authored
Merge pull request #1239 from DimensionDev/bugfix/bsky_build
fix bsky build
2 parents 693cd97 + 621581b commit 0be3b0b

File tree

5 files changed

+187
-66
lines changed

5 files changed

+187
-66
lines changed

shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Bluesky.kt

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package dev.dimension.flare.data.database.cache.mapper
22

3+
import SnowflakeIdGenerator
34
import app.bsky.actor.ProfileView
45
import app.bsky.actor.ProfileViewBasic
56
import app.bsky.actor.ProfileViewDetailed
7+
import app.bsky.bookmark.BookmarkView
8+
import app.bsky.bookmark.BookmarkViewItemUnion
69
import app.bsky.feed.FeedViewPost
710
import app.bsky.feed.FeedViewPostReasonUnion
811
import app.bsky.feed.Like
912
import app.bsky.feed.PostView
1013
import app.bsky.feed.ReplyRefParentUnion
1114
import app.bsky.feed.Repost
1215
import app.bsky.notification.ListNotificationsNotification
13-
import app.bsky.notification.ListNotificationsReason
16+
import app.bsky.notification.ListNotificationsNotificationReason
1417
import chat.bsky.convo.ConvoView
1518
import chat.bsky.convo.ConvoViewLastMessageUnion
1619
import chat.bsky.convo.MessageView
@@ -149,6 +152,25 @@ internal object Bluesky {
149152
}
150153
}
151154

155+
internal suspend fun List<BookmarkView>.toDb(
156+
accountKey: MicroBlogKey,
157+
pagingKey: String,
158+
sortIdProvider: suspend (BookmarkView) -> Long = {
159+
it.createdAt?.toStdlibInstant()?.toEpochMilliseconds() ?: SnowflakeIdGenerator.nextId()
160+
},
161+
): List<DbPagingTimelineWithStatus> =
162+
this.mapNotNull {
163+
it.toDbStatusWithUser(accountKey)?.let { status ->
164+
createDbPagingTimelineWithStatus(
165+
accountKey = accountKey,
166+
pagingKey = pagingKey,
167+
sortId = sortIdProvider(it),
168+
status = status,
169+
references = mapOf(),
170+
)
171+
}
172+
}
173+
152174
internal fun List<PostView>.toDb(
153175
accountKey: MicroBlogKey,
154176
pagingKey: String,
@@ -173,10 +195,10 @@ internal fun List<ListNotificationsNotification>.toDb(
173195
val grouped = this.groupBy { it.reason }.filter { it.value.any() }
174196
return grouped.flatMap { (reason, items) ->
175197
when (reason) {
176-
is ListNotificationsReason.Unknown,
177-
ListNotificationsReason.StarterpackJoined,
178-
ListNotificationsReason.Verified,
179-
ListNotificationsReason.Unverified,
198+
is ListNotificationsNotificationReason.Unknown,
199+
ListNotificationsNotificationReason.StarterpackJoined,
200+
ListNotificationsNotificationReason.Verified,
201+
ListNotificationsNotificationReason.Unverified,
180202
->
181203
items.map {
182204
createDbPagingTimelineWithStatus(
@@ -188,15 +210,15 @@ internal fun List<ListNotificationsNotification>.toDb(
188210
)
189211
}
190212

191-
ListNotificationsReason.Repost, ListNotificationsReason.Like -> {
213+
ListNotificationsNotificationReason.Repost, ListNotificationsNotificationReason.Like -> {
192214
val post =
193215
items
194216
.first()
195217
.record
196218
.let {
197219
when (reason) {
198-
ListNotificationsReason.Repost -> it.decodeAs<Repost>().subject
199-
ListNotificationsReason.Like -> it.decodeAs<Like>().subject
220+
ListNotificationsNotificationReason.Repost -> it.decodeAs<Repost>().subject
221+
ListNotificationsNotificationReason.Like -> it.decodeAs<Like>().subject
200222
else -> null
201223
}
202224
}?.uri
@@ -210,8 +232,8 @@ internal fun List<ListNotificationsNotification>.toDb(
210232
)
211233
val idSuffix =
212234
when (reason) {
213-
ListNotificationsReason.Repost -> "_repost"
214-
ListNotificationsReason.Like -> "_like"
235+
ListNotificationsNotificationReason.Repost -> "_repost"
236+
ListNotificationsNotificationReason.Like -> "_like"
215237
else -> ""
216238
}
217239
val data =
@@ -246,13 +268,18 @@ internal fun List<ListNotificationsNotification>.toDb(
246268
listOfNotNull(
247269
post,
248270
).associate {
249-
ReferenceType.Notification to listOfNotNull(it.toDbStatusWithUser(accountKey = accountKey))
271+
ReferenceType.Notification to
272+
listOfNotNull(
273+
it.toDbStatusWithUser(
274+
accountKey = accountKey,
275+
),
276+
)
250277
},
251278
),
252279
)
253280
}
254281

255-
ListNotificationsReason.Follow -> {
282+
ListNotificationsNotificationReason.Follow -> {
256283
val content = UserList(data = items, post = null)
257284
val data =
258285
DbStatusWithUser(
@@ -287,7 +314,10 @@ internal fun List<ListNotificationsNotification>.toDb(
287314
)
288315
}
289316

290-
ListNotificationsReason.Mention, ListNotificationsReason.Reply, ListNotificationsReason.Quote -> {
317+
ListNotificationsNotificationReason.Mention,
318+
ListNotificationsNotificationReason.Reply,
319+
ListNotificationsNotificationReason.Quote,
320+
-> {
291321
items.mapNotNull {
292322
val post = references[it.uri] ?: return@mapNotNull null
293323
val content = Post(post = post)
@@ -316,13 +346,18 @@ internal fun List<ListNotificationsNotification>.toDb(
316346
status = data,
317347
references =
318348
mapOf(
319-
ReferenceType.Notification to listOfNotNull(post.toDbStatusWithUser(accountKey)),
349+
ReferenceType.Notification to
350+
listOfNotNull(
351+
post.toDbStatusWithUser(
352+
accountKey,
353+
),
354+
),
320355
),
321356
)
322357
}
323358
}
324359

325-
ListNotificationsReason.LikeViaRepost ->
360+
ListNotificationsNotificationReason.LikeViaRepost ->
326361
items.mapNotNull {
327362
val post = references[it.uri] ?: return@mapNotNull null
328363
val content = Post(post = post)
@@ -351,12 +386,17 @@ internal fun List<ListNotificationsNotification>.toDb(
351386
status = data,
352387
references =
353388
mapOf(
354-
ReferenceType.Notification to listOfNotNull(post.toDbStatusWithUser(accountKey)),
389+
ReferenceType.Notification to
390+
listOfNotNull(
391+
post.toDbStatusWithUser(
392+
accountKey,
393+
),
394+
),
355395
),
356396
)
357397
}
358398

359-
ListNotificationsReason.RepostViaRepost ->
399+
ListNotificationsNotificationReason.RepostViaRepost ->
360400
items.mapNotNull {
361401
val post = references[it.uri] ?: return@mapNotNull null
362402
val content = Post(post = post)
@@ -385,12 +425,17 @@ internal fun List<ListNotificationsNotification>.toDb(
385425
status = data,
386426
references =
387427
mapOf(
388-
ReferenceType.Notification to listOfNotNull(post.toDbStatusWithUser(accountKey)),
428+
ReferenceType.Notification to
429+
listOfNotNull(
430+
post.toDbStatusWithUser(
431+
accountKey,
432+
),
433+
),
389434
),
390435
)
391436
}
392437

393-
ListNotificationsReason.SubscribedPost -> {
438+
ListNotificationsNotificationReason.SubscribedPost -> {
394439
items.mapNotNull {
395440
val post = references[it.uri] ?: return@mapNotNull null
396441
val content = Post(post = post)
@@ -419,7 +464,12 @@ internal fun List<ListNotificationsNotification>.toDb(
419464
status = data,
420465
references =
421466
mapOf(
422-
ReferenceType.Notification to listOfNotNull(post.toDbStatusWithUser(accountKey)),
467+
ReferenceType.Notification to
468+
listOfNotNull(
469+
post.toDbStatusWithUser(
470+
accountKey,
471+
),
472+
),
423473
),
424474
)
425475
}
@@ -428,6 +478,14 @@ internal fun List<ListNotificationsNotification>.toDb(
428478
}
429479
}
430480

481+
private fun BookmarkView.toDbStatusWithUser(accountKey: MicroBlogKey): DbStatusWithUser? =
482+
when (val content = item) {
483+
is BookmarkViewItemUnion.BlockedPost -> null
484+
is BookmarkViewItemUnion.NotFoundPost -> null
485+
is BookmarkViewItemUnion.PostView -> content.value.toDbStatusWithUser(accountKey)
486+
is BookmarkViewItemUnion.Unknown -> null
487+
}
488+
431489
private fun ListNotificationsNotification.toDbStatusWithUser(accountKey: MicroBlogKey): DbStatusWithUser {
432490
val user = this.author.toDbUser(accountKey.host)
433491
val status = this.toDbStatus(accountKey)

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDataSource.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import app.bsky.actor.GetProfileQueryParams
1212
import app.bsky.actor.PreferencesUnion
1313
import app.bsky.actor.PutPreferencesRequest
1414
import app.bsky.actor.SavedFeed
15-
import app.bsky.actor.Type
15+
import app.bsky.actor.SavedFeedType
1616
import app.bsky.embed.Images
1717
import app.bsky.embed.ImagesImage
1818
import app.bsky.embed.Record
@@ -1190,7 +1190,7 @@ internal class BlueskyDataSource(
11901190
?.value
11911191
?.items
11921192
?.filter {
1193-
it.type == Type.Feed
1193+
it.type == SavedFeedType.Feed
11941194
}.orEmpty()
11951195
service
11961196
.getFeedGenerators(
@@ -1325,7 +1325,7 @@ internal class BlueskyDataSource(
13251325
(
13261326
pref.value.items +
13271327
SavedFeed(
1328-
type = Type.Feed,
1328+
type = SavedFeedType.Feed,
13291329
value = feedInfo.view.uri.atUri,
13301330
pinned = true,
13311331
id = Uuid.random().toString(),
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dev.dimension.flare.data.datasource.bluesky
2+
3+
import androidx.paging.ExperimentalPagingApi
4+
import app.bsky.bookmark.GetBookmarksQueryParams
5+
import dev.dimension.flare.common.BaseTimelineRemoteMediator
6+
import dev.dimension.flare.data.database.cache.CacheDatabase
7+
import dev.dimension.flare.data.database.cache.mapper.toDb
8+
import dev.dimension.flare.data.network.bluesky.BlueskyService
9+
import dev.dimension.flare.model.MicroBlogKey
10+
11+
@OptIn(ExperimentalPagingApi::class)
12+
internal class BookmarkTimelineRemoteMediator(
13+
private val service: BlueskyService,
14+
database: CacheDatabase,
15+
private val accountKey: MicroBlogKey,
16+
) : BaseTimelineRemoteMediator(
17+
database = database,
18+
) {
19+
override val pagingKey: String = "bookmark_$accountKey"
20+
21+
override suspend fun timeline(
22+
pageSize: Int,
23+
request: Request,
24+
): Result {
25+
val response =
26+
when (request) {
27+
Request.Refresh -> {
28+
service
29+
.getBookmarks(
30+
GetBookmarksQueryParams(
31+
limit = pageSize.toLong(),
32+
),
33+
).requireResponse()
34+
}
35+
36+
is Request.Prepend -> {
37+
return Result(
38+
endOfPaginationReached = true,
39+
)
40+
}
41+
42+
is Request.Append -> {
43+
service
44+
.getBookmarks(
45+
GetBookmarksQueryParams(
46+
limit = pageSize.toLong(),
47+
cursor = request.nextKey,
48+
),
49+
).requireResponse()
50+
}
51+
}
52+
53+
return Result(
54+
endOfPaginationReached = response.bookmarks.isEmpty() || response.cursor == null,
55+
data =
56+
response.bookmarks.toDb(
57+
accountKey = accountKey,
58+
pagingKey = pagingKey,
59+
),
60+
nextKey = response.cursor,
61+
)
62+
}
63+
}

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/NotificationRemoteMediator.kt

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import androidx.paging.ExperimentalPagingApi
44
import app.bsky.feed.GetPostsQueryParams
55
import app.bsky.feed.Like
66
import app.bsky.feed.Repost
7+
import app.bsky.notification.ListNotificationsNotificationReason
78
import app.bsky.notification.ListNotificationsQueryParams
8-
import app.bsky.notification.ListNotificationsReason
99
import app.bsky.notification.UpdateSeenRequest
1010
import dev.dimension.flare.common.BaseTimelineRemoteMediator
1111
import dev.dimension.flare.data.database.cache.CacheDatabase
@@ -79,27 +79,27 @@ internal class NotificationRemoteMediator(
7979
response.notifications
8080
.mapNotNull {
8181
when (it.reason) {
82-
is ListNotificationsReason.Unknown -> null
83-
ListNotificationsReason.Like ->
82+
is ListNotificationsNotificationReason.Unknown -> null
83+
ListNotificationsNotificationReason.Like ->
8484
it.record
8585
.decodeAs<Like>()
8686
.subject.uri
8787

88-
ListNotificationsReason.Repost ->
88+
ListNotificationsNotificationReason.Repost ->
8989
it.record
9090
.decodeAs<Repost>()
9191
.subject.uri
9292

93-
ListNotificationsReason.Follow -> null
94-
ListNotificationsReason.Mention -> it.uri
95-
ListNotificationsReason.Reply -> it.uri
96-
ListNotificationsReason.Quote -> it.uri
97-
ListNotificationsReason.StarterpackJoined -> null
98-
ListNotificationsReason.Unverified -> null
99-
ListNotificationsReason.Verified -> null
100-
ListNotificationsReason.LikeViaRepost -> it.uri
101-
ListNotificationsReason.RepostViaRepost -> it.uri
102-
ListNotificationsReason.SubscribedPost -> it.uri
93+
ListNotificationsNotificationReason.Follow -> null
94+
ListNotificationsNotificationReason.Mention -> it.uri
95+
ListNotificationsNotificationReason.Reply -> it.uri
96+
ListNotificationsNotificationReason.Quote -> it.uri
97+
ListNotificationsNotificationReason.StarterpackJoined -> null
98+
ListNotificationsNotificationReason.Unverified -> null
99+
ListNotificationsNotificationReason.Verified -> null
100+
ListNotificationsNotificationReason.LikeViaRepost -> it.uri
101+
ListNotificationsNotificationReason.RepostViaRepost -> it.uri
102+
ListNotificationsNotificationReason.SubscribedPost -> it.uri
103103
}
104104
}.distinct()
105105
.toImmutableList()

0 commit comments

Comments
 (0)