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.
261 lines
6.5 KiB
261 lines
6.5 KiB
package service |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/admin/main/tv/model" |
|
accmdl "go-common/app/service/main/account/api" |
|
account "go-common/app/service/main/account/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
|
|
"github.com/jinzhu/gorm" |
|
) |
|
|
|
const ( |
|
_removeArcs = 2 |
|
_deleted = 1 |
|
_toinit = 1 |
|
_requestedInit = 2 |
|
_onlineAct = "1" |
|
_offlineAct = "0" |
|
_validOnline = 1 |
|
_validOffline = 0 |
|
) |
|
|
|
// AddMids CheckMids checks the mids, whether all the uppers exist |
|
func (s *Service) AddMids(mids []int64) (res *model.AddResp, err error) { |
|
var ( |
|
accsReply *accmdl.InfosReply |
|
accsInfo map[int64]*account.Info |
|
midExist bool |
|
) |
|
// init the response |
|
res = &model.AddResp{ |
|
Succ: []int64{}, |
|
Exist: []int64{}, |
|
Invalids: []int64{}, |
|
} |
|
// rpc get all the mids' info |
|
if accsReply, err = s.accClient.Infos3(ctx, &accmdl.MidsReq{ |
|
Mids: mids, |
|
}); err != nil { |
|
log.Error("CheckMids Mids: %v, Error: %v", mids, err) |
|
return |
|
} |
|
accsInfo = accsReply.Infos |
|
for _, v := range mids { |
|
// if invalid account |
|
if _, ok := accsInfo[v]; !ok { |
|
res.Invalids = append(res.Invalids, v) |
|
continue |
|
} |
|
if midExist, err = s.existMid(v); err != nil { |
|
log.Error("AddMid %d, Error %v", v, err) |
|
return |
|
} |
|
// if the account is existing in our DB |
|
if midExist { |
|
res.Exist = append(res.Exist, v) |
|
continue |
|
} |
|
// add the upper |
|
if err = s.dao.UpAdd(v); err != nil { |
|
log.Error("AddMid %d, Error %v", v, err) |
|
return |
|
} |
|
res.Succ = append(res.Succ, v) |
|
} |
|
return |
|
} |
|
|
|
// existMid checks whether the mid is existing in our DB |
|
func (s *Service) existMid(mid int64) (exist bool, err error) { |
|
if err = s.DB.Where("deleted = 0").Where("mid = ?", mid).First(&model.Upper{}).Error; err != nil { |
|
if err == gorm.ErrRecordNotFound { |
|
return false, nil |
|
} |
|
log.Error("existMid %d, Error %v", mid, err) |
|
return |
|
} |
|
return true, nil |
|
} |
|
|
|
// ImportMids is for updating the data to tell the tv-job to import the uppers' all videos |
|
func (s *Service) ImportMids(mids []int64) (res *model.ImportResp, err error) { |
|
var midExist bool |
|
res = &model.ImportResp{ |
|
NotExist: []int64{}, |
|
Succ: []int64{}, |
|
} |
|
for _, v := range mids { |
|
if midExist, err = s.existMid(v); err != nil { |
|
log.Error("ImportMids %d, Error %v", v, err) |
|
return |
|
} |
|
if !midExist { |
|
res.NotExist = append(res.NotExist, v) |
|
continue |
|
} |
|
if err = s.DB.Model(&model.Upper{}).Where("mid = ?", v).Update(map[string]int{"toinit": _toinit, "state": _requestedInit}).Error; err != nil { |
|
log.Error("ImportMids %d, Error %v", v, err) |
|
return |
|
} |
|
res.Succ = append(res.Succ, v) |
|
} |
|
return |
|
} |
|
|
|
// DelMid is for updating remove one upper from the list |
|
func (s *Service) DelMid(mid int64) (err error) { |
|
var exist bool |
|
if exist, err = s.existMid(mid); err != nil { |
|
return |
|
} |
|
if !exist { |
|
return ecode.TvUpperNotInList |
|
} |
|
if err = s.DB.Model(&model.Upper{}).Where("mid = ?", mid).Update(map[string]int{"deleted": _deleted, "toinit": _removeArcs}).Error; err != nil { |
|
log.Error("DelMid %d, Error %v", mid, err) |
|
} |
|
return |
|
} |
|
|
|
// UpList shows the upper list |
|
func (s *Service) UpList(order int, page int, name string, id int) (pager *model.UpperPager, err error) { |
|
var ( |
|
source []*model.Upper |
|
mids []int64 |
|
match map[int64]*account.Info |
|
info *account.Info |
|
ok bool |
|
namesReply, infosReply *accmdl.InfosReply |
|
nameRes map[int64]*account.Info |
|
ids []int64 |
|
) |
|
pager = &model.UpperPager{} |
|
// id treatmnet |
|
if id != 0 { |
|
ids = append(ids, int64(id)) |
|
} |
|
// name treatment |
|
if name != "" { |
|
if namesReply, err = s.accClient.InfosByName3(ctx, &accmdl.NamesReq{ |
|
Names: []string{name}, |
|
}); err != nil { |
|
log.Error("accRPC InfosByName3 %s, Err %v", name, err) |
|
return |
|
} |
|
nameRes = namesReply.Infos |
|
for k := range nameRes { |
|
ids = append(ids, k) |
|
} |
|
} |
|
if source, pager.Page, err = s.dao.UpList(order, page, ids); err != nil { |
|
return |
|
} |
|
// pick upper's name from AccRPC |
|
for _, v := range source { |
|
mids = append(mids, v.MID) |
|
} |
|
if infosReply, err = s.accClient.Infos3(ctx, &accmdl.MidsReq{ |
|
Mids: mids, |
|
}); err != nil { |
|
log.Error("accRPC Infos3, %v, Error %v", mids, err) |
|
return |
|
} |
|
match = infosReply.Infos |
|
for _, v := range source { // arrange the data to output |
|
if info, ok = match[v.MID]; !ok { |
|
log.Error("Mid %v, AccRPC info is nil", v.MID) |
|
continue |
|
} |
|
pager.Items = append(pager.Items, &model.UpperR{ |
|
MID: v.MID, |
|
State: v.State, |
|
Name: info.Name, |
|
Ctime: s.TimeFormat(v.Ctime), |
|
Mtime: s.TimeFormat(v.Mtime), |
|
}) |
|
} |
|
return |
|
} |
|
|
|
// CmsList is the upper cms list service function |
|
func (s *Service) CmsList(ctx context.Context, req *model.ReqUpCms) (pager *model.CmsUpperPager, err error) { |
|
ups, page, errList := s.dao.UpCmsList(req) |
|
if errList != nil { |
|
return nil, errList |
|
} |
|
for _, v := range ups { |
|
v.MtimeStr = v.Mtime.Time().Format("2006-01-02 15:04:05") |
|
} |
|
pager = &model.CmsUpperPager{ |
|
Items: ups, |
|
Page: page, |
|
} |
|
return |
|
} |
|
|
|
// CmsAudit updates the mids' valid status |
|
func (s *Service) CmsAudit(ctx context.Context, mids []int64, action string) (resp *model.RespUpAudit, err error) { |
|
var ( |
|
okMids map[int64]*model.UpMC |
|
validAct int |
|
) |
|
resp = &model.RespUpAudit{ |
|
Succ: mids, |
|
} |
|
if okMids, err = s.dao.VerifyIds(mids); err != nil { |
|
return |
|
} |
|
if len(okMids) != len(mids) { |
|
succ := []int64{} |
|
for _, v := range mids { |
|
if _, ok := okMids[v]; !ok { |
|
resp.Invalid = append(resp.Invalid, v) |
|
} else { |
|
succ = append(succ, v) |
|
} |
|
} |
|
resp.Succ = succ |
|
} |
|
if action == _onlineAct { |
|
validAct = _validOnline |
|
} else if action == _offlineAct { |
|
validAct = _validOffline |
|
} |
|
if err = s.dao.AuditIds(resp.Succ, validAct); err != nil { |
|
return |
|
} |
|
for _, v := range resp.Succ { |
|
s.dao.DelCache(ctx, v) // delete cache from MC because their status has been updated |
|
} |
|
return |
|
} |
|
|
|
// CmsEdit updates the upper's info in both DB and cache |
|
func (s *Service) CmsEdit(ctx context.Context, req *model.ReqUpEdit) (err error) { |
|
var ( |
|
okMids map[int64]*model.UpMC |
|
upInfo *model.UpMC |
|
ok bool |
|
) |
|
if okMids, err = s.dao.VerifyIds([]int64{req.MID}); err != nil { |
|
return |
|
} |
|
if len(okMids) == 0 { |
|
return ecode.TvUpperNotInList |
|
} |
|
if upInfo, ok = okMids[req.MID]; !ok { |
|
log.Error("okMids %v, Mid %d, not found", okMids, req.MID) |
|
return ecode.NothingFound |
|
} |
|
if err = s.dao.SetUpper(req); err != nil { // update upper cms info in DB |
|
return |
|
} |
|
upInfo.CMSFace = req.Face |
|
upInfo.CMSName = req.Name |
|
err = s.dao.SetUpMetaCache(ctx, upInfo) // update Cache |
|
return |
|
}
|
|
|