From c7ce92f35b7e02663ad5cd87584b5a09f4830a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Guti=C3=A9rrez?= <35082514+alezmad@users.noreply.github.com> Date: Sat, 2 May 2026 23:46:50 +0100 Subject: [PATCH] fix(api): use inArray for /v1/me/workspace mesh-id filters drizzle's sql template literal interpolated meshIds as a tuple (($1, $2, $3, ...)) instead of an array, breaking ANY() and returning HTTP 500. inArray() emits the right binding shape. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/api/src/modules/mesh/v1-router.ts | 23 +++++++--------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/packages/api/src/modules/mesh/v1-router.ts b/packages/api/src/modules/mesh/v1-router.ts index bb5743c..066ba42 100644 --- a/packages/api/src/modules/mesh/v1-router.ts +++ b/packages/api/src/modules/mesh/v1-router.ts @@ -39,7 +39,7 @@ import { messageQueue, presence, } from "@turbostarter/db/schema/mesh"; -import { and, asc, count, desc, eq, gt, isNull, lt, sql } from "drizzle-orm"; +import { and, asc, count, desc, eq, gt, inArray, isNull, lt, sql } from "drizzle-orm"; import { validate } from "../../middleware"; import { @@ -402,7 +402,7 @@ export const v1Router = new Hono() return c.json({ userId: issuer.userId, meshes: [], - totals: { meshes: 0, peers: 0, topics: 0, unreadMentions: 0 }, + totals: { meshes: 0, peers: 0, online: 0, topics: 0, unreadMentions: 0 }, }); } @@ -417,10 +417,7 @@ export const v1Router = new Hono() }) .from(meshMember) .where( - and( - sql`${meshMember.meshId} = ANY(${meshIds})`, - isNull(meshMember.revokedAt), - ), + and(inArray(meshMember.meshId, meshIds), isNull(meshMember.revokedAt)), ) .groupBy(meshMember.meshId); @@ -431,10 +428,7 @@ export const v1Router = new Hono() }) .from(meshTopic) .where( - and( - sql`${meshTopic.meshId} = ANY(${meshIds})`, - isNull(meshTopic.archivedAt), - ), + and(inArray(meshTopic.meshId, meshIds), isNull(meshTopic.archivedAt)), ) .groupBy(meshTopic.meshId); @@ -446,10 +440,7 @@ export const v1Router = new Hono() .from(presence) .innerJoin(meshMember, eq(presence.memberId, meshMember.id)) .where( - and( - sql`${meshMember.meshId} = ANY(${meshIds})`, - isNull(meshMember.revokedAt), - ), + and(inArray(meshMember.meshId, meshIds), isNull(meshMember.revokedAt)), ) .groupBy(meshMember.meshId); @@ -463,8 +454,8 @@ export const v1Router = new Hono() .from(meshNotification) .where( and( - sql`${meshNotification.meshId} = ANY(${meshIds})`, - sql`${meshNotification.recipientMemberId} = ANY(${myMemberIds})`, + inArray(meshNotification.meshId, meshIds), + inArray(meshNotification.recipientMemberId, myMemberIds), isNull(meshNotification.readAt), ), )