diff options
author | Andrey Nering <andrey.nering@gmail.com> | 2016-12-29 12:58:24 -0200 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2016-12-29 22:58:24 +0800 |
commit | b9928588834a9aad1771ba79f1d6638cdc29904a (patch) | |
tree | 790d6d87a1565076a1fd06d28618d465366b9350 /models/star.go | |
parent | 2d1a1fce934cb87cc67b85083d342b14bb52b780 (diff) | |
download | gitea-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.go | 87 |
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 +} |