mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-15 02:20:38 +09:00
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:
parent
ca8d35fd99
commit
c9ee8e7a7e
1 changed files with 4 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue