package service import ( "go-common/app/admin/main/tv/model" "go-common/library/database/sql" "go-common/library/log" ) // 0=not found, 1=pgc, 2=cms, 3=license const ( ErrNotFound = 0 _TypeDefault = 0 _TypePGC = 1 _TypeUGC = 2 ) func (s *Service) getSeason(sid int64) (res *model.TVEpSeason, err error) { sn := model.TVEpSeason{} if err = s.DB.Where("id = ?", sid).First(&sn).Error; err != nil { if err == sql.ErrNoRows { err = nil return } log.Error("GetSeason error(%v)\n", err) return } return &sn, nil } // RemoveInvalids removes invalid interventions func (s *Service) RemoveInvalids(invalids []*model.RankError) (err error) { tx := s.DB.Begin() for _, v := range invalids { if err = tx.Model(&model.Rank{}).Where("id=?", v.ID).Update(map[string]int{"is_deleted": 1}).Error; err != nil { log.Error("tvSrv.RemoveInvalids error(%v)", err) tx.Rollback() return } } tx.Commit() log.Info("Remove Invalid Interventions: %d", len(invalids)) return } // Intervs pick the intervention and combine the season data func (s *Service) Intervs(req *model.IntervListReq) (res *model.RankList, err error) { var ( intervs []*model.Rank items []*model.SimpleRank invalids []*model.RankError db = req.BuildDB(s.DB).Order("position asc") ) if err = db.Find(&intervs).Error; err != nil { log.Error("[Intervs] DB query fail(%v)", err) return } items, invalids = s.intervsValid(intervs) err = s.RemoveInvalids(invalids) res = &model.RankList{ List: items, } return } func (s *Service) intervsValid(intervs []*model.Rank) (items []*model.SimpleRank, invalids []*model.RankError) { // check Its Season Status, pick invalid ones for _, v := range intervs { switch v.ContType { case _TypePGC, _TypeDefault: isValid, sn := s.snValid(v.ContID) if !isValid { invalids = append(invalids, v.BeError()) continue } items = append(items, v.BeSimpleSn(sn, s.pgcCatToName)) case _TypeUGC: isValid, arc := s.arcValid(v.ContID) if !isValid { invalids = append(invalids, v.BeError()) continue } items = append(items, v.BeSimpleArc(arc, s.arcPName)) default: log.Error("[Intervs] Rank Error Cont_Type %d, RankID:%d", v.ContType, v.ID) continue } } return } // snValid Distinguish whether the Season is existing and valid func (s *Service) snValid(sid int64) (res bool, season *model.TVEpSeason) { var err error if season, err = s.getSeason(sid); err != nil || season == nil { return } res = errTyping(int(season.Check), int(season.Valid), int(season.IsDeleted)) return } // arcValid Distinguish whether the archive is existing and valid func (s *Service) arcValid(aid int64) (res bool, arc *model.SimpleArc) { var err error if arc, err = s.ExistArc(aid); err != nil || arc == nil { return } res = errTyping(arc.Result, arc.Valid, arc.Deleted) return } func errTyping(check, valid, isDeleted int) (res bool) { if check == 1 && valid == 1 && isDeleted == 0 { return true } return false } // RefreshIntervs is used to delete the previous interventions func (s *Service) RefreshIntervs(req *model.IntervPubReq) (invalid *model.RankError, err error) { var ( tx = s.DB.Begin() txDel = req.BuildDB(tx) position = 1 title string ) if err = txDel.Delete(&model.Rank{}).Error; err != nil { // delete old intervs log.Error("Del Previsou Intervs error(%v)\n", err) tx.Rollback() return } for _, v := range req.Items { if invalid, title = s.checkInterv(req, v); invalid != nil { tx.Rollback() return } if err = tx.Create(v.BeComplete(req, title, position)).Error; err != nil { // create new ones log.Error("Create New Intervs %v ,Error(%v)\n", v, err) tx.Rollback() return } position = position + 1 } tx.Commit() log.Info("RefreshIntervs Success") return } // checkInterv checks whether the to-publish intervention is valid func (s *Service) checkInterv(req *model.IntervPubReq, v *model.SimpleRank) (invalid *model.RankError, title string) { var ( isValid bool sn *model.TVEpSeason arc *model.SimpleArc rankErr = &model.RankError{ ID: int(v.ID), SeasonID: int(v.ContID), } ) if req.IsIdx() { if int(req.Category) != v.ContType+model.RankIdxBase { // if ugc, we can't accept pgc data isValid = false return rankErr, "" } } switch v.ContType { case _TypePGC, _TypeDefault: isValid, sn = s.snValid(v.ContID) if isValid && req.IsIdx() { // if index, check it's the pgc category's season isValid = (sn.Category == int(req.Rank)) } case _TypeUGC: isValid, arc = s.arcValid(v.ContID) if isValid && req.IsIdx() { // if index, check it's the first level type's archive pid := s.GetArchivePid(arc.TypeID) isValid = pid == int32(req.Rank) } default: log.Error("[Intervs] Rank Error Cont_Type %d, RankID:%d", v.ContType, v.ID) return rankErr, "" } if !isValid { log.Error("snValid (%d) Not passed", v.ContID) return rankErr, "" } if v.ContType == _TypeUGC && arc != nil { title = arc.Title } if (v.ContType == _TypePGC || v.ContType == _TypeDefault) && sn != nil { title = sn.Title } return } func (s *Service) pgcCatToName(cat int) (res string) { if res, ok := s.pgcCatName[cat]; ok { return res } return "" }