bilibili-backup/app/admin/main/videoup-task/model/review.go

164 lines
4.1 KiB
Go
Raw Normal View History

2019-04-22 10:59:20 +08:00
package model
import (
"context"
"sync"
"time"
"go-common/library/log"
)
// ReviewConf 复审配置
type ReviewConf struct {
ID int64 `json:"id" form:"id"`
Types []int64 `json:"types" form:"types,split"` // 分区
mtp map[int16]struct{}
UpFroms []int64 `json:"upfroms" form:"upfroms,split"` // 投稿来源
muf map[int8]struct{}
UpGroups []int64 `json:"upgroups" form:"upgroups,split"` // 用户组
mug map[int8]struct{}
Uids []int64 `json:"uids" form:"uids,split"` // 指定uid
Unames []string `json:"unames"` // 指定uid
muid map[int64]struct{}
FansLow int64 `json:"fanslow" form:"fanslow"` // 粉丝数最低值
FansHigh int64 `json:"fanshigh" form:"fanshigh"` // 粉丝数最高
Bt FormatTime `json:"bt" form:"bt"`
Et FormatTime `json:"et" form:"et"`
State int8 `json:"state" form:"state"`
UID int64 `json:"uid"`
Uname string `json:"uname"`
Desc string `json:"desc" form:"desc"`
Mt FormatTime `json:"mt"`
}
// Refresh refresh
func (r *ReviewConf) Refresh() {
mtp := make(map[int16]struct{})
muf := make(map[int8]struct{})
mug := make(map[int8]struct{})
muid := make(map[int64]struct{})
for _, tp := range r.Types {
mtp[int16(tp)] = struct{}{}
}
for _, uf := range r.UpFroms {
muf[int8(uf)] = struct{}{}
}
for _, ug := range r.UpGroups {
mug[int8(ug)] = struct{}{}
}
for _, uid := range r.Uids {
muid[uid] = struct{}{}
}
r.mtp = mtp
r.muf = muf
r.mug = mug
r.muid = muid
}
// SubmitForm form
type SubmitForm struct {
Status int16 `json:"status" form:"status"`
ID int64 `json:"id" form:"id"`
CID int64 `json:"cid" form:"cid"`
AID int64 `json:"aid" form:"aid"`
MID int64 `json:"mid" form:"mid"`
Eptitle string `json:"eptitle,omitempty" form:"eptitle"`
Description string `json:"description,omitempty" form:"description"`
Note string `json:"note,omitempty" form:"note"`
ReasonID int64 `json:"reason_id,omitempty" form:"reason_id"`
Reason string `json:"reason,omitempty" form:"reason"`
TID int64 `json:"tid,omitempty" form:"tid"`
Norank int32 `json:"norank" form:"norank"`
Noindex int32 `json:"noindex" form:"noindex"`
PushBlog int32 `json:"push_blog" form:"push_blog"`
NoRecommend int32 `json:"norecommend" form:"norecommend"`
Nosearch int32 `json:"nosearch" form:"nosearch"`
OverseaBlock int32 `json:"oversea_block" form:"oversea_block"`
Encoding int8 `json:"encoding" form:"encoding"`
TaskID int64 `json:"task_id" form:"task_id"`
UID int64 `json:"uid" form:"uid"`
Uname string `json:"uname" form:"uname"`
}
// ReviewCache 快速判断配置项是否命中
type ReviewCache struct {
MRC map[int64]*ReviewConf
Mux sync.RWMutex
}
// NewRC 复审配置
func NewRC() *ReviewCache {
rc := &ReviewCache{}
rc.MRC = make(map[int64]*ReviewConf)
return rc
}
// Check 检查配置是否命中
func (rc *ReviewCache) Check(c context.Context, opt *TaskPriority, uid int64) bool {
rc.Mux.RLock()
defer rc.Mux.RUnlock()
if len(rc.MRC) == 0 {
log.Info("ReviewCache empty")
return false
}
log.Info("ReviewCache opt(%+v) uid(%d),", opt, uid)
for id, item := range rc.MRC {
log.Info("ReviewCache config(%+v)", item)
if item.State != 0 {
continue
}
bt := item.Bt.TimeValue()
et := item.Et.TimeValue()
if bt.After(time.Now()) || (!et.IsZero() && et.Before(time.Now())) {
continue
}
if len(item.mtp) > 0 {
if _, ok := item.mtp[opt.TypeID]; !ok {
continue
}
}
if len(item.muf) > 0 {
if _, ok := item.muf[opt.UpFrom]; !ok {
continue
}
}
if len(item.mug) > 0 {
var hit bool
for _, ug := range opt.UpGroups {
if _, ok := item.mug[ug]; ok {
hit = true
break
}
}
if !hit {
continue
}
}
if len(item.muid) > 0 {
if _, ok := item.muid[uid]; !ok {
continue
}
}
if item.FansHigh > 0 {
if opt.Fans < item.FansLow || opt.Fans > item.FansHigh {
continue
}
}
log.Info("ReviewCache task(%d) hit config(%d)", opt.TaskID, id)
return true
}
return false
}