From 1bc9d533255b846f2637d50ae941317dbeccb6c8 Mon Sep 17 00:00:00 2001
From: Mihai Parparita
Date: Tue, 29 Jul 2014 22:52:36 -0700
Subject: [PATCH] Send single email button.
---
TODO | 2 +-
app/githop.go | 70 ++++++++++++++++++++++++++++++++++++++--
app/templates/index.html | 4 +++
3 files changed, 72 insertions(+), 4 deletions(-)
diff --git a/TODO b/TODO
index 871e785..073af08 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
TODO
- Break up indexHandler
-- Single email sending button
+- Flash message when sending a single email
- Loop over registered accounts and send them email
- Flash message and sign out when OAuth token has expired/is invalid
- Handle pagination for user repository list
diff --git a/app/githop.go b/app/githop.go
index 3423821..50176dc 100644
--- a/app/githop.go
+++ b/app/githop.go
@@ -1,6 +1,7 @@
package githop
import (
+ "bytes"
"encoding/json"
"html/template"
"io/ioutil"
@@ -8,6 +9,7 @@ import (
"net/http"
"appengine"
+ "appengine/mail"
"appengine/urlfetch"
"code.google.com/p/goauth2/oauth"
@@ -35,7 +37,7 @@ func initGithubOAuthConfig() {
if err != nil {
log.Panicf("Could not parse GitHub OAuth config %s: %s", configBytes, err.Error())
}
- githubOauthConfig.Scope = "repo"
+ githubOauthConfig.Scope = "repo, user:email"
githubOauthConfig.AuthURL = "https://github.com/login/oauth/authorize"
githubOauthConfig.TokenURL = "https://github.com/login/oauth/access_token"
}
@@ -46,6 +48,7 @@ func init() {
router = mux.NewRouter()
router.HandleFunc("/", indexHandler).Name("index")
+ router.HandleFunc("/digest/send", sendDigestHandler).Name("send-digest").Methods("POST")
router.HandleFunc("/session/sign-in", signInHandler).Name("sign-in")
router.HandleFunc("/session/sign-out", signOutHandler).Name("sign-out")
router.HandleFunc("/github/callback", githubOAuthCallbackHandler)
@@ -100,15 +103,76 @@ func indexHandler(w http.ResponseWriter, r *http.Request) {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
signOutUrl, _ := router.Get("sign-out").URL()
+ sendDigestUrl, _ := router.Get("send-digest").URL()
var data = map[string]interface{}{
- "SignOutUrl": signOutUrl.String(),
- "Digest": digest,
+ "SignOutUrl": signOutUrl.String(),
+ "SendDigestUrl": sendDigestUrl.String(),
+ "Digest": digest,
}
if err := templates.ExecuteTemplate(w, "index", data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
+func sendDigestHandler(w http.ResponseWriter, r *http.Request) {
+ session, _ := sessionStore.Get(r, sessionConfig.CookieName)
+ userId := session.Values[sessionConfig.UserIdKey].(int)
+ c := appengine.NewContext(r)
+ account, err := getAccount(c, userId)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ oauthTransport := githubOAuthTransport(r)
+ oauthTransport.Token = &account.OAuthToken
+ githubClient := github.NewClient(oauthTransport.Client())
+
+ digest, err := newDigest(githubClient)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ var digestHtml bytes.Buffer
+ if err := templates.ExecuteTemplate(&digestHtml, "digest", digest); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ emails, _, err := githubClient.Users.ListEmails(nil)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ var primaryVerified *string
+ for _, email := range emails {
+ if email.Primary != nil && *email.Primary &&
+ email.Verified != nil && *email.Verified {
+ primaryVerified = email.Email
+ break
+ }
+ }
+ if primaryVerified == nil {
+ http.Error(w, "No verified email addresses found in GitHub account", http.StatusBadRequest)
+ return
+ }
+
+ digestMessage := &mail.Message{
+ Sender: "GitHop ",
+ To: []string{*primaryVerified},
+ Subject: "GitHop Digest",
+ HTMLBody: digestHtml.String(),
+ }
+ if err := mail.Send(c, digestMessage); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+
+ indexUrl, _ := router.Get("index").URL()
+ http.Redirect(w, r, indexUrl.String(), http.StatusFound)
+}
+
func githubOAuthCallbackHandler(w http.ResponseWriter, r *http.Request) {
code := r.FormValue("code")
oauthTransport := githubOAuthTransport(r)
diff --git a/app/templates/index.html b/app/templates/index.html
index 5cad7a0..02e020c 100644
--- a/app/templates/index.html
+++ b/app/templates/index.html
@@ -16,6 +16,10 @@
+
+
{{template "digest" .Digest}}