Register the new client if not already done.
authorOllivier Robert <roberto@keltia.net>
Mon, 10 Apr 2017 15:54:10 +0200
changeset 35 27c58d359940
parent 34 69711df3beac
child 36 b3c341207b30
Register the new client if not already done.
app.go
--- a/app.go	Fri Apr 07 15:32:49 2017 +0200
+++ b/app.go	Mon Apr 10 15:54:10 2017 +0200
@@ -1,18 +1,95 @@
 package gondole
 
 import (
+	"encoding/json"
+	"github.com/sendgrid/rest"
+	"log"
+	"strings"
+)
 
+var (
+	ourScopes = []string{
+		"read",
+		"write",
+		"follow",
+	}
 )
 
-// NewApp registers a new instance
-func NewApp(name, redirectURI string) (g *Gondole, err error) {
-	// Load configuration, will register if none is found
+type registerApp struct {
+	ID           int64  `json:"id"`
+	ClientID     int64  `json:"Client_id"`
+	ClientSecret string `json:"client_secret"`
+}
+
+func registerApplication(name string, scopes []string, redirectURI string) (g *Gondole, err error) {
+	g = &Gondole{
+		Name: name,
+	}
+
+	req := g.prepareRequest("apps")
+	if redirectURI != "" {
+		req.QueryParams["redirect_uris"] = redirectURI
+	} else {
+		req.QueryParams["redirect_uris"] = NoRedirect
+	}
+	req.QueryParams["client_name"] = name
+	req.QueryParams["scopes"] = strings.Join(scopes, " ")
+	req.Method = rest.Post
 
-	g = &Gondole{
-		Name:   name,
-		//ID:     config.ID,
-		//Secret: config.BearerToken,
+	r, err := rest.API(req)
+	if err != nil {
+		log.Fatalf("error can not register app: %v", err)
+	}
+
+	var resp registerApp
+
+	err = json.Unmarshal([]byte(r.Body), &resp)
+	if err != nil {
+		log.Fatalf("error can not register app: %v", err)
+	}
+	g.ID = resp.ClientID
+	g.Secret = resp.ClientSecret
+
+	server := &Server{
+		ID:          g.ID,
+		Name:        name,
+		BearerToken: g.Secret,
+	}
+	err = server.WriteToken(name)
+	if err != nil {
+		log.Fatalf("error: can not write token for %s", name)
 	}
 	return
 }
 
+// NewApp registers a new instance
+func NewApp(name string, scopes []string, redirectURI string) (g *Gondole, err error) {
+	// Load configuration, will register if none is found
+	cnf, err := LoadConfig(name)
+	if err != nil {
+		// Nothing exist yet
+		cnf := Config{
+			Default: name,
+		}
+		err = cnf.Write()
+		if err != nil {
+			log.Fatalf("error: can not write config for %s", name)
+		}
+
+		// Now register this through OAuth
+		if scopes == nil {
+			scopes = ourScopes
+		}
+
+		g, err = registerApplication(name, scopes, redirectURI)
+
+	} else {
+		g = &Gondole{
+			Name:   cnf.Name,
+			ID:     cnf.ID,
+			Secret: cnf.BearerToken,
+		}
+	}
+
+	return
+}