go-common/app/job/main/playlist/service/stat.go
2019-04-22 18:49:16 +08:00

127 lines
3.1 KiB
Go

package service
import (
"context"
plamdl "go-common/app/interface/main/playlist/model"
"go-common/app/job/main/playlist/conf"
"go-common/app/job/main/playlist/dao"
"go-common/app/job/main/playlist/model"
"go-common/library/log"
)
func (s *Service) viewproc(i int64) {
defer s.waiter.Done()
var (
c = context.TODO()
ch = s.statCh[i]
)
for {
sm, ok := <-ch
if !ok {
log.Warn("statproc(%d) quit", i)
return
}
// filter view count
if conf.Conf.Job.InterceptOn && sm.Count != nil && *sm.Count > 0 {
if s.intercept(sm) {
log.Info("intercept view count (pid:%d, aid:%d, ip:%s)", sm.ID, sm.Aid, sm.IP)
dao.PromInfo("stat:访问计数拦截")
continue
}
}
s.upStat(c, sm, model.ViewCountType)
}
}
func (s *Service) upStat(c context.Context, sm *model.StatM, tp string) {
// update cache
s.updateCache(c, sm, tp)
// update db
s.updateDB(c, sm, tp)
}
// updateDB update stat in db.
func (s *Service) updateDB(c context.Context, stat *model.StatM, tp string) (err error) {
if _, err = s.dao.Update(context.TODO(), stat, tp); err != nil {
return
}
log.Info("update db success "+tp+" pid(%d) count(%d) ", stat.ID, *stat.Count)
dao.PromInfo("stat:更新计数DB")
return
}
// updateCache update stat in cache
func (s *Service) updateCache(c context.Context, sm *model.StatM, tp string) (err error) {
var (
mid int64
fid int64
st *plamdl.PlStat
stat *plamdl.ArgStats
)
if st, err = s.dao.Stat(c, sm.ID); err != nil {
log.Error("s.dao.Stat(%d) error(%v)", sm.ID, err)
return
}
switch tp {
case model.ViewCountType:
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{
ID: sm.ID,
Mid: st.Mid,
Fid: st.Fid,
View: *sm.Count,
Reply: st.Reply,
Fav: st.Fav,
Share: st.Share,
MTime: st.MTime,
}}
case model.FavCountType:
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{
ID: sm.ID,
Mid: st.Mid,
Fid: st.Fid,
View: st.View,
Reply: st.Reply,
Fav: *sm.Count,
Share: st.Share,
MTime: st.MTime,
}}
case model.ReplyCountType:
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{
ID: sm.ID,
Mid: st.Mid,
Fid: st.Fid,
View: st.View,
Reply: *sm.Count,
Fav: st.Fav,
Share: st.Share,
MTime: st.MTime,
}}
case model.ShareCountType:
stat = &plamdl.ArgStats{PlStat: &plamdl.PlStat{
ID: sm.ID,
Mid: st.Mid,
Fid: st.Fid,
View: st.View,
Reply: st.Reply,
Fav: st.Fav,
Share: *sm.Count,
MTime: st.MTime,
}}
}
if err = s.playlistRPC.SetStat(c, stat); err != nil {
dao.PromError("stat:更新计数缓存",
"s.playlistRPC.SetStat "+tp+" pid(%d) fid(%d) mid(%d) view(%d) favorite(%d) reply(%d) share(%d) error(%v)",
sm.ID, fid, mid, *sm.Count, st.Fav, st.Reply, st.Share, err)
}
log.Info("update cache success "+tp+" pid(%d) aid(%d) fid(%d) mid(%d) view(%d) favorite(%d) reply(%d) share(%d)",
sm.ID, sm.Aid, fid, mid, *sm.Count, st.Fav, st.Reply, st.Share)
dao.PromInfo("stat:更新计数缓存")
return
}
// intercept intercepts illegal views.
func (s *Service) intercept(stat *model.StatM) bool {
return s.dao.Intercept(context.TODO(), stat.ID, stat.Aid, stat.IP)
}