diff --git a/db/members.go b/db/members.go index 85b93c5..62476fc 100644 --- a/db/members.go +++ b/db/members.go @@ -67,3 +67,34 @@ func SaveTeamMembers(orgID, teamID uint64, members []uint64) { panic(err) } } + +func SaveTeamRepos(orgID, teamID uint64, repos []uint64) { + defer measure("SaveTeamRepos", time.Now()) + tx := db.MustBegin() + + var ids = []string{} + for _, id := range repos { + ids = append(ids, strconv.FormatUint(id, 10)) + } + tx.MustExec(fmt.Sprintf(` + delete from team_repos + where + org_id = %d and + team_id = %d and + repo_id not in (%s) + `, orgID, teamID, strings.Join(ids, ", "))) + + var values = []string{} + for _, id := range repos { + values = append(values, fmt.Sprintf("(%d, %d, %d)", orgID, teamID, id)) + } + tx.MustExec(` + insert into team_repos (org_id, team_id, repo_id) + values ` + strings.Join(values, ", ") + ` + on duplicate key update org_id = org_id + `) + + if err := tx.Commit(); err != nil { + panic(err) + } +} diff --git a/task/sync.go b/task/sync.go index 4494e23..b33eea1 100644 --- a/task/sync.go +++ b/task/sync.go @@ -128,6 +128,7 @@ func SyncOrgTeams(token string, org *db.Org) (err error) { OrgID: org.ID, } go SyncTeamMembers(token, t) + go SyncTeamRepos(token, t) t.Save() } if opt.Page >= resp.LastPage { @@ -192,3 +193,30 @@ func SyncTeamMembers(token string, team *db.Team) (err error) { return } + +func SyncTeamRepos(token string, team *db.Team) (err error) { + defer report("SyncTeamRepos", time.Now()) + client := newGithubClient(token) + opt := &github.ListOptions{PerPage: 100} + + var ids = []uint64{} + for { + opt.Page++ + var repos []github.Repository + var resp *github.Response + if repos, resp, err = client.Organizations.ListTeamRepos(int(team.ID), opt); err != nil { + return + } + saveResponseMeta(token, resp) + + for _, repo := range repos { + ids = append(ids, uint64(*repo.ID)) + } + if opt.Page >= resp.LastPage { + break + } + } + db.SaveTeamRepos(team.OrgID, team.ID, ids) + + return +}