123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- package service
- import (
- "context"
- "html/template"
- "time"
- "go-common/app/interface/main/space/model"
- arcmdl "go-common/app/service/main/archive/api"
- filmdl "go-common/app/service/main/filter/model/rpc"
- upmdl "go-common/app/service/main/up/api/v1"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup.v2"
- )
- const (
- _reasonWarnLevel = int8(20)
- _reasonErrLevel = int8(30)
- _checkTypeChannel = "channel"
- )
- var (
- _emptyArchiveReason = make([]*model.ArchiveReason, 0)
- _emptySearchVList = make([]*model.SearchVList, 0)
- )
- // UpArcStat get up all article stat.
- func (s *Service) UpArcStat(c context.Context, mid int64) (data *model.UpArcStat, err error) {
- addCache := true
- if data, err = s.dao.UpArcCache(c, mid); err != nil {
- addCache = false
- } else if data != nil {
- return
- }
- dt := time.Now().AddDate(0, 0, -1).Add(-12 * time.Hour).Format("20060102")
- if data, err = s.dao.UpArcStat(c, mid, dt); data != nil && addCache {
- s.cache.Do(c, func(c context.Context) {
- s.dao.SetUpArcCache(c, mid, data)
- })
- }
- return
- }
- // TopArc get top archive.
- func (s *Service) TopArc(c context.Context, mid, vmid int64) (res *model.ArchiveReason, err error) {
- var (
- topArc *model.AidReason
- arcReply *arcmdl.ArcReply
- )
- if topArc, err = s.dao.TopArc(c, vmid); err != nil {
- return
- }
- if topArc == nil || topArc.Aid == 0 {
- err = ecode.SpaceNoTopArc
- return
- }
- if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: topArc.Aid}); err != nil {
- log.Error("TopArc s.arcClient.Arc(%d) error(%v)", topArc.Aid, err)
- return
- }
- arc := arcReply.Arc
- if mid != vmid && !arc.IsNormal() {
- err = ecode.SpaceNoTopArc
- return
- }
- if arc.Access >= 10000 {
- arc.Stat.View = -1
- }
- res = &model.ArchiveReason{Arc: arc, Reason: template.HTMLEscapeString(topArc.Reason)}
- return
- }
- // SetTopArc set top archive.
- func (s *Service) SetTopArc(c context.Context, mid, aid int64, reason string) (err error) {
- var (
- arcReply *arcmdl.ArcReply
- filRes *filmdl.FilterRes
- topArc *model.AidReason
- )
- if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
- log.Error("SetTopArc s.arcClient.Arc(%d) error(%v)", aid, err)
- return
- }
- arc := arcReply.Arc
- if !arc.IsNormal() {
- err = ecode.SpaceFakeAid
- return
- }
- if arc.Author.Mid != mid {
- err = ecode.SpaceNotAuthor
- return
- }
- if reason != "" {
- if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
- log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
- return
- }
- if filRes.Level >= _reasonErrLevel {
- err = ecode.SpaceTextBanned
- return
- }
- if filRes.Level == _reasonWarnLevel {
- reason = filRes.Result
- }
- }
- if topArc, err = s.dao.TopArc(c, mid); err != nil {
- return
- }
- if topArc != nil && aid == topArc.Aid && reason == topArc.Reason {
- err = ecode.NotModified
- return
- }
- if err = s.dao.AddTopArc(c, mid, aid, reason); err == nil {
- s.dao.AddCacheTopArc(c, mid, &model.AidReason{Aid: aid, Reason: reason})
- }
- return
- }
- // DelTopArc delete top archive.
- func (s *Service) DelTopArc(c context.Context, mid int64) (err error) {
- var topArc *model.AidReason
- if topArc, err = s.dao.TopArc(c, mid); err != nil {
- return
- }
- if topArc == nil {
- err = ecode.RequestErr
- return
- }
- if err = s.dao.DelTopArc(c, mid); err == nil {
- s.dao.AddCacheTopArc(c, mid, &model.AidReason{Aid: -1})
- }
- return
- }
- // Masterpiece get masterpiece.
- func (s *Service) Masterpiece(c context.Context, mid, vmid int64) (res []*model.ArchiveReason, err error) {
- var (
- mps *model.AidReasons
- arcsReply *arcmdl.ArcsReply
- aids []int64
- )
- if mps, err = s.dao.Masterpiece(c, vmid); err != nil {
- return
- }
- if mps == nil || len(mps.List) == 0 {
- res = _emptyArchiveReason
- return
- }
- for _, v := range mps.List {
- aids = append(aids, v.Aid)
- }
- if arcsReply, err = s.arcClient.Arcs(c, &arcmdl.ArcsRequest{Aids: aids}); err != nil {
- log.Error("Masterpiece s.arcClient.Arcs(%v) error(%v)", aids, err)
- return
- }
- for _, v := range mps.List {
- if arc, ok := arcsReply.Arcs[v.Aid]; ok && arc != nil {
- if !arc.IsNormal() && mid != vmid {
- continue
- }
- if arc.Access >= 10000 {
- arc.Stat.View = -1
- }
- res = append(res, &model.ArchiveReason{Arc: arc, Reason: template.HTMLEscapeString(v.Reason)})
- }
- }
- if len(res) == 0 {
- res = _emptyArchiveReason
- }
- return
- }
- // AddMasterpiece add masterpiece.
- func (s *Service) AddMasterpiece(c context.Context, mid, aid int64, reason string) (err error) {
- var (
- mps *model.AidReasons
- arcReply *arcmdl.ArcReply
- filRes *filmdl.FilterRes
- )
- if mps, err = s.dao.Masterpiece(c, mid); err != nil {
- return
- }
- if mps == nil {
- mps = &model.AidReasons{}
- }
- mpLen := len(mps.List)
- if mpLen >= s.c.Rule.MaxMpLimit {
- err = ecode.SpaceMpMaxCount
- return
- }
- if mpLen > 0 {
- for _, v := range mps.List {
- if v.Aid == aid {
- err = ecode.SpaceMpExist
- return
- }
- }
- }
- if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
- log.Error("AddMasterpiece s.arcClient.Arc(%d) error(%v)", aid, err)
- return
- }
- arc := arcReply.Arc
- if !arc.IsNormal() {
- err = ecode.SpaceFakeAid
- return
- }
- if arc.Author.Mid != mid {
- err = ecode.SpaceNotAuthor
- return
- }
- if reason != "" {
- if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
- log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
- return
- }
- if filRes.Level >= _reasonErrLevel {
- err = ecode.SpaceTextBanned
- return
- }
- if filRes.Level == _reasonWarnLevel {
- reason = filRes.Result
- }
- }
- if err = s.dao.AddMasterpiece(c, mid, aid, reason); err == nil {
- mps.List = append(mps.List, &model.AidReason{Aid: aid, Reason: reason})
- s.cache.Do(c, func(c context.Context) {
- s.dao.AddCacheMasterpiece(c, mid, mps)
- })
- }
- return
- }
- // EditMasterpiece edit masterpiece.
- func (s *Service) EditMasterpiece(c context.Context, mid, preAid, aid int64, reason string) (err error) {
- var (
- mps *model.AidReasons
- arcReply *arcmdl.ArcReply
- filRes *filmdl.FilterRes
- preCheck bool
- )
- if mps, err = s.dao.Masterpiece(c, mid); err != nil {
- return
- }
- if mps == nil || len(mps.List) == 0 {
- err = ecode.SpaceMpNoArc
- return
- }
- for _, v := range mps.List {
- if v.Aid == preAid {
- preCheck = true
- }
- if v.Aid == aid {
- err = ecode.SpaceMpExist
- return
- }
- }
- if !preCheck {
- err = ecode.SpaceMpNoArc
- return
- }
- if arcReply, err = s.arcClient.Arc(c, &arcmdl.ArcRequest{Aid: aid}); err != nil || arcReply.Arc == nil {
- log.Error("AddMasterpiece s.arcClient.Arc(%d) error(%v)", aid, err)
- return
- }
- arc := arcReply.Arc
- if !arc.IsNormal() {
- err = ecode.SpaceFakeAid
- return
- }
- if arc.Author.Mid != mid {
- err = ecode.SpaceNotAuthor
- return
- }
- if reason != "" {
- if filRes, err = s.filter.FilterArea(c, &filmdl.ArgFilter{Area: "common", Message: reason}); err != nil || filRes == nil {
- log.Error("SetTopArc s.filter.FilterArea(%s) error(%v)", reason, err)
- return
- }
- if filRes.Level >= _reasonErrLevel {
- err = ecode.SpaceTextBanned
- return
- }
- if filRes.Level == _reasonWarnLevel {
- reason = filRes.Result
- }
- }
- if err = s.dao.EditMasterpiece(c, mid, aid, preAid, reason); err == nil {
- newAidReasons := &model.AidReasons{}
- for _, v := range mps.List {
- if v.Aid == preAid {
- newAidReasons.List = append(newAidReasons.List, &model.AidReason{Aid: aid, Reason: reason})
- } else {
- newAidReasons.List = append(newAidReasons.List, v)
- }
- }
- s.cache.Do(c, func(c context.Context) {
- s.dao.AddCacheMasterpiece(c, mid, newAidReasons)
- })
- }
- return
- }
- // CancelMasterpiece delete masterpiece.
- func (s *Service) CancelMasterpiece(c context.Context, mid, aid int64) (err error) {
- var (
- mps *model.AidReasons
- existCheck bool
- )
- if mps, err = s.dao.Masterpiece(c, mid); err != nil {
- return
- }
- if mps == nil || len(mps.List) == 0 {
- err = ecode.SpaceMpNoArc
- return
- }
- for _, v := range mps.List {
- if v.Aid == aid {
- existCheck = true
- break
- }
- }
- if !existCheck {
- err = ecode.SpaceMpNoArc
- return
- }
- if err = s.dao.DelMasterpiece(c, mid, aid); err == nil {
- newAidReasons := &model.AidReasons{}
- for _, v := range mps.List {
- if v.Aid == aid {
- continue
- }
- newAidReasons.List = append(newAidReasons.List, v)
- }
- if len(newAidReasons.List) == 0 {
- newAidReasons.List = append(newAidReasons.List, &model.AidReason{Aid: -1})
- }
- s.cache.Do(c, func(c context.Context) {
- s.dao.AddCacheMasterpiece(c, mid, newAidReasons)
- })
- }
- return
- }
- // UpArcs get upload archive .
- func (s *Service) UpArcs(c context.Context, mid int64, pn, ps int32) (res *model.UpArc, err error) {
- res = &model.UpArc{List: []*model.ArcItem{}}
- group := errgroup.WithContext(c)
- group.Go(func(ctx context.Context) error {
- if upCount, e := s.upClient.UpCount(ctx, &upmdl.UpCountReq{Mid: mid}); e != nil {
- log.Error("UpArcs s.upClient.UpCount mid(%d) error(%v)", mid, e)
- } else {
- res.Count = upCount.Count
- }
- return nil
- })
- group.Go(func(ctx context.Context) error {
- if reply, e := s.upClient.UpArcs(ctx, &upmdl.UpArcsReq{Mid: mid, Pn: pn, Ps: ps}); e != nil {
- log.Error("UpArcs s.upClient.UpArcs mid(%d) error(%v)", mid, err)
- } else if len(reply.Archives) > 0 {
- res.List = make([]*model.ArcItem, 0, len(reply.Archives))
- for _, v := range reply.Archives {
- si := &model.ArcItem{}
- si.FromArc(v)
- res.List = append(res.List, si)
- }
- }
- return nil
- })
- if e := group.Wait(); e != nil {
- log.Error("UpArcs group.Wait mid(%d) error(%v)", mid, e)
- }
- return
- }
- // ArcSearch get archive from search.
- func (s *Service) ArcSearch(c context.Context, mid int64, arg *model.SearchArg) (data *model.SearchRes, total int, err error) {
- if data, total, err = s.dao.ArcSearchList(c, arg); err != nil {
- return
- }
- if len(data.VList) == 0 {
- data.VList = _emptySearchVList
- return
- }
- checkAids := make(map[int64]int64)
- if arg.CheckType == _checkTypeChannel {
- if mid == 0 {
- err = ecode.RequestErr
- return
- }
- var chArcs []*model.ChannelArc
- if chArcs, err = s.dao.ChannelVideos(c, mid, arg.CheckID, false); err != nil {
- err = nil
- } else {
- for _, chArc := range chArcs {
- checkAids[chArc.Aid] = chArc.Aid
- }
- }
- }
- vlist := make([]*model.SearchVList, 0)
- for _, v := range data.VList {
- if v.HideClick {
- v.Play = "--"
- }
- if _, ok := checkAids[v.Aid]; !ok {
- vlist = append(vlist, v)
- }
- }
- data.VList = vlist
- return
- }
|