(event: SlackUserChangeEvent)
| 204 | * Updates our database with the new profile data |
| 205 | */ |
| 206 | export async function handleUserChange(event: SlackUserChangeEvent): Promise<void> { |
| 207 | const user = event.user; |
| 208 | |
| 209 | if (!user?.id) { |
| 210 | logger.warn('user_change event missing user data'); |
| 211 | return; |
| 212 | } |
| 213 | |
| 214 | logger.debug( |
| 215 | { userId: user.id, email: user.profile?.email, name: user.profile?.real_name }, |
| 216 | 'Slack user profile changed' |
| 217 | ); |
| 218 | |
| 219 | try { |
| 220 | const email = user.profile?.email || null; |
| 221 | const displayName = user.profile?.display_name || user.profile?.display_name_normalized || null; |
| 222 | const realName = user.profile?.real_name || user.real_name || null; |
| 223 | |
| 224 | // Upsert the user into our database with updated profile |
| 225 | await slackDb.upsertSlackUser({ |
| 226 | slack_user_id: user.id, |
| 227 | slack_email: email, |
| 228 | slack_display_name: displayName, |
| 229 | slack_real_name: realName, |
| 230 | slack_is_bot: user.is_bot || false, |
| 231 | slack_is_deleted: user.deleted || false, |
| 232 | slack_tz_offset: user.tz_offset ?? null, |
| 233 | }); |
| 234 | |
| 235 | // Invalidate caches since user data changed |
| 236 | invalidateUnifiedUsersCache(); |
| 237 | invalidateMemberContextCache(user.id); |
| 238 | |
| 239 | logger.debug({ userId: user.id }, 'Slack user profile updated'); |
| 240 | } catch (error) { |
| 241 | logger.error({ error, userId: user.id }, 'Failed to process user_change event'); |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | /** |
| 246 | * Try to auto-map a Slack user to a web user by email |
no test coverage detected