diff options
author | Ethan Koenig <etk39@cornell.edu> | 2017-03-11 03:46:53 -0500 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2017-03-11 16:46:53 +0800 |
commit | 3803f257fb5cfa3419f0d91ccbae1c128f0fcca1 (patch) | |
tree | f771af0252ae57f9be20ff56952a34aeb9c820ab /models/user_follow.go | |
parent | 1e3548b7e764c60aad2eb315a65e146264c11a7d (diff) | |
download | gitea-3803f257fb5cfa3419f0d91ccbae1c128f0fcca1.tar.gz gitea-3803f257fb5cfa3419f0d91ccbae1c128f0fcca1.zip |
Move user_follow to separate file (#1210)
Also add unit tests
Diffstat (limited to 'models/user_follow.go')
-rw-r--r-- | models/user_follow.go | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/models/user_follow.go b/models/user_follow.go new file mode 100644 index 0000000000..ac0cf0a8f3 --- /dev/null +++ b/models/user_follow.go @@ -0,0 +1,71 @@ +// Copyright 2017 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 + +// Follow represents relations of user and his/her followers. +type Follow struct { + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"UNIQUE(follow)"` + FollowID int64 `xorm:"UNIQUE(follow)"` +} + +// IsFollowing returns true if user is following followID. +func IsFollowing(userID, followID int64) bool { + has, _ := x.Get(&Follow{UserID: userID, FollowID: followID}) + return has +} + +// FollowUser marks someone be another's follower. +func FollowUser(userID, followID int64) (err error) { + if userID == followID || IsFollowing(userID, followID) { + return nil + } + + sess := x.NewSession() + defer sessionRelease(sess) + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(&Follow{UserID: userID, FollowID: followID}); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { + return err + } + return sess.Commit() +} + +// UnfollowUser unmarks someone as another's follower. +func UnfollowUser(userID, followID int64) (err error) { + if userID == followID || !IsFollowing(userID, followID) { + return nil + } + + sess := x.NewSession() + defer sessionRelease(sess) + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Delete(&Follow{UserID: userID, FollowID: followID}); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { + return err + } + return sess.Commit() +} + |