Files
go-common/app/service/main/thumbup/service/like.go
2019-04-22 18:49:16 +08:00

111 lines
2.8 KiB
Go

package service
import (
"context"
"time"
"go-common/app/service/main/thumbup/dao"
"go-common/app/service/main/thumbup/model"
"go-common/library/ecode"
"go-common/library/log"
)
// Like like
func (s *Service) Like(c context.Context, business string, mid, originID, messageID int64, likeType int8, upMid int64) (stat model.Stats, err error) {
var businessID int64
if businessID, err = s.CheckBusinessOrigin(business, originID); err != nil {
return
}
if (likeType < 0) || (likeType > 4) {
err = ecode.RequestErr
return
}
oldState, err := s.dao.LikeState(c, mid, businessID, originID, messageID)
if err == nil {
if oldState == model.StateBlank {
switch likeType {
case model.TypeCancelLike:
err = ecode.ThumbupCancelLikeErr
case model.TypeCancelDislike:
err = ecode.ThumbupCancelDislikeErr
}
} else if oldState == model.StateLike {
switch likeType {
case model.TypeLike:
err = ecode.ThumbupDupLikeErr
case model.TypeCancelDislike:
err = ecode.ThumbupCancelDislikeErr
}
} else if oldState == model.StateDislike {
switch likeType {
case model.TypeCancelLike:
err = ecode.ThumbupCancelLikeErr
case model.TypeDislike:
err = ecode.ThumbupDupDislikeErr
}
} else {
dao.PromError("点赞表状态异常")
log.Error("service.Like(mid:%v bid:%v oid: %v, messageID: %v, state: %v)", mid, businessID, originID, messageID, oldState)
return
}
if err != nil {
return
}
}
err = s.dbus.Do(c, func(c context.Context) {
msg := &model.LikeMsg{UpMid: upMid, Mid: mid, Type: likeType, LikeTime: time.Now(), Business: business, OriginID: originID, MessageID: messageID}
s.dao.PubLikeDatabus(c, msg)
})
if err != nil {
return
}
// todo fix
if business == "reply" {
return
}
stats, err := s.Stats(c, business, originID, []int64{messageID})
if err == nil && stats != nil && stats[messageID] != nil {
stat = *stats[messageID]
}
stat = calculateCount(stat, likeType)
return
}
func calculateCount(stat model.Stats, typ int8) model.Stats {
var likesCount, dislikesCount int64
switch typ {
case model.TypeLike:
likesCount = 1
case model.TypeCancelLike:
likesCount = -1
case model.TypeDislike:
dislikesCount = 1
case model.TypeCancelDislike:
dislikesCount = -1
case model.TypeLikeReverse:
likesCount = -1
dislikesCount = 1
case model.TypeDislikeReverse:
likesCount = 1
dislikesCount = -1
}
stat.Likes += likesCount
stat.Dislikes += dislikesCount
return stat
}
func (s *Service) updateStatCache(c context.Context, businessID, originID int64, stat *model.Stats) (err error) {
if stat == nil {
return
}
var ok bool
if originID == 0 {
err = s.dao.AddStatsCache(c, businessID, stat)
} else {
if ok, err = s.dao.ExpireHashStatsCache(c, businessID, originID); ok {
err = s.dao.AddHashStatsCache(c, businessID, originID, stat)
}
}
return
}