276 lines · 11.3 KB
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 ?",