145 lines · 5.0 KB
import { waitUntil } from "cloudflare:workers";
import { all, batch, first, run, stmt } from "./db";
import { addIssueEvent } from "./pulls";
import { dropPullRefsForIssue } from "./git/pull-bridge";
import { loadRepoById } from "./repos";
import { emitWebhook, publicUrl } from "./events/emit";
import { placeholders } from "./db";
import type { RepoRow } from "~/lib/types";

const MAX_CLOSING_REFERENCES = 10;
const CLOSING_KEYWORDS = /\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)\b/gi;

export type IssueRow = {
  id: string;
  repo_id: string;
  number: number;
  author_id: string;
  title: string;
  body: string;
  state: "open" | "closed";
  is_pull: number;
  comments_count: number;
  locked: number;
  closed_at: number | null;
  closed_by: string | null;
  milestone_id: string | null;
  type_id: string | null;
  parent_id: string | null;
  created_at: number;
  updated_at: number;
};

export async function loadIssue(repoId: string, number: number): Promise<IssueRow | null> {
  return first<IssueRow>("SELECT * FROM issues WHERE repo_id = ? AND number = ? AND hidden_at IS NULL", repoId, number);
}

export async function allocateIssueNumber(repoId: string): Promise<number> {
  const row = await first<{ number: number }>(
    "UPDATE repos SET next_number = next_number + 1 WHERE id = ? RETURNING next_number - 1 AS number",
    repoId,