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.
162 lines
4.3 KiB
162 lines
4.3 KiB
package service |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/interface/main/web/model" |
|
arcmdl "go-common/app/service/main/archive/api" |
|
"go-common/app/service/main/archive/model/archive" |
|
coinmdl "go-common/app/service/main/coin/api" |
|
favmdl "go-common/app/service/main/favorite/model" |
|
thumbup "go-common/app/service/main/thumbup/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
const ( |
|
_businessLike = "archive" |
|
) |
|
|
|
// Like like archive. |
|
func (s *Service) Like(c context.Context, aid, mid int64, like int8) (upperID int64, err error) { |
|
var ( |
|
arcReply *arcmdl.ArcReply |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil { |
|
log.Error("s.arcClient.Arc(%d) error(%v)", aid, err) |
|
return |
|
} |
|
arc := arcReply.Arc |
|
if !arc.IsNormal() { |
|
err = ecode.ArchiveNotExist |
|
return |
|
} |
|
upperID = arc.Author.Mid |
|
err = s.thumbup.Like(c, &thumbup.ArgLike{Mid: mid, UpMid: upperID, Business: _businessLike, MessageID: aid, Type: like, RealIP: ip}) |
|
return |
|
} |
|
|
|
// LikeTriple like & coin & fav |
|
func (s *Service) LikeTriple(c context.Context, aid, mid int64) (res *model.TripleRes, err error) { |
|
var ( |
|
arcReply *arcmdl.ArcReply |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
res = new(model.TripleRes) |
|
maxCoin := int64(1) |
|
multiply := int64(1) |
|
if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil { |
|
log.Error("s.arcClient.Arc(%d) error(%v)", aid, err) |
|
return |
|
} |
|
a := arcReply.Arc |
|
if !a.IsNormal() { |
|
err = ecode.ArchiveNotExist |
|
return |
|
} |
|
if a.Copyright == int32(archive.CopyrightOriginal) { |
|
maxCoin = 2 |
|
multiply = 2 |
|
} |
|
res.UpID = a.Author.Mid |
|
eg := errgroup.Group{} |
|
eg.Go(func() (err error) { |
|
if multiply == 2 { |
|
if userCoins, e := s.coinClient.UserCoins(c, &coinmdl.UserCoinsReq{Mid: mid}); e != nil { |
|
log.Error("s.coinClient.UserCoins error(%v)", e) |
|
} else if userCoins != nil { |
|
if userCoins.Count < 1 { |
|
return |
|
} |
|
if userCoins.Count < 2 { |
|
multiply = 1 |
|
} |
|
} |
|
} |
|
cArg := &coinmdl.AddCoinReq{ |
|
IP: ip, |
|
Mid: mid, |
|
Upmid: a.Author.Mid, |
|
MaxCoin: maxCoin, |
|
Aid: aid, |
|
Business: model.CoinArcBusiness, |
|
Number: multiply, |
|
Typeid: a.TypeID, |
|
PubTime: int64(a.PubDate), |
|
} |
|
if _, err = s.coinClient.AddCoin(c, cArg); err != nil { |
|
log.Error("s.coinClient.AddCoin error(%v)", err) |
|
err = nil |
|
if arcUserCoins, e := s.coinClient.ItemUserCoins(c, &coinmdl.ItemUserCoinsReq{Mid: mid, Aid: aid, Business: model.CoinArcBusiness}); e != nil { |
|
log.Error("s.coinClient.ItemUserCoins error(%v)", e) |
|
} else { |
|
if arcUserCoins != nil && arcUserCoins.Number > 0 { |
|
res.Coin = true |
|
} |
|
} |
|
} else { |
|
res.Multiply = multiply |
|
res.Anticheat = true |
|
res.Coin = true |
|
} |
|
return |
|
}) |
|
eg.Go(func() (err error) { |
|
var isFav bool |
|
if isFav, err = s.fav.IsFav(context.Background(), &favmdl.ArgIsFav{Type: favmdl.TypeVideo, Mid: mid, Oid: aid, RealIP: ip}); err != nil { |
|
log.Error("s.fav.IsFav error(%v)", err) |
|
err = nil |
|
} else if isFav { |
|
res.Fav = true |
|
return |
|
} |
|
fArg := &favmdl.ArgAdd{Type: favmdl.TypeVideo, Mid: mid, Oid: aid, Fid: 0, RealIP: ip} |
|
if err = s.fav.Add(c, fArg); err != nil { |
|
if ecode.FavVideoExist.Equal(err) { |
|
res.Fav = true |
|
return |
|
} |
|
log.Error("s.fav.Add error(%v)", err) |
|
err = nil |
|
} else { |
|
res.Fav = true |
|
res.Anticheat = true |
|
} |
|
return |
|
}) |
|
eg.Go(func() (err error) { |
|
if err = s.thumbup.Like(c, &thumbup.ArgLike{Mid: mid, UpMid: res.UpID, Business: _businessLike, MessageID: aid, Type: thumbup.TypeLike, RealIP: ip}); err != nil { |
|
if ecode.ThumbupDupLikeErr.Equal(err) { |
|
res.Like = true |
|
return |
|
} |
|
log.Error("s.thumbup.Like error(%v)", err) |
|
err = nil |
|
} else { |
|
res.Like = true |
|
res.Anticheat = true |
|
} |
|
return |
|
}) |
|
eg.Wait() |
|
return |
|
} |
|
|
|
// HasLike get if has like. |
|
func (s *Service) HasLike(c context.Context, aid, mid int64) (like int8, err error) { |
|
var ( |
|
data map[int64]int8 |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
if data, err = s.thumbup.HasLike(c, &thumbup.ArgHasLike{Business: _businessLike, MessageIDs: []int64{aid}, Mid: mid, RealIP: ip}); err != nil { |
|
log.Error("s.thumbup.HasLike aid(%d) mid(%d) error(%v)", aid, mid, err) |
|
return |
|
} |
|
if v, ok := data[aid]; ok { |
|
like = v |
|
} |
|
return |
|
}
|
|
|