import { env } from "cloudflare:workers";
import { batch, first, stmt } from "../db";
import { randomId } from "../crypto";
import type { CompiledJob, CompileInput } from "./compile";
import type { Trigger } from "./triggers";
import type { RepoRow } from "~/lib/types";
export async function allocateRunNumber(repoId: string): Promise<number> {
const row = await first<{ run_number: number }>(
"UPDATE repos SET next_run_number = next_run_number + 1 WHERE id = ? RETURNING next_run_number - 1 AS run_number",
repoId,
);
if (!row) throw new Error("Repository disappeared while scheduling workflows");
return row.run_number;
}
export type RunInsert = {
repo: RepoRow;
trigger: Trigger;
path: string;
workflowName: string;
runId: string;
runNumber: number;
jobs: CompiledJob[];
error: string | null;
approvalRequired: boolean;
source: string | null;
context: CompileInput | null;
rerunOf: string | null;
};
/** Returns the generated job ids keyed by job key. */
export async function insertRun(input: RunInsert): Promise<Map<string, string>> {
const now = Date.now();
const { repo, trigger } = input;
const statements = [
stmt(
`INSERT INTO workflow_runs (id, repo_id, source_repo_id, run_number, workflow_path, workflow_name, event, ref, sha,
title, actor_id, pr_number, approval_required, status, conclusion, created_at, completed_at,
workflow_source, context, trigger_depth, rerun_of, untrusted)