Skip to content

Commit

Permalink
feat: refactored for teams api
Browse files Browse the repository at this point in the history
  • Loading branch information
olivercodes committed Aug 11, 2022
1 parent 60da891 commit f0a551c
Show file tree
Hide file tree
Showing 4 changed files with 8,949 additions and 126 deletions.
28 changes: 18 additions & 10 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,22 @@ const core = require('@actions/core');
const github = require('@actions/github');
const {getUserIsApprover} = require('./lib/helpers');

try {
const actor = github.context.actor;
const isApprover = getUserIsApprover(actor, '.');
if (!isApprover) {
core.setFailed(`${actor} is not an approver. Please check your OWNERS file.`)
} else {
return true;
(async () => {

// const actor = 'username';
// const repo = 'repo';
// const org = 'org';
const { actor, repo, org } = github.context;
try {
const isApprover = await getUserIsApprover(org, repo, actor);
if (!isApprover) {
core.setFailed(`${actor} is not an approver`);
} else return true
} catch (error) {
core.setFailed(error.message);
}
} catch (error) {
core.setFailed(error.message);
}
console.log(isApprover);


})();

76 changes: 39 additions & 37 deletions lib/helpers.js
Original file line number Diff line number Diff line change
@@ -1,51 +1,53 @@
const yaml = require('js-yaml');
const fs = require('fs');
const github = require('@actions/github');
const path = require('path');

function getOwners(path) {
const ownersFile = fs.readFileSync(path + '/OWNERS');
const obj = yaml.load(ownersFile, {encoding: 'utf-8'});
return obj;
const {Octokit} = require('@octokit/action')
const octokit = new Octokit();

function uniq(a) {
return [...new Set(a)];
}

function getOwnersAliases(path) {
const aliasesFile = fs.readFileSync(path + '/OWNERS_ALIASES');
return yaml.load(aliasesFile, {encoding: 'utf-8'});
function teamHasWrite(permission) {
return permission == 'push';
}

function getApprovers(owners) {
if (!owners.approvers) {
throw new Error('no approvers');
} else if (owners.approvers.length <= 0) {
throw new Error('approvers is empty');
}
return owners.approvers
async function getTeamUsers(team) {
const {data} = await octokit.request('GET /orgs/{org}/teams/{team_slug}/members', {
org: 'ThoughtWorks-DPS',
team_slug: team
});

return Promise.resolve(data.map(user => user.login));
}

function getUsersOfAlias(ownersAliases, alias) {
if (!ownersAliases.aliases) {
throw new Error('no aliases');
} // TODO - return error if alias does not exist
return ownersAliases.aliases[alias];

async function getRepoTeams(org, repo) {
const {data} = await octokit.request('GET /repos/{org}/{repo}/teams', {
org: org,
repo: repo
});

return Promise.resolve(data
.filter(team => teamHasWrite(team.permission))
.map(team => team.name)
);
}

function getUserIsApprover(user, workspace) {
const aliases = getOwnersAliases(workspace);
const owners = getOwners(workspace);
const approvers = getApprovers(owners);
const usersThatCanApprove = approvers
.map(alias => getUsersOfAlias(aliases, alias))
.reduce((acc, arr) => acc.concat(arr))
return usersThatCanApprove.indexOf(user) > -1;
async function getUserIsApprover(org, repo, user) {
const repoTeams = await getRepoTeams(org, repo);
teamsArrays = await Promise.all(
repoTeams.map(team => getTeamUsers(team))
);

const allApprovingUsers = teamsArrays
.reduce((acc, arr) => acc.concat(arr));

const uniqSetApprovingUsers = uniq(allApprovingUsers);

return uniqSetApprovingUsers.indexOf(user) != -1;
}


module.exports = {
getOwners: getOwners,
getOwnersAliases: getOwnersAliases,
getApprovers: getApprovers,
getUsersOfAlias: getUsersOfAlias,
getUserIsApprover: getUserIsApprover,
getUserIsApprover: getUserIsApprover
}


Expand Down
Loading

0 comments on commit f0a551c

Please sign in to comment.