From abadb0587da0fc88a208c4e7e6d92181b5bdfa22 Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Tue, 15 Aug 2023 18:39:46 +0200 Subject: [PATCH] feat(inbox): add mentions api --- .../core/api/dto/CommentSortType.kt | 17 +++++++++++++ .../raccoonforlemmy/core/api/dto/Constants.kt | 1 + .../core/api/dto/GetPersonMentionsResponse.kt | 10 ++++++++ .../core/api/dto/PersonMention.kt | 13 ++++++++++ .../core/api/dto/PersonMentionView.kt | 20 +++++++++++++++ .../core/api/service/CommentService.kt | 4 +-- .../core/api/service/UserService.kt | 14 +++++++++-- .../domain/lemmy/data/PersonMentionModel.kt | 6 +++++ .../lemmy/repository/CommentRepository.kt | 3 ++- .../domain/lemmy/repository/UserRepository.kt | 25 ++++++++++++++++--- .../domain/lemmy/repository/utils/Mappings.kt | 24 ++++++++++++++++++ 11 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/CommentSortType.kt create mode 100644 core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/GetPersonMentionsResponse.kt create mode 100644 core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMention.kt create mode 100644 core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMentionView.kt create mode 100644 domain-lemmy/data/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/data/PersonMentionModel.kt diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/CommentSortType.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/CommentSortType.kt new file mode 100644 index 000000000..46f716105 --- /dev/null +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/CommentSortType.kt @@ -0,0 +1,17 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.api.dto + +import kotlinx.serialization.SerialName + +enum class CommentSortType { + @SerialName("Hot") + Hot, + + @SerialName("Top") + Top, + + @SerialName("New") + New, + + @SerialName("Old") + Old, +} \ No newline at end of file diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/Constants.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/Constants.kt index 724364c6b..48a221d66 100644 --- a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/Constants.kt +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/Constants.kt @@ -10,3 +10,4 @@ typealias SiteId = Int typealias LocalSiteId = Int typealias LocalUserId = Int typealias CustomEmojiId = Int +typealias PersonMentionId = Int diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/GetPersonMentionsResponse.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/GetPersonMentionsResponse.kt new file mode 100644 index 000000000..311b662cd --- /dev/null +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/GetPersonMentionsResponse.kt @@ -0,0 +1,10 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.api.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetPersonMentionsResponse( + @SerialName("mentions") + val mentions: List, +) diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMention.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMention.kt new file mode 100644 index 000000000..c13ade797 --- /dev/null +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMention.kt @@ -0,0 +1,13 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.api.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PersonMention( + @SerialName("id") val id: PersonMentionId, + @SerialName("recipient_id") val recipientId: PersonId, + @SerialName("comment_id") val commentId: CommentId, + @SerialName("read") val read: Boolean, + @SerialName("published") val published: String, +) \ No newline at end of file diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMentionView.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMentionView.kt new file mode 100644 index 000000000..2e8381534 --- /dev/null +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/dto/PersonMentionView.kt @@ -0,0 +1,20 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.api.dto + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class PersonMentionView( + @SerialName("person_mention") val personMention: PersonMention, + @SerialName("comment") val comment: Comment, + @SerialName("creator") val creator: Person, + @SerialName("post") val post: Post, + @SerialName("community") val community: Community, + @SerialName("recipient") val recipient: Person, + @SerialName("counts") val counts: CommentAggregates, + @SerialName("creator_banned_from_community") val creatorBannedFromCommunity: Boolean, + @SerialName("subscribed") val subscribed: SubscribedType, + @SerialName("saved") val saved: Boolean, + @SerialName("creator_blocked") val creatorBlocked: Boolean, + @SerialName("my_vote") val myVote: Int? = null, +) \ No newline at end of file diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/CommentService.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/CommentService.kt index a18d46a41..02fac0adb 100644 --- a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/CommentService.kt +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/CommentService.kt @@ -1,6 +1,7 @@ package com.github.diegoberaldin.raccoonforlemmy.core.api.service import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommentResponse +import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommentSortType import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CreateCommentForm import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CreateCommentLikeForm import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.DeleteCommentForm @@ -8,7 +9,6 @@ import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.EditCommentForm import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.GetCommentsResponse import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.ListingType import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SaveCommentForm -import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SortType import de.jensklingenberg.ktorfit.Response import de.jensklingenberg.ktorfit.http.Body import de.jensklingenberg.ktorfit.http.GET @@ -22,7 +22,7 @@ interface CommentService { suspend fun getAll( @Query("auth") auth: String? = null, @Query("limit") limit: Int? = null, - @Query("sort") sort: SortType? = null, + @Query("sort") sort: CommentSortType? = null, @Query("post_id") postId: Int? = null, @Query("parent_id") parentId: Int? = null, @Query("page") page: Int? = null, diff --git a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/UserService.kt b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/UserService.kt index 9f57fb9df..b2c70922a 100644 --- a/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/UserService.kt +++ b/core-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/api/service/UserService.kt @@ -1,7 +1,8 @@ package com.github.diegoberaldin.raccoonforlemmy.core.api.service +import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommentSortType import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.GetPersonDetailsResponse -import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SortType +import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.GetPersonMentionsResponse import de.jensklingenberg.ktorfit.Response import de.jensklingenberg.ktorfit.http.GET import de.jensklingenberg.ktorfit.http.Query @@ -15,8 +16,17 @@ interface UserService { @Query("person_id") personId: Int? = null, @Query("page") page: Int? = null, @Query("limit") limit: Int? = null, - @Query("sort") sort: SortType = SortType.Active, + @Query("sort") sort: CommentSortType = CommentSortType.New, @Query("username") username: String? = null, @Query("saved_only") savedOnly: Boolean? = null, ): Response + + @GET("user/mention") + suspend fun getMentions( + @Query("auth") auth: String? = null, + @Query("page") page: Int? = null, + @Query("limit") limit: Int? = null, + @Query("sort") sort: CommentSortType = CommentSortType.New, + @Query("unread_only") unreadOnly: Boolean? = null, + ): Response } diff --git a/domain-lemmy/data/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/data/PersonMentionModel.kt b/domain-lemmy/data/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/data/PersonMentionModel.kt new file mode 100644 index 000000000..288a204e0 --- /dev/null +++ b/domain-lemmy/data/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/data/PersonMentionModel.kt @@ -0,0 +1,6 @@ +package com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data + +data class PersonMentionModel( + val post: PostModel, + val comment: CommentModel, +) diff --git a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/CommentRepository.kt b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/CommentRepository.kt index 76ba4ed40..1d916688f 100644 --- a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/CommentRepository.kt +++ b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/CommentRepository.kt @@ -6,6 +6,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.api.provider.ServiceProvide import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommentModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.ListingType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toCommentDto import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toDto import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toModel @@ -30,7 +31,7 @@ class CommentRepository( page = page, limit = limit, type = type.toDto(), - sort = sort.toDto(), + sort = sort.toCommentDto(), ) val dto = response.body()?.comments ?: emptyList() return dto.map { it.toModel() } diff --git a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/UserRepository.kt b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/UserRepository.kt index 4af7bcf0e..68d0c0961 100644 --- a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/UserRepository.kt +++ b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/UserRepository.kt @@ -2,10 +2,11 @@ package com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository import com.github.diegoberaldin.raccoonforlemmy.core.api.provider.ServiceProvider import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommentModel +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel -import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toDto +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toCommentDto import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toHost import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils.toModel @@ -46,7 +47,7 @@ class UserRepository( personId = id, page = page, limit = limit, - sort = sort.toDto(), + sort = sort.toCommentDto(), savedOnly = savedOnly, ) val dto = response.body() ?: return emptyList() @@ -65,9 +66,27 @@ class UserRepository( personId = id, page = page, limit = limit, - sort = sort.toDto(), + sort = sort.toCommentDto(), ) val dto = response.body() ?: return emptyList() return dto.comments.map { it.toModel() } } + + suspend fun getMentions( + auth: String? = null, + page: Int, + limit: Int = PostsRepository.DEFAULT_PAGE_SIZE, + sort: SortType = SortType.Active, + unreadOnly: Boolean = true, + ): List { + val response = serviceProvider.user.getMentions( + auth = auth, + limit = limit, + sort = sort.toCommentDto(), + page = page, + unreadOnly = unreadOnly, + ) + val dto = response.body() ?: return emptyList() + return dto.mentions.map { it.toModel() } + } } diff --git a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/utils/Mappings.kt b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/utils/Mappings.kt index 363cfc862..8203233a4 100644 --- a/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/utils/Mappings.kt +++ b/domain-lemmy/repository/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/lemmy/repository/utils/Mappings.kt @@ -1,5 +1,6 @@ package com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.utils +import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommentSortType import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommentView import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.Community import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.CommunityFollowerView @@ -8,6 +9,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.ListingType.Local import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.ListingType.Subscribed import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.Person import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.PersonAggregates +import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.PersonMentionView import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.PostView import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SortType.Active import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SortType.Hot @@ -26,6 +28,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.SortType.TopYear import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommentModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommunityModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.ListingType +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PersonMentionModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel @@ -54,6 +57,14 @@ internal fun SortType.toDto() = when (this) { else -> Active } +internal fun SortType.toCommentDto(): CommentSortType = when (this) { + SortType.Hot -> CommentSortType.Hot + SortType.New -> CommentSortType.New + SortType.Top.Generic -> CommentSortType.Top + SortType.Old -> CommentSortType.Old + else -> CommentSortType.New +} + internal fun Person.toModel() = UserModel( id = id, name = name, @@ -110,6 +121,19 @@ internal fun CommunityFollowerView.toModel() = CommunityModel( host = community.actorId.toHost(), ) +internal fun PersonMentionView.toModel() = PersonMentionModel( + post = PostModel( + id = post.id, + title = post.name, + text = post.body.orEmpty(), + ), + comment = CommentModel( + id = comment.id, + text = comment.content, + community = community.toModel(), + ), +) + internal fun String.toHost(): String = this.replace("https://", "").let { val index = it.indexOf("/") if (index < 0) {