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;
}