woocommerce/plugins/woocommerce-admin/bin/changelog/zenhub/requests.js

101 lines
2.2 KiB
JavaScript

'use strict';
/* eslint no-console: 0 */
const ZenHub = require( 'zenhub-api' );
const { REPO, pkg } = require( '../config' );
const { authedGraphql } = require( '../common' );
const { pull } = require( 'lodash' );
const api = new ZenHub( pkg.changelog.zhApiToken );
const getQuery = ( before ) => {
const [ owner, repo ] = REPO.split( '/' );
const paging = before ? `, before: "${ before }"` : '';
const query = `
{
repository(owner: "${ owner }", name: "${ repo }") {
pullRequests(last: 100, states: [MERGED]${ paging }) {
totalCount
pageInfo {
startCursor
}
nodes {
number
title
url
author {
login
}
body
labels(last: 10) {
nodes {
name
}
}
}
}
}
}
`;
return query;
};
const fetchAllIssuesForRelease = async ( releaseId ) => {
const releaseIssues = await api.getReleaseReportIssues( {
release_id: releaseId,
} );
return releaseIssues.map( ( releaseIssue ) => releaseIssue.issue_number );
};
const extractPullRequestsMatchingReleaseIssue = (
releaseIds,
pullRequests
) => {
return pullRequests.filter( ( pullRequest ) => {
const hasPullRequest = releaseIds.includes( pullRequest.number );
if ( hasPullRequest ) {
pull( releaseIds, pullRequest.number );
return true;
}
return false;
} );
};
const fetchAllPullRequests = async ( releaseId ) => {
// first get all release issue ids
const releaseIds = await fetchAllIssuesForRelease( releaseId );
let maxPages = Math.ceil( releaseIds.length / 100 ) + 2;
const fetchResults = async ( before ) => {
const query = getQuery( before );
const results = await authedGraphql( query );
const pullRequests = extractPullRequestsMatchingReleaseIssue(
releaseIds,
results.repository.pullRequests.nodes
);
if ( maxPages === 0 ) {
return pullRequests;
}
maxPages--;
const nextResults = await fetchResults(
results.repository.pullRequests.pageInfo.startCursor
);
return pullRequests.concat(
extractPullRequestsMatchingReleaseIssue( releaseIds, nextResults )
);
};
let results = [];
try {
results = await fetchResults();
} catch ( e ) {
console.log( e.request );
console.log( e.message );
console.log( e.data );
}
return results;
};
module.exports = {
fetchAllPullRequests,
};