561 lines
10 KiB
Go
561 lines
10 KiB
Go
package http
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"go-common/app/interface/main/history/model"
|
|
"go-common/library/ecode"
|
|
"go-common/library/log"
|
|
bm "go-common/library/net/http/blademaster"
|
|
"go-common/library/net/metadata"
|
|
)
|
|
|
|
// history return the user history for mobile app.
|
|
func history(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
v = new(Histroy)
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.Pn < 1 {
|
|
v.Pn = 1
|
|
}
|
|
if v.Ps > cnf.History.Max || v.Ps <= 0 {
|
|
v.Ps = cnf.History.Max
|
|
}
|
|
list, err := hisSvc.Videos(c, mid, v.Pn, v.Ps, v.TP)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(list, nil)
|
|
}
|
|
|
|
// aids return the user histories.
|
|
func aids(c *bm.Context) {
|
|
var (
|
|
mid int64
|
|
)
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
list, err := hisSvc.AVHistories(c, mid)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(list, nil)
|
|
}
|
|
|
|
func managerHistory(c *bm.Context) {
|
|
var (
|
|
err error
|
|
v = new(struct {
|
|
Mid int64 `form:"mid" validate:"required,gt=0"`
|
|
OnlyAV bool `form:"only_av"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
history, err := hisSvc.ManagerHistory(c, v.OnlyAV, v.Mid)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(history, nil)
|
|
}
|
|
|
|
// clearHistory clear the user histories.
|
|
func clearHistory(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
v = new(struct {
|
|
TP int8 `form:"type"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
var tps []int8
|
|
if v.TP > 0 {
|
|
tps = append(tps, v.TP)
|
|
}
|
|
c.JSON(nil, hisSvc.ClearHistory(c, mid, tps))
|
|
}
|
|
|
|
// delHistory delete the user history by aid.
|
|
func delHistory(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
v = new(struct {
|
|
TP int8 `form:"type"`
|
|
Aids []int64 `form:"aid,split"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
c.JSON(nil, hisSvc.DelHistory(c, mid, v.Aids, v.TP))
|
|
}
|
|
|
|
func delete(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
v = new(struct {
|
|
Hid []string `form:"hid,split"`
|
|
Bid []string `form:"bid,split"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
var his []*model.History
|
|
if len(v.Bid) == 0 {
|
|
for _, hid := range v.Hid {
|
|
hs := strings.Split(hid, "_")
|
|
if len(hs) == 0 {
|
|
continue
|
|
}
|
|
aid, _ := strconv.ParseInt(hs[0], 10, 0)
|
|
if aid == 0 {
|
|
continue
|
|
}
|
|
var tp int64
|
|
if len(hs) == 2 {
|
|
tp, _ = strconv.ParseInt(hs[1], 10, 0)
|
|
}
|
|
his = append(his, &model.History{
|
|
Aid: aid,
|
|
TP: int8(tp),
|
|
})
|
|
}
|
|
}
|
|
for _, bid := range v.Bid {
|
|
bs := strings.Split(bid, "_")
|
|
if len(bs) != 2 {
|
|
continue
|
|
}
|
|
aid, _ := strconv.ParseInt(bs[1], 10, 0)
|
|
if aid == 0 {
|
|
continue
|
|
}
|
|
tp, err := model.CheckBusiness(bs[0])
|
|
if err != nil {
|
|
continue
|
|
}
|
|
his = append(his, &model.History{
|
|
Aid: aid,
|
|
TP: int8(tp),
|
|
})
|
|
}
|
|
if len(his) == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
c.JSON(nil, hisSvc.Delete(c, mid, his))
|
|
}
|
|
|
|
// addHistory add history into user redis set.
|
|
func addHistory(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
h *model.History
|
|
now = time.Now().Unix()
|
|
v = new(AddHistory)
|
|
)
|
|
// sid cid tp, dt
|
|
// dt:devece type , sid :season_id,type:video type
|
|
// aid :aid
|
|
// cid:cid,epid
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.TP == model.TypeBangumi || v.TP == model.TypeMovie {
|
|
if v.Sid <= 0 || v.Epid <= 0 {
|
|
if v.Aid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
if v.Aid <= 0 || (v.TP < model.TypeArticle && v.Cid <= 0) {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.DT <= 0 {
|
|
if v.Platform == model.PlatformIOS {
|
|
v.DT = model.DeviceIphone
|
|
if v.Device == model.DevicePad {
|
|
v.DT = model.DeviceIpad
|
|
}
|
|
} else if v.Platform == model.PlatformAndroid {
|
|
v.DT = model.DeviceAndroid
|
|
}
|
|
}
|
|
h = &model.History{
|
|
Aid: v.Aid,
|
|
Unix: now,
|
|
Sid: v.Sid,
|
|
Epid: v.Epid,
|
|
Cid: v.Cid,
|
|
TP: v.TP,
|
|
STP: v.SubTP,
|
|
DT: v.DT,
|
|
}
|
|
h.ConvertType()
|
|
c.JSON(nil, hisSvc.AddHistory(c, mid, 0, h))
|
|
}
|
|
|
|
// report report view progress.
|
|
func report(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
h *model.History
|
|
now = time.Now().Unix()
|
|
v = new(HistoryReport)
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.Type = tp
|
|
}
|
|
if v.Progress < 0 {
|
|
v.Progress = model.ProComplete
|
|
}
|
|
if v.Aid <= 0 || (v.Type < model.TypeArticle && v.Cid <= 0) {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.SubType <= 0 {
|
|
v.SubType = v.SubTP
|
|
}
|
|
if v.Type == model.TypeBangumi || v.Type == model.TypeMovie {
|
|
if v.Sid <= 0 || v.Epid <= 0 {
|
|
v.Type = model.TypeUGC
|
|
} else {
|
|
v.Type = model.TypePGC
|
|
}
|
|
}
|
|
if v.DT <= 0 {
|
|
if v.Platform == model.PlatformIOS {
|
|
v.DT = model.DeviceIphone
|
|
if v.Device == model.DevicePad {
|
|
v.DT = model.DeviceIpad
|
|
}
|
|
} else if v.Platform == model.PlatformAndroid {
|
|
v.DT = model.DeviceAndroid
|
|
if v.MobileApp == model.MobileAppAndroidTV {
|
|
v.DT = model.DeviceAndroidTV
|
|
}
|
|
}
|
|
}
|
|
h = &model.History{
|
|
Aid: v.Aid,
|
|
Unix: now,
|
|
Sid: v.Sid,
|
|
Epid: v.Epid,
|
|
Cid: v.Cid,
|
|
Pro: v.Progress,
|
|
TP: v.Type,
|
|
STP: v.SubType,
|
|
DT: v.DT,
|
|
}
|
|
c.JSON(nil, hisSvc.AddHistory(c, mid, v.Realtime, h))
|
|
}
|
|
|
|
// report report view progress.
|
|
func innerReport(c *bm.Context) {
|
|
var (
|
|
err error
|
|
h *model.History
|
|
v = new(HistoryReport)
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.Type = tp
|
|
}
|
|
if v.Mid == 0 && v.Aid == 0 && v.Type == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.Type == model.TypeComic && v.Aid == 0 {
|
|
v.Aid = v.Sid
|
|
}
|
|
if v.PlayTime == 0 {
|
|
v.PlayTime = time.Now().Unix()
|
|
}
|
|
if v.Progress < 0 {
|
|
v.Progress = model.ProComplete
|
|
}
|
|
h = &model.History{
|
|
Aid: v.Aid,
|
|
Unix: v.PlayTime,
|
|
Sid: v.Sid,
|
|
Epid: v.Epid,
|
|
Cid: v.Cid,
|
|
Pro: v.Progress,
|
|
TP: v.Type,
|
|
STP: v.SubType,
|
|
DT: v.DT,
|
|
}
|
|
c.JSON(nil, hisSvc.AddHistory(c, v.Mid, v.Realtime, h))
|
|
}
|
|
|
|
// reports
|
|
func reports(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
hs = make([]*model.History, 0)
|
|
v = new(struct {
|
|
Type int8 `form:"type"`
|
|
Data string `form:"data"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.Type = tp
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if err = json.Unmarshal([]byte(v.Data), &hs); err != nil {
|
|
log.Error("json.Unmarshal(%s),err:%v.", v.Data, err)
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if err = hisSvc.AddHistories(c, mid, v.Type, metadata.String(c, metadata.RemoteIP), hs); err != nil {
|
|
c.JSON(nil, ecode.ServerErr)
|
|
return
|
|
}
|
|
c.JSON(nil, nil)
|
|
}
|
|
|
|
// shadow return the user shadow status.
|
|
func shadow(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
)
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
status, err := hisSvc.Shadow(c, mid)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(status == model.ShadowOn, nil)
|
|
}
|
|
|
|
// setShadow the user shadow status.
|
|
func setShadow(c *bm.Context) {
|
|
var (
|
|
err error
|
|
mid int64
|
|
shadow = model.ShadowOff
|
|
v = new(struct {
|
|
Switch bool `form:"switch"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if midInter, ok := c.Get("mid"); ok {
|
|
mid = midInter.(int64)
|
|
}
|
|
if mid <= 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if v.Switch {
|
|
shadow = model.ShadowOn
|
|
}
|
|
c.JSON(nil, hisSvc.SetShadow(c, mid, shadow))
|
|
}
|
|
|
|
// flush flush users hisotry.
|
|
func flush(c *bm.Context) {
|
|
var (
|
|
err error
|
|
v = new(struct {
|
|
Mids []int64 `form:"mids,split" validate:"required,min=1,dive,gt=0"`
|
|
STime int64 `form:"time"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
c.JSON(nil, hisSvc.FlushHistory(c, v.Mids, v.STime))
|
|
}
|
|
|
|
// position report report view progress.
|
|
func position(c *bm.Context) {
|
|
var (
|
|
err error
|
|
v = new(struct {
|
|
Mid int64 `form:"mid"`
|
|
Aid int64 `form:"aid"`
|
|
TP int8 `form:"type"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if v.Mid == 0 && v.Aid == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
c.JSON(hisSvc.Position(c, v.Mid, v.Aid, v.TP))
|
|
}
|
|
|
|
// position report report view progress.
|
|
func resource(c *bm.Context) {
|
|
var (
|
|
err error
|
|
v = new(struct {
|
|
Mid int64 `form:"mid"`
|
|
TP int8 `form:"type"`
|
|
Pn int `form:"pn"`
|
|
Ps int `form:"ps"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if v.Mid == 0 || v.TP == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
c.JSON(hisSvc.Histories(c, v.Mid, v.TP, v.Pn, v.Ps))
|
|
}
|
|
|
|
// position report report view progress.
|
|
func resources(c *bm.Context) {
|
|
var (
|
|
err error
|
|
v = new(struct {
|
|
Mid int64 `form:"mid"`
|
|
TP int8 `form:"type"`
|
|
Aids []int64 `form:"aids,split"`
|
|
})
|
|
)
|
|
if err = c.Bind(v); err != nil {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if tp, ok := business(c); !ok {
|
|
return
|
|
} else if tp > 0 {
|
|
v.TP = tp
|
|
}
|
|
if v.Mid == 0 || v.TP == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
if len(v.Aids) == 0 {
|
|
c.JSON(nil, ecode.RequestErr)
|
|
return
|
|
}
|
|
c.JSON(hisSvc.HistoryType(c, v.Mid, v.TP, v.Aids, metadata.String(c, metadata.RemoteIP)))
|
|
}
|