From 96cc9822d03fce626cff76787b458558c0f099f2 Mon Sep 17 00:00:00 2001 From: charles-gauthereau Date: Mon, 25 May 2026 15:01:25 +0200 Subject: [PATCH] fix(api-v1): handle agent.organizationId FK path and nullable isArchived in ACL helpers --- src/lib/api-v1/acl.ts | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/lib/api-v1/acl.ts b/src/lib/api-v1/acl.ts index 8be7efb0..e004938e 100644 --- a/src/lib/api-v1/acl.ts +++ b/src/lib/api-v1/acl.ts @@ -1,6 +1,6 @@ import { db } from "@/db"; import * as drizzleDb from "@/db"; -import { eq, inArray, and } from "drizzle-orm"; +import { eq, inArray, and, or, isNull } from "drizzle-orm"; export async function getAccessibleAgentIds(userId: string): Promise { const memberships = await db.query.member.findMany({ @@ -11,20 +11,36 @@ export async function getAccessibleAgentIds(userId: string): Promise { if (memberships.length === 0) return []; const orgIds = memberships.map((m) => m.organizationId); + const isActiveAgent = or( + eq(drizzleDb.schemas.agent.isArchived, false), + isNull(drizzleDb.schemas.agent.isArchived) + ); + // Path 1: via organizationAgent junction table const orgAgents = await db.query.organizationAgent.findMany({ where: inArray(drizzleDb.schemas.organizationAgent.organizationId, orgIds), columns: { agentId: true }, }); + const junctionAgentIds = orgAgents.map((oa) => oa.agentId); - if (orgAgents.length === 0) return []; + // Path 2: via agent.organizationId direct FK + const directAgents = await db.query.agent.findMany({ + where: and( + inArray(drizzleDb.schemas.agent.organizationId, orgIds), + isActiveAgent + ), + columns: { id: true }, + }); + const directAgentIds = directAgents.map((a) => a.id); - const agentIds = orgAgents.map((oa) => oa.agentId); + const allAgentIds = [...new Set([...junctionAgentIds, ...directAgentIds])]; + if (allAgentIds.length === 0) return []; + // Filter junction-path agents by active status const agents = await db.query.agent.findMany({ where: and( - inArray(drizzleDb.schemas.agent.id, agentIds), - eq(drizzleDb.schemas.agent.isArchived, false) + inArray(drizzleDb.schemas.agent.id, allAgentIds), + isActiveAgent ), columns: { id: true }, });