diff --git a/gogs.go b/gogs.go index cf097a3a0..04db72a66 100644 --- a/gogs.go +++ b/gogs.go @@ -20,7 +20,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.5.0311" +const APP_VER = "0.0.5.0313" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/action.go b/models/action.go new file mode 100644 index 000000000..cae093ecb --- /dev/null +++ b/models/action.go @@ -0,0 +1,56 @@ +// 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 models + +import ( + "encoding/json" + "time" +) + +// Operation types of user action. +const ( + OP_CREATE_REPO = iota + 1 + OP_DELETE_REPO + OP_STAR_REPO + OP_FOLLOW_REPO + OP_COMMIT_REPO + OP_PULL_REQUEST +) + +// An Action represents +type Action struct { + Id int64 + UserId int64 + OpType int + RepoId int64 + Content string + Created time.Time `xorm:"created"` +} + +type NewRepoContent struct { + UserName string + RepoName string +} + +// NewRepoAction inserts action for create repository. +func NewRepoAction(user *User, repo *Repository) error { + content, err := json.Marshal(&NewRepoContent{user.Name, repo.Name}) + if err != nil { + return err + } + _, err = orm.InsertOne(&Action{ + UserId: user.Id, + OpType: OP_CREATE_REPO, + RepoId: repo.Id, + Content: string(content), + }) + return err +} + +func GetFeeds(userid, offset int64) ([]Action, error) { + actions := make([]Action, 0, 20) + err := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid).Find(&actions) + return actions, err +} diff --git a/models/models.go b/models/models.go index 413775f58..7c28dc542 100644 --- a/models/models.go +++ b/models/models.go @@ -92,7 +92,7 @@ func setEngine() { func init() { setEngine() - err := orm.Sync(new(User), new(PublicKey), new(Repository), new(Access)) + err := orm.Sync(new(User), new(PublicKey), new(Repository), new(Access), new(Action)) if err != nil { fmt.Printf("sync database struct error: %s\n", err) os.Exit(2) diff --git a/models/repo.go b/models/repo.go index c790dc90a..6387090ed 100644 --- a/models/repo.go +++ b/models/repo.go @@ -137,7 +137,8 @@ func CreateRepository(user *User, repoName, desc, repoLang, license string, priv } return nil, err } - return repo, nil + + return repo, NewRepoAction(user, repo) } // InitRepository initializes README and .gitignore if needed. diff --git a/models/user.go b/models/user.go index 8fa2e44e0..c59e4ae15 100644 --- a/models/user.go +++ b/models/user.go @@ -61,26 +61,6 @@ type Follow struct { Created time.Time `xorm:"created"` } -// Operation types of repository. -const ( - OP_CREATE_REPO = iota + 1 - OP_DELETE_REPO - OP_STAR_REPO - OP_FOLLOW_REPO - OP_COMMIT_REPO - OP_PULL_REQUEST -) - -// An Action represents -type Action struct { - Id int64 - UserId int64 - OpType int - RepoId int64 - Content string - Created time.Time `xorm:"created"` -} - var ( ErrUserOwnRepos = errors.New("User still have ownership of repositories") ErrUserAlreadyExist = errors.New("User already exist") diff --git a/modules/auth/auth.go b/modules/auth/auth.go index b08552755..e4748650c 100644 --- a/modules/auth/auth.go +++ b/modules/auth/auth.go @@ -90,6 +90,11 @@ func (f *LogInForm) Validate(errors *binding.Errors, req *http.Request, context validate(errors, data, f) } +type FeedsForm struct { + UserId int64 `form:"userid" binding:"Required"` + Offset int64 `form:"offset"` +} + func getMinMaxSize(field reflect.StructField) string { for _, rule := range strings.Split(field.Tag.Get("binding"), ";") { if strings.HasPrefix(rule, "MinSize(") || strings.HasPrefix(rule, "MaxSize(") { diff --git a/routers/user/user.go b/routers/user/user.go index 5017e878c..ae9dd9029 100644 --- a/routers/user/user.go +++ b/routers/user/user.go @@ -5,6 +5,7 @@ package user import ( + "bytes" "net/http" "github.com/codegangsta/martini" @@ -140,7 +141,6 @@ func SignUp(form auth.RegisterForm, data base.TmplData, req *http.Request, r ren r.Redirect("/user/login") } -// TODO: unfinished func Delete(data base.TmplData, req *http.Request, session sessions.Session, r render.Render) { data["Title"] = "Delete Account" @@ -166,3 +166,21 @@ func Delete(data base.TmplData, req *http.Request, session sessions.Session, r r r.HTML(200, "user/delete", data) } + +func Feeds(form auth.FeedsForm, r render.Render) string { + actions, err := models.GetFeeds(form.UserId, form.Offset) + if err != nil { + return err.Error() + } + + length := len(actions) + buf := bytes.NewBuffer([]byte("[")) + for i, action := range actions { + buf.WriteString(action.Content) + if i < length-1 { + buf.WriteString(",") + } + } + buf.WriteString("]") + return buf.String() +} diff --git a/web.go b/web.go index 0b41a909d..1f34891bc 100644 --- a/web.go +++ b/web.go @@ -64,18 +64,19 @@ func runWeb(*cli.Context) { m.Any("/user/logout", auth.SignInRequire(true), user.SignOut) m.Any("/user/sign_up", auth.SignOutRequire(), binding.BindIgnErr(auth.RegisterForm{}), user.SignUp) m.Any("/user/delete", auth.SignInRequire(true), user.Delete) + m.Get("/user/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) m.Any("/user/setting", auth.SignInRequire(true), user.Setting) m.Any("/user/setting/ssh", auth.SignInRequire(true), binding.BindIgnErr(auth.AddSSHKeyForm{}), user.SettingSSHKeys) m.Get("/user/:username", auth.SignInRequire(false), user.Profile) - m.Get("/:username/:reponame", repo.Repo) - m.Any("/repo/create", auth.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) m.Any("/repo/delete", auth.SignInRequire(true), repo.Delete) m.Any("/repo/list", auth.SignInRequire(false), repo.List) + m.Get("/:username/:reponame", repo.Repo) + listenAddr := fmt.Sprintf("%s:%s", base.Cfg.MustValue("server", "HTTP_ADDR"), base.Cfg.MustValue("server", "HTTP_PORT", "3000"))