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.
240 lines
5.9 KiB
240 lines
5.9 KiB
package data |
|
|
|
import ( |
|
"context" |
|
"strings" |
|
|
|
"go-common/app/interface/main/creative/conf" |
|
"go-common/app/interface/main/creative/dao/account" |
|
"go-common/app/interface/main/creative/dao/activity" |
|
"go-common/app/interface/main/creative/dao/archive" |
|
"go-common/app/interface/main/creative/dao/article" |
|
"go-common/app/interface/main/creative/dao/bfs" |
|
"go-common/app/interface/main/creative/dao/data" |
|
"go-common/app/interface/main/creative/dao/medal" |
|
"go-common/app/interface/main/creative/dao/tag" |
|
arcMdl "go-common/app/interface/main/creative/model/archive" |
|
dataMdl "go-common/app/interface/main/creative/model/data" |
|
"go-common/app/interface/main/creative/service" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/stat/prom" |
|
) |
|
|
|
//Service struct |
|
type Service struct { |
|
c *conf.Config |
|
data *data.Dao |
|
acc *account.Dao |
|
arc *archive.Dao |
|
art *article.Dao |
|
dtag *tag.Dao |
|
dbfs *bfs.Dao |
|
medal *medal.Dao |
|
act *activity.Dao |
|
p *service.Public |
|
pCacheHit *prom.Prom |
|
pCacheMiss *prom.Prom |
|
} |
|
|
|
//New get service |
|
func New(c *conf.Config, rpcdaos *service.RPCDaos, p *service.Public) *Service { |
|
s := &Service{ |
|
c: c, |
|
data: data.New(c), |
|
acc: rpcdaos.Acc, |
|
arc: rpcdaos.Arc, |
|
art: rpcdaos.Art, |
|
dtag: tag.New(c), |
|
dbfs: bfs.New(c), |
|
medal: medal.New(c), |
|
act: activity.New(c), |
|
p: p, |
|
pCacheHit: prom.CacheHit, |
|
pCacheMiss: prom.CacheMiss, |
|
} |
|
return s |
|
} |
|
|
|
// Stat get stat. |
|
func (s *Service) Stat(c context.Context, mid int64, ip string) (r *dataMdl.Stat, err error) { |
|
if r, err = s.data.Stat(c, ip, mid); err != nil { |
|
return |
|
} |
|
pfl, err := s.acc.ProfileWithStat(c, mid) |
|
if err != nil { |
|
return |
|
} |
|
r.Fan = int64(pfl.Follower) |
|
return |
|
} |
|
|
|
// Tags get predict tag. |
|
func (s *Service) Tags(c context.Context, mid int64, tid uint16, title, filename, desc, cover string, tagFrom int8) (res *dataMdl.Tags, err error) { |
|
res = &dataMdl.Tags{ |
|
Tags: make([]string, 0), |
|
} |
|
var ctags []*dataMdl.CheckedTag |
|
ctags, err = s.TagsWithChecked(c, mid, tid, title, filename, desc, cover, tagFrom) |
|
if len(ctags) > 0 { |
|
for _, t := range ctags { |
|
res.Tags = append(res.Tags, t.Tag) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// TagsWithChecked get predict tag with checked mark. |
|
func (s *Service) TagsWithChecked(c context.Context, mid int64, tid uint16, title, filename, desc, cover string, tagFrom int8) (retTags []*dataMdl.CheckedTag, err error) { |
|
retTags = make([]*dataMdl.CheckedTag, 0) |
|
var checkedTags []*dataMdl.CheckedTag |
|
if checkedTags, err = s.data.TagsWithChecked(c, mid, tid, title, filename, desc, cover, tagFrom); err != nil { |
|
log.Error("s.data.TagsWithChecked error(%v)", err) |
|
err = nil |
|
} |
|
// no recommend tag, return |
|
if len(checkedTags) == 0 { |
|
return |
|
} |
|
actTagsMap := make(map[string]int64) |
|
acts, _ := s.act.Activities(c) |
|
// no acts, no filter and return |
|
if len(acts) == 0 { |
|
retTags = checkedTags |
|
return |
|
} |
|
// filter act tags |
|
for _, act := range acts { |
|
tagsSlice := strings.Split(act.Tags, ",") |
|
if len(tagsSlice) > 0 { |
|
for _, tag := range tagsSlice { |
|
actTagsMap[tag] = act.ID |
|
} |
|
} |
|
actTagsMap[act.Name] = act.ID |
|
} |
|
for _, checkedTag := range checkedTags { |
|
if _, ok := actTagsMap[checkedTag.Tag]; !ok { |
|
retTags = append(retTags, checkedTag) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// VideoQuitPoints get video quit data. |
|
func (s *Service) VideoQuitPoints(c context.Context, cid, mid int64, ip string) (res []int64, err error) { |
|
// check cid owner |
|
isWhite := false |
|
for _, m := range s.c.Whitelist.DataMids { |
|
if m == mid { |
|
isWhite = true |
|
break |
|
} |
|
} |
|
if !isWhite { |
|
var video *arcMdl.Video |
|
if video, err = s.arc.VideoByCid(c, int64(cid), ip); err != nil { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
if arc, errr := s.arc.Archive(c, video.Aid, ip); errr == nil { |
|
if arc.Author.Mid != mid { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
} |
|
} |
|
res, err = s.data.VideoQuitPoints(c, cid) |
|
return |
|
} |
|
|
|
// ArchiveStat get video quit data. |
|
func (s *Service) ArchiveStat(c context.Context, aid, mid int64, ip string) (stat *dataMdl.ArchiveData, err error) { |
|
// check aid valid and owner |
|
isWhite := false |
|
for _, m := range s.c.Whitelist.DataMids { |
|
if m == mid { |
|
isWhite = true |
|
break |
|
} |
|
} |
|
if !isWhite { |
|
a, re := s.arc.Archive(c, aid, ip) |
|
if re != nil { |
|
err = re |
|
return |
|
} |
|
if a == nil { |
|
log.Warn("arc not exist") |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
if a.Author.Mid != mid { |
|
log.Warn("owner mid(%d) and viewer mid(%d) are different ", a.Author.Mid, mid) |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
} |
|
if stat, err = s.data.ArchiveStat(c, aid); err != nil { |
|
return |
|
} |
|
if stat == nil { |
|
return |
|
} |
|
if stat.ArchiveStat != nil && stat.ArchiveStat.Play >= 100 { |
|
if stat.ArchiveAreas, err = s.data.ArchiveArea(c, aid); err != nil { |
|
log.Error(" s.data.ArchiveArea aid(%d)|mid(%d), err(%+v)", aid, mid, err) |
|
return |
|
} |
|
} |
|
//获取播放数据 |
|
if stat.ArchivePlay, err = s.data.UpArcPlayAnalysis(c, aid); err != nil { |
|
log.Error(" s.data.UpArcPlayAnalysis aid(%d)|mid(%d), err(%+v)", aid, mid, err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// Covers get covers from ai |
|
func (s *Service) Covers(c context.Context, mid int64, fns []string, ip string) (cvs []string, err error) { |
|
if cvs, err = s.data.RecommendCovers(c, mid, fns); err != nil { |
|
log.Error("s.data.RecommendCovers err(%v)", mid, err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// Ping service |
|
func (s *Service) Ping(c context.Context) (err error) { |
|
if err = s.data.Ping(c); err != nil { |
|
log.Error("s.data.Dao.PingDb err(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
// Close dao |
|
func (s *Service) Close() { |
|
s.data.Close() |
|
} |
|
|
|
// IsWhite check white. |
|
func (s *Service) IsWhite(mid int64) (isWhite bool) { |
|
for _, m := range s.c.Whitelist.DataMids { |
|
if m == mid { |
|
isWhite = true |
|
break |
|
} |
|
} |
|
return |
|
} |
|
|
|
// IsForbidVideoup fn. |
|
func (s *Service) IsForbidVideoup(mid int64) (isForbid bool) { |
|
for _, m := range s.c.Whitelist.ForbidVideoupMids { |
|
if m == mid { |
|
isForbid = true |
|
break |
|
} |
|
} |
|
return |
|
}
|
|
|