diff --git a/app/src/main/java/com/fastaccess/github/usecase/issuesprs/GetPullRequestTimelineUseCase.kt b/app/src/main/java/com/fastaccess/github/usecase/issuesprs/GetPullRequestTimelineUseCase.kt index 0cbc94af..34e9083b 100644 --- a/app/src/main/java/com/fastaccess/github/usecase/issuesprs/GetPullRequestTimelineUseCase.kt +++ b/app/src/main/java/com/fastaccess/github/usecase/issuesprs/GetPullRequestTimelineUseCase.kt @@ -48,12 +48,9 @@ class GetPullRequestTimelineUseCase @Inject constructor( timeline.pageInfo.isHasNextPage, timeline.pageInfo.isHasPreviousPage ) /** - * [ISSUE_COMMENT, CLOSED_EVENT, REOPENED_EVENT, REFERENCED_EVENT, ASSIGNED_EVENT, - UNASSIGNED_EVENT, LABELED_EVENT, UNLABELED_EVENT, MILESTONED_EVENT, DEMILESTONED_EVENT, RENAMED_TITLE_EVENT, - LOCKED_EVENT, UNLOCKED_EVENT, TRANSFERRED_EVENT, PULL_REQUEST_COMMIT, PULL_REQUEST_COMMIT_COMMENT_THREAD, - PULL_REQUEST_REVIEW, PULL_REQUEST_REVIEW_THREAD, HEAD_REF_DELETED_EVENT, HEAD_REF_FORCE_PUSHED_EVENT, - MERGED_EVENT, MERGED_EVENT, REVIEW_DISMISSED_EVENT, REVIEW_REQUESTED_EVENT, - REVIEW_REQUEST_REMOVED_EVENT, READY_FOR_REVIEW_EVENT] + * + PULL_REQUEST_COMMIT, PULL_REQUEST_COMMIT_COMMENT_THREAD, + PULL_REQUEST_REVIEW, PULL_REQUEST_REVIEW_THREAD,] */ timeline.nodes?.forEach { node -> when (node) { @@ -91,13 +88,86 @@ class GetPullRequestTimelineUseCase @Inject constructor( is AsHeadRefDeletedEvent -> list.add(getHeadRefDeleted(node)) is AsReviewRequestedEvent -> list.add(getRequestForReview(node)) is AsReviewDismissedEvent -> list.add(getDismissedReview(node)) + is AsReviewRequestRemovedEvent -> list.add(getReviewRemoved(node)) + is AsPullRequestReview -> list.add(getPullRequestReview(node)) + is AsPullRequestCommit -> list.add(getPullRequestCommit(node)) } } return@map Pair(pageInfo, list) } } - private fun getDismissedReview(node: AsReviewDismissedEvent): TimelineModel = TimelineModel( + private fun getPullRequestReview(node: AsPullRequestReview) = TimelineModel( + review = ReviewModel( + node.id, + node.databaseId, + ShortUserModel(node.author?.login, node.author?.login, node.author?.url?.toString(), avatarUrl = node.author?.avatarUrl?.toString()), + node.body, + node.authorAssociation.rawValue(), + node.state.rawValue(), + node.createdAt, + node.comments.nodes?.map { + ReviewComment( + ShortUserModel( + it.author?.login, + it.author?.login, + it.author?.url?.toString(), + avatarUrl = it.author?.avatarUrl.toString() + ), + ShortUserModel( + it.replyTo?.author?.login, + it.replyTo?.author?.login, + it.replyTo?.author?.url?.toString(), + avatarUrl = it.replyTo?.author?.avatarUrl.toString() + ), + it.body, + it.path, + it.originalPosition, + it.isOutdated + ) + }?.firstOrNull() + ) + ) + + private fun getPullRequestCommit(node: AsPullRequestCommit) = TimelineModel( + pullRequestCommit = PullRequestCommitModel( + node.id, + node.url.toString(), + CommitModel( + node.prCommit.oid.toString(), + ShortUserModel( + node.prCommit.author?.name, + node.prCommit.author?.name, + node.prCommit.author?.user?.url.toString(), + avatarUrl = node.prCommit.author?.avatarUrl?.toString() ?: node.prCommit.author?.user?.avatarUrl?.toString() + ), + node.prCommit.message, + node.prCommit.abbreviatedOid, + node.prCommit.commitUrl.toString(), + node.prCommit.authoredDate, + node.prCommit.isCommittedViaWeb, + node.prCommit.status?.state?.rawValue() + ) + ) + ) + + private fun getReviewRemoved(node: AsReviewRequestRemovedEvent) = TimelineModel( + reviewRequestRemoved = ReviewRequestRemovedModel( + node.actor?.fragments?.shortActor?.toUser(), + when (val m = node.requestedReviewer) { + is AsUser1 -> ShortUserModel(m.login, m.login, m.url.toString(), avatarUrl = m.userAvatar.toString()) + is AsTeam1 -> ShortUserModel(m.name, m.name, m.url.toString(), avatarUrl = m.teamAvatar.toString()) + is AsMannequin1 -> ShortUserModel(m.login, m.login, m.url.toString(), avatarUrl = m.monnequinAvatar.toString()) + else -> null + }, + node.createdAt, + node.requestedReviewer is AsUser1, + node.requestedReviewer is AsTeam1, + node.requestedReviewer is AsMannequin1 + ) + ) + + private fun getDismissedReview(node: AsReviewDismissedEvent) = TimelineModel( reviewDismissed = ReviewDismissedModel( node.actor?.fragments?.shortActor?.toUser(), node.createdAt, diff --git a/data/src/main/graphql/github/issues_prs.graphql b/data/src/main/graphql/github/issues_prs.graphql index a10e10e7..7fcd1f49 100644 --- a/data/src/main/graphql/github/issues_prs.graphql +++ b/data/src/main/graphql/github/issues_prs.graphql @@ -231,6 +231,22 @@ query getPullRequestTimeline($login: String!, $repo: String!, $number: Int!, $pa prCommit: commit { oid abbreviatedOid + committedViaWeb + authoredDate + message + commitUrl + status { + state + } + author { + avatarUrl + name + user { + login + avatarUrl + url + } + } } } ... on PullRequestCommitCommentThread { @@ -378,6 +394,24 @@ query getPullRequestTimeline($login: String!, $repo: String!, $number: Int!, $pa } ... on ReviewRequestRemovedEvent { actor { ... ShortActor } + createdAt + requestedReviewer { + ... on User { + userAvatar: avatarUrl + login + url + } + ... on Team { + teamAvatar: avatarUrl + name + url + } + ... on Mannequin { + monnequinAvatar: avatarUrl + login + url + } + } } ... on PullRequestReview { id diff --git a/data/src/main/java/com/fastaccess/data/model/TimelineModel.kt b/data/src/main/java/com/fastaccess/data/model/TimelineModel.kt index 546d041e..63ea0a6e 100644 --- a/data/src/main/java/com/fastaccess/data/model/TimelineModel.kt +++ b/data/src/main/java/com/fastaccess/data/model/TimelineModel.kt @@ -30,7 +30,10 @@ data class TimelineModel( @SerializedName("headRefRestored") var headRefRestored: HeadRefRestoredModel? = null, @SerializedName("headRefDeleted") var headRefDeleted: HeadRefDeletedModel? = null, @SerializedName("reviewRequested") var reviewRequested: ReviewRequestedModel? = null, - @SerializedName("reviewDismissed") var reviewDismissed: ReviewDismissedModel? = null + @SerializedName("reviewDismissed") var reviewDismissed: ReviewDismissedModel? = null, + @SerializedName("reviewRequestRemoved") var reviewRequestRemoved: ReviewRequestRemovedModel? = null, + @SerializedName("pullRequestCommit") var pullRequestCommit: PullRequestCommitModel? = null, + @SerializedName("review") var review: ReviewModel? = null ) data class CommitModel( @@ -40,7 +43,8 @@ data class CommitModel( @SerializedName("abbreviatedOid") var abbreviatedOid: String? = null, @SerializedName("commitUrl") var commitUrl: String? = null, @SerializedName("authoredDate") var authoredDate: Date? = null, - @SerializedName("committedViaWeb") var committedViaWeb: Boolean? = null + @SerializedName("committedViaWeb") var committedViaWeb: Boolean? = null, + @SerializedName("state") var state: String? = null ) data class CommentModel( @@ -178,9 +182,45 @@ data class ReviewDismissedModel( @SerializedName("createdAt") var createdAt: Date? = null, @SerializedName("dismissalMessage") var dismissalMessage: String? = null, @SerializedName("previousReviewState") var previousReviewState: String? = null, - @SerializedName("url") var url: String + @SerializedName("url") var url: String? = null ) +data class ReviewRequestRemovedModel( + @SerializedName("actor") var actor: ShortUserModel? = null, + @SerializedName("reviewer") var reviewer: ShortUserModel? = null, + @SerializedName("createdAt") var createdAt: Date? = null, + @SerializedName("isUser") var isUser: Boolean = true, + @SerializedName("isTeam") var isTeam: Boolean = false, + @SerializedName("isMannequin") var isMannequin: Boolean = false +) + +data class PullRequestCommitModel( + @SerializedName("id") var id: String? = null, + @SerializedName("url") var url: String? = null, + @SerializedName("commit") var commit: CommitModel? = null +) + +data class ReviewModel( + @SerializedName("id") var id: String? = null, + @SerializedName("databaseId") var databaseId: Int? = null, + @SerializedName("author") var author: ShortUserModel? = null, + @SerializedName("body") var body: String? = null, + @SerializedName("authorAssociation") var authorAssociation: String? = null, + @SerializedName("state") var state: String? = null, + @SerializedName("createdAt") var createdAt: Date? = null, + @SerializedName("comment") var comment: ReviewComment? = null +) + +data class ReviewComment( + @SerializedName("author") var author: ShortUserModel? = null, + @SerializedName("replyTo") var replyTo: ShortUserModel? = null, + @SerializedName("body") var body: String? = null, + @SerializedName("path") var path: String? = null, + @SerializedName("originalPosition") var originalPosition: Int? = null, + @SerializedName("outdated") var outdated: Boolean? = null +) + + enum class CommentAuthorAssociation(val value: String) { MEMBER("MEMBER"), OWNER("OWNER"), @@ -204,6 +244,6 @@ enum class CommentCannotUpdateReason(val value: kotlin.String) { DENIED("LOGIN_REQUIRED"); companion object { - fun fromName(name: String): CommentCannotUpdateReason? = CommentCannotUpdateReason.values().firstOrNull { it.value == name } + fun fromName(name: String): CommentCannotUpdateReason? = values().firstOrNull { it.value == name } } } \ No newline at end of file