pr-monitor/server/reviewState.ts
2026-07-28 14:21:25 +00:00

34 lines
1.2 KiB
TypeScript

import type { ReviewState, ReviewerVerdict } from '../shared/types.js';
import type { ListPr } from './github/queries.js';
export function deriveReviewState(pr: ListPr): {
reviewState: ReviewState;
unresolvedThreads: number;
totalThreads: number;
} {
const totalThreads = pr.reviewThreads.totalCount;
const unresolvedThreads = pr.reviewThreads.nodes.filter((t) => !t.isResolved).length;
let reviewState: ReviewState;
if (pr.reviews.totalCount === 0 && totalThreads === 0) reviewState = 'no_review';
else if (unresolvedThreads > 0) reviewState = 'outstanding';
else reviewState = 'addressed';
return { reviewState, unresolvedThreads, totalThreads };
}
export function deriveVerdicts(pr: ListPr): ReviewerVerdict[] {
const author = pr.author?.login;
return pr.latestReviews.nodes
.filter(
(r): r is typeof r & { state: 'APPROVED' | 'CHANGES_REQUESTED' } =>
(r.state === 'APPROVED' || r.state === 'CHANGES_REQUESTED') &&
r.author?.login !== undefined &&
r.author.login !== author,
)
.map((r) => ({
reviewer: r.author!.login,
state: r.state,
url: r.url,
submittedAt: r.submittedAt,
}));
}