Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .changeset/fix-slack-leader-display.md
Original file line number Diff line number Diff line change
@@ -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.
13 changes: 12 additions & 1 deletion server/src/db/working-group-db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down