go-common/app/interface/main/creative/service/data/service.go
2019-04-22 18:49:16 +08:00

241 lines
5.9 KiB
Go

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
}