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"}} +
  • + + {{.FullName}} + {{.DisplayVintage}} +
  • +{{end}} + +{{define "body"}} + +{{if .ReposError}} + {{.ReposError}} +{{else}} + {{len .Repos.AllRepos}} from {{len .Repos.OtherUserRepos}} other users and {{len .Repos.OrgRepos}} organizations + +
    +

    + + {{.User.Login}} +

    + +
    + + {{range .Repos.OtherUserRepos}} +
    +

    + {{.User.Login}} +

    + +
    + {{end}} + + {{range .Repos.OrgRepos}} +
    +

    + {{.Org.Login}} +

    + +
    + {{end}} + +{{end}} + +{{end}} diff --git a/app/templates/users-admin.html b/app/templates/users-admin.html index 17fe8ec..66b1fad 100644 --- a/app/templates/users-admin.html +++ b/app/templates/users-admin.html @@ -5,7 +5,7 @@
    - {{.TotalUsers}} users with {{.TotalRepos}} repositories. + {{len .Users}} users.
    @@ -15,14 +15,15 @@ - + + {{range .Users}} - + - + +
    Username Email FrequencyRepositoriesDigestRepos Account
    {{.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}} - ViewView