go-common/app/admin/main/tv/service/intervs.go

200 lines
5.2 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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 ""
}