diff --git a/packages/app/server/routes/publish.post.ts b/packages/app/server/routes/publish.post.ts index 0c5022ac..746cf9ef 100644 --- a/packages/app/server/routes/publish.post.ts +++ b/packages/app/server/routes/publish.post.ts @@ -36,7 +36,9 @@ export default eventHandler(async (event) => { } const runId = Number(runIdHeader); const workflowsBucket = useWorkflowsBucket(event); + const debugBucket = useDebugBucket(event); const workflowData = await workflowsBucket.getItem(key); + const webhookDebugData = await debugBucket.getItem(key); if (!workflowData) { throw createError({ @@ -323,6 +325,7 @@ export default eventHandler(async (event) => { workflowData, key, runId, + webhookDebug: webhookDebugData, }, }; }); diff --git a/packages/app/server/routes/webhook.post.ts b/packages/app/server/routes/webhook.post.ts index 05425acb..2e2504bc 100644 --- a/packages/app/server/routes/webhook.post.ts +++ b/packages/app/server/routes/webhook.post.ts @@ -1,6 +1,6 @@ import type { PullRequestEvent } from "@octokit/webhooks-types"; import type { HandlerFunction } from "@octokit/webhooks/dist-types/types"; -import type { PullRequestData, WorkflowData } from "../types"; +import type { PullRequestData, WorkflowData, WebhookDebugData } from "../types"; import { hash } from "ohash"; // mark a PR as a PR :) @@ -16,6 +16,7 @@ export default eventHandler(async (event) => { const { test } = useRuntimeConfig(event); const workflowsBucket = useWorkflowsBucket(event); const pullRequestNumbersBucket = usePullRequestNumbersBucket(event); + const debugBucket = useDebugBucket(event); const workflowHandler: HandlerFunction<"workflow_run", unknown> = async ({ payload, @@ -51,9 +52,8 @@ export default eventHandler(async (event) => { await pullRequestNumbersBucket.hasItem(oldPrDataHash); const isPullRequest = isNewPullRequest || isOldPullRequest; - const prNumber = await pullRequestNumbersBucket.getItem( - isNewPullRequest ? prKey : oldPrDataHash, - ); + const lookupKey = isNewPullRequest ? prKey : oldPrDataHash; + const prNumber = await pullRequestNumbersBucket.getItem(lookupKey); const data: WorkflowData = { owner, @@ -64,6 +64,27 @@ export default eventHandler(async (event) => { // Publishing is only available throughout the lifetime of a workflow_job await workflowsBucket.setItem(hashKey, data); + + const debugData: WebhookDebugData = { + action: payload.action, + head_branch: payload.workflow_run.head_branch, + head_repository_full_name: + payload.workflow_run.head_repository?.full_name || null, + full_name: payload.repository.full_name, + + isPullRequest, + prNumber, + prNumberType: typeof prNumber, + isNewPullRequest, + isOldPullRequest, + + prKey, + oldPrDataHash, + lookupKey, + data, + }; + + await debugBucket.setItem(hashKey, debugData); } }; diff --git a/packages/app/server/types.ts b/packages/app/server/types.ts index 5265709a..b99e35f7 100644 --- a/packages/app/server/types.ts +++ b/packages/app/server/types.ts @@ -14,3 +14,22 @@ export interface Cursor { timestamp: number; sha: string; } + +export interface WebhookDebugData { + webhookAction: string; + originalHeadBranch: string | null; + originalHeadRepository: string | null; + originalRepositoryFullName: string | null; + + isPullRequest: boolean; + prNumber: number | null; + prNumberType: string; + isNewPullRequest: boolean; + isOldPullRequest: boolean; + + prKey: string; + oldPrDataHash: string; + lookupKey: string; + + finalWorkflowData: WorkflowData; +} diff --git a/packages/app/server/utils/bucket.ts b/packages/app/server/utils/bucket.ts index 76160d8b..1dd5c1b5 100644 --- a/packages/app/server/utils/bucket.ts +++ b/packages/app/server/utils/bucket.ts @@ -1,5 +1,5 @@ import type { H3EventContext } from "h3"; -import type { Cursor, WorkflowData } from "../types"; +import type { Cursor, WorkflowData, WebhookDebugData } from "../types"; import { createStorage, joinKeys, prefixStorage } from "unstorage"; import cloudflareR2BindingDriver from "unstorage/drivers/cloudflare-r2-binding"; import { getR2Binding } from "unstorage/drivers/utils/cloudflare"; @@ -112,3 +112,11 @@ usePullRequestNumbersBucket.base = joinKeys( useBucket.base, usePullRequestNumbersBucket.key, ); + +export function useDebugBucket(event: Event) { + const storage = useBucket(event); + return prefixStorage(storage, useDebugBucket.key); +} + +useDebugBucket.key = "debug"; +useDebugBucket.base = joinKeys(useBucket.base, useDebugBucket.key);