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);
|
|
}
|
|
}
|