From 154393669021994234b1f38cf7336fa0b5c916ad Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sat, 10 Jan 2026 07:40:36 -0500 Subject: [PATCH] fix: display Slack profile name for chapter leaders without WorkOS accounts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Leaders added via Slack ID that haven't linked their WorkOS account were showing raw Slack user IDs (e.g., U09BEKNJ3GB) instead of their names. The getLeaders and getLeadersBatch queries now include slack_user_mappings as an additional name source, falling back to slack_real_name or slack_display_name before showing the raw user ID. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .changeset/fix-slack-leader-display.md | 12 ++++++++++++ server/src/db/working-group-db.ts | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 .changeset/fix-slack-leader-display.md diff --git a/.changeset/fix-slack-leader-display.md b/.changeset/fix-slack-leader-display.md new file mode 100644 index 0000000000..3620cb18ae --- /dev/null +++ b/.changeset/fix-slack-leader-display.md @@ -0,0 +1,12 @@ +--- +"adcontextprotocol": patch +--- + +fix: display Slack profile name for chapter leaders without WorkOS accounts + +Leaders added via Slack ID that haven't linked their WorkOS account now display +their Slack profile name (real_name or display_name) instead of the raw Slack +user ID (e.g., U09BEKNJ3GB). + +The getLeaders and getLeadersBatch queries now include slack_user_mappings as an +additional name source in the COALESCE chain. diff --git a/server/src/db/working-group-db.ts b/server/src/db/working-group-db.ts index c777a3fc67..8623a1ca5e 100644 --- a/server/src/db/working-group-db.ts +++ b/server/src/db/working-group-db.ts @@ -590,7 +590,8 @@ export class WorkingGroupDatabase { // 1. working_group_memberships (if they're a member with cached name) // 2. users table (canonical user data synced from WorkOS) // 3. organization_memberships (older sync table) - // 4. Falls back to user_id if no name found + // 4. slack_user_mappings (Slack profile name for unmapped Slack users) + // 5. Falls back to user_id if no name found // // canonical_user_id is resolved at read time via slack_user_mappings // to handle cases where leaders were added via Slack ID before linking WorkOS @@ -604,12 +605,17 @@ export class WorkingGroupDatabase { NULLIF(TRIM(CONCAT(om.first_name, ' ', om.last_name)), ''), u.email, om.email, + NULLIF(slack_profile.slack_real_name, ''), + NULLIF(slack_profile.slack_display_name, ''), wgl.user_id ) AS name, COALESCE(wgm.user_org_name, user_org.name, org.name) AS org_name, wgl.created_at FROM working_group_leaders wgl + -- sm: resolves Slack ID -> WorkOS ID (only for linked users) LEFT JOIN slack_user_mappings sm ON wgl.user_id = sm.slack_user_id AND sm.workos_user_id IS NOT NULL + -- slack_profile: gets Slack profile name (for all Slack users, including unlinked) + LEFT JOIN slack_user_mappings slack_profile ON wgl.user_id = slack_profile.slack_user_id LEFT JOIN working_group_memberships wgm ON COALESCE(sm.workos_user_id, wgl.user_id) = wgm.workos_user_id AND wgm.working_group_id = wgl.working_group_id LEFT JOIN users u ON COALESCE(sm.workos_user_id, wgl.user_id) = u.workos_user_id LEFT JOIN organizations user_org ON u.primary_organization_id = user_org.workos_organization_id @@ -650,12 +656,17 @@ export class WorkingGroupDatabase { NULLIF(TRIM(CONCAT(om.first_name, ' ', om.last_name)), ''), u.email, om.email, + NULLIF(slack_profile.slack_real_name, ''), + NULLIF(slack_profile.slack_display_name, ''), wgl.user_id ) AS name, COALESCE(wgm.user_org_name, user_org.name, org.name) AS org_name, wgl.created_at FROM working_group_leaders wgl + -- sm: resolves Slack ID -> WorkOS ID (only for linked users) LEFT JOIN slack_user_mappings sm ON wgl.user_id = sm.slack_user_id AND sm.workos_user_id IS NOT NULL + -- slack_profile: gets Slack profile name (for all Slack users, including unlinked) + LEFT JOIN slack_user_mappings slack_profile ON wgl.user_id = slack_profile.slack_user_id LEFT JOIN working_group_memberships wgm ON COALESCE(sm.workos_user_id, wgl.user_id) = wgm.workos_user_id AND wgm.working_group_id = wgl.working_group_id LEFT JOIN users u ON COALESCE(sm.workos_user_id, wgl.user_id) = u.workos_user_id LEFT JOIN organizations user_org ON u.primary_organization_id = user_org.workos_organization_id