Skip to content

Commit 080729c

Browse files
rofeclaude
andcommitted
Slack card: show display name for known Adobe users
Resolves the display name from the tenant when posting the approval card for @adobe.com invitees, shown as "email (Name)" on the Email line. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 919fd1b commit 080729c

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

src/slack.js

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ function teamDeepLink(request, env) {
3737
return `https://teams.microsoft.com/l/team/${encodeURIComponent(channelId)}/conversations?groupId=${encodeURIComponent(groupId)}&tenantId=${encodeURIComponent(tenantId)}`;
3838
}
3939

40-
function cardBodyBlocks(request, env) {
40+
function cardBodyBlocks(request, env, { displayName } = {}) {
4141
const requester = request.requester_email ?? request.requester_name ?? 'Someone';
4242
const teamLink = teamDeepLink(request, env);
4343
const teamDisplay = teamLink
4444
? `<${teamLink}|${request.team_name}>`
4545
: request.team_name;
46-
// Blockquote lines (>) render as gray vertical bars in Slack
4746
const intro = `${requester} requested to invite one person to Adobe Enterprise Support`;
48-
const fields = `> *Email*: ${request.member_email}\n> *Team*: ${teamDisplay}`;
47+
const emailDisplay = displayName ? `${request.member_email} (${displayName})` : request.member_email;
48+
const fields = `> *Email*: ${emailDisplay}\n> *Team*: ${teamDisplay}`;
4949
return [
5050
{
5151
type: 'section',
@@ -58,10 +58,10 @@ function cardBodyBlocks(request, env) {
5858
];
5959
}
6060

61-
/** Blocks for the card with a "Processing" line instead of buttons (spinner state). */
62-
function spinnerBlocks(request, env) {
61+
/** Blocks for the card with a "Processing..." line instead of buttons (spinner state). */
62+
function spinnerBlocks(request, env, opts) {
6363
return [
64-
...cardBodyBlocks(request, env),
64+
...cardBodyBlocks(request, env, opts),
6565
{ type: 'section', text: { type: 'mrkdwn', text: ':hourglass_flowing_sand: Processing…' } },
6666
];
6767
}
@@ -73,12 +73,20 @@ export async function postApprovalCard(env, request) {
7373
if (!channel) {
7474
throw new Error('SLACK_ADMIN_CHANNEL_ID is not set. Set it in wrangler.toml [vars] or in the Cloudflare dashboard so it is not removed on deploy.');
7575
}
76+
let displayName;
77+
if (request.member_email.toLowerCase().endsWith('@adobe.com')) {
78+
try {
79+
const user = await resolveUser(env, request.member_email);
80+
displayName = user?.displayName;
81+
} catch { /* not in tenant yet */ }
82+
}
83+
const opts = { displayName };
7684
const requester = request.requester_email ?? request.requester_name ?? 'Someone';
7785
const result = await slack(env, 'chat.postMessage', {
7886
channel,
7987
text: `${requester} requested to invite ${request.member_email} to ${request.team_name}`,
8088
blocks: [
81-
...cardBodyBlocks(request, env),
89+
...cardBodyBlocks(request, env, opts),
8290
{
8391
type: 'actions',
8492
block_id: 'approval_actions',
@@ -240,6 +248,7 @@ async function handleApprove(payload, action, env) {
240248
}
241249

242250
const reviewerName = payload.user.name ?? payload.user.username ?? payload.user.id;
251+
let resolvedDisplayName;
243252

244253
// Adobe emails: skip the display-name modal if the user already exists in the tenant.
245254
if (request.member_email.toLowerCase().endsWith('@adobe.com')) {
@@ -253,6 +262,7 @@ async function handleApprove(payload, action, env) {
253262
await openApproveDisplayNameModal(payload, request, env);
254263
return;
255264
}
265+
resolvedDisplayName = existingUser.displayName;
256266
// User exists — show spinner and fall through to normal approval
257267
const channelId = payload.channel?.id ?? env.SLACK_ADMIN_CHANNEL_ID;
258268
const messageTs = payload.message?.ts ?? request.slack_message_ts;
@@ -262,7 +272,7 @@ async function handleApprove(payload, action, env) {
262272
channel: channelId,
263273
ts: messageTs,
264274
text: `${request.requester_email ?? request.requester_name} requested to invite ${request.member_email} to ${request.team_name}\nProcessing…`,
265-
blocks: spinnerBlocks(request, env),
275+
blocks: spinnerBlocks(request, env, { displayName: resolvedDisplayName }),
266276
});
267277
} catch (e) {
268278
console.error('Spinner update failed:', e);
@@ -293,7 +303,7 @@ async function handleApprove(payload, action, env) {
293303
ts: messageTs,
294304
text: `${request.requester_email ?? request.requester_name} requested to invite ${request.member_email} to ${request.team_name}\n${approveText}`,
295305
blocks: [
296-
...cardBodyBlocks(request, env),
306+
...cardBodyBlocks(request, env, { displayName: resolvedDisplayName }),
297307
{ type: 'section', text: { type: 'mrkdwn', text: approveText } },
298308
],
299309
});
@@ -343,7 +353,7 @@ async function handleApprove(payload, action, env) {
343353
ts: messageTs,
344354
text: fallbackText,
345355
blocks: [
346-
...cardBodyBlocks(request, env),
356+
...cardBodyBlocks(request, env, { displayName: resolvedDisplayName }),
347357
{ type: 'section', text: { type: 'mrkdwn', text: errorCardText } },
348358
],
349359
});
@@ -600,7 +610,7 @@ async function handleApproveDisplayNameSubmission(payload, env, displayName) {
600610
channel,
601611
ts,
602612
text: `${request.requester_email ?? request.requester_name} requested to invite ${request.member_email} to ${request.team_name}\nProcessing…`,
603-
blocks: spinnerBlocks(request, env),
613+
blocks: spinnerBlocks(request, env, { displayName }),
604614
});
605615
} catch (e) {
606616
console.error('Approve display name spinner update failed:', e);
@@ -626,7 +636,7 @@ async function handleApproveDisplayNameSubmission(payload, env, displayName) {
626636
ts,
627637
text: `${request.requester_email ?? request.requester_name} requested to invite ${request.member_email} to ${request.team_name}\n${approveText}`,
628638
blocks: [
629-
...cardBodyBlocks(request, env),
639+
...cardBodyBlocks(request, env, { displayName }),
630640
{ type: 'section', text: { type: 'mrkdwn', text: approveText } },
631641
],
632642
});
@@ -652,7 +662,7 @@ async function handleApproveDisplayNameSubmission(payload, env, displayName) {
652662
ts,
653663
text: `${request.requester_email ?? request.requester_name} requested to invite ${request.member_email} to ${request.team_name}\n${errorCardText}`,
654664
blocks: [
655-
...cardBodyBlocks(request, env),
665+
...cardBodyBlocks(request, env, { displayName }),
656666
{ type: 'section', text: { type: 'mrkdwn', text: errorCardText } },
657667
],
658668
});

0 commit comments

Comments
 (0)