fix(issues): replace non-null assertions with null checks in checkout re-read

Two code paths in issueService.checkout() used rows[0]! when
re-reading an issue after stale-run adoption or self-ownership
verification. If the issue is deleted concurrently (company cascade,
API delete), rows[0] is undefined and withIssueLabels crashes with
an unhandled TypeError.

Replace both with rows[0] ?? null and throw notFound when the row
is missing, returning a clean 404 instead of an uncaught exception.
This commit is contained in:
plind-dm 2026-04-03 09:56:23 +09:00
parent ca8d35fd99
commit c9ee8e7a7e

View file

@ -1469,7 +1469,8 @@ export function issueService(db: Db) {
expectedCheckoutRunId: current.checkoutRunId,
});
if (adopted) {
const row = await db.select().from(issues).where(eq(issues.id, id)).then((rows) => rows[0]!);
const row = await db.select().from(issues).where(eq(issues.id, id)).then((rows) => rows[0] ?? null);
if (!row) throw notFound("Issue not found");
const [enriched] = await withIssueLabels(db, [row]);
return enriched;
}
@ -1481,7 +1482,8 @@ export function issueService(db: Db) {
current.status === "in_progress" &&
sameRunLock(current.checkoutRunId, checkoutRunId)
) {
const row = await db.select().from(issues).where(eq(issues.id, id)).then((rows) => rows[0]!);
const row = await db.select().from(issues).where(eq(issues.id, id)).then((rows) => rows[0] ?? null);
if (!row) throw notFound("Issue not found");
const [enriched] = await withIssueLabels(db, [row]);
return enriched;
}