github.com/aleksi/gonuts.io@v0.0.0-20130622121132-3b0f2d1999fb/app/gonuts/controllers/me.go (about)

     1  package controllers
     2  
     3  import (
     4  	"appengine"
     5  	"appengine/datastore"
     6  	gaeuser "appengine/user"
     7  	"bytes"
     8  	"fmt"
     9  	"html/template"
    10  	"net/http"
    11  	"net/url"
    12  
    13  	"gonuts"
    14  	nutp "gonuts.io/AlekSi/nut"
    15  )
    16  
    17  func myHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) {
    18  	d := make(ContentData)
    19  	u := gaeuser.Current(c)
    20  
    21  	if u == nil || u.ID == "" {
    22  		url, err := gaeuser.LoginURL(c, "/-/me")
    23  		gonuts.LogError(c, err)
    24  		d["LoginURL"] = url
    25  		d["OpenIDURL"] = "/-/me/openid"
    26  	} else {
    27  		user := new(gonuts.User)
    28  		err := datastore.Get(c, gonuts.UserKey(c, u), user)
    29  		if err == nil {
    30  			url, err := gaeuser.LogoutURL(c, "/")
    31  			gonuts.LogError(c, err)
    32  			d["LogoutURL"] = url
    33  			d["Identifier"] = user.Identifier()
    34  			d["Token"] = user.Token
    35  			d["GenerateURL"] = "/-/me/generate"
    36  			d["Vendors"] = user.Vendors
    37  		} else if err == datastore.ErrNoSuchEntity {
    38  			user = &gonuts.User{Id: u.ID, Email: u.Email, FederatedIdentity: u.FederatedIdentity}
    39  			url, err := gaeuser.LogoutURL(c, "/-/me")
    40  			gonuts.LogError(c, err)
    41  			d["LogoutURL"] = url
    42  			d["Identifier"] = user.Identifier()
    43  			d["RegisterURL"] = "/-/me/register"
    44  		} else {
    45  			panic(err)
    46  		}
    47  	}
    48  
    49  	var content bytes.Buffer
    50  	gonuts.PanicIfErr(Base.ExecuteTemplate(&content, "me.html", d))
    51  
    52  	bd := BaseData{
    53  		Tabtitle: "Me",
    54  		Title:    "Me",
    55  		Content:  template.HTML(content.String()),
    56  	}
    57  	gonuts.PanicIfErr(Base.Execute(w, &bd))
    58  }
    59  
    60  func registerHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) {
    61  	u := gaeuser.Current(c)
    62  	if u != nil && u.ID != "" {
    63  		var err error
    64  		vendor := r.FormValue("vendor")
    65  		if !nutp.VendorRegexp.MatchString(vendor) {
    66  			err = fmt.Errorf("Vendor name should match %s.", nutp.VendorRegexp.String())
    67  			WriteError(w, http.StatusBadRequest, err)
    68  			return
    69  		}
    70  
    71  		v := &gonuts.Vendor{Vendor: vendor}
    72  		user := &gonuts.User{Id: u.ID, Email: u.Email, FederatedIdentity: u.FederatedIdentity}
    73  		gonuts.PanicIfErr(user.GenerateToken())
    74  
    75  		err = datastore.Get(c, gonuts.VendorKey(c, vendor), v)
    76  		if err != datastore.ErrNoSuchEntity {
    77  			if err == nil {
    78  				err = fmt.Errorf("Vendor name %q is already registered.", vendor)
    79  				WriteError(w, http.StatusForbidden, err)
    80  				return
    81  			}
    82  
    83  			gonuts.LogError(c, err)
    84  			WriteError(w, http.StatusInternalServerError, err)
    85  			return
    86  		}
    87  
    88  		err = datastore.Get(c, gonuts.UserKey(c, u), user)
    89  		if err != datastore.ErrNoSuchEntity {
    90  			gonuts.LogError(c, err)
    91  			WriteError(w, http.StatusInternalServerError, err)
    92  			return
    93  		}
    94  
    95  		c.Infof("Adding user %s (%s) to vendor %s.", user.Id, user.Identifier(), v.Vendor)
    96  		user.AddVendor(v)
    97  		_, err = datastore.Put(c, gonuts.VendorKey(c, vendor), v)
    98  		gonuts.PanicIfErr(err)
    99  		_, err = datastore.Put(c, gonuts.UserKey(c, u), user)
   100  		gonuts.PanicIfErr(err)
   101  	}
   102  
   103  	http.Redirect(w, r, "/-/me", http.StatusSeeOther)
   104  }
   105  
   106  func generateHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) {
   107  	u := gaeuser.Current(c)
   108  	if u != nil && u.ID != "" {
   109  		key := gonuts.UserKey(c, u)
   110  		user := gonuts.User{}
   111  		err := datastore.Get(c, key, &user)
   112  		if err == nil {
   113  			gonuts.PanicIfErr(user.GenerateToken())
   114  			_, err = datastore.Put(c, key, &user)
   115  		}
   116  		gonuts.LogError(c, err)
   117  	}
   118  	http.Redirect(w, r, "/-/me", http.StatusSeeOther)
   119  }
   120  
   121  func openIdHandler(c appengine.Context, w http.ResponseWriter, r *http.Request) {
   122  	u := gaeuser.Current(c)
   123  	if u != nil && u.ID != "" {
   124  		err := fmt.Errorf("This page is not supposed to be accessible by logged-in users")
   125  		WriteError(w, http.StatusForbidden, err)
   126  		return
   127  	}
   128  
   129  	provider := r.FormValue("provider")
   130  	if _, err := url.Parse(provider); err != nil {
   131  		err := fmt.Errorf("OpenID provider name should be a valid url")
   132  		WriteError(w, http.StatusBadRequest, err)
   133  		return
   134  	}
   135  
   136  	url, err := gaeuser.LoginURLFederated(c, "/-/me", provider)
   137  	if err != nil {
   138  		gonuts.LogError(c, err)
   139  		return
   140  	}
   141  
   142  	http.Redirect(w, r, url, http.StatusSeeOther)
   143  }