2019-04-22 02:59:20 +00:00

165 lines
3.9 KiB
Go

package web
import (
"context"
"strings"
"sync"
"sync/atomic"
"time"
tagmdl "go-common/app/interface/main/tag/model"
"go-common/app/interface/main/web-goblin/dao/web"
webmdl "go-common/app/interface/main/web-goblin/model/web"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
)
var (
_emptyMiArc = make([]*webmdl.Mi, 0)
)
const (
_tagBlkSize = 50
_tagArcType = 3
)
// FullShort xiao mi FullShort .
func (s *Service) FullShort(c context.Context, pn, ps int64, source string) (res []*webmdl.Mi, err error) {
var (
aids []int64
ip = metadata.String(c, metadata.RemoteIP)
m = make(map[int64]string)
)
if aids, err = s.aids(c, pn, ps); err != nil {
return
}
if res, err = s.archiveWithTag(c, aids, ip, m, source); err != nil {
log.Error("s.archiveWithTag error(%v)", err)
}
return
}
func (s *Service) archiveWithTag(c context.Context, aids []int64, ip string, op map[int64]string, source string) (list []*webmdl.Mi, err error) {
var (
arcErr, tagErr error
archives map[int64]*api.Arc
pages []*api.Page
pageInfo map[int64][]*api.Page
tags map[int64][]*tagmdl.Tag
mutex = sync.Mutex{}
tempTags []string
)
group := new(errgroup.Group)
group.Go(func() error {
if archives, arcErr = s.arc.Archives3(context.Background(), &archive.ArgAids2{Aids: aids, RealIP: ip}); arcErr != nil {
web.PromError("Archives3接口错误", "s.arc.Archives3(%d,%s) error %v", aids, ip, err)
return arcErr
}
return nil
})
pageInfo = make(map[int64][]*api.Page)
for _, aid := range aids {
group.Go(func() error {
pages = []*api.Page{}
if pages, err = s.arc.Page3(context.Background(), &archive.ArgAid2{Aid: aid, RealIP: ip}); err != nil {
log.Error("s.arc.Page3 error(%v)", err)
return err
}
mutex.Lock()
pageInfo[aid] = pages
mutex.Unlock()
return nil
})
}
aidsLen := len(aids)
tags = make(map[int64][]*tagmdl.Tag, aidsLen)
for i := 0; i < aidsLen; i += _tagBlkSize {
var partAids []int64
if i+_tagBlkSize > aidsLen {
partAids = aids[i:]
} else {
partAids = aids[i : i+_tagBlkSize]
}
group.Go(func() (err error) {
var tmpRes map[int64][]*tagmdl.Tag
arg := &tagmdl.ArgResTags{Oids: partAids, Type: _tagArcType, RealIP: ip}
if tmpRes, tagErr = s.tag.ResTags(context.Background(), arg); tagErr != nil {
web.PromError("ResTags接口错误", "s.tag.ResTag(%+v) error(%v)", arg, tagErr)
return
}
mutex.Lock()
for aid, tmpTags := range tmpRes {
tags[aid] = tmpTags
}
mutex.Unlock()
return nil
})
}
if err = group.Wait(); err != nil {
return
}
for _, aid := range aids {
if arc, ok := archives[aid]; ok && arc.IsNormal() {
miArc := new(webmdl.Mi)
tempTags = []string{}
miArc.FromArchive(arc, pageInfo[aid], op[aid], source)
if tag, ok := tags[aid]; ok {
for _, v := range tag {
tempTags = append(tempTags, v.Name)
}
}
if len(tempTags) == 0 {
miArc.Tags = ""
} else {
miArc.Tags = strings.Join(tempTags, ",")
}
list = append(list, miArc)
}
}
if len(list) == 0 {
list = _emptyMiArc
}
return
}
func (s *Service) aids(c context.Context, pn, ps int64) (res []int64, err error) {
var start, end int64
if pn > 1 {
start = pn*ps + 1
} else {
start = 1
}
end = start + ps
if s.maxAid > 0 && end > s.maxAid {
log.Warn("aids(%d,%d) maxAid(%d)", pn, ps, s.maxAid)
err = ecode.RequestErr
return
}
for i := start; i < end; i++ {
res = append(res, i)
}
return
}
func (s *Service) justAID() {
var (
maxAid int64
err error
)
for {
if maxAid, err = s.arc.MaxAID(context.Background()); err != nil {
web.PromError("MaxAID接口错误", "s.arc.MaxAID error(%v)", err)
time.Sleep(time.Second)
continue
}
if maxAid > 0 {
atomic.StoreInt64(&s.maxAid, maxAid+100)
}
time.Sleep(time.Minute)
}
}