blob: 6f365492a0ac1dab17f1f0446827acb36aa69ba2 [file] [log] [blame]
// Copyright 2023 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:io';
import 'package:github/github.dart';
import 'cache.dart';
import 'utils.dart';
class TeamRoster {
TeamRoster(this.teams);
static Future<TeamRoster> load({
required final Directory cache,
required final GitHub github,
required final String orgName,
required final DateTime cacheEpoch,
}) async {
final roster = <String?, Map<String, User>>{};
final teamsData = await loadFromCache(
cache,
github,
<String>['org', orgName, 'teams'],
cacheEpoch,
() async {
final cacheData = StringBuffer();
await for (final Team team in github.organizations.listTeams(orgName)) {
verifyStringSanity(team.name!, const <String>{'\n', ' '});
cacheData.writeln('${team.name} ${team.id!}');
}
return cacheData.toString().trimRight();
},
);
Map<String, User> parseTeamData(final String teamData) {
final users = <String, User>{};
for (final line in teamData.split('\n')) {
if (line.isNotEmpty) {
final components = line.split(' ');
final member = User(
login: components[0],
id: int.parse(components[1]),
siteAdmin: components[2] == 'true',
htmlUrl: components[3],
avatarUrl: components[4],
);
users[member.login!] = member;
}
}
return users;
}
for (final teamLine in teamsData.split('\n')) {
final components = teamLine.split(' ');
final teamName = components[0];
final teamId = int.parse(components[1]);
final teamData = await loadFromCache(
cache,
github,
<String>['team', orgName, '$teamId'],
cacheEpoch,
() async {
final cacheData = StringBuffer();
await for (final TeamMember member
in github.organizations.listTeamMembers(teamId)) {
verifyStringSanity(member.login!, const <String>{'\n', ' '});
verifyStringSanity(member.htmlUrl!, const <String>{'\n', ' '});
verifyStringSanity(member.avatarUrl!, const <String>{'\n', ' '});
cacheData.writeln(
'${member.login} ${member.id!} ${member.siteAdmin} ${member.htmlUrl} ${member.avatarUrl}',
);
}
return cacheData.toString().trimRight();
},
);
roster[teamName] = parseTeamData(teamData);
}
final teamData = await loadFromCache(
cache,
github,
<String>['org', orgName, 'users'],
cacheEpoch,
() async {
final cacheData = StringBuffer();
await for (final User member in github.organizations.listUsers(
orgName,
)) {
verifyStringSanity(member.login!, const <String>{'\n', ' '});
verifyStringSanity(member.htmlUrl!, const <String>{'\n', ' '});
verifyStringSanity(member.avatarUrl!, const <String>{'\n', ' '});
cacheData.writeln(
'${member.login} ${member.id!} ${member.siteAdmin} ${member.htmlUrl} ${member.avatarUrl}',
);
}
return cacheData.toString().trimRight();
},
);
roster[null] = parseTeamData(teamData);
return TeamRoster(roster);
}
final Map<String?, Map<String, User>> teams;
}