From 385ed102119c7d68ddc96c7556df9ec80d7bc4b5 Mon Sep 17 00:00:00 2001 From: Lint Roller Date: Tue, 26 May 2026 01:48:12 +0000 Subject: [PATCH] fix(rbac): guard noUncheckedIndexedAccess in name derivation and newStaff insert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With noUncheckedIndexedAccess:true, split("@")[0] returns string|undefined, making `name` typed as string|undefined and failing the notNull staff.name insert constraint. Fix by using ?? fallback on the array access. Also add newStaff null guard after .returning() destructure — array destructuring yields T|undefined with noUncheckedIndexedAccess enabled. --- src/middleware/rbac.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/middleware/rbac.ts b/src/middleware/rbac.ts index bace747..f8dbc14 100644 --- a/src/middleware/rbac.ts +++ b/src/middleware/rbac.ts @@ -127,15 +127,14 @@ export const resolveStaffMiddleware: MiddlewareHandler = async ( if (oidcAccount) { // Derive name: prefer jwt.name, fall back to email prefix, then "Unknown" - const name = - jwt.name?.trim() || - (jwt.email ? jwt.email.split("@")[0] : "Unknown"); + const emailPrefix = jwt.email.split("@")[0] ?? "Unknown"; + const name = jwt.name?.trim() || emailPrefix; const [newStaff] = await db .insert(staff) .values({ userId: jwt.sub, - email: jwt.email ?? "", + email: jwt.email, name, role: "groomer", isSuperUser: false, @@ -143,6 +142,10 @@ export const resolveStaffMiddleware: MiddlewareHandler = async ( }) .returning(); + if (!newStaff) { + return c.json({ error: "Forbidden: auto-provision failed" }, 500); + } + console.log( `[rbac] auto-provisioned staff record for OIDC user: ${jwt.sub} -> staff:${newStaff.id} (${name})` );