Move Gitea code into separate file

This commit is contained in:
galfert 2020-12-30 18:54:56 +01:00
parent 49717e4205
commit ea15a41609
No known key found for this signature in database
GPG Key ID: 942831AA5471AB49
2 changed files with 101 additions and 88 deletions

View File

@ -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);
});

93
lib/gitea-reviews.js Normal file
View File

@ -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;
}
}