async run()

in webhooks/tasks/team.ts [27:133]


  async run(operations: Operations, organization: Organization, data: any): Promise<boolean> {
    const queryCache = operations.providers.queryCache;
    const event = data.body;
    let refresh = false;
    let expectedAfterRefresh = false;
    const teamId = event.team.id;
    const teamIdAsString = event.team.id.toString();
    const organizationIdAsString = event.organization.id.toString();
    let addOrUpdate = false;
    if (event.action === 'created') {
      console.log(`team created: ${event.team.name} in organization ${event.organization.login} by ${event.sender.login}`);
      refresh = true;
      expectedAfterRefresh = true;
      addOrUpdate = true;
    } else if (event.action === 'deleted') {
      console.log(`team DELETED: ${event.team.name} in organization ${event.organization.login} by ${event.sender.login}`);
      refresh = true;
      try {
        if (organizationIdAsString === organization.id.toString() && queryCache && queryCache.supportsTeams) {
          await queryCache.removeOrganizationTeam(organizationIdAsString, teamIdAsString);
        }
      } catch (queryCacheError) {
        console.dir(queryCacheError);
      }
    } else if (event.action === 'edited') {
      addOrUpdate = true;
      if (event.changes && event.changes.repository && event.changes.repository.permissions && event.changes.repository.permissions.from && queryCache && queryCache.supportsTeamPermissions) {
        const oldRepositoryPermissionLevel = permissionsObjectToValue(event.changes.repository.permissions.from);
        const newRepositoryPermissionLevel = permissionsObjectToValue(event.repository.permissions);
        console.log(`team ${event.team.name} permission level for repo ${event.repository.name} changed from ${oldRepositoryPermissionLevel} to ${newRepositoryPermissionLevel}`);
        const isPrivate = event.repository.private as boolean;
        const repoName = event.repository.name as string;
        const orgId = event.repository.owner.id as number;
        if (operations.isOrganizationManagedById(orgId)) {
          await queryCache.addOrUpdateTeamsPermission(
            organizationIdAsString,
            event.repository.id.toString(),
            isPrivate,
            repoName,
            event.team.id.toString(),
            newRepositoryPermissionLevel);
        }
      }
    } else if (event.action === 'added_to_repository') {
      console.log(`team got permission to repo: ${event.team.name} for repo ${event.repository.name} in organization ${event.organization.login} by ${event.sender.login}`);
      if (queryCache && queryCache.supportsTeamPermissions) {
        const isPrivate = event.repository.private as boolean;
        const repoName = event.repository.name as string;
        const orgId = event.repository.owner.id as number;
        if (operations.isOrganizationManagedById(orgId)) {
          await queryCache.addOrUpdateTeamsPermission(
            organizationIdAsString,
            event.repository.id.toString(),
            isPrivate,
            repoName,
            event.team.id.toString(),
            permissionsObjectToValue(event.repository.permissions)); // equiv to event.team.permission as GitHubRepositoryPermission
        }
      }
    } else if (event.action === 'removed_from_repository') {
      console.log(`team lost permission to repo: ${event.team.name} for repo ${event.repository.name} in organization ${event.organization.login} by ${event.sender.login}`);
      if (queryCache && queryCache.supportsTeamPermissions) {
        await queryCache.removeRepositoryTeam(organizationIdAsString, event.team.id.toString(), event.repository.id.toString());
      }
    } else {
      console.log('other team condition:');
      console.dir(data);
    }

    if (addOrUpdate) {
      try {
        if (organizationIdAsString === organization.id.toString() && queryCache && queryCache.supportsTeams) {
          await queryCache.addOrUpdateTeam(organizationIdAsString, teamIdAsString, event.team);
        }
      } catch (queryCacheError) {
        console.dir(queryCacheError);
      }
    }

    if (refresh) {
      const startingRefresh = moment();
      // organization.getTeams(immediateRefreshOptions, () => {
      //   console.log('refreshing teams list after add or remove operations');
      //   const now = moment();
      //   const elapsedSeconds = Math.ceil(moment.duration(now.diff(startingRefresh)).asSeconds());
      //   console.log(`elapsed seconds since kicked off the refresh: ${elapsedSeconds}`);
      //   const crossOrgRefreshOptions = {
      //     backgroundRefresh: false,
      //     maxAgeSeconds: elapsedSeconds || 15,
      //   };
      //   operations.getTeams(null, crossOrgRefreshOptions, (crossOrgRefreshError, allTeams) => {
      //     if (crossOrgRefreshError) {
      //       console.log('cross-org team refresh encountered an error:');
      //       console.dir(crossOrgRefreshError);
      //     } else {
      //       console.log(`refreshed cross-org teams list with ${elapsedSeconds} seconds buffer`);
      //       if (expectedAfterRefresh && allTeams.has(teamId)) {
      //         console.log('Verified that the team ' + teamId + ' was present in the cross-org result');
      //       }
      //     }
      //   });
      // });
    }

    // Immediately, to help delete the ticket
    return true;
  }