123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- 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
- }
|