From 075df6db081d48460ac1451e2f2372f0ceccf466 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:53:12 +0100 Subject: [PATCH] fix(api): correct online count in /v1/me/workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit count distinct members with disconnectedAt is null instead of all presence rows — a member can have many sessions, plus stale rows from prior runs. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/api/src/modules/mesh/v1-router.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/api/src/modules/mesh/v1-router.ts b/packages/api/src/modules/mesh/v1-router.ts index 066ba42..4f6b967 100644 --- a/packages/api/src/modules/mesh/v1-router.ts +++ b/packages/api/src/modules/mesh/v1-router.ts @@ -435,12 +435,16 @@ export const v1Router = new Hono() const onlineCounts = await db .select({ meshId: meshMember.meshId, - online: count(presence.memberId), + online: sql`count(distinct ${presence.memberId})`, }) .from(presence) .innerJoin(meshMember, eq(presence.memberId, meshMember.id)) .where( - and(inArray(meshMember.meshId, meshIds), isNull(meshMember.revokedAt)), + and( + inArray(meshMember.meshId, meshIds), + isNull(meshMember.revokedAt), + isNull(presence.disconnectedAt), + ), ) .groupBy(meshMember.meshId);