11package dev.dimension.flare.data.database.cache.mapper
22
3+ import SnowflakeIdGenerator
34import app.bsky.actor.ProfileView
45import app.bsky.actor.ProfileViewBasic
56import app.bsky.actor.ProfileViewDetailed
7+ import app.bsky.bookmark.BookmarkView
8+ import app.bsky.bookmark.BookmarkViewItemUnion
69import app.bsky.feed.FeedViewPost
710import app.bsky.feed.FeedViewPostReasonUnion
811import app.bsky.feed.Like
912import app.bsky.feed.PostView
1013import app.bsky.feed.ReplyRefParentUnion
1114import app.bsky.feed.Repost
1215import app.bsky.notification.ListNotificationsNotification
13- import app.bsky.notification.ListNotificationsReason
16+ import app.bsky.notification.ListNotificationsNotificationReason
1417import chat.bsky.convo.ConvoView
1518import chat.bsky.convo.ConvoViewLastMessageUnion
1619import 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+
152174internal 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+
431489private fun ListNotificationsNotification.toDbStatusWithUser (accountKey : MicroBlogKey ): DbStatusWithUser {
432490 val user = this .author.toDbUser(accountKey.host)
433491 val status = this .toDbStatus(accountKey)
0 commit comments