139 lines · 4.7 KB
import { all, batch, first, run, stmt } from "./db";
import { addIssueEvent } from "./pulls";
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;
  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 = ?", 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,
  );
  if (!row) throw new Error("Repository not found while allocating an issue number");
  return row.number;
}