From ea15a41609a3429618974a7e4c0a9c4d9e3498f0 Mon Sep 17 00:00:00 2001 From: Garret Alfert Date: Wed, 30 Dec 2020 18:54:56 +0100 Subject: [PATCH] Move Gitea code into separate file --- index.js | 96 ++++---------------------------------------- lib/gitea-reviews.js | 93 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 88 deletions(-) create mode 100644 lib/gitea-reviews.js diff --git a/index.js b/index.js index ebbd2b8..0ab2883 100644 --- a/index.js +++ b/index.js @@ -1,104 +1,24 @@ require('dotenv').config() +const GiteaReviews = require('./lib/gitea-reviews'); -const axios = require('axios'); - -const pageLimit = 50; const kreditsAmounts = { 'kredits-1': 100, 'kredits-2': 300, 'kredits-3': 1000 }; -const repos = require('./repos.json'); - -const gitea = axios.create({ - baseURL: 'https://gitea.kosmos.org/api/v1', - headers: { - 'accepts': 'application/json', - 'Authorization': `token ${process.env.GITEA_TOKEN}` - } -}); - // TODO get the dates from params or user input const startDate = new Date('2020-11-01T00:00:00Z'); const endDate = new Date('2020-12-30T23:59:59Z'); -async function getGiteaReviewContributions (repos) { - let pulls = []; - let reviewContributions = {} +const repos = require('./repos.json'); + +const giteaReviews = new GiteaReviews(process.env.GITEA_TOKEN, kreditsAmounts); + +giteaReviews.getReviewContributions(repos.gitea, startDate, endDate).then(reviewContributions => { + console.log('GITEA REVIEW CONTRIBUTIONS', reviewContributions); +}); - await Promise.all(repos.map(async (repo) => { - let page = 1; - let result; - do { - try { - result = await gitea.get(`/repos/${repo}/pulls?state=closed&limit=${pageLimit}&page=${page}`); - } catch(error) { - console.log(`failed to fetch PRs for repo ${repo}:`, error); - continue; - } - - if (!result || !result.data || result.data.length === 0) { - continue; - } - - let pullRequests = result.data.filter(pr => { - if (!pr.merged) return false; // only interested in merged PRs - - // check if the PR has been merged in the given timeframe - const mergeDate = new Date(pr.merged_at); - if (mergeDate < startDate || mergeDate > endDate) return false; - - // check if the PR has a kredits label - return pr.labels - .map(label => label.name) - .some(labelname => labelname.match(/kredits-[123]/)); - }); - - await Promise.all(pullRequests.map(async (pr) => { - let reviews; - try { - reviews = await gitea.get(`/repos/${repo}/pulls/${pr.number}/reviews`); - } catch(error) { - console.log(`failed to fetch reviews for repo ${repo}, PR ${pr.number}:`, error); - return; - } - - if (!reviews || !reviews.data || reviews.data.length === 0) { - return; - } - - reviews = reviews.data.filter(review => { - return ['APPROVED', 'REJECTED'].includes(review.state); - }); - - reviews.forEach(review => { - if (typeof reviewContributions[review.user.login] === 'undefined') { - reviewContributions[review.user.login] = []; - } - - let kreditsLabel = pr.labels.find(label => label.name.match(/kredits-[123]/)); - - reviewContributions[review.user.login].push({ - pr, - prNumber: pr.number, - review, - reviewState: review.state, - kredits: kreditsAmounts[kreditsLabel.name] - }); - - }); - })); - - page++; - } while (result.data && result.data.length > 0); - })); - - return reviewContributions; -} - -getGiteaReviewContributions(repos.gitea).then(reviewContributions => { - console.log('REVIEW CONTRIBUTIONS', reviewContributions); }); diff --git a/lib/gitea-reviews.js b/lib/gitea-reviews.js new file mode 100644 index 0000000..014be12 --- /dev/null +++ b/lib/gitea-reviews.js @@ -0,0 +1,93 @@ +const axios = require('axios'); + +module.exports = class GiteaReviews { + + client = null; + kreditsAmounts = null; + pageLimit = 50; + + constructor (token, kreditsAmounts) { + this.kreditsAmounts = kreditsAmounts; + + this.client = axios.create({ + baseURL: 'https://gitea.kosmos.org/api/v1', + headers: { + 'accepts': 'application/json', + 'Authorization': `token ${token}` + } + }); + } + + async getReviewContributions (repos, startDate, endDate) { + let pulls = []; + let reviewContributions = {} + + await Promise.all(repos.map(async (repo) => { + let page = 1; + let result; + + do { + try { + result = await this.client.get(`/repos/${repo}/pulls?state=closed&limit=${this.pageLimit}&page=${page}`); + } catch(error) { + console.log(`failed to fetch PRs for repo ${repo}:`, error.message); + continue; + } + + if (!result || !result.data || result.data.length === 0) { + continue; + } + + let pullRequests = result.data.filter(pr => { + if (!pr.merged) return false; // only interested in merged PRs + + // check if the PR has been merged in the given timeframe + const mergeDate = new Date(pr.merged_at); + if (mergeDate < startDate || mergeDate > endDate) return false; + + // check if the PR has a kredits label + return pr.labels.some(label => label.name.match(/kredits-[123]/)); + }); + + await Promise.all(pullRequests.map(async (pr) => { + let reviews; + try { + reviews = await this.client.get(`/repos/${repo}/pulls/${pr.number}/reviews`); + } catch(error) { + console.log(`failed to fetch reviews for repo ${repo}, PR ${pr.number}:`, error.message); + return; + } + + if (!reviews || !reviews.data || reviews.data.length === 0) { + return; + } + + reviews = reviews.data.filter(review => { + return ['APPROVED', 'REJECTED'].includes(review.state); + }); + + reviews.forEach(review => { + if (typeof reviewContributions[review.user.login] === 'undefined') { + reviewContributions[review.user.login] = []; + } + + let kreditsLabel = pr.labels.find(label => label.name.match(/kredits-[123]/)); + + reviewContributions[review.user.login].push({ + pr, + prNumber: pr.number, + review, + reviewState: review.state, + kredits: this.kreditsAmounts[kreditsLabel.name] + }); + }); + })); + + page++; + } while (result && result.data && result.data.length > 0); + })); + + return reviewContributions; + } + +}