in webhooks/tasks/repository.ts [20:114]
async run(operations: Operations, organization: Organization, data: any): Promise<boolean> {
const event = data.body;
const queryCache = operations.providers.queryCache;
let update = false;
let addOrUpdateRepositoryQueryCache = false;
let isNewOrTransferred = false;
let transferSourceLogin: string = null;
const action = event.action;
const organizationId = event.organization.id as number;
if (!operations.isOrganizationManagedById(organizationId)) {
console.log(`skipping organization ID ${organizationId} which is not directly managed: ${event.organization.login}`);
return true;
}
if (action === 'created' || action === 'transferred') {
console.log(`repo ${action}: ${event.repository.full_name} ${event.repository.private === 'private' ? 'private' : 'public'} by ${event.sender.login}`);
addOrUpdateRepositoryQueryCache = true;
isNewOrTransferred = true;
update = true;
if (action === 'transferred') {
transferSourceLogin = (event?.changes?.owner?.from?.user?.login) || (event?.changes?.owner?.from?.organization?.login);
}
} else if (action === 'deleted') {
console.log(`repo DELETED: ${event.repository.full_name} ${event.repository.private === 'private' ? 'private' : 'public'} by ${event.sender.login}`);
update = true;
const repositoryIdAsString = event.repository.id.toString();
const organizationIdAsString = event.organization.id.toString();
try {
if (organizationIdAsString === organization.id.toString() && queryCache && queryCache.supportsOrganizationMembership) {
// TODO: Verify what happens to forks...
await queryCache.removeRepository(organizationIdAsString, repositoryIdAsString);
}
} catch (queryCacheError) {
console.dir(queryCacheError);
}
} else if (action === 'publicized') {
console.log('a repo went public!');
addOrUpdateRepositoryQueryCache = true;
} else if (action === 'privatized') {
addOrUpdateRepositoryQueryCache = true;
} else if (action === 'edited') {
addOrUpdateRepositoryQueryCache = true;
} else if (action === 'renamed') {
addOrUpdateRepositoryQueryCache = true;
} else if (action === 'archived') {
addOrUpdateRepositoryQueryCache = true;
} else if (action === 'unarchived') {
addOrUpdateRepositoryQueryCache = true;
} else {
console.log(`repository event not being intercepted: ${action}`);
}
if (addOrUpdateRepositoryQueryCache) {
const repositoryIdAsString = event.repository.id.toString();
const organizationIdAsString = event.organization.id.toString();
try {
if (organizationIdAsString === organization.id.toString() && queryCache && queryCache.supportsOrganizationMembership) {
// FYI: forked repositories do not cause upstream org hooks to fire, but
// by protecting against the org ID being the same as the webhook, we make
// sure to not cause confusion in the query cache
await queryCache.addOrUpdateRepository(organizationIdAsString, repositoryIdAsString, event.repository);
}
} catch (queryCacheError) {
console.dir(queryCacheError);
}
}
if (update) {
// CONSIDER: When to update the entire org list? operations.getRepos() would be cross-org
// organization.getRepositories(immediateRefreshOptions, () => {
// console.log('refreshed repos list after ADD');
// const crossOrgRefreshOptions = {
// backgroundRefresh: false,
// maxAgeSeconds: 15,
// };
// operations.getRepos(crossOrgRefreshOptions, () => {
// console.log('refreshed cross-org repos list with 15s buffer');
// });
// });
}
if (isNewOrTransferred && event.sender.login && event.sender.id && organization.isNewRepositoryLockdownSystemEnabled()) {
try {
const repository = organization.repository(event.repository.name, event.repository);
const repositoryMetadataProvider = getRepositoryMetadataProvider(organization.operations);
const lockdownSystem = new NewRepositoryLockdownSystem({ operations, organization, repository, repositoryMetadataProvider });
const wasLockedDown = await lockdownSystem.lockdownIfNecessary(action, event.sender.login, event.sender.id, transferSourceLogin);
console.log(wasLockedDown ?
`${organization.name} uses the new repository lockdown system and the new ${repository.name} repository ${action} by ${event.sender.login} was locked down` :
`No lockdown on new repository ${repository.name}, ${action} by ${event.sender.login}, even though the organization ${organization.name} supports and has enabled the system`);
} catch (lockdownSystemError) {
console.warn('lockdownSystemError:');
console.dir(lockdownSystemError);
}
}
// Immediately delete the ticket
return true;
}