You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 lines
4.5 KiB

package user
// 会员关注
import (
"live/app/lib"
"live/app/lib/recook"
"live/app/model/user"
)
type Follow struct {
}
type ReplyFollowItem struct {
recook.ReplyUserItem
Follows uint `json:"follows"`
Fans uint `json:"fans"`
IsFollow int `json:"isFollow"`
}
// @Title 获取会员关注列表
// @Param userId uint true "当前登录会员id,未登录传0"
// @Param findUserId uint true "需要查询关注列表的会员id"
func (f *Follow) GetList(userId, findUserId uint, page lib.Page) (result *[]ReplyFollowItem, count int64) {
userFollow := &user.UserFollow{}
result = &[]ReplyFollowItem{}
// 查询会员关注列表
start := (page.GetPage() - 1) * page.GetLimit()
count = userFollow.GetCountByUserId(findUserId)
if count <= int64(start) {
// 没有数据,不需要查库
return
}
findFollows := userFollow.GetListByUserId(findUserId, start, page.GetLimit())
if len(*findFollows) == 0 {
// 未查询到数据
return
}
followUserIds := []uint{}
for _, findFollow := range *findFollows {
followUserIds = append(followUserIds, findFollow.FollowUserId)
}
// 获取会员基础信息
userItems, err := recook.User.GetUsers(followUserIds)
if err != nil {
return
}
userItemsMap := map[uint]recook.ReplyUserItem{}
for _, userItem := range *userItems {
userItemsMap[userItem.UserId] = userItem
}
// 获取当前用户关注情况
userFollowsMap := map[uint]user.UserFollow{}
hasFollow := 1
if userId != findUserId {
hasFollow = 0
userFollows := userFollow.GetByUserIdAndFollowIds(userId, followUserIds)
for _, userFollow := range userFollows {
userFollowsMap[userFollow.FollowUserId] = userFollow
}
}
// 获取会员关注及粉丝数
userDatas := (&user.UserData{}).GetByUserIds(followUserIds)
userDatasMap := map[uint]user.UserData{}
for _, userData := range userDatas {
userDatasMap[userData.UserId] = userData
}
for _, findFollow := range *findFollows {
// 如果能查询到会员信息
if replyUserItem, ok := userItemsMap[findFollow.FollowUserId]; ok {
isFollow := hasFollow
if isFollow == 0 {
// 判断是否关注
if _, ok := userFollowsMap[findFollow.FollowUserId]; ok {
isFollow = 1
}
}
// 获取统计数据
userData := userDatasMap[findFollow.FollowUserId]
*result = append(*result, ReplyFollowItem{
ReplyUserItem: replyUserItem,
Follows: userData.Follows,
Fans: userData.Fans,
IsFollow: isFollow,
})
}
}
return result, count
}
// @Title 添加关注
func (f *Follow) Add(userId, followUserId uint) (result bool) {
userFollowModel := &user.UserFollow{}
userFollow := userFollowModel.GetByUserIdAndFollowId(userId, followUserId)
tx := userFollowModel.Begin()
defer func() {
if result {
tx.Commit()
} else {
tx.Rollback()
}
}()
// 已经关注过
if userFollow.Id != 0 {
// 关注过后取消关注
if userFollow.IsDel == 1 {
res := userFollowModel.RenewFollow(userId, followUserId)
if res == 0 {
return false
}
userDataModel := &user.UserData{}
userDataModel.SetDb(tx)
res = userDataModel.AddFollow(userId)
if res == 0 {
return false
}
// 被关注者新增粉丝
res = userDataModel.AddFans(followUserId)
if res == 0 {
return false
}
} else {
return false
}
return true
} else {
// 未关注添加关注
fid := userFollowModel.Create(&user.UserFollow{
UserId: userId,
FollowUserId: followUserId,
})
if fid == 0 {
return false
} else {
userDataModel := &user.UserData{}
userDataModel.SetDb(tx)
res := userDataModel.AddFollow(userId)
if res == 0 {
return false
}
// 被关注者新增粉丝
res = userDataModel.AddFans(followUserId)
if res == 0 {
return false
}
return true
}
}
}
// @Title 取消关注
func (f *Follow) Cancel(userId, followUserId uint) (result bool) {
userFollowModel := &user.UserFollow{}
userFollow := userFollowModel.GetByUserIdAndFollowId(userId, followUserId)
// 已经关注过
if userFollow.Id != 0 {
// 关注过后取消关注
if userFollow.IsDel == 0 {
tx := userFollow.Begin()
defer func() {
if result {
tx.Commit()
} else {
tx.Rollback()
}
}()
res := userFollowModel.CancelFollow(userId, followUserId)
if res == 0 {
return false
}
// 统计数据处理
userDataModel := &user.UserData{}
userDataModel.SetDb(tx)
res = userDataModel.CancelFollow(userId)
if res == 0 {
return false
}
// 被取关者减少粉丝
res = userDataModel.CancelFans(followUserId)
if res == 0 {
return false
}
}
}
return true
}