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