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.
134 lines
3.6 KiB
134 lines
3.6 KiB
package service |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/interface/main/web/conf" |
|
"go-common/app/interface/main/web/model" |
|
"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" |
|
) |
|
|
|
const _allRank = 0 |
|
|
|
// NewList get new list by region id. |
|
func (s *Service) NewList(c context.Context, rid int32, tp int8, pn, ps int) (arcs []*api.Arc, count int, err error) { |
|
var ( |
|
addCache = true |
|
first bool |
|
allArcs, moreArcs []*api.Arc |
|
start, end, max int |
|
ip = metadata.String(c, metadata.RemoteIP) |
|
) |
|
// check first or second region id. |
|
if _, ok := s.rids[rid]; ok { |
|
first = true |
|
} |
|
if first { |
|
max = s.c.Rule.MaxFirstCacheSize |
|
end = max |
|
} else { |
|
max = s.c.Rule.MaxSecondCacheSize |
|
start = (pn - 1) * ps |
|
end = start + ps - 1 |
|
if start < 0 || end < 0 { |
|
err = ecode.RequestErr |
|
return |
|
} |
|
} |
|
// get from local cache. |
|
if arcs, count, err = s.dao.NewListCache(c, rid, tp, start, end); err != nil { |
|
err = nil |
|
addCache = false |
|
} else if len(arcs) > 0 { |
|
return |
|
} |
|
// get from archive-service |
|
if first { |
|
if allArcs, count, err = s.rankTopArcs(c, rid, tp, 1, max, ip); err != nil { |
|
err = nil |
|
} else if tid, ok := model.NewListRid[rid]; ok && len(allArcs) < conf.Conf.Rule.MinNewListCnt { |
|
if moreArcs, _, err = s.rankArcs(c, tid, tp, _samplePn, conf.Conf.Rule.MinNewListCnt, ip); err != nil { |
|
err = nil |
|
} else { |
|
allAidMap := make(map[int64]int64, len(allArcs)) |
|
for _, arc := range allArcs { |
|
allAidMap[arc.Aid] = arc.Aid |
|
} |
|
for _, v := range moreArcs { |
|
if _, ok := allAidMap[v.Aid]; ok { |
|
continue |
|
} |
|
allArcs = append(allArcs, v) |
|
} |
|
log.Info("NewList more arcs rid(%d) tid(%d) len allArcs(%d) len moreArcs(%d)", tid, rid, len(allArcs), len(moreArcs)) |
|
} |
|
} |
|
} else { |
|
if start >= max { |
|
if arcs, count, err = s.rankArcs(c, rid, tp, pn, ps, ip); err != nil { |
|
return |
|
} |
|
fmtArcs3(arcs) |
|
return |
|
} |
|
if allArcs, count, err = s.rankArcs(c, rid, tp, 1, max, ip); err != nil { |
|
err = nil |
|
} |
|
} |
|
if len(allArcs) > 0 { |
|
fmtArcs3(allArcs) |
|
length := len(allArcs) |
|
if length < start { |
|
arcs = []*api.Arc{} |
|
return |
|
} |
|
if length > end { |
|
arcs = allArcs[start : end+1] |
|
} else { |
|
arcs = allArcs[start:] |
|
} |
|
if addCache { |
|
s.cache.Do(c, func(c context.Context) { |
|
s.dao.SetNewListCache(c, rid, tp, allArcs, count) |
|
}) |
|
} |
|
return |
|
} |
|
// get from remote cache. |
|
arcs, count, err = s.dao.NewListBakCache(c, rid, tp, start, end) |
|
if len(arcs) == 0 { |
|
arcs = []*api.Arc{} |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) rankArcs(c context.Context, rid int32, tp int8, pn, ps int, ip string) (arcs []*api.Arc, count int, err error) { |
|
var res = &archive.RankArchives3{} |
|
if rid == _allRank { |
|
if res, err = s.arc.RankAllArcs3(c, &archive.ArgRankAll2{Pn: pn, Ps: ps}); err != nil { |
|
log.Error("arcrpc.RankAllArcs2(%d,%d) error(%v)", pn, ps, err) |
|
return |
|
} |
|
} else { |
|
arg := &archive.ArgRank2{Rid: int16(rid), Type: tp, Pn: pn, Ps: ps, RealIP: ip} |
|
if res, err = s.arc.RankArcs3(c, arg); err != nil { |
|
log.Error("arcrpc.RankArcs2(%d,%d,%d,%s) error(%v)", rid, pn, ps, ip, err) |
|
return |
|
} |
|
} |
|
arcs = res.Archives |
|
count = res.Count |
|
return |
|
} |
|
|
|
func (s *Service) rankTopArcs(c context.Context, rid int32, tp int8, pn, ps int, ip string) (arcs []*api.Arc, count int, err error) { |
|
arg := &archive.ArgRankTop2{ReID: int16(rid), Pn: pn, Ps: ps} |
|
if arcs, err = s.arc.RankTopArcs3(c, arg); err != nil { |
|
log.Error("arcrpc.RankTopArcs3(%d,%d,%d,%s) error(%v)", rid, pn, ps, ip, err) |
|
} |
|
return |
|
}
|
|
|