go-common/app/interface/main/tv/dao/cms/ugc_load.go
2019-04-22 18:49:16 +08:00

149 lines
4.8 KiB
Go

package cms
import (
"context"
"go-common/app/interface/main/tv/model"
"go-common/library/ecode"
"go-common/library/log"
)
// LoadArcsMediaMap loads a batch of arc meta
func (d *Dao) LoadArcsMediaMap(ctx context.Context, aids []int64) (resMetas map[int64]*model.ArcCMS, err error) {
var (
cachedMetas map[int64]*model.ArcCMS // cache hit seasons
missedMetas map[int64]*model.ArcCMS // cache miss seasons, pick from DB
missed []int64 // cache miss seasons
addCache = true // whether we need to fill DB data in MC
)
resMetas = make(map[int64]*model.ArcCMS) // merge info from MC and from DB
// pick up the information for these season ids
if cachedMetas, missed, err = d.ArcsMetaCache(ctx, aids); err != nil {
log.Error("LoadArcsMedia ArcsMetaCache Aids:%v, Error:%v", aids, err)
err = nil
addCache = false // mc error, we don't add
}
if len(missed) > 0 {
if missedMetas, err = d.ArcMetas(ctx, missed); err != nil {
log.Error("LoadArcsMedia ArcMetas Sids:%v, Error:%v", missed, err)
return
}
}
// merge info from DB and the info from MC
for sid, v := range cachedMetas {
resMetas[sid] = v
}
for sid, v := range missedMetas {
resMetas[sid] = v
}
// async Reset the DB data in MC for next time
log.Info("Set Sids [%d], MissedMetas [%d] Data in MC", len(aids), len(missedMetas))
if addCache && len(missedMetas) > 0 {
for _, art := range missedMetas {
d.AddArcMetaCache(art)
}
}
return
}
// LoadVideosMeta picks the videos meta info
func (d *Dao) LoadVideosMeta(ctx context.Context, cids []int64) (resMetas map[int64]*model.VideoCMS, err error) {
var (
cachedMetas map[int64]*model.VideoCMS // cache hit seasons
missedMetas map[int64]*model.VideoCMS // cache miss seasons, pick from DB
missed []int64 // cache miss seasons
addCache = true // whether we need to fill DB data in MC
)
resMetas = make(map[int64]*model.VideoCMS) // merge info from MC and from DB
// pick up the information for these season ids
if cachedMetas, missed, err = d.VideosMetaCache(ctx, cids); err != nil {
log.Error("LoadVideosMeta VideosMetaCache Aids:%v, Error:%v", cids, err)
err = nil
addCache = false // mc error, we don't add
}
if len(missed) > 0 {
if missedMetas, err = d.VideoMetas(ctx, missed); err != nil {
log.Error("LoadVideosMeta VideoMetas Sids:%v, Error:%v", missed, err)
return
}
}
// merge info from DB and the info from MC
for sid, v := range cachedMetas {
resMetas[sid] = v
}
for sid, v := range missedMetas {
resMetas[sid] = v
}
// async Reset the DB data in MC for next time
log.Info("Set Sids [%d], MissedMetas [%d] Data in MC", len(cids), len(missedMetas))
if addCache && len(missedMetas) > 0 {
for _, art := range missedMetas {
d.AddVideoMetaCache(art)
}
}
return
}
// LoadArcsMedia loads the arc meta cms data from cache, for missed ones, pick them from the DB
func (d *Dao) LoadArcsMedia(ctx context.Context, aids []int64) (arcs []*model.ArcCMS, err error) {
var (
resMetas map[int64]*model.ArcCMS // merge info from MC and from DB
)
if resMetas, err = d.LoadArcsMediaMap(ctx, aids); err != nil {
log.Error("LoadArcsMedia LoadArcsMediaMap Aids: %v, Err: %v", aids, err)
return
}
// re-arrange the info, according to the order got from Redis
for _, v := range aids {
if arcCMS, ok := resMetas[v]; !ok {
log.Error("PickDBeiPage LoadArcsMedia Miss Info for Sid: %d", v)
continue
} else {
arcs = append(arcs, arcCMS)
}
}
return
}
// LoadArcMeta loads the arc meta cms data from cache, for missed ones, pick them from the DB
func (d *Dao) LoadArcMeta(ctx context.Context, aid int64) (arcMeta *model.ArcCMS, err error) {
if arcMeta, err = d.ArcMetaCache(ctx, aid); err != nil { // mc error
log.Error("LoadArcMedia Get Aid [%d] from CMS Error (%v)", aid, err)
return
}
if arcMeta != nil { // mc found
return
}
if arcMeta, err = d.ArcMetaDB(ctx, aid); err != nil { // db error
log.Error("LoadArcMedia ArcMetaDB Aid ERROR (%d) (%v)", aid, err)
return
}
if arcMeta == nil { // db not found
err = ecode.NothingFound
return
}
d.AddArcMetaCache(arcMeta) // db found, re-fill the cache
return
}
// LoadVideoMeta loads the video meta cms data from cache, for missed ones, pick them from the DB
func (d *Dao) LoadVideoMeta(ctx context.Context, cid int64) (videoMeta *model.VideoCMS, err error) {
if videoMeta, err = d.VideoMetaCache(ctx, cid); err != nil { // mc error
log.Error("LoadVideoMeta Get Cid [%d] from CMS Error (%v)", cid, err)
return
}
if videoMeta != nil { // mc found
return
}
if videoMeta, err = d.VideoMetaDB(ctx, cid); err != nil { // db error
log.Error("LoadArcMedia ArcMetaDB Aid ERROR (%d) (%v)", cid, err)
return
}
if videoMeta == nil { // db not found
err = ecode.NothingFound
return
}
d.AddVideoMetaCache(videoMeta) // db found, re-fill the cache
return
}