From 67fbf822042613f5f54089ea13c03e05c009ee1f Mon Sep 17 00:00:00 2001 From: Aaron Ang Date: Fri, 17 Mar 2017 20:34:58 -0700 Subject: [PATCH] Close issues when inactive for long period of time --- src/github.js | 12 ++++++++ src/handlers/issues/closing.js | 53 ++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/handlers/issues/closing.js diff --git a/src/github.js b/src/github.js index e90b078..6fad405 100644 --- a/src/github.js +++ b/src/github.js @@ -60,6 +60,7 @@ type CloseIssueParams = { }; exports.closeIssue = ({ id, owner, repo }: CloseIssueParams) => { return got.patch(`${BASE_URI}/repos/${owner}/${repo}/issues/${id}`, { + headers, body: JSON.stringify({ state: 'closed' }) }); }; @@ -91,3 +92,14 @@ exports.createIssueReaction = ({ content, number, owner, repo }: IssueParams) => body: JSON.stringify({ content }) }).then(({ body }) => body); } + +type LabeledIssuesParams = { + labels: string; + owner: string; + repo: string; +} + +exports.getLabeledIssues = ({ labels, owner, repo }: LabeledIssuesParams) => { + return get(`${BASE_URI}/repos/${owner}/${repo}/issues?labels=${labels}`, { json: true }) + .then(({ body }) => body); +} diff --git a/src/handlers/issues/closing.js b/src/handlers/issues/closing.js new file mode 100644 index 0000000..cf8ca87 --- /dev/null +++ b/src/handlers/issues/closing.js @@ -0,0 +1,53 @@ +// @flow + +import github from '../../github'; +import Logger from '../../logger'; + +const { log } = new Logger('issues/closing.js'); + +type ClosingIssuesPayload = { + repository: { + owner: { login: string; }; + name: string; + } +} + +const closingIssueMessage = "Closing this issue because it has been inactive for a long period of time."; + +const isInactive = updatedAt => { + const idleTime = 30 * 24 * 60 * 60 * 1000; + const currentDate = new Date(); + const updateDate = new Date(updatedAt); + return currentDate - updateDate > idleTime; +} + +export default function({ repository }: ClosingIssuesPayload) { + const { owner: { login: owner }, name: repo } = repository; + + github.getLabeledIssues({ + labels: encodeURIComponent("Needs Info"), + owner: owner, + repo: repo + }).then(issues => { + issues.forEach(({ pull_request, number, updated_at }) => { + if (!pull_request && isInactive(updated_at)) { + log(`Adding comment to issue #${number}`, 'verbose'); + github.addIssueComment( + number, + owner, + repo, + closingIssueMessage + ).then(res => { + log(`Closing issue #${number}`, 'verbose') + return github.closeIssue({ + id: number, + owner: owner, + repo: repo + }); + }).catch(err => { + log(`Failed closing issue ${number}. Details: ${err.message}`); + }); + } + }) + }); +}