diff --git a/app/admin.go b/app/admin.go index 64f5883..eeb1c82 100644 --- a/app/admin.go +++ b/app/admin.go @@ -14,8 +14,6 @@ type AdminUserData struct { Account *Account User *github.User EmailAddress string - Repos *Repos - ReposError error } // sort.Interface implementation for sorting AdminUserDatas @@ -48,34 +46,25 @@ func usersAdminHandler(w http.ResponseWriter, r *http.Request) *AppError { emailAddress = err.Error() } - repos, reposErr := getRepos(c, githubClient, account, user) ch <- &AdminUserData{ Account: account, User: user, EmailAddress: emailAddress, - Repos: repos, - ReposError: reposErr, } }(&accounts[i]) } users := make([]*AdminUserData, 0) - totalRepos := 0 for _ = range accounts { select { case r := <-ch: users = append(users, r) - if r.Repos != nil { - totalRepos += len(r.Repos.AllRepos) - } } } sort.Sort(AdminUserDataByGitHubUserId(users)) var data = map[string]interface{}{ - "Users": users, - "TotalUsers": len(users), - "TotalRepos": totalRepos, + "Users": users, } return templates["users-admin"].Render(w, data) } @@ -109,6 +98,36 @@ func digestAdminHandler(w http.ResponseWriter, r *http.Request) *AppError { return templates["digest-admin"].Render(w, data) } +func reposAdminHandler(w http.ResponseWriter, r *http.Request) *AppError { + userId, err := strconv.Atoi(r.FormValue("user_id")) + if err != nil { + return BadRequest(err, "Malformed user_id value") + } + c := appengine.NewContext(r) + account, err := getAccount(c, userId) + if account == nil { + return BadRequest(err, "user_id does not point to an account") + } + if err != nil { + return InternalError(err, "Could not look up account") + } + + oauthTransport := githubOAuthTransport(c) + oauthTransport.Token = &account.OAuthToken + githubClient := github.NewClient(oauthTransport.Client()) + + user, _, err := githubClient.Users.Get("") + repos, reposErr := getRepos(c, githubClient, account, user) + + repos.Redact() + var data = map[string]interface{}{ + "User": user, + "Repos": repos, + "ReposError": reposErr, + } + return templates["repos-admin"].Render(w, data) +} + func deleteAccountAdminHandler(w http.ResponseWriter, r *http.Request) *AppError { userId, err := strconv.Atoi(r.FormValue("user_id")) if err != nil { diff --git a/app/digest.go b/app/digest.go index 6feb3f6..88724b7 100644 --- a/app/digest.go +++ b/app/digest.go @@ -316,6 +316,5 @@ func (digest *Digest) Redact() { commit.Message = "Redacted redacted redacted" } } - } } diff --git a/app/repos.go b/app/repos.go index a6527c1..0bd1715 100644 --- a/app/repos.go +++ b/app/repos.go @@ -167,6 +167,29 @@ type Repos struct { OldestVintage time.Time } +func (repos *Repos) Redact() { + for _, repo := range repos.UserRepos { + *repo.HTMLURL = "https://redacted" + *repo.FullName = "redacted/redacted" + } + for _, otherUserRepos := range repos.OtherUserRepos { + *otherUserRepos.User.Login = "redacted" + *otherUserRepos.User.AvatarURL = "https://redacted" + for _, repo := range otherUserRepos.Repos { + *repo.HTMLURL = "https://redacted" + *repo.FullName = "redacted/redacted" + } + } + for _, orgRepos := range repos.OrgRepos { + *orgRepos.Org.Login = "redacted" + *orgRepos.Org.AvatarURL = "https://redacted" + for _, repo := range orgRepos.Repos { + *repo.HTMLURL = "https://redacted" + *repo.FullName = "redacted/redacted" + } + } +} + type Repo struct { *github.Repository Vintage time.Time diff --git a/app/retrogit.go b/app/retrogit.go index 21d011a..e8c34be 100644 --- a/app/retrogit.go +++ b/app/retrogit.go @@ -58,6 +58,7 @@ func init() { router.Handle("/admin/users", AppHandler(usersAdminHandler)).Name("users-admin") router.Handle("/admin/digest", AppHandler(digestAdminHandler)).Name("digest-admin") + router.Handle("/admin/repos", AppHandler(reposAdminHandler)).Name("repos-admin") router.Handle("/admin/delete-account", AppHandler(deleteAccountAdminHandler)).Name("delete-account-admin") http.Handle("/", router) } diff --git a/app/templates/repos-admin.html b/app/templates/repos-admin.html new file mode 100644 index 0000000..ee2cc20 --- /dev/null +++ b/app/templates/repos-admin.html @@ -0,0 +1,58 @@ +{{define "title"}}Repos Admin{{end}} + +{{define "repo"}} +
| Username | Frequency | -Repositories | +Digest | +Repos | Account | {{range .Users}}|||
|---|---|---|---|---|---|---|---|---|
| {{.Account.GitHubUserId}} | +{{.Account.GitHubUserId}} | {{if .User}} {{template "user" .User}} @@ -32,13 +33,8 @@ | {{.EmailAddress}} | {{.Account.Frequency}} | -- {{if .ReposError}} - {{.ReposError}} - {{else}} - {{len .Repos.AllRepos}} from {{len .Repos.OtherUserRepos}} other users and {{len .Repos.OrgRepos}} organizations - {{end}} - | +View | +View |