Skip to content

Commit

Permalink
feat: add handling for comments during issue assignment
Browse files Browse the repository at this point in the history
Implement functionality to skip comments during user assignment periods.
  • Loading branch information
gentlementlegen committed Nov 21, 2024
1 parent b64d54a commit 3623fd8
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/configuration/data-purge-config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { Type, Static } from "@sinclair/typebox";

export const dataPurgeConfigurationType = Type.Object({});
export const dataPurgeConfigurationType = Type.Object({
skipCommentsWhileAssigned: Type.Boolean({
default: true,
description: "Skip comments posted by a user while it is assigned to the issue",
}),
});

export type DataPurgeConfiguration = Static<typeof dataPurgeConfigurationType>;
70 changes: 70 additions & 0 deletions src/helpers/user-assigned-timespans.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { GitHubIssue, GitHubIssueComment, GitHubPullRequest, GitHubPullRequestReviewComment } from "../github-types";
import { IssueParams } from "../start";
import { ContextPlugin } from "../types/plugin-input";

export interface AssignmentPeriod {
assignedAt: string;
unassignedAt: string | null;
}

export interface UserAssignments {
[username: string]: AssignmentPeriod[];
}

/*
* Returns the list of assignment periods per user for a given issue.
*/
export async function getAssignmentPeriods(octokit: ContextPlugin["octokit"], issueParams: IssueParams) {
const events = await octokit.paginate(octokit.rest.issues.listEvents, {
...issueParams,
per_page: 100,
});

const userAssignments: UserAssignments = {};

events
.filter((event) => ["assigned", "unassigned"].includes(event.event))
.forEach((event) => {
const username = "assignee" in event ? event.assignee?.login : null;
if (!username) return;

if (!userAssignments[username]) {
userAssignments[username] = [];
}

const lastPeriod = userAssignments[username][userAssignments[username].length - 1];

if (event.event === "assigned") {
userAssignments[username].push({
assignedAt: event.created_at,
unassignedAt: null,
});
} else if (event.event === "unassigned" && lastPeriod && lastPeriod.unassignedAt === null) {
lastPeriod.unassignedAt = event.created_at;
}
});

Object.values(userAssignments).forEach((periods) => {
const lastPeriod = periods[periods.length - 1];
if (lastPeriod && lastPeriod.unassignedAt === null) {
lastPeriod.unassignedAt = new Date().toISOString();
}
});

return userAssignments;
}

export function isCommentDuringAssignment(
comment: GitHubIssueComment | GitHubPullRequestReviewComment | GitHubIssue | GitHubPullRequest,
assignments: AssignmentPeriod[]
) {
const commentDate = new Date(comment.created_at);
if (!assignments?.length) {
return false;
}
return assignments.some((period) => {
const assignedAt = new Date(period.assignedAt);
const unassignedAt = period.unassignedAt ? new Date(period.unassignedAt) : new Date();
return commentDate >= assignedAt && commentDate <= unassignedAt;
});
}
14 changes: 14 additions & 0 deletions src/parser/data-purge-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { GitHubPullRequestReviewComment } from "../github-types";
import { IssueActivity } from "../issue-activity";
import { BaseModule } from "../types/module";
import { Result } from "../types/results";
import { getAssignmentPeriods, isCommentDuringAssignment } from "../helpers/user-assigned-timespans";
import { parseGitHubUrl } from "../start";

/**
* Removes the data in the comments that we do not want to be processed.
Expand All @@ -19,12 +21,24 @@ export class DataPurgeModule extends BaseModule {
}

async transform(data: Readonly<IssueActivity>, result: Result) {

Check failure on line 23 in src/parser/data-purge-module.ts

View workflow job for this annotation

GitHub Actions / Check for formatting errors

Refactor this function to reduce its Cognitive Complexity from 21 to the 15 allowed
const assignmentPeriods = await getAssignmentPeriods(
this.context.octokit,
parseGitHubUrl(this.context.payload.issue.html_url)
);
for (const comment of data.allComments) {
// Skips comments if they are minimized
if ("isMinimized" in comment && comment.isMinimized) {
this.context.logger.debug("Skipping hidden comment", { comment });
continue;
}
if (this._configuration?.skipCommentsWhileAssigned) {
if (comment.user?.login && isCommentDuringAssignment(comment, assignmentPeriods[comment.user?.login])) {
this.context.logger.debug("Skipping comment during assignment", {
comment,
});
continue;
}
}
if (comment.body && comment.user?.login && result[comment.user.login]) {
const newContent = comment.body
// Remove quoted text
Expand Down

0 comments on commit 3623fd8

Please sign in to comment.