Skip to content

Commit

Permalink
feat: improve slack home, add additional sections for prs waiting for…
Browse files Browse the repository at this point in the history
… review
  • Loading branch information
christophehurpeau committed Feb 17, 2024
1 parent cc7d81d commit f296ffa
Show file tree
Hide file tree
Showing 18 changed files with 390 additions and 213 deletions.
2 changes: 1 addition & 1 deletion src/context/accountContext.ts
Expand Up @@ -124,7 +124,7 @@ const initAccountContext = async <
githubLoginToTeams.get(githubLogin) || [],

getMembersForTeams: async (teamIds): Promise<AccountEmbedWithoutType[]> => {
if (teamIds.length === 0) return [];
if (!teamIds || teamIds.length === 0) return [];
if (accountInfo.type !== 'Organization') {
throw new Error(
`Invalid account type "${accountInfo.type}" for getMembersForTeam`,
Expand Down
19 changes: 19 additions & 0 deletions src/events/pr-handlers/actions/editOpenedPR.ts
Expand Up @@ -32,6 +32,7 @@ import { lintCommitMessage } from './utils/commitMessages';
import createStatus, { isSameStatus } from './utils/createStatus';
import { cleanTitle } from './utils/prTitle';
import type { StepsState } from './utils/steps/calcStepsState';
import { updateSlackHomeForPr } from './utils/updateSlackHome';

export interface ReviewflowStatus {
name: string;
Expand All @@ -51,6 +52,7 @@ export interface EditOpenedPullRequestOptions<
reviewflowPrContext: ReviewflowPrContext;
shouldUpdateCommentBodyInfos: boolean;
shouldUpdateCommentBodyProgress: boolean;
shouldUpdateSlackHomeOnTitleChange?: boolean;
stepsState: StepsState;
previousSha?: string;
checksAndStatuses?: ChecksAndStatuses;
Expand All @@ -70,6 +72,7 @@ export const editOpenedPR = async <
reviewflowPrContext,
shouldUpdateCommentBodyInfos,
shouldUpdateCommentBodyProgress,
shouldUpdateSlackHomeOnTitleChange,
stepsState,
previousSha,
checksAndStatuses,
Expand Down Expand Up @@ -347,6 +350,8 @@ export const editOpenedPR = async <
newCommentBody = updateCommentBodyProgress(newCommentBody, stepsState);
}

const hasDiffInTitle = title && pullRequest.title !== title;

if (shouldCreateCommentBody || shouldUpdateCommentBodyInfos) {
promises.push(
readCommitsAndUpdateInfos(
Expand All @@ -367,4 +372,18 @@ export const editOpenedPR = async <
}

await Promise.all(promises);

if (shouldUpdateSlackHomeOnTitleChange && hasDiffInTitle) {
const teamMembers = await repoContext.getMembersForTeams(
pullRequest.requested_teams
? pullRequest.requested_teams.map((team) => team.id)
: [],
);
updateSlackHomeForPr(repoContext, pullRequest, {
assignees: true,
requestedReviewers: true,
requestedTeams: true,
teamMembers,
});
}
};
55 changes: 55 additions & 0 deletions src/events/pr-handlers/actions/utils/updateSlackHome.ts
@@ -0,0 +1,55 @@
import type { RepoContext } from 'src/context/repoContext';
import type { AccountEmbedWithoutType } from '../../../../mongo';
import type { PullRequestWithDecentData } from '../../utils/PullRequestData';

interface UpdateSlackHomeForPrOptions {
user?: boolean;
assignees?: boolean;
requestedReviewers?: boolean;
requestedTeams?: boolean;
teamMembers?: AccountEmbedWithoutType[];
otherLogins?: string[];
}

export function updateSlackHomeForPr(
repoContext: RepoContext,
pullRequest: PullRequestWithDecentData,
{
user,
assignees,
requestedReviewers,
requestedTeams,
teamMembers,
otherLogins,
}: UpdateSlackHomeForPrOptions,
): void {
if (repoContext.slack) {
const logins = new Set<string>(otherLogins);

if (user && pullRequest.user) {
logins.add(pullRequest.user.login);
}
if (assignees && pullRequest.assignees) {
pullRequest.assignees.forEach((assignee) => {
logins.add(assignee.login);
});
}

if (requestedReviewers && pullRequest.requested_reviewers) {
pullRequest.requested_reviewers.forEach((requestedReviewer) => {
if (!('login' in requestedReviewer)) return;
logins.add(requestedReviewer.login);
});
}

if (requestedTeams && pullRequest.requested_teams && teamMembers) {
teamMembers.forEach((member) => {
logins.add(member.login);
});
}

logins.forEach((login) => {
repoContext.slack.updateHome(login);
});
}
}
6 changes: 4 additions & 2 deletions src/events/pr-handlers/assignedOrUnassigned.ts
Expand Up @@ -2,6 +2,7 @@ import type { Probot } from 'probot';
import type { AppContext } from '../../context/AppContext';
import * as slackUtils from '../../slack/utils';
import { checkIfIsThisBot } from '../../utils/github/isBotUser';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import { toBasicUser } from './utils/PullRequestData';
import { createPullRequestHandler } from './utils/createPullRequestHandler';

Expand Down Expand Up @@ -46,8 +47,9 @@ export default function assignedOrUnassignedHandler(
}

if (repoContext.slack) {
// update new assignee slack home
repoContext.slack.updateHome(newlyAssigned.login);
updateSlackHomeForPr(repoContext, pullRequest, {
otherLogins: [newlyAssigned.login],
});

await Promise.all(
[
Expand Down
41 changes: 20 additions & 21 deletions src/events/pr-handlers/closed.ts
Expand Up @@ -7,6 +7,7 @@ import { updateReviewStatus } from './actions/updateReviewStatus';
import { updateStatusCheckFromStepsState } from './actions/updateStatusCheckFromStepsState';
import { parseOptions } from './actions/utils/body/parseBody';
import { calcStepsState } from './actions/utils/steps/calcStepsState';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import { createPullRequestHandler } from './utils/createPullRequestHandler';
import { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';
import { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';
Expand Down Expand Up @@ -34,6 +35,15 @@ export default function closed(app: Probot, appContext: AppContext): void {
{
$set: {
isClosed: true,
...(reviewflowPrContext.reviewflowPr.flowDates
? { 'flowDates.closedAt': new Date(pullRequest.closed_at!) }
: {
flowDates: {
createdAt: new Date(pullRequest.created_at),
openedAt: new Date(pullRequest.created_at),
closedAt: new Date(pullRequest.closed_at!),
},
}),
},
},
);
Expand Down Expand Up @@ -92,27 +102,16 @@ export default function closed(app: Probot, appContext: AppContext): void {
}

/* update slack home */
if (pullRequest.requested_reviewers) {
pullRequest.requested_reviewers.forEach((requestedReviewer) => {
if (!('login' in requestedReviewer)) return;
repoContext.slack.updateHome(requestedReviewer.login);
});
}

if (pullRequest.requested_teams) {
const members = await repoContext.getMembersForTeams(
pullRequest.requested_teams.map((team) => team.id),
);
members.forEach((member) => {
repoContext.slack.updateHome(member.login);
});
}

if (pullRequest.assignees) {
pullRequest.assignees.forEach((assignee) => {
repoContext.slack.updateHome(assignee.login);
});
}
const teamMembers = await repoContext.getMembersForTeams(
pullRequest.requested_teams.map((team) => team.id),
);
updateSlackHomeForPr(repoContext, pullRequest, {
user: true,
assignees: true,
requestedReviewers: true,
requestedTeams: true,
teamMembers,
});

/* send notifications to assignees and followers */
const { reviewers } = await getReviewersAndReviewStates(context);
Expand Down
22 changes: 21 additions & 1 deletion src/events/pr-handlers/convertedToDraft.ts
Expand Up @@ -5,6 +5,7 @@ import { editOpenedPR } from './actions/editOpenedPR';
import { updateReviewStatus } from './actions/updateReviewStatus';
import { updateStatusCheckFromStepsState } from './actions/updateStatusCheckFromStepsState';
import { calcStepsState } from './actions/utils/steps/calcStepsState';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import { createPullRequestHandler } from './utils/createPullRequestHandler';
import { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';
import { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';
Expand Down Expand Up @@ -38,7 +39,14 @@ export default function convertedToDraft(
appContext.mongoStores.prs.partialUpdateOne(
reviewflowPrContext.reviewflowPr,
{
$set: { isDraft: true },
$set: {
isDraft: true,
},
$unset: reviewflowPrContext.reviewflowPr.flowDates?.readyAt
? {
'flowDates.readyAt': true,
}
: undefined,
},
),
updateReviewStatus(pullRequest, context, repoContext, stepsState),
Expand Down Expand Up @@ -71,6 +79,18 @@ export default function convertedToDraft(
excludeIds: [sender.id],
});

const teamMembers = await repoContext.getMembersForTeams(
pullRequest.requested_teams
? pullRequest.requested_teams.map((team) => team.id)
: [],
);
updateSlackHomeForPr(repoContext, pullRequest, {
assignees: true,
requestedReviewers: true,
requestedTeams: true,
teamMembers,
});

const mention = repoContext.slack.mention(sender.login);
const prUrl = slackUtils.createPrLink(pullRequest, repoContext);
const ownerMention = repoContext.slack.mention(owner.login);
Expand Down
1 change: 1 addition & 0 deletions src/events/pr-handlers/edited.ts
Expand Up @@ -62,6 +62,7 @@ export default function edited(app: Probot, appContext: AppContext): void {
stepsState,
shouldUpdateCommentBodyInfos: true,
shouldUpdateCommentBodyProgress: true,
shouldUpdateSlackHomeOnTitleChange: true,
checksAndStatuses,
}),
updateStatusCheckFromStepsState(
Expand Down
6 changes: 6 additions & 0 deletions src/events/pr-handlers/opened.ts
Expand Up @@ -10,6 +10,7 @@ import { updateStatusCheckFromStepsState } from './actions/updateStatusCheckFrom
// import { defaultCommentBody } from './actions/utils/body/updateBody';
import { calcStepsState } from './actions/utils/steps/calcStepsState';
import { syncLabels } from './actions/utils/syncLabel';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import type { PullRequestLabels } from './utils/PullRequestData';
import { createPullRequestHandler } from './utils/createPullRequestHandler';
// import { createReviewflowComment } from './utils/reviewflowComment';
Expand Down Expand Up @@ -93,6 +94,11 @@ export default function opened(app: Probot, appContext: AppContext): void {
]);
}),
]);

updateSlackHomeForPr(repoContext, pullRequest, {
user: true,
assignees: true,
});
},
// https://sentry.io/organizations/chrp/issues/3888881569/?project=1243466&query=is%3Aunresolved&referrer=issue-stream
// https://github.com/christophehurpeau/reviewflow/pull/617
Expand Down
32 changes: 6 additions & 26 deletions src/events/pr-handlers/readyForReview.ts
Expand Up @@ -7,6 +7,7 @@ import { updateReviewStatus } from './actions/updateReviewStatus';
import { updateStatusCheckFromStepsState } from './actions/updateStatusCheckFromStepsState';
import hasLabelInPR from './actions/utils/labels/hasLabelInPR';
import { calcStepsState } from './actions/utils/steps/calcStepsState';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import { createPullRequestHandler } from './utils/createPullRequestHandler';
import { fetchPr, type PullRequestFromRestEndpoint } from './utils/fetchPr';

Expand Down Expand Up @@ -87,32 +88,11 @@ export default function readyForReview(
}

/* update slack home */
const loginsAskedToUpdateSlackHome: string[] = [];
if (pullRequest.assignees) {
pullRequest.assignees.forEach((assignee) => {
loginsAskedToUpdateSlackHome.push(assignee.login);
repoContext.slack.updateHome(assignee.login);
});
}

pullRequest.requested_reviewers.forEach((requestedReviewer: any) => {
if (loginsAskedToUpdateSlackHome.includes(requestedReviewer.login)) {
return;
}

loginsAskedToUpdateSlackHome.push(requestedReviewer.login);
repoContext.slack.updateHome(requestedReviewer.login);
});

membersForTeams.forEach(({ members }) => {
members.forEach((teamMember) => {
if (loginsAskedToUpdateSlackHome.includes(teamMember.login)) {
return;
}

loginsAskedToUpdateSlackHome.push(teamMember.login);
repoContext.slack.updateHome(teamMember.login);
});
updateSlackHomeForPr(repoContext, pullRequest, {
assignees: true,
requestedReviewers: true,
requestedTeams: true,
teamMembers: membersForTeams.flatMap(({ members }) => members),
});

/* send slack notification */
Expand Down
51 changes: 29 additions & 22 deletions src/events/pr-handlers/reopened.ts
Expand Up @@ -6,6 +6,7 @@ import { editOpenedPR } from './actions/editOpenedPR';
import { updateReviewStatus } from './actions/updateReviewStatus';
import { updateStatusCheckFromStepsState } from './actions/updateStatusCheckFromStepsState';
import { calcStepsState } from './actions/utils/steps/calcStepsState';
import { updateSlackHomeForPr } from './actions/utils/updateSlackHome';
import { createPullRequestHandler } from './utils/createPullRequestHandler';
import { getReviewersAndReviewStates } from './utils/getReviewersAndReviewStates';
import { getRolesFromPullRequestAndReviewers } from './utils/getRolesFromPullRequestAndReviewers';
Expand Down Expand Up @@ -36,7 +37,25 @@ export default function reopened(app: Probot, appContext: AppContext): void {
appContext.mongoStores.prs.partialUpdateOne(
reviewflowPrContext.reviewflowPr,
{
$set: { isDraft: pullRequest.draft === true },
$set: {
isDraft: pullRequest.draft === true,
...(reviewflowPrContext.reviewflowPr.flowDates
? {
'flowDates.readyAt': new Date(),
}
: {
flowDates: {
createdAt: new Date(pullRequest.created_at),
openedAt: new Date(),
readyAt: pullRequest.draft ? undefined : new Date(),
},
}),
},
$unset: reviewflowPrContext.reviewflowPr.flowDates?.closedAt
? {
'flowDates.closedAt': true,
}
: {},
},
),
updateReviewStatus(pullRequest, context, repoContext, stepsState),
Expand All @@ -62,27 +81,15 @@ export default function reopened(app: Probot, appContext: AppContext): void {
}

/* update slack home */
if (pullRequest.requested_reviewers) {
pullRequest.requested_reviewers.forEach((requestedReviewer) => {
if (!('login' in requestedReviewer)) return;
repoContext.slack.updateHome(requestedReviewer.login);
});
}

if (pullRequest.requested_teams) {
const members = await repoContext.getMembersForTeams(
pullRequest.requested_teams.map((team) => team.id),
);
members.forEach((member) => {
repoContext.slack.updateHome(member.login);
});
}

if (pullRequest.assignees) {
pullRequest.assignees.forEach((assignee) => {
repoContext.slack.updateHome(assignee.login);
});
}
const teamMembers = await repoContext.getMembersForTeams(
pullRequest.requested_teams.map((team) => team.id),
);
updateSlackHomeForPr(repoContext, pullRequest, {
assignees: true,
requestedReviewers: true,
requestedTeams: true,
teamMembers,
});

/* send notifications to assignees and followers */
const { reviewers } = await getReviewersAndReviewStates(context);
Expand Down

0 comments on commit f296ffa

Please sign in to comment.