aboutsummaryrefslogtreecommitdiffstats
path: root/models/star.go
diff options
context:
space:
mode:
authorAndrey Nering <andrey.nering@gmail.com>2016-12-29 12:58:24 -0200
committerLunny Xiao <xiaolunwen@gmail.com>2016-12-29 22:58:24 +0800
commitb9928588834a9aad1771ba79f1d6638cdc29904a (patch)
tree790d6d87a1565076a1fd06d28618d465366b9350 /models/star.go
parent2d1a1fce934cb87cc67b85083d342b14bb52b780 (diff)
downloadgitea-b9928588834a9aad1771ba79f1d6638cdc29904a.tar.gz
gitea-b9928588834a9aad1771ba79f1d6638cdc29904a.zip
Tab on user profile to show starred repos (#519)
* Tab on user profile to show starred repos * Make golint happy and use transactions on StarRepo function * x -> sess * Use sess.Close() instead of sess.Rollback() * Add copyright * Fix lint
Diffstat (limited to 'models/star.go')
-rw-r--r--models/star.go87
1 files changed, 87 insertions, 0 deletions
diff --git a/models/star.go b/models/star.go
new file mode 100644
index 0000000000..e2feb2c4b6
--- /dev/null
+++ b/models/star.go
@@ -0,0 +1,87 @@
+// Copyright 2016 The Gitea 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
+
+// Star represents a starred repo by an user.
+type Star struct {
+ ID int64 `xorm:"pk autoincr"`
+ UID int64 `xorm:"UNIQUE(s)"`
+ RepoID int64 `xorm:"UNIQUE(s)"`
+}
+
+// StarRepo or unstar repository.
+func StarRepo(userID, repoID int64, star bool) error {
+ sess := x.NewSession()
+
+ defer sess.Close()
+
+ if err := sess.Begin(); err != nil {
+ return err
+ }
+
+ if star {
+ if IsStaring(userID, repoID) {
+ return nil
+ }
+
+ if _, err := sess.Insert(&Star{UID: userID, RepoID: repoID}); err != nil {
+ return err
+ }
+ if _, err := sess.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoID); err != nil {
+ return err
+ }
+ if _, err := sess.Exec("UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", userID); err != nil {
+ return err
+ }
+ } else {
+ if !IsStaring(userID, repoID) {
+ return nil
+ }
+
+ if _, err := sess.Delete(&Star{0, userID, repoID}); err != nil {
+ return err
+ }
+ if _, err := sess.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil {
+ return err
+ }
+ if _, err := sess.Exec("UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", userID); err != nil {
+ return err
+ }
+ }
+
+ return sess.Commit()
+}
+
+// IsStaring checks if user has starred given repository.
+func IsStaring(userID, repoID int64) bool {
+ has, _ := x.Get(&Star{0, userID, repoID})
+ return has
+}
+
+// GetStargazers returns the users that starred the repo.
+func (repo *Repository) GetStargazers(page int) ([]*User, error) {
+ users := make([]*User, 0, ItemsPerPage)
+ err := x.
+ Limit(ItemsPerPage, (page-1)*ItemsPerPage).
+ Where("star.repo_id = ?", repo.ID).
+ Join("LEFT", "star", "`user`.id = star.uid").
+ Find(&users)
+ return users, err
+}
+
+// GetStarredRepos returns the repos the user starred.
+func (u *User) GetStarredRepos(private bool) (repos []*Repository, err error) {
+ sess := x.
+ Join("INNER", "star", "star.repo_id = repository.id").
+ Where("star.uid = ?", u.ID)
+
+ if !private {
+ sess = sess.And("is_private = ?", false)
+ }
+
+ err = sess.
+ Find(&repos)
+ return
+}