123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- package service
- import (
- "context"
- "strings"
- "time"
- "go-common/app/interface/main/videoup/conf"
- "go-common/app/interface/main/videoup/dao/account"
- "go-common/app/interface/main/videoup/dao/archive"
- "go-common/app/interface/main/videoup/dao/bfs"
- "go-common/app/interface/main/videoup/dao/creative"
- "go-common/app/interface/main/videoup/dao/dynamic"
- "go-common/app/interface/main/videoup/dao/elec"
- "go-common/app/interface/main/videoup/dao/filter"
- "go-common/app/interface/main/videoup/dao/geetest"
- "go-common/app/interface/main/videoup/dao/mission"
- "go-common/app/interface/main/videoup/dao/order"
- "go-common/app/interface/main/videoup/dao/pay"
- "go-common/app/interface/main/videoup/dao/subtitle"
- "go-common/app/interface/main/videoup/dao/tag"
- arcmdl "go-common/app/interface/main/videoup/model/archive"
- missmdl "go-common/app/interface/main/videoup/model/mission"
- "go-common/app/interface/main/videoup/model/porder"
- "go-common/library/log"
- binfoc "go-common/library/log/infoc"
- "sync"
- )
- // Service is archive and videos service.
- type Service struct {
- c *conf.Config
- // dao
- arc *archive.Dao
- acc *account.Dao
- bfs *bfs.Dao
- miss *mission.Dao
- elec *elec.Dao
- order *order.Dao
- tag *tag.Dao
- creative *creative.Dao
- filter *filter.Dao
- gt *geetest.Dao
- dynamic *dynamic.Dao
- sub *subtitle.Dao
- pay *pay.Dao
- wg sync.WaitGroup
- asyncCh chan func() error
- // type cache
- typeCache map[int16]*arcmdl.Type
- orderUps map[int64]int64
- staffUps map[int64]int64
- missCache map[int]*missmdl.Mission
- missTagsCache map[string]int
- staffTypeCache map[int16]*arcmdl.StaffTypeConf
- staffGary bool
- descFmtsCache map[int16]map[int8][]*arcmdl.DescFormat
- exemptIDCheckUps map[int64]int64
- exemptZeroLevelAndAnswerUps map[int64]int64
- exemptUgcPayUps map[int64]int64
- exemptHalfMinUps map[int64]int64
- PorderCfgs map[int64]*porder.Config
- PorderGames map[int64]*porder.Game
- infoc *binfoc.Infoc
- }
- // New new a service.
- func New(c *conf.Config) (s *Service) {
- s = &Service{
- c: c,
- arc: archive.New(c),
- acc: account.New(c),
- bfs: bfs.New(c),
- miss: mission.New(c),
- elec: elec.New(c),
- order: order.New(c),
- tag: tag.New(c),
- creative: creative.New(c),
- filter: filter.New(c),
- gt: geetest.New(c),
- dynamic: dynamic.New(c),
- sub: subtitle.New(c),
- pay: pay.New(c),
- asyncCh: make(chan func() error, 100),
- infoc: binfoc.New(c.AppEditorInfoc),
- }
- s.loadType()
- s.loadMission()
- s.loadOrderUps()
- s.loadPorderCfgListAsMap()
- s.loadPorderGameListAsMap()
- s.loadExemptIDCheckUps()
- s.loadDescFormatCache()
- s.loadExemptZeroLevelAndAnswer()
- s.loadExemptUgcPayUps()
- s.loadStaffUps()
- s.loadStaffConfig()
- s.loadExemptHalfMinUps()
- go s.loadproc()
- go s.asyncproc()
- return s
- }
- func (s *Service) asyncproc() {
- s.wg.Add(1)
- defer s.wg.Done()
- for {
- f, ok := <-s.asyncCh
- if !ok {
- return
- }
- retry(3, 1*time.Second, f)
- }
- }
- func retry(attempts int, sleep time.Duration, callback func() error) (err error) {
- for i := 0; ; i++ {
- err = callback()
- if err == nil {
- return
- }
- if i >= (attempts - 1) {
- break
- }
- time.Sleep(sleep)
- log.Error("asyncproc retry retrying after error:(%+v)", err)
- }
- log.Error("asyncproc retry after %d attempts, last error: %s", attempts, err)
- return nil
- }
- func (s *Service) loadType() {
- tpm, err := s.arc.TypeMapping(context.TODO())
- if err != nil {
- log.Error("s.arc.TypeMapping error(%v)", err)
- return
- }
- s.typeCache = tpm
- }
- // s.missTagsCache: missionName or first tag
- func (s *Service) loadMission() {
- mm, err := s.miss.Missions(context.TODO())
- if err != nil {
- log.Error("s.miss.Mission error(%v)", err)
- return
- }
- s.missTagsCache = make(map[string]int)
- for _, m := range mm {
- if len(m.Tags) > 0 {
- splitedTags := strings.Split(m.Tags, ",")
- s.missTagsCache[splitedTags[0]] = m.ID
- } else {
- s.missTagsCache[m.Name] = m.ID
- }
- }
- s.missCache = mm
- }
- func (s *Service) loadOrderUps() {
- orderUps, err := s.order.Ups(context.TODO())
- if err != nil {
- return
- }
- s.orderUps = orderUps
- }
- // loadDescFormatCache
- func (s *Service) loadDescFormatCache() {
- fmts, err := s.arc.DescFormat(context.TODO())
- if err != nil {
- return
- }
- newFmts := make(map[int16]map[int8][]*arcmdl.DescFormat)
- for _, d := range fmts {
- if _, okTp := newFmts[d.TypeID]; !okTp {
- newFmts[d.TypeID] = make(map[int8][]*arcmdl.DescFormat)
- }
- if _, okCp := newFmts[d.TypeID][d.Copyright]; !okCp {
- newFmts[d.TypeID][d.Copyright] = []*arcmdl.DescFormat{}
- }
- newFmts[d.TypeID][d.Copyright] = append(newFmts[d.TypeID][d.Copyright], d)
- }
- log.Info("s.loadDescFormat: newFmts(%d), fmts(%d)", len(newFmts), len(fmts))
- s.descFmtsCache = newFmts
- }
- func (s *Service) loadStaffUps() {
- staffUps, err := s.arc.StaffUps(context.TODO())
- if err != nil {
- return
- }
- s.staffUps = staffUps
- }
- func (s *Service) loadproc() {
- for {
- time.Sleep(time.Duration(s.c.Tick))
- s.loadType()
- s.loadMission()
- s.loadExemptIDCheckUps()
- s.loadExemptZeroLevelAndAnswer()
- s.loadExemptUgcPayUps()
- s.loadExemptHalfMinUps()
- s.loadDescFormatCache()
- s.loadOrderUps()
- s.loadPorderCfgListAsMap()
- s.loadPorderGameListAsMap()
- s.loadStaffUps()
- s.loadStaffConfig()
- }
- }
- func (s *Service) loadPorderCfgListAsMap() {
- porderCfgList, err := s.arc.PorderCfgList(context.TODO())
- if err != nil {
- log.Error("s.arc.PorderCfgList error(%v)", err)
- return
- }
- s.PorderCfgs = porderCfgList
- }
- func (s *Service) loadPorderGameListAsMap() {
- list, err := s.arc.GameList(context.TODO())
- if err != nil {
- log.Error("GameList error(%v)", err)
- return
- }
- if len(list) == 0 || list == nil {
- log.Error("GameList empty error(%v)", err)
- return
- }
- s.PorderGames = list
- }
- // Ping ping success.
- func (s *Service) Ping(c context.Context) (err error) {
- return s.arc.Ping(c)
- }
- // Close close resource.
- func (s *Service) Close() {
- s.acc.Close()
- s.arc.Close()
- s.infoc.Close()
- close(s.asyncCh)
- s.wg.Wait()
- }
- // loadExemptIDCheckUps
- func (s *Service) loadExemptIDCheckUps() {
- ups, err := s.arc.UpSpecial(context.TODO(), 8)
- if err != nil {
- return
- }
- s.exemptIDCheckUps = ups
- }
- // loadExemptIDCheckUps
- func (s *Service) loadExemptZeroLevelAndAnswer() {
- ups, err := s.arc.UpSpecial(context.TODO(), 12)
- if err != nil {
- return
- }
- s.exemptZeroLevelAndAnswerUps = ups
- }
- // loadExemptUgcPayUps
- func (s *Service) loadExemptUgcPayUps() {
- ups, err := s.arc.UpSpecial(context.TODO(), 17)
- if err != nil {
- return
- }
- s.exemptUgcPayUps = ups
- }
- // loadStaffConfig 加载联合投稿分区配置
- func (s *Service) loadStaffConfig() {
- var err error
- if s.staffGary, s.staffTypeCache, err = s.arc.StaffTypeConfig(context.TODO()); err != nil {
- s.staffGary = true //怕权限被放出,没有获取到 creative配置的时候,默认开启了灰度策略
- }
- }
- // loadExemptHalfMinUps
- func (s *Service) loadExemptHalfMinUps() {
- ups, err := s.arc.UpSpecial(context.TODO(), 25)
- if err != nil {
- return
- }
- s.exemptHalfMinUps = ups
- }
|