]> source.dussan.org Git - gitea.git/commitdiff
Add binding form for register user
authorUnknown <joe2010xtmf@163.com>
Thu, 6 Mar 2014 07:21:44 +0000 (02:21 -0500)
committerUnknown <joe2010xtmf@163.com>
Thu, 6 Mar 2014 07:21:44 +0000 (02:21 -0500)
bee.json
conf/app.ini
gogs.go
models/models.go
models/user.go
modules/auth/form.go [new file with mode: 0644]
modules/base/base.go [new file with mode: 0644]
routers/user/user.go
templates/user/signup.tmpl
utils/auth/auth.go [deleted file]
web.go

index 40050dd58196f860f13d4f009456695b772494d9..e4a0f803d3b3434dc9af8cb4d46d26d0b63459b9 100644 (file)
--- a/bee.json
+++ b/bee.json
@@ -11,7 +11,8 @@
                "controllers": "routers",
                "models": "",
                "others": [
-                       "utils"
+                       "utils", "modules",
+                       "$GOPATH/src/github.com/gogits/binding"
                ]
        },
        "cmd_args": [
index dcc58c37f374f603bce4ffd782566bc58f2470c2..3d4a259327c5d06a7da550389d5f0146e5faf1fb 100644 (file)
@@ -3,6 +3,7 @@ RUN_USER = lunny
 
 [repository]
 ROOT = /Users/lunny/git/gogs-repositories
+ROOT_jiahuachen = /Users/jiahuachen/git/gogs-repositories
 
 [server]
 HTTP_ADDR = 
diff --git a/gogs.go b/gogs.go
index 72a967f01c5a9ee1eaaca0e48566cf0a1344f99c..1ce0f7f98ebf19d70062034bffde6e0f33ff5da4 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -19,7 +19,7 @@ import (
 // Test that go1.1 tag above is included in builds. main.go refers to this definition.
 const go11tag = true
 
-const APP_VER = "0.0.0.0303"
+const APP_VER = "0.0.0.0305"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index d07b1fe384e432f2ac3274ee8a5271655c2088d4..0dee65478f7abe51073c38c592cf56c12815a1b5 100644 (file)
@@ -83,6 +83,9 @@ func setEngine() {
        //log.Trace("Initialized database -> %s", dbName)
 
        RepoRootPath = utils.Cfg.MustValue("repository", "ROOT")
+       if uname.Username == "jiahuachen" {
+               RepoRootPath = utils.Cfg.MustValue("repository", "ROOT_jiahuachen")
+       }
 }
 
 func init() {
index 820597380de3d3d23bfc4bc374da69e787106784..d8469251e93a77d2bc5e5b0caf839b7b411a4617 100644 (file)
@@ -15,7 +15,6 @@ import (
        "github.com/dchest/scrypt"
 
        "github.com/gogits/gogs/utils"
-       "github.com/gogits/gogs/utils/log"
 )
 
 // User types.
@@ -100,17 +99,15 @@ func RegisterUser(user *User) (err error) {
        user.LowerName = strings.ToLower(user.Name)
        user.Avatar = utils.EncodeMd5(user.Email)
        user.EncodePasswd()
-       _, err = orm.Insert(user)
-       if err != nil {
+       if _, err = orm.Insert(user); err != nil {
                return err
        }
 
-       err = os.MkdirAll(UserPath(user.Name), os.ModePerm)
-       if err != nil {
-               _, err2 := orm.Id(user.Id).Delete(&User{})
-               if err2 != nil {
-                       log.Error("create userpath %s failed and delete table record faild",
-                               user.Name)
+       if err = os.MkdirAll(UserPath(user.Name), os.ModePerm); err != nil {
+
+               if _, err := orm.Id(user.Id).Delete(&User{}); err != nil {
+                       return errors.New(fmt.Sprintf(
+                               "both create userpath %s and delete table record faild", user.Name))
                }
                return err
        }
diff --git a/modules/auth/form.go b/modules/auth/form.go
new file mode 100644 (file)
index 0000000..9094ef5
--- /dev/null
@@ -0,0 +1,111 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package auth
+
+import (
+       "net/http"
+       "reflect"
+
+       "github.com/codegangsta/martini"
+
+       "github.com/gogits/binding"
+
+       "github.com/gogits/gogs/modules/base"
+       "github.com/gogits/gogs/utils/log"
+)
+
+type RegisterForm struct {
+       UserName string `form:"username" binding:"Required;AlphaDash;MinSize(5);MaxSize(30)"`
+       Email    string `form:"email" binding:"Required;Email;MaxSize(50)"`
+       Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
+}
+
+func (r *RegisterForm) Validate(errors *binding.Errors, req *http.Request, context martini.Context) {
+       if req.Method == "GET" || errors.Count() == 0 {
+               return
+       }
+
+       data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData)
+       data["HasError"] = true
+       AssignForm(r, data)
+
+       if len(errors.Overall) > 0 {
+               for _, err := range errors.Overall {
+                       log.Error("RegisterForm.Validate: %v", err)
+               }
+               return
+       }
+
+       if err, ok := errors.Fields["UserName"]; ok {
+               data["Err_Username"] = true
+               switch err {
+               case binding.RequireError:
+                       data["ErrorMsg"] = "Username cannot be empty"
+               case binding.AlphaDashError:
+                       data["ErrorMsg"] = "Username must be valid alpha or numeric or dash(-_) characters"
+               case binding.MinSizeError:
+                       data["ErrorMsg"] = "Username at least has 5 characters"
+               case binding.MaxSizeError:
+                       data["ErrorMsg"] = "Username at most has 30 characters"
+               default:
+                       data["ErrorMsg"] = "Unknown error: " + err
+               }
+               return
+       }
+
+       if err, ok := errors.Fields["Email"]; ok {
+               data["Err_Email"] = true
+               switch err {
+               case binding.RequireError:
+                       data["ErrorMsg"] = "E-mail address cannot be empty"
+               case binding.EmailError:
+                       data["ErrorMsg"] = "E-mail address is not valid"
+               case binding.MaxSizeError:
+                       data["ErrorMsg"] = "E-mail address at most has 50 characters"
+               default:
+                       data["ErrorMsg"] = "Unknown error: " + err
+               }
+               return
+       }
+
+       if err, ok := errors.Fields["Password"]; ok {
+               data["Err_Passwd"] = true
+               switch err {
+               case binding.RequireError:
+                       data["ErrorMsg"] = "Password cannot be empty"
+               case binding.MinSizeError:
+                       data["ErrorMsg"] = "Password at least has 6 characters"
+               case binding.MaxSizeError:
+                       data["ErrorMsg"] = "Password at most has 30 characters"
+               default:
+                       data["ErrorMsg"] = "Unknown error: " + err
+               }
+               return
+       }
+
+}
+
+// AssignForm assign form values back to the template data.
+func AssignForm(form interface{}, data base.TmplData) {
+       typ := reflect.TypeOf(form)
+       val := reflect.ValueOf(form)
+
+       if typ.Kind() == reflect.Ptr {
+               typ = typ.Elem()
+               val = val.Elem()
+       }
+
+       for i := 0; i < typ.NumField(); i++ {
+               field := typ.Field(i)
+
+               fieldName := field.Tag.Get("form")
+               // Allow ignored fields in the struct
+               if fieldName == "-" {
+                       continue
+               }
+
+               data[fieldName] = val.Field(i).Interface()
+       }
+}
diff --git a/modules/base/base.go b/modules/base/base.go
new file mode 100644 (file)
index 0000000..0d305ab
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package base
+
+import (
+       "github.com/codegangsta/martini"
+)
+
+type (
+       // Type TmplData represents data in the templates.
+       TmplData map[string]interface{}
+)
+
+func InitContext() martini.Handler {
+       return func(context martini.Context) {
+               context.Map(TmplData{})
+       }
+}
index a66a7b5f9436ed004f01bea9e12affb104abdc41..503ebf54f4faf3445527659e543e937764c0a9f7 100644 (file)
@@ -8,13 +8,13 @@ import (
        "fmt"
        "net/http"
 
+       //"github.com/martini-contrib/binding"
        "github.com/martini-contrib/render"
        "github.com/martini-contrib/sessions"
 
-       "github.com/gogits/validation"
-
        "github.com/gogits/gogs/models"
-       "github.com/gogits/gogs/utils/auth"
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/base"
        "github.com/gogits/gogs/utils/log"
 )
 
@@ -50,42 +50,42 @@ func SignIn(req *http.Request, r render.Render, session sessions.Session) {
        })
 }
 
-func SignUp(req *http.Request, r render.Render) {
-       data := map[string]interface{}{"Title": "Sign Up"}
+func SignUp(form auth.RegisterForm, data base.TmplData, req *http.Request, r render.Render) {
+       data["Title"] = "Sign Up"
+
        if req.Method == "GET" {
                r.HTML(200, "user/signup", data)
                return
        }
 
-       // Front-end should do double check of password.
-       u := &models.User{
-               Name:   req.FormValue("username"),
-               Email:  req.FormValue("email"),
-               Passwd: req.FormValue("passwd"),
+       if hasErr, ok := data["HasError"]; ok && hasErr.(bool) {
+               r.HTML(200, "user/signup", data)
+               return
        }
 
-       valid := validation.Validation{}
-       ok, err := valid.Valid(u)
-       if err != nil {
-               log.Error("user.SignUp -> valid user: %v", err)
-               return
+       //Front-end should do double check of password.
+       u := &models.User{
+               Name:   form.UserName,
+               Email:  form.Email,
+               Passwd: form.Password,
        }
-       if !ok {
-               data["HasError"] = true
-               data["ErrorMsg"] = auth.GenerateErrorMsg(valid.Errors[0])
-               r.HTML(200, "user/signup", data)
+
+       if err := models.RegisterUser(u); err != nil {
+               if err.Error() == models.ErrUserAlreadyExist.Error() {
+                       data["HasError"] = true
+                       data["Err_Username"] = true
+                       data["ErrorMsg"] = "Username has been already taken"
+                       auth.AssignForm(form, data)
+                       r.HTML(200, "user/signup", data)
+                       return
+               }
+
+               log.Error("user.SignUp: %v", err)
+               r.HTML(500, "status/500", nil)
                return
        }
 
-       // err = models.RegisterUser(u)
-       // if err != nil {
-       //      r.HTML(200, "base/error", map[string]interface{}{
-       //              "Error": fmt.Sprintf("%v", err),
-       //      })
-       //      return
-       // }
-
-       // r.Redirect("/")
+       r.Redirect("/user/login")
 }
 
 func Delete(req *http.Request, r render.Render) {
index e8854e4aca45af5dbc234e988dc1432d868b2e48..52e8fe1814697d1c135ad4977e312c4d17434f64 100644 (file)
@@ -6,20 +6,20 @@
        {{if .HasError}}
        <div class="alert alert-danger">{{.ErrorMsg}}</div>
        {{end}}
-               <div class="form-group">
+               <div class="form-group {{if .Err_Username}}has-error has-feedback{{end}}">
                        <label class="col-md-4 control-label">Username: </label>
                        <div class="col-md-6">
-                               <input name="username" class="form-control" placeholder="Type your username">
+                               <input name="username" class="form-control" placeholder="Type your username" value="{{.username}}">
                        </div>
                </div>
-               <div class="form-group">
+               <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
                        <label class="col-md-4 control-label">Email: </label>
                        <div class="col-md-6">
-                               <input name="email" class="form-control" placeholder="Type your e-mail address">
+                               <input name="email" class="form-control" placeholder="Type your e-mail address" value="{{.email}}">
                        </div>
                </div>
 
-               <div class="form-group">
+               <div class="form-group {{if .Err_Passwd}}has-error has-feedback{{end}}">
                        <label class="col-md-4 control-label">Password: </label>
                        <div class="col-md-6">
                                <input name="passwd" type="password" class="form-control" placeholder="Type your password">
diff --git a/utils/auth/auth.go b/utils/auth/auth.go
deleted file mode 100644 (file)
index 1099103..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Use of this source code is governed by a MIT-style
-// license that can be found in the LICENSE file.
-
-package auth
-
-import (
-       "fmt"
-
-       "github.com/gogits/validation"
-)
-
-func GenerateErrorMsg(e *validation.ValidationError) string {
-       return fmt.Sprintf("%v", e.LimitValue)
-}
diff --git a/web.go b/web.go
index ca3b4fcf1a316bec0639999d6113d3443586fe8b..90551510705671e9174b6c61bf57b6611ae5eff9 100644 (file)
--- a/web.go
+++ b/web.go
@@ -14,6 +14,10 @@ import (
        "github.com/martini-contrib/render"
        "github.com/martini-contrib/sessions"
 
+       "github.com/gogits/binding"
+
+       "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/base"
        "github.com/gogits/gogs/routers"
        "github.com/gogits/gogs/routers/repo"
        "github.com/gogits/gogs/routers/user"
@@ -46,6 +50,7 @@ func runWeb(*cli.Context) {
 
        // Middleware.
        m.Use(render.Renderer(render.Options{Funcs: []template.FuncMap{AppHelpers}}))
+       m.Use(base.InitContext())
 
        // TODO: should use other store because cookie store is not secure.
        store := sessions.NewCookieStore([]byte("secret123"))
@@ -55,7 +60,7 @@ func runWeb(*cli.Context) {
        m.Get("/", routers.Dashboard)
        m.Any("/user/login", user.SignIn)
 
-       m.Any("/user/sign_up", user.SignUp)
+       m.Any("/user/sign_up", binding.BindIgnErr(auth.RegisterForm{}), user.SignUp)
 
        m.Get("/user/profile", user.Profile) // should be /username
        m.Any("/user/delete", user.Delete)