import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { placeholders } from "~/server/db";
import { repoDb } from "~/server/scoped-db";
import { requireRepoAccess } from "~/server/repos";
import { rerunTrigger } from "~/server/ci/rerun";
import { publicUrl } from "~/server/events/emit";
import { pendingDeployments, visibleOutputs } from "~/server/ci/deployments";
import type { WorkflowJobRow, WorkflowRunRow } from "~/server/ci/jobs";
import { scheduleWorkflows } from "~/server/ci/scheduler";
import { approveRunRow, cancelRunRow, loadRunByNumber as loadRun } from "~/server/ci/run-control";
import { parseWorkflow, WORKFLOW_DIR } from "~/server/ci/spec";
import { listRefs, resolveRevision } from "~/server/git/refs";
import { withStore } from "~/server/git/store";
import { accountOrGhost, accountsById } from "~/server/people";
import { badRequest } from "~/server/errors";
import { limitBrowse, limitWrite, MAX_PAGE } from "~/server/limits";
import { repoRef } from "~/lib/validation";
import type { Conclusion, JobStatus } from "~/lib/types";
const PAGE_SIZE = 25;
export const listRuns = createServerFn({ method: "GET" })
.middleware([viewerMiddleware])
.validator(
repoRef.extend({ workflow: z.string().optional(), page: z.number().int().min(1).max(MAX_PAGE).default(1) }),
)
.handler(async ({ data, context }) => {
const { repo, permission } = await requireRepoAccess(data.owner, data.repo, context.viewer, "read");
const rows = data.workflow
? await repoDb(repo.id).all<WorkflowRunRow>(
"SELECT * FROM workflow_runs WHERE repo_id = ? AND workflow_path = ? ORDER BY run_number DESC LIMIT ? OFFSET ?",
repo.id,
data.workflow,
PAGE_SIZE + 1,
(data.page - 1) * PAGE_SIZE,
)
: await repoDb(repo.id).all<WorkflowRunRow>(
"SELECT * FROM workflow_runs WHERE repo_id = ? ORDER BY run_number DESC LIMIT ? OFFSET ?",