From 1cb55cfe6afbf839933f081869f6de88907ef8e3 Mon Sep 17 00:00:00 2001 From: Mihai Parparita Date: Sun, 31 Aug 2014 15:22:19 -0700 Subject: [PATCH] Add option to control which repositories are included in the digest. --- app/account.go | 10 ++++++++++ app/digest.go | 4 ++-- app/githop.go | 38 ++++++++++++++++++++++++++++++------- app/repos.go | 19 ++++++++++++------- app/templates/settings.html | 23 ++++++++++++++-------- 5 files changed, 70 insertions(+), 24 deletions(-) diff --git a/app/account.go b/app/account.go index 1675a15..20c3633 100644 --- a/app/account.go +++ b/app/account.go @@ -19,6 +19,7 @@ type Account struct { OAuthToken oauth.Token `datastore:"-,"` TimezoneName string `datastore:",noindex"` TimezoneLocation *time.Location `datastore:"-,"` + ExcludedRepoIds []int `datastore:",noindex"` } func getAccount(c appengine.Context, githubUserId int) (*Account, error) { @@ -66,6 +67,15 @@ func getAllAccountGithubUserIds(c appengine.Context) ([]int, error) { return result, nil } +func (account *Account) IsRepoIdExcluded(repoId int) bool { + for i := range account.ExcludedRepoIds { + if account.ExcludedRepoIds[i] == repoId { + return true + } + } + return false +} + func (account *Account) put(c appengine.Context) error { w := new(bytes.Buffer) err := gob.NewEncoder(w).Encode(&account.OAuthToken) diff --git a/app/digest.go b/app/digest.go index fe6c4d5..f65dfe8 100644 --- a/app/digest.go +++ b/app/digest.go @@ -133,7 +133,7 @@ func newDigest(c appengine.Context, githubClient *github.Client, account *Accoun return nil, err } - repos, err := getRepos(c, githubClient, user) + repos, err := getRepos(c, githubClient, account, user) if err != nil { return nil, err } @@ -151,7 +151,7 @@ func newDigest(c appengine.Context, githubClient *github.Client, account *Accoun // Only look at repos that may have activity in the digest interval. var intervalRepos []*Repo for _, repo := range repos.AllRepos { - if repo.Vintage.Before(digestEndTime) && repo.PushedAt != nil && + if repo.IncludeInDigest && repo.Vintage.Before(digestEndTime) && repo.PushedAt != nil && repo.PushedAt.After(digestStartTime) { intervalRepos = append(intervalRepos, repo) } diff --git a/app/githop.go b/app/githop.go index 7501307..f14fbaa 100644 --- a/app/githop.go +++ b/app/githop.go @@ -49,8 +49,8 @@ func init() { router.HandleFunc("/digest/send", sendDigestHandler).Name("send-digest").Methods("POST") router.HandleFunc("/digest/cron", digestCronHandler) - router.HandleFunc("/account/settings", settingsHandler).Name("settings") - router.HandleFunc("/account/set-timezone", setTimezoneHandler).Name("set-timezone").Methods("POST") + router.HandleFunc("/account/settings", settingsHandler).Name("settings").Methods("GET") + router.HandleFunc("/account/settings", saveSettingsHandler).Name("save-settings").Methods("POST") router.HandleFunc("/admin/digest", digestAdminHandler) http.Handle("/", router) @@ -374,7 +374,7 @@ func settingsHandler(w http.ResponseWriter, r *http.Request) { return } - repos, err := getRepos(c, githubClient, user) + repos, err := getRepos(c, githubClient, account, user) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -391,7 +391,7 @@ func settingsHandler(w http.ResponseWriter, r *http.Request) { } } -func setTimezoneHandler(w http.ResponseWriter, r *http.Request) { +func saveSettingsHandler(w http.ResponseWriter, r *http.Request) { session, _ := sessionStore.Get(r, sessionConfig.CookieName) userId := session.Values[sessionConfig.UserIdKey].(int) c := appengine.NewContext(r) @@ -400,6 +400,21 @@ func setTimezoneHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } + oauthTransport := githubOAuthTransport(c) + oauthTransport.Token = &account.OAuthToken + githubClient := github.NewClient(oauthTransport.Client()) + + user, _, err := githubClient.Users.Get("") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + repos, err := getRepos(c, githubClient, account, user) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } timezoneName := r.FormValue("timezone_name") _, err = time.LoadLocation(timezoneName) @@ -407,16 +422,25 @@ func setTimezoneHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - account.TimezoneName = timezoneName + + account.ExcludedRepoIds = make([]int, 0) + for _, repo := range repos.AllRepos { + repoId := *repo.ID + _, included := r.Form[fmt.Sprintf("repo-%d", repoId)] + if !included { + account.ExcludedRepoIds = append(account.ExcludedRepoIds, repoId) + } + } + err = account.put(c) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - indexUrl, _ := router.Get("index").URL() - http.Redirect(w, r, indexUrl.String(), http.StatusFound) + settingsUrl, _ := router.Get("settings").URL() + http.Redirect(w, r, settingsUrl.String(), http.StatusFound) } func digestAdminHandler(w http.ResponseWriter, r *http.Request) { diff --git a/app/repos.go b/app/repos.go index f95e167..9fabbf4 100644 --- a/app/repos.go +++ b/app/repos.go @@ -159,11 +159,16 @@ type Repos struct { type Repo struct { *github.Repository - Vintage time.Time + Vintage time.Time + IncludeInDigest bool } -func newRepo(githubRepo *github.Repository) *Repo { - return &Repo{githubRepo, githubRepo.CreatedAt.UTC()} +func newRepo(githubRepo *github.Repository, account *Account) *Repo { + return &Repo{ + Repository: githubRepo, + Vintage: githubRepo.CreatedAt.UTC(), + IncludeInDigest: !account.IsRepoIdExcluded(*githubRepo.ID), + } } func (repo *Repo) TypeAsOcticonName() string { @@ -200,7 +205,7 @@ type OrgRepos struct { Repos []*Repo } -func getRepos(c appengine.Context, githubClient *github.Client, user *github.User) (*Repos, error) { +func getRepos(c appengine.Context, githubClient *github.Client, account *Account, user *github.User) (*Repos, error) { // The username parameter must be left blank so that we can get all of the // repositories the user has access to, not just ones that they own. clientUserRepos, _, err := githubClient.Repositories.List("", nil) @@ -215,7 +220,7 @@ func getRepos(c appengine.Context, githubClient *github.Client, user *github.Use for i := range clientUserRepos { ownerID := *clientUserRepos[i].Owner.ID if ownerID == *user.ID { - repos.UserRepos = append(repos.UserRepos, newRepo(&clientUserRepos[i])) + repos.UserRepos = append(repos.UserRepos, newRepo(&clientUserRepos[i], account)) } else { var userRepos *UserRepos for j := range repos.OtherUserRepos { @@ -231,7 +236,7 @@ func getRepos(c appengine.Context, githubClient *github.Client, user *github.Use } repos.OtherUserRepos = append(repos.OtherUserRepos, userRepos) } - userRepos.Repos = append(userRepos.Repos, newRepo(&clientUserRepos[i])) + userRepos.Repos = append(userRepos.Repos, newRepo(&clientUserRepos[i], account)) } } @@ -251,7 +256,7 @@ func getRepos(c appengine.Context, githubClient *github.Client, user *github.Use orgRepos := make([]*Repo, 0, len(clientOrgRepos)) allRepoCount += len(clientOrgRepos) for j := range clientOrgRepos { - orgRepos = append(orgRepos, newRepo(&clientOrgRepos[j])) + orgRepos = append(orgRepos, newRepo(&clientOrgRepos[j], account)) } repos.OrgRepos = append(repos.OrgRepos, &OrgRepos{org, orgRepos}) } diff --git a/app/templates/settings.html b/app/templates/settings.html index 7504865..301ffe9 100644 --- a/app/templates/settings.html +++ b/app/templates/settings.html @@ -2,16 +2,22 @@ {{define "repo"}}
  • - - {{.FullName}} - {{.DisplayVintage}} +
  • {{end}} {{define "body"}} +
    +

    - +

    - You have {{len .Repos.AllRepos}} repositories: + You have {{len .Repos.AllRepos}} repositories. Select which you would like to include in your digest:

    @@ -71,5 +75,8 @@
    {{end}} + + + {{end}}