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.
105 lines
3.0 KiB
105 lines
3.0 KiB
package thirdp |
|
|
|
import ( |
|
"math" |
|
|
|
"go-common/app/interface/main/tv/dao/thirdp" |
|
"go-common/app/interface/main/tv/model" |
|
tpMdl "go-common/app/interface/main/tv/model/thirdp" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
|
|
"github.com/pkg/errors" |
|
) |
|
|
|
func (s *Service) buildPager(req *tpMdl.ReqDBeiPages) (pager *model.IdxPager, err error) { |
|
var ( |
|
addCache bool |
|
count int |
|
) |
|
// pick up the count from redis, otherwise pick it from DB |
|
if count, err = s.dao.GetThirdpCnt(ctx, req.TypeC); err != nil { |
|
if count, err = s.dao.ThirdpCnt(ctx, req.TypeC); err != nil { |
|
return // if db count still error, fatal error |
|
} |
|
log.Error("PickDBeiPage - Can't Get Count, Pass by DB, Page %d", req.Page) |
|
addCache = true |
|
} |
|
pager = &model.IdxPager{ |
|
CurrentPage: int(req.Page), |
|
TotalItems: count, |
|
TotalPages: int(math.Ceil(float64(count) / float64(req.Ps))), |
|
PageSize: int(req.Ps), |
|
} |
|
if req.Page > int64(pager.TotalPages) { |
|
err = ecode.TvDangbeiPageNotExist |
|
return |
|
} |
|
// async Reset the DB data: Count & CurrentPage ID in MC for next time |
|
if addCache { |
|
cache.Save(func() { |
|
s.dao.SetThirdpCnt(ctx, count, req.TypeC) |
|
log.Info("PickDBeiPage Set Count %d Into Cache", count) |
|
}) |
|
} |
|
return |
|
} |
|
|
|
// PickDBeiPage picks the dangbei's page |
|
func (s *Service) PickDBeiPage(page int64, typeC string) (data *tpMdl.DBeiPage, err error) { |
|
var ( |
|
cPageID int64 |
|
sids []int64 // this page's season ids |
|
sns []*model.SeasonCMS |
|
arcs []*model.ArcCMS |
|
dbeiSns []*tpMdl.DBeiSeason |
|
pager *model.IdxPager |
|
) |
|
req := &tpMdl.ReqDBeiPages{ |
|
Ps: s.conf.Cfg.Dangbei.Pagesize, |
|
TypeC: typeC, |
|
Page: page, |
|
} |
|
if pager, err = s.buildPager(req); err != nil { |
|
return |
|
} |
|
if req.LastID, err = s.dao.LoadPageID(ctx, req); err != nil { |
|
log.Error("MangoPage getPageID LastPage %d Miss, Pass by offset", page-1) |
|
return |
|
} |
|
if sids, cPageID, err = s.dao.DBeiPages(ctx, req); err != nil { |
|
return |
|
} |
|
if len(sids) == 0 { |
|
err = errors.Wrapf(ecode.NothingFound, "Type_C [%s], Page [%d], Offset Result Empty", typeC, page) |
|
return |
|
} |
|
// load data from cache and transform data to Dangbei structure |
|
if typeC == thirdp.DBeiPGC { // pgc - seasonCMS |
|
if sns, _, err = s.cmsDao.LoadSnsCMS(ctx, sids); err != nil { |
|
log.Error("PickDBeiPage - PGC - LoadSnsCMS - Sids %v, Error %v", sids, err) |
|
return |
|
} |
|
for _, v := range sns { // transform the object to DbeiSeason |
|
dbeiSns = append(dbeiSns, tpMdl.DBeiSn(v)) |
|
} |
|
} else if typeC == thirdp.DBeiUGC { // ugc - arcCMS |
|
if arcs, err = s.cmsDao.LoadArcsMedia(ctx, sids); err != nil { |
|
log.Error("PickDBeiPage - UGC - LoadArcsMedia - Sids %v, Error %v", sids, err) |
|
return |
|
} |
|
for _, v := range arcs { |
|
first, second := s.arcDao.GetPTypeName(int32(v.TypeID)) |
|
dbeiSns = append(dbeiSns, tpMdl.DbeiArc(v, first, second)) |
|
} |
|
} |
|
// async Reset the DB data: CurrentPage ID in MC for next time |
|
cache.Save(func() { |
|
s.dao.SetPageID(ctx, &tpMdl.ReqPageID{Page: page, ID: cPageID, TypeC: typeC}) |
|
}) |
|
data = &tpMdl.DBeiPage{ |
|
List: dbeiSns, |
|
Pager: pager, |
|
} |
|
return |
|
}
|
|
|