2017-03-11 03:46:53 -05:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2017-03-11 03:46:53 -05:00
2021-11-17 17:58:31 +08:00
package user
2017-03-11 03:46:53 -05:00
2020-10-13 02:01:57 +02:00
import (
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2020-10-13 02:01:57 +02:00
"code.gitea.io/gitea/modules/timeutil"
)
2022-06-26 00:50:12 +02:00
// Follow represents relations of user and their followers.
2017-03-11 03:46:53 -05:00
type Follow struct {
2020-10-13 02:01:57 +02:00
ID int64 ` xorm:"pk autoincr" `
UserID int64 ` xorm:"UNIQUE(follow)" `
FollowID int64 ` xorm:"UNIQUE(follow)" `
CreatedUnix timeutil . TimeStamp ` xorm:"INDEX created" `
2017-03-11 03:46:53 -05:00
}
2021-09-19 19:49:59 +08:00
func init ( ) {
db . RegisterModel ( new ( Follow ) )
}
2017-03-11 03:46:53 -05:00
// IsFollowing returns true if user is following followID.
func IsFollowing ( userID , followID int64 ) bool {
2021-09-23 16:45:36 +01:00
has , _ := db . GetEngine ( db . DefaultContext ) . Get ( & Follow { UserID : userID , FollowID : followID } )
2017-03-11 03:46:53 -05:00
return has
}
// FollowUser marks someone be another's follower.
func FollowUser ( userID , followID int64 ) ( err error ) {
if userID == followID || IsFollowing ( userID , followID ) {
return nil
}
2022-11-13 04:18:50 +08:00
ctx , committer , err := db . TxContext ( db . DefaultContext )
2021-11-21 23:41:00 +08:00
if err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
defer committer . Close ( )
2017-03-11 03:46:53 -05:00
2021-11-21 23:41:00 +08:00
if err = db . Insert ( ctx , & Follow { UserID : userID , FollowID : followID } ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
if _ , err = db . Exec ( ctx , "UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?" , followID ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
if _ , err = db . Exec ( ctx , "UPDATE `user` SET num_following = num_following + 1 WHERE id = ?" , userID ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
return committer . Commit ( )
2017-03-11 03:46:53 -05:00
}
// UnfollowUser unmarks someone as another's follower.
func UnfollowUser ( userID , followID int64 ) ( err error ) {
if userID == followID || ! IsFollowing ( userID , followID ) {
return nil
}
2022-11-13 04:18:50 +08:00
ctx , committer , err := db . TxContext ( db . DefaultContext )
2021-11-21 23:41:00 +08:00
if err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
defer committer . Close ( )
2017-03-11 03:46:53 -05:00
2021-11-21 23:41:00 +08:00
if _ , err = db . DeleteByBean ( ctx , & Follow { UserID : userID , FollowID : followID } ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
if _ , err = db . Exec ( ctx , "UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?" , followID ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
if _ , err = db . Exec ( ctx , "UPDATE `user` SET num_following = num_following - 1 WHERE id = ?" , userID ) ; err != nil {
2017-03-11 03:46:53 -05:00
return err
}
2021-11-21 23:41:00 +08:00
return committer . Commit ( )
2017-03-11 03:46:53 -05:00
}