Skip to content

Commit

Permalink
Merge pull request #17 from Hollywood/fix-member-removal-issue
Browse files Browse the repository at this point in the history
Initial method to detect repo creator removal
  • Loading branch information
Jon Cardona committed Jun 28, 2018
2 parents bd5fccf + 0cc967f commit 1bcf5a6
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 17 deletions.
56 changes: 40 additions & 16 deletions lib/RemoveOutsideCollaborators.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,19 @@ const yaml = require('js-yaml')
const noOrgConfig = false

class RemoveOutsideCollaborators {
static analyze (github, repo, payload, logger) {

static analyze(github, repo, payload, logger) {
const defaults = require('./defaults')
const orgRepo = (process.env.ORG_WIDE_REPO_NAME) ? process.env.ORG_WIDE_REPO_NAME : defaults.ORG_WIDE_REPO_NAME
const filename = (process.env.FILE_NAME) ? process.env.FILE_NAME : defaults.FILE_NAME

return github.repos.getContent({
owner: repo.owner,
repo: orgRepo,
path: filename
}).catch(() => ({
noOrgConfig
}))
owner: repo.owner,
repo: orgRepo,
path: filename
}).catch(() => ({
noOrgConfig
}))
.then((orgConfig) => {
if ('noOrgConfig' in orgConfig) {
return new RemoveOutsideCollaborators(github, repo, payload, logger, '').update()
Expand All @@ -24,15 +25,21 @@ class RemoveOutsideCollaborators {
})
}

constructor (github, repo, payload, logger, config) {
constructor(github, repo, payload, logger, config) {
this.github = github
this.repo = repo
this.payload = payload
this.logger = logger
this.config = yaml.safeLoad(config)
}

update () {
update() {
if (this.isRepoAddedByOrgMember(this.payload)) return

this.executeWorkflow()
}

executeWorkflow() {
var configParams = Object.assign({}, require('./defaults'), this.config || {})

if (this.isRemoveCollaboratorsDisabled(configParams.enableCollaboratorRemoval, configParams.monitorOnly)) return
Expand All @@ -46,39 +53,56 @@ class RemoveOutsideCollaborators {
return this.executeMonitorOnly(configParams)
}

isRemoveCollaboratorsDisabled (enableCollaboratorRemoval, monitorOnly) {
async isRepoAddedByOrgMember() {
var isMember = false
const orgParams = {
org: this.payload.organization.login,
username: this.payload.member.login
}
const toOrgParams = Object.assign({}, orgParams || {})

this.github.orgs.checkMembership(toOrgParams).then(({
data
}) => {
return isMember === 'pending' ? false : true
}).catch(() => {
this.executeWorkflow()
})
}

isRemoveCollaboratorsDisabled(enableCollaboratorRemoval, monitorOnly) {
if (this.payload.action === 'added' && !enableCollaboratorRemoval && !monitorOnly) {
return true
}
return false
}

isExcludedCollaborator (excludeCollaborators) {
isExcludedCollaborator(excludeCollaborators) {
if (excludeCollaborators.includes(this.payload.member.login)) {
return true
}
return false
}

executeRemoval (configParams) {
executeRemoval(configParams) {
var issueBody = this.formIssueBody(`<h3 align="center">${configParams.removedIssueBody}</h3>`, configParams.ccList)
this.createIssue(configParams.removedIssueTitle, issueBody)
this.removeCollaborator()
}

executeMonitorOnly (configParams) {
executeMonitorOnly(configParams) {
var issueBody = this.formIssueBody(`<h3 align="center">${configParams.monitorIssueBody}</h3>`, configParams.ccList)
this.createIssue(configParams.monitorIssueTitle, issueBody)
}

formIssueBody (body, ccList) {
formIssueBody(body, ccList) {
const owner = this.payload.sender.login
var issueBody = body + `\n\n<p align="center">Collaborator added: <strong>${owner}</strong></p>\n\n---`
issueBody += (ccList) ? `\n\n<h6 align="center">/cc ${ccList}</h6>` : ''
return issueBody
}

createIssue (title, body) {
createIssue(title, body) {
const issueParams = {
title: title,
body: body
Expand All @@ -87,7 +111,7 @@ class RemoveOutsideCollaborators {
this.github.issues.create(createIssueParams)
}

removeCollaborator () {
removeCollaborator() {
const removeParams = {
owner: this.payload.repository.owner.login,
repo: this.repo.repo,
Expand Down
11 changes: 10 additions & 1 deletion test/lib/plugins/RemoveOutsideCollaborators.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ describe('removeOutsideCollaborators', () => {
return new RemoveOutsideCollaborators(github, {owner: 'Hollywood', repo: 'test', username: 'Usr45'}, payload, console, yaml)
}

let payloadRemoveCollaborator = { action: 'added', member: { login: 'Usr45' }, repository: { name: 'test', owner: { login: 'Usr45' } }, sender: { login: 'Usr45' } }
let payloadRemoveCollaborator = { action: 'added', member: { login: 'Usr45' }, repository: { name: 'test', owner: { login: 'Usr45' } }, organization: { login: 'Albatoss'}, sender: { login: 'Usr45' } }

beforeEach(() => {
github = {
Expand All @@ -17,6 +17,9 @@ describe('removeOutsideCollaborators', () => {
},
issues: {
create: jest.fn().mockImplementation(() => Promise.resolve([]))
},
orgs: {
getOrgMembership: jest.fn().mockImplementation(() => Promise.resolve([]))
}
}
})
Expand All @@ -26,14 +29,20 @@ describe('removeOutsideCollaborators', () => {
var spyMonitorOnly

beforeEach(() => {
spyIsOrgMember = jest.spyOn(RemoveOutsideCollaborators.prototype, 'isRepoAddedByOrgMember')
spyExecuteRemoval = jest.spyOn(RemoveOutsideCollaborators.prototype, 'executeRemoval')
spyMonitorOnly = jest.spyOn(RemoveOutsideCollaborators.prototype, 'executeMonitorOnly')
})
afterEach(function () {
spyIsOrgMember.mockClear()
spyExecuteRemoval.mockClear()
spyMonitorOnly.mockClear()
})

it('repo created by an org member', () => {
expect(spyExecuteRemoval).not.toHaveBeenCalled()
})

it('added and enableCollaboratorRemoval is disabled', () => {
const config = configure(payloadRemoveCollaborator, `
monitorOnly: true
Expand Down

0 comments on commit 1bcf5a6

Please sign in to comment.