From 534ef29c9156d2985eefe051618920ebf7058014 Mon Sep 17 00:00:00 2001 From: Christophe Hurpeau Date: Sat, 21 Jan 2023 16:53:59 +0100 Subject: [PATCH] fix: update slack home and slack message for team after review done by one member --- src/context/accountContext.ts | 13 ++ src/events/pr-handlers/reviewSubmitted.ts | 142 ++++++++++++++++------ 2 files changed, 118 insertions(+), 37 deletions(-) diff --git a/src/context/accountContext.ts b/src/context/accountContext.ts index 923239baf..5ac6ab11e 100644 --- a/src/context/accountContext.ts +++ b/src/context/accountContext.ts @@ -37,6 +37,7 @@ export interface AccountContext< getTeamGroup: (teamName: string) => GroupNames | undefined; getGithubTeamsGroups: (teamNames: string[]) => GroupNames[]; getMembersForTeams: (teamIds: number[]) => Promise; + getGithubTeamsForMember: (memberId: number) => Promise; getTeamsForLogin: (githubLogin: string) => TeamNames[]; updateGithubTeamMembers: () => Promise; approveShouldWait: ( @@ -212,6 +213,18 @@ const initAccountContext = async < const orgMembers = await cursor.toArray(); return orgMembers.map((member) => member.user); }, + getGithubTeamsForMember: async (memberId): Promise => { + if (accountInfo.type !== 'Organization') { + throw new Error( + `Invalid account type "${accountInfo.type}" for getTeamsForMember`, + ); + } + const orgMember = await appContext.mongoStores.orgMembers.findOne({ + 'org.id': account._id, + 'user.id': memberId, + }); + return orgMember ? orgMember.teams : []; + }, updateGithubTeamMembers, approveShouldWait: ( diff --git a/src/events/pr-handlers/reviewSubmitted.ts b/src/events/pr-handlers/reviewSubmitted.ts index 9df2de57b..4b64605f7 100644 --- a/src/events/pr-handlers/reviewSubmitted.ts +++ b/src/events/pr-handlers/reviewSubmitted.ts @@ -71,10 +71,11 @@ export default function reviewSubmitted( html_url: reviewUrl, } = payload.review; - const { reviewers, reviewStates } = await getReviewersAndReviewStates( - context, - repoContext, - ); + const [{ reviewers, reviewStates }, reviewerGithubTeams] = + await Promise.all([ + getReviewersAndReviewStates(context, repoContext), + repoContext.getGithubTeamsForMember(reviewer.id), + ]); const { owner, assignees, followers } = getRolesFromPullRequestAndReviewers(pullRequest, reviewers, { excludeIds: [reviewer.id], @@ -168,15 +169,18 @@ export default function reviewSubmitted( } } - if (assignees) { - assignees.forEach((assignee) => { - repoContext.slack.updateHome(assignee.login); - }); - } - repoContext.slack.updateHome(reviewer.login); + const createTeamsRegex = () => { + if (reviewerGithubTeams.length === 1) { + return reviewerGithubTeams[0].id; + } + return `(${reviewerGithubTeams.map((team) => team.id).join('|')})`; + }; - const sentMessageRequestedReview = - await appContext.mongoStores.slackSentMessages.findOne( + const [ + sentMessageRequestedReview, + sentMessageRequestedReviewForReviewerTeams, + ] = await Promise.all([ + appContext.mongoStores.slackSentMessages.findOne( { 'account.id': repoContext.accountEmbed.id, 'account.type': repoContext.accountEmbed.type, @@ -184,35 +188,99 @@ export default function reviewSubmitted( typeId: `${pullRequest.id}_${reviewer.id}`, }, { created: -1 }, - ); + ), + reviewerGithubTeams.length > 0 + ? appContext.mongoStores.slackSentMessages.findAll( + { + 'account.id': repoContext.accountEmbed.id, + 'account.type': repoContext.accountEmbed.type, + type: 'review-requested', + typeId: { + $regex: `^${pullRequest.id}_${createTeamsRegex()}_`, + }, + }, + { created: -1 }, + ) + : [], + ]); + + repoContext.slack.updateHome(reviewer.login); + if (assignees) { + assignees.forEach((assignee) => { + repoContext.slack.updateHome(assignee.login); + }); + } + + for (const sentMessageRequestedReviewForReviewerTeam of sentMessageRequestedReviewForReviewerTeams) { + for (const { + user, + } of sentMessageRequestedReviewForReviewerTeam.sentTo) { + repoContext.slack.updateHome(user.login); + } + } const emoji = getEmojiFromState(state); - if (sentMessageRequestedReview) { - const message = sentMessageRequestedReview.message; + if ( + sentMessageRequestedReview || + sentMessageRequestedReviewForReviewerTeams.length > 0 + ) { await Promise.all([ - ...sentMessageRequestedReview.sentTo.map((sentTo) => [ - repoContext.slack.updateMessage( - sentTo.user, - sentTo.ts, - sentTo.channel, - { - ...message, - text: message.text - .split('\n') - .map((l) => `~${l}~`) - .join('\n'), - }, - ), - repoContext.slack.addReaction( - sentTo.user, - sentTo.ts, - sentTo.channel, - emoji, - ), - ]), - appContext.mongoStores.slackSentMessages.deleteOne( - sentMessageRequestedReview, + ...(sentMessageRequestedReview + ? [ + ...sentMessageRequestedReview.sentTo.map((sentTo) => [ + repoContext.slack.updateMessage( + sentTo.user, + sentTo.ts, + sentTo.channel, + { + ...sentMessageRequestedReview.message, + text: sentMessageRequestedReview.message.text + .split('\n') + .map((l) => `~${l}~`) + .join('\n'), + }, + ), + repoContext.slack.addReaction( + sentTo.user, + sentTo.ts, + sentTo.channel, + emoji, + ), + ]), + appContext.mongoStores.slackSentMessages.deleteOne( + sentMessageRequestedReview, + ), + ] + : []), + ...sentMessageRequestedReviewForReviewerTeams.flatMap( + (sentMessageRequestedReviewForReviewerTeam) => [ + ...sentMessageRequestedReviewForReviewerTeam.sentTo.map( + (sentTo) => [ + repoContext.slack.updateMessage( + sentTo.user, + sentTo.ts, + sentTo.channel, + { + ...sentMessageRequestedReviewForReviewerTeam.message, + text: sentMessageRequestedReviewForReviewerTeam.message.text + .split('\n') + .map((l) => `~${l}~`) + .join('\n'), + }, + ), + repoContext.slack.addReaction( + sentTo.user, + sentTo.ts, + sentTo.channel, + emoji, + ), + ], + ), + appContext.mongoStores.slackSentMessages.deleteOne( + sentMessageRequestedReviewForReviewerTeam, + ), + ], ), ]); }