require('dotenv').config() 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 = {} 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); });