46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // Imports
 | |
| import {assertNotMissingOrEmpty} from '../common/utils';
 | |
| import {GithubApi} from './github-api';
 | |
| 
 | |
| // Interfaces - Types
 | |
| interface Team {
 | |
|   id: number;
 | |
|   slug: string;
 | |
| }
 | |
| 
 | |
| interface TeamMembership {
 | |
|   state: string;
 | |
| }
 | |
| 
 | |
| // Classes
 | |
| export class GithubTeams extends GithubApi {
 | |
|   // Constructor
 | |
|   constructor(githubToken: string, protected organization: string) {
 | |
|     super(githubToken);
 | |
|     assertNotMissingOrEmpty('organization', organization);
 | |
|   }
 | |
| 
 | |
|   // Methods - Public
 | |
|   public fetchAll(): Promise<Team[]> {
 | |
|     return this.getPaginated<Team>(`/orgs/${this.organization}/teams`);
 | |
|   }
 | |
| 
 | |
|   public isMemberById(username: string, teamIds: number[]): Promise<boolean> {
 | |
|     const getMembership = (teamId: number) =>
 | |
|       this.get<TeamMembership>(`/teams/${teamId}/memberships/${username}`).
 | |
|         then(membership => membership.state === 'active').
 | |
|         catch(() => false);
 | |
|     const reduceFn = (promise: Promise<boolean>, teamId: number) =>
 | |
|       promise.then(isMember => isMember || getMembership(teamId));
 | |
| 
 | |
|     return teamIds.reduce(reduceFn, Promise.resolve(false));
 | |
|   }
 | |
| 
 | |
|   public isMemberBySlug(username: string, teamSlugs: string[]): Promise<boolean> {
 | |
|     return this.fetchAll().
 | |
|       then(teams => teams.filter(team => teamSlugs.includes(team.slug)).map(team => team.id)).
 | |
|       then(teamIds => this.isMemberById(username, teamIds)).
 | |
|       catch(() => false);
 | |
|   }
 | |
| }
 |