Skip to content

Commit 89b7218

Browse files
Adds mapper from shared pr model to local
1 parent a0eb753 commit 89b7218

File tree

2 files changed

+147
-11
lines changed

2 files changed

+147
-11
lines changed

src/git/models/pullRequest.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ export interface PullRequestRefs {
5757

5858
export interface PullRequestMember {
5959
name: string;
60-
avatarUrl: string;
61-
url: string;
60+
avatarUrl?: string;
61+
url?: string;
6262
}
6363

6464
export interface PullRequestReviewer {
@@ -150,8 +150,8 @@ export class PullRequest implements PullRequestShape {
150150
public readonly provider: ProviderReference,
151151
public readonly author: {
152152
readonly name: string;
153-
readonly avatarUrl: string;
154-
readonly url: string;
153+
readonly avatarUrl?: string;
154+
readonly url?: string;
155155
},
156156
public readonly id: string,
157157
public readonly nodeId: string | undefined,

src/plus/integrations/providers/models.ts

Lines changed: 143 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ import type { Account as UserAccount } from '../../../git/models/author';
3030
import type { IssueMember, SearchedIssue } from '../../../git/models/issue';
3131
import { RepositoryAccessLevel } from '../../../git/models/issue';
3232
import type {
33-
PullRequest,
3433
PullRequestMember,
3534
PullRequestRefs,
3635
PullRequestReviewer,
36+
PullRequestState,
3737
} from '../../../git/models/pullRequest';
3838
import {
39+
PullRequest,
3940
PullRequestMergeableState,
4041
PullRequestReviewDecision,
4142
PullRequestReviewState,
@@ -44,6 +45,7 @@ import {
4445
import type { ProviderReference } from '../../../git/models/remoteProvider';
4546
import type { RepositoryIdentityDescriptor } from '../../../gk/models/repositoryIdentities';
4647
import type { EnrichableItem } from '../../focus/enrichmentService';
48+
import type { Integration } from '../integration';
4749
import { getEntityIdentifierInput } from './utils';
4850

4951
export type ProviderAccount = Account;
@@ -560,6 +562,20 @@ export const toProviderBuildStatusState = {
560562
[PullRequestStatusCheckRollupState.Pending]: GitBuildStatusState.Pending,
561563
};
562564

565+
export const fromProviderBuildStatusState = {
566+
[GitBuildStatusState.Success]: PullRequestStatusCheckRollupState.Success,
567+
[GitBuildStatusState.Failed]: PullRequestStatusCheckRollupState.Failed,
568+
[GitBuildStatusState.Pending]: PullRequestStatusCheckRollupState.Pending,
569+
[GitBuildStatusState.ActionRequired]: PullRequestStatusCheckRollupState.Failed,
570+
// TODO: The rest of these are defaulted because we don't have a matching state for them
571+
[GitBuildStatusState.Error]: undefined,
572+
[GitBuildStatusState.Cancelled]: undefined,
573+
[GitBuildStatusState.OptionalActionRequired]: undefined,
574+
[GitBuildStatusState.Skipped]: undefined,
575+
[GitBuildStatusState.Running]: undefined,
576+
[GitBuildStatusState.Warning]: undefined,
577+
};
578+
563579
export const toProviderPullRequestReviewState = {
564580
[PullRequestReviewState.Approved]: GitPullRequestReviewState.Approved,
565581
[PullRequestReviewState.ChangesRequested]: GitPullRequestReviewState.ChangesRequested,
@@ -569,12 +585,29 @@ export const toProviderPullRequestReviewState = {
569585
[PullRequestReviewState.Pending]: null,
570586
};
571587

588+
export const fromProviderPullRequestReviewState = {
589+
[GitPullRequestReviewState.Approved]: PullRequestReviewState.Approved,
590+
[GitPullRequestReviewState.ChangesRequested]: PullRequestReviewState.ChangesRequested,
591+
[GitPullRequestReviewState.Commented]: PullRequestReviewState.Commented,
592+
[GitPullRequestReviewState.ReviewRequested]: PullRequestReviewState.ReviewRequested,
593+
};
594+
572595
export const toProviderPullRequestMergeableState = {
573596
[PullRequestMergeableState.Mergeable]: GitPullRequestMergeableState.Mergeable,
574597
[PullRequestMergeableState.Conflicting]: GitPullRequestMergeableState.Conflicts,
575598
[PullRequestMergeableState.Unknown]: GitPullRequestMergeableState.Unknown,
576599
};
577600

601+
export const fromProviderPullRequestMergeableState = {
602+
[GitPullRequestMergeableState.Mergeable]: PullRequestMergeableState.Mergeable,
603+
[GitPullRequestMergeableState.Conflicts]: PullRequestMergeableState.Conflicting,
604+
[GitPullRequestMergeableState.Unknown]: PullRequestMergeableState.Unknown,
605+
[GitPullRequestMergeableState.Behind]: PullRequestMergeableState.Unknown,
606+
[GitPullRequestMergeableState.Blocked]: PullRequestMergeableState.Unknown,
607+
[GitPullRequestMergeableState.UnknownAndBlocked]: PullRequestMergeableState.Unknown,
608+
[GitPullRequestMergeableState.Unstable]: PullRequestMergeableState.Unknown,
609+
};
610+
578611
export function toProviderReviews(reviewers: PullRequestReviewer[]): ProviderPullRequest['reviews'] {
579612
return reviewers
580613
.filter(r => r.state !== PullRequestReviewState.Dismissed && r.state !== PullRequestReviewState.Pending)
@@ -584,6 +617,30 @@ export function toProviderReviews(reviewers: PullRequestReviewer[]): ProviderPul
584617
}));
585618
}
586619

620+
export function toReviewRequests(reviews: ProviderPullRequest['reviews']): PullRequestReviewer[] | undefined {
621+
return reviews == null
622+
? undefined
623+
: reviews
624+
?.filter(r => r.state === GitPullRequestReviewState.ReviewRequested)
625+
.map(r => ({
626+
isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
627+
reviewer: fromProviderAccount(r.reviewer),
628+
state: PullRequestReviewState.ReviewRequested,
629+
}));
630+
}
631+
632+
export function toCompletedReviews(reviews: ProviderPullRequest['reviews']): PullRequestReviewer[] | undefined {
633+
return reviews == null
634+
? undefined
635+
: reviews
636+
?.filter(r => r.state !== GitPullRequestReviewState.ReviewRequested)
637+
.map(r => ({
638+
isCodeOwner: false, // TODO: Find this value, and implement in the shared lib if needed
639+
reviewer: fromProviderAccount(r.reviewer),
640+
state: fromProviderPullRequestReviewState[r.state],
641+
}));
642+
}
643+
587644
export function toProviderReviewDecision(
588645
reviewDecision?: PullRequestReviewDecision,
589646
reviewers?: PullRequestReviewer[],
@@ -606,6 +663,25 @@ export function toProviderReviewDecision(
606663
}
607664
}
608665

666+
export const fromPullRequestReviewDecision = {
667+
[GitPullRequestReviewState.Approved]: PullRequestReviewDecision.Approved,
668+
[GitPullRequestReviewState.ChangesRequested]: PullRequestReviewDecision.ChangesRequested,
669+
[GitPullRequestReviewState.Commented]: undefined,
670+
[GitPullRequestReviewState.ReviewRequested]: PullRequestReviewDecision.ReviewRequired,
671+
};
672+
673+
export function toProviderPullRequestState(state: PullRequestState): GitPullRequestState {
674+
return state === 'opened'
675+
? GitPullRequestState.Open
676+
: state === 'closed'
677+
? GitPullRequestState.Closed
678+
: GitPullRequestState.Merged;
679+
}
680+
681+
export function fromProviderPullRequestState(state: GitPullRequestState): PullRequestState {
682+
return state === GitPullRequestState.Open ? 'opened' : state === GitPullRequestState.Closed ? 'closed' : 'merged';
683+
}
684+
609685
export function toProviderPullRequest(pr: PullRequest): ProviderPullRequest {
610686
const prReviews = [...(pr.reviewRequests ?? []), ...(pr.latestReviews ?? [])];
611687
return {
@@ -614,12 +690,7 @@ export function toProviderPullRequest(pr: PullRequest): ProviderPullRequest {
614690
number: Number.parseInt(pr.id, 10),
615691
title: pr.title,
616692
url: pr.url,
617-
state:
618-
pr.state === 'opened'
619-
? GitPullRequestState.Open
620-
: pr.state === 'closed'
621-
? GitPullRequestState.Closed
622-
: GitPullRequestState.Merged,
693+
state: toProviderPullRequestState(pr.state),
623694
isDraft: pr.isDraft ?? false,
624695
createdDate: pr.createdDate,
625696
updatedDate: pr.updatedDate,
@@ -710,6 +781,63 @@ export function toProviderPullRequest(pr: PullRequest): ProviderPullRequest {
710781
};
711782
}
712783

784+
export function fromProviderPullRequest(pr: ProviderPullRequest, integration: Integration): PullRequest {
785+
return new PullRequest(
786+
integration,
787+
fromProviderAccount(pr.author),
788+
pr.id,
789+
pr.graphQLId,
790+
pr.title,
791+
pr.url ?? '',
792+
{
793+
owner: pr.repository.owner.login,
794+
repo: pr.repository.name,
795+
},
796+
fromProviderPullRequestState(pr.state),
797+
pr.createdDate,
798+
pr.updatedDate,
799+
pr.closedDate ?? undefined,
800+
pr.mergedDate ?? undefined,
801+
pr.mergeableState ? fromProviderPullRequestMergeableState[pr.mergeableState] : undefined,
802+
pr.permissions?.canMerge || pr.permissions?.canMergeAndBypassProtections ? true : undefined,
803+
{
804+
base: {
805+
branch: pr.baseRef?.name ?? '',
806+
sha: pr.baseRef?.oid ?? '',
807+
repo: pr.repository.name,
808+
owner: pr.repository.owner.login,
809+
exists: pr.baseRef != null,
810+
url: pr.repository.remoteInfo?.cloneUrlHTTPS
811+
? pr.repository.remoteInfo.cloneUrlHTTPS.replace(/\.git$/, '')
812+
: '',
813+
},
814+
head: {
815+
branch: pr.headRef?.name ?? '',
816+
sha: pr.headRef?.oid ?? '',
817+
repo: pr.headRepository?.name ?? '',
818+
owner: pr.headRepository?.owner.login ?? '',
819+
exists: pr.headRef != null,
820+
url: pr.headRepository?.remoteInfo?.cloneUrlHTTPS
821+
? pr.headRepository.remoteInfo.cloneUrlHTTPS.replace(/\.git$/, '')
822+
: '',
823+
},
824+
isCrossRepository: pr.headRepository?.id !== pr.repository.id,
825+
},
826+
pr.isDraft,
827+
pr.additions ?? undefined,
828+
pr.deletions ?? undefined,
829+
pr.commentCount ?? undefined,
830+
pr.upvoteCount ?? undefined,
831+
pr.reviewDecision ? fromPullRequestReviewDecision[pr.reviewDecision] : undefined,
832+
toReviewRequests(pr.reviews),
833+
toCompletedReviews(pr.reviews),
834+
pr.assignees?.map(fromProviderAccount) ?? undefined,
835+
pr.headCommit?.buildStatuses?.[0]?.state
836+
? fromProviderBuildStatusState[pr.headCommit.buildStatuses[0].state]
837+
: undefined,
838+
);
839+
}
840+
713841
export function toProviderPullRequestWithUniqueId(pr: PullRequest): PullRequestWithUniqueID {
714842
return {
715843
...toProviderPullRequest(pr),
@@ -729,6 +857,14 @@ export function toProviderAccount(account: PullRequestMember | IssueMember): Pro
729857
};
730858
}
731859

860+
export function fromProviderAccount(account: ProviderAccount | null): PullRequestMember | IssueMember {
861+
return {
862+
name: account?.name ?? 'unknown',
863+
avatarUrl: account?.avatarUrl ?? undefined,
864+
url: account?.url ?? '',
865+
};
866+
}
867+
732868
export type ProviderActionablePullRequest = ActionablePullRequest;
733869

734870
export type EnrichablePullRequest = ProviderPullRequest & {

0 commit comments

Comments
 (0)