diff --git a/src/handlers/pr-rework.ts b/src/handlers/pr-rework.ts index fb71144..505216e 100644 --- a/src/handlers/pr-rework.ts +++ b/src/handlers/pr-rework.ts @@ -16,14 +16,33 @@ export function prRework(config: Config, queue: TaskQueue) { return c.text("ignored: not a reviewed event", 200); } - if (!event.review?.state) { - console.log(`[pr-rework] ignored: no review state (review: ${JSON.stringify(event.review)})`); + if (!event.review) { + console.log(`[pr-rework] ignored: no review object`); return c.text("ignored: no review data", 200); } const [org, repo] = event.repository.full_name.split("/"); const prNumber = event.pull_request.number; - const reviewState = event.review.state.toLowerCase(); + + // Gitea webhook payloads use "state" in the API but "type" in webhooks + // state: "REQUEST_CHANGES" | "APPROVED" | "COMMENT" + // type: "pull_request_review_rejected" | "pull_request_review_approved" | ... + let reviewState: string; + if (event.review.state) { + reviewState = event.review.state.toLowerCase(); + } else if (event.review.type) { + const typeMap: Record = { + pull_request_review_rejected: "request_changes", + pull_request_review_approved: "approved", + pull_request_review_comment: "comment", + }; + reviewState = typeMap[event.review.type] || event.review.type; + } else { + console.log(`[pr-rework] ignored: no review state or type (review: ${JSON.stringify(event.review)})`); + return c.text("ignored: no review state", 200); + } + + console.log(`[pr-rework] PR #${prNumber} review: ${reviewState}`); let taskType: string | null = null; let giteaToken: string; diff --git a/src/types.ts b/src/types.ts index 38a7110..9510d51 100644 --- a/src/types.ts +++ b/src/types.ts @@ -46,7 +46,8 @@ export interface GiteaPullRequest { export interface GiteaReview { id: number; body: string; - state: string; // "approved", "request_changes", "comment" + state?: string; // "approved", "request_changes", "comment" (API response) + type?: string; // "pull_request_review_rejected" | "pull_request_review_approved" (webhook payload) user: GiteaUser; }