Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["http_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = ["//app/interface/main/dm2/model:go_default_library"],
)
go_library(
name = "go_default_library",
srcs = [
"dm.go",
"filter.go",
"history.go",
"http.go",
"manage.go",
"mask.go",
"member.go",
"subtitle.go",
"thumbup.go",
"view.go",
],
importpath = "go-common/app/interface/main/dm2/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/dm2/conf:go_default_library",
"//app/interface/main/dm2/model:go_default_library",
"//app/interface/main/dm2/model/oplog:go_default_library",
"//app/interface/main/dm2/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"//library/net/http/blademaster/middleware/antispam:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/ip:go_default_library",
"//library/net/metadata:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,365 @@
package http
import (
"math"
"net/http"
"strconv"
xtime "time"
"go-common/app/interface/main/dm2/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/ip"
"go-common/library/net/metadata"
"go-common/library/time"
)
func httpCode(err error) (code int) {
switch err {
case ecode.NotModified:
code = http.StatusNotModified
case ecode.RequestErr:
code = http.StatusBadRequest
case ecode.NothingFound:
code = http.StatusNotFound
case ecode.ServiceUnavailable:
code = http.StatusServiceUnavailable
default:
code = http.StatusInternalServerError
}
return
}
func dmXML(c *bm.Context) {
var (
p = c.Request.Form
comp = p.Get("comp")
contentType = "text/xml"
)
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.AbortWithStatus(http.StatusBadRequest)
return
}
data, err := dmSvc.DMXML(c, model.SubTypeVideo, oid)
if err != nil {
c.AbortWithStatus(httpCode(err))
log.Error("dmSvc.XML(%d) error(%v)", oid, err)
return
}
c.Writer.Header().Set("Content-Encoding", "deflate")
c.Writer.Header().Set("Last-Modified", xtime.Now().Format(http.TimeFormat))
if comp == "0" {
c.Writer.Header().Set("Content-Encoding", "none")
if data, err = dmSvc.Gzdeflate(data); err != nil {
log.Error("dmSvc.Gzdeflate(%d) error(%v)", oid, err)
c.AbortWithStatus(httpCode(err))
return
}
}
c.Bytes(http.StatusOK, contentType, data)
}
func dmSeg(c *bm.Context) {
var (
plat int32
mid int64
contentType = "application/octet-stream"
p = c.Request.Form
)
iMid, ok := c.Get("mid")
if ok {
mid = iMid.(int64)
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.AbortWithStatus(http.StatusBadRequest)
return
}
ps, err := strconv.ParseInt(p.Get("ps"), 10, 64)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
platform, err := strconv.ParseInt(p.Get("plat"), 10, 64)
if err != nil {
plat = model.PlatUnknow
} else {
plat = int32(platform)
}
data, err := dmSvc.DMSeg(c, int32(tp), plat, mid, aid, oid, ps)
if err != nil {
c.AbortWithStatus(httpCode(err))
return
}
if len(data) == 0 {
c.AbortWithStatus(http.StatusNotFound)
return
}
c.Bytes(http.StatusOK, contentType, data)
}
func dmSegV2(c *bm.Context) {
var (
plat int32
mid int64
p = c.Request.Form
)
iMid, ok := c.Get("mid")
if ok {
mid = iMid.(int64)
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.ParseInt(p.Get("pn"), 10, 64)
if err != nil || pn <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
platform, err := strconv.ParseInt(p.Get("plat"), 10, 64)
if err != nil {
plat = model.PlatUnknow
} else {
plat = int32(platform)
}
c.JSON(dmSvc.DMSegV2(c, int32(tp), mid, aid, oid, pn, plat))
}
func dm(c *bm.Context) {
p := c.Request.Form
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(dmSvc.DM(c, int32(tp), aid, oid))
}
func ajaxDM(c *bm.Context) {
var (
p = c.Request.Form
msgs = make([]string, 0)
)
app := p.Get("mobi_app")
if app == "android" || app == "iphone" {
c.JSON(msgs, nil)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(dmSvc.AjaxDM(c, aid))
}
// validDMStyle 验证弾幕pool and mode.
func validDMStyle(pool, mode int32) (valid bool) {
switch pool {
case model.PoolNormal, model.PoolSubtitle:
if mode == model.ModeRolling || mode == model.ModeBottom || mode == model.ModeTop ||
mode == model.ModeReverse || mode == model.ModeSpecial {
valid = true
}
case model.PoolSpecial:
if mode == model.ModeCode || mode == model.ModeBAS {
valid = true
}
}
return
}
//dm post
func dmPost(c *bm.Context) {
var (
plat = int64(model.PlatUnknow)
p = c.Request.Form
now = xtime.Now().Unix()
)
mid, _ := c.Get("mid")
msg := p.Get("msg")
typ, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil || int32(typ) != model.SubTypeVideo {
c.JSON(nil, ecode.RequestErr)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil || aid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
progress, err := strconv.ParseInt(p.Get("progress"), 10, 32) // NOTE 老接口过来的弹幕时间为秒
if err != nil || progress < 0 || progress > math.MaxInt32 {
c.JSON(nil, ecode.RequestErr)
return
}
color, err := strconv.ParseInt(p.Get("color"), 10, 64)
if err != nil || color < 0 || color > math.MaxInt32 {
c.JSON(nil, ecode.RequestErr)
return
}
fontsize, err := strconv.ParseInt(p.Get("fontsize"), 10, 32)
if err != nil || fontsize <= 0 || fontsize > 127 {
c.JSON(nil, ecode.RequestErr)
return
}
pool, err := strconv.ParseInt(p.Get("pool"), 10, 32)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
mode, err := strconv.ParseInt(p.Get("mode"), 10, 32)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if !validDMStyle(int32(pool), int32(mode)) {
c.JSON(nil, ecode.RequestErr)
return
}
rnd, err := strconv.ParseInt(p.Get("rnd"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
platStr := p.Get("plat")
if platStr != "" {
if plat, err = strconv.ParseInt(platStr, 10, 32); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
dm := &model.DM{
Type: int32(typ),
Oid: oid,
Mid: mid.(int64),
Progress: int32(progress),
Pool: int32(pool),
State: model.StateNormal,
Ctime: time.Time(now),
Mtime: time.Time(now),
Content: &model.Content{
FontSize: int32(fontsize),
Color: color,
IP: int64(ip.InetAtoN(metadata.String(c, metadata.RemoteIP))),
Mode: int32(mode),
Plat: int32(plat),
Msg: msg,
Ctime: time.Time(now),
Mtime: time.Time(now),
},
}
if dm.Pool == model.PoolSpecial {
dm.ContentSpe = &model.ContentSpecial{
Msg: msg,
Ctime: time.Time(now),
Mtime: time.Time(now),
}
}
if err = dmSvc.Post(c, dm, aid, rnd); err != nil {
c.JSON(nil, err)
return
}
data := map[string]interface{}{
"dmid": dm.ID,
}
c.JSON(data, nil)
}
// judgeDM dm judge list.
func judgeDM(c *bm.Context) {
p := c.Request.Form
cid, err := strconv.ParseInt(p.Get("cid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
dmid, err := strconv.ParseInt(p.Get("dmid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
data, err := dmSvc.JudgeDms(c, 1, cid, dmid)
if err != nil {
log.Error("dmSvc.JudgeDms(cid:%d,dmid:%d) error(%v)", cid, dmid, err)
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}
func dmAdvert(c *bm.Context) {
p := c.Request.Form
arg := &model.ADReq{
ClientIP: metadata.String(c, metadata.RemoteIP),
Buvid: c.Request.Header.Get("Buvid"),
MobiApp: p.Get("mobi_app"),
ADExtra: p.Get("ad_extra"),
}
if mid, ok := c.Get("mid"); ok {
arg.Mid = mid.(int64)
}
typ, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil || int32(typ) != model.SubTypeVideo {
c.JSON(nil, ecode.RequestErr)
return
}
aid, err := strconv.ParseInt(p.Get("aid"), 10, 64)
if err != nil || aid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
arg.Aid = aid
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
arg.Oid = oid
build, err := strconv.ParseInt(p.Get("build"), 10, 64)
if err != nil || build <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
arg.Build = build
c.JSON(dmSvc.DMAdvert(c, arg))
}

View File

@@ -0,0 +1,94 @@
package http
import (
"encoding/json"
"strconv"
"go-common/app/interface/main/dm2/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func upFilters(c *bm.Context) {
mid, _ := c.Get("mid")
data, err := dmSvc.UpFilters(c, mid.(int64))
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}
// 前端协管/up主禁言用户接口
func addUpFilterID(c *bm.Context) {
var (
p = c.Request.Form
fltList = make([]*model.UpFilter, 0)
fltMap = make(map[string]string)
)
mid, _ := c.Get("mid")
fType, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil || fType != int64(model.FilterTypeID) {
c.JSON(nil, ecode.RequestErr)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if err = json.Unmarshal([]byte(p.Get("filters")), &fltList); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
for _, v := range fltList {
fltMap[v.Filter] = v.Comment
}
if err = dmSvc.AddUpFilterID(c, mid.(int64), oid, fltMap); err != nil {
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
}
// 创作中心up主添加屏蔽词
func editUpFilters(c *bm.Context) {
var (
p = c.Request.Form
filters = make([]*model.UpFilter, 0)
fType int64
fltMap = make(map[string]string)
)
mid, _ := c.Get("mid")
active, err := strconv.ParseInt(p.Get("active"), 10, 64)
if err != nil || (int8(active) != model.FilterActive && int8(active) != model.FilterUnActive) {
c.JSON(nil, ecode.RequestErr)
return
}
if err = json.Unmarshal([]byte(p.Get("filters")), &filters); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if fType, err = strconv.ParseInt(p.Get("type"), 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
for _, filter := range filters {
fltMap[filter.Filter] = filter.Comment
}
switch int8(active) {
case model.FilterActive:
err = dmSvc.AddUpFilters(c, mid.(int64), int8(fType), fltMap)
case model.FilterUnActive:
flts := make([]string, 0)
for f := range fltMap {
flts = append(flts, f)
}
if _, err = dmSvc.EditUpFilters(c, mid.(int64), int8(fType), model.FilterUnActive, flts); err != nil {
break
}
default:
err = ecode.RequestErr
}
c.JSON(nil, err)
}

View File

@@ -0,0 +1,97 @@
package http
import (
"net/http"
"strconv"
"time"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func dmHistory(c *bm.Context) {
var (
p = c.Request.Form
contextType = "text/xml"
)
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
date, err := time.Parse("2006-01-02", p.Get("date"))
if err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
// convert 2006-01-02-->2016-01-02 23:59:59
tm := time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 0, time.Local)
data, err := dmSvc.SearchDMHistory(c, int32(tp), oid, tm.Unix())
if err != nil {
c.AbortWithStatus(httpCode(err))
return
}
c.Writer.Header().Set("Content-Encoding", "deflate")
c.Bytes(200, contextType, data)
}
func dmHistoryV2(c *bm.Context) {
p := c.Request.Form
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
date, err := time.Parse("2006-01-02", p.Get("date"))
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
// convert 2006-01-02-->2016-01-02 23:59:59
tm := time.Date(date.Year(), date.Month(), date.Day(), 23, 59, 59, 0, time.Local)
c.JSON(dmSvc.SearchDMHistoryV2(c, int32(tp), oid, tm.Unix()))
}
func dmHistoryIndex(c *bm.Context) {
var (
p = c.Request.Form
now = time.Now()
)
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
month := p.Get("month")
date, err := time.Parse("2006-01", month)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
// only allow recent one year query
if now.Year()-date.Year() >= 1 && now.Month()-date.Month() > 12 {
c.JSON(nil, ecode.RequestErr)
return
}
data, err := dmSvc.SearchDMHisIndex(c, int32(tp), oid, month)
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}

View File

@@ -0,0 +1,112 @@
package http
import (
"net/http"
"go-common/app/interface/main/dm2/conf"
"go-common/app/interface/main/dm2/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/antispam"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
dmSvc *service.Service
antispamSvc *antispam.Antispam
authSvc *auth.Auth
verifySvc *verify.Verify
)
// Init http init.
func Init(c *conf.Config, s *service.Service) {
dmSvc = s
authSvc = auth.New(c.Auth)
verifySvc = verify.New(c.Verify)
antispamSvc = antispam.New(c.Antispam)
engine := bm.NewServer(c.HTTPServer)
engine.Use(bm.Recovery(), bm.Trace(), bm.Logger())
innerRouter(engine)
outerRouter(engine)
if err := engine.Start(); err != nil {
log.Error("engine.Start() error(%v)", err)
panic(err)
}
}
// innerRouter init router api path.
func innerRouter(e *bm.Engine) {
group := e.Group("/x/internal/v2/dm", bm.CSRF())
{
group.GET("/search", verifySvc.VerifyUser, dmUpSearch)
group.GET("/recent", verifySvc.VerifyUser, dmUpRecent)
group.GET("/distribution", verifySvc.Verify, dmDistribution)
group.POST("/edit/state", verifySvc.VerifyUser, editState)
group.POST("/edit/pool", verifySvc.VerifyUser, editPool)
group.POST("/mask/update", verifySvc.Verify, updateMask)
group.POST("/subtitle/lan/add", verifySvc.Verify, subtitleLanAdd)
group.POST("/subtitle/upos/callback", waveFormCallBack)
}
}
func outerRouter(e *bm.Engine) {
e.GET("/monitor/ping", ping)
e.GET("/x/v1/dm/list.so", dmXML)
group := e.Group("/x/v2/dm", bm.CSRF())
{
group.GET("/view", authSvc.Guest, view)
group.GET("", dm)
group.GET("/search", authSvc.User, dmUpSearch)
group.GET("/ajax", ajaxDM)
group.GET("/list.so", authSvc.Guest, dmSeg)
group.GET("/list", authSvc.Guest, dmSegV2)
group.GET("/judge/list", authSvc.Guest, judgeDM)
group.GET("/thumbup/stats", authSvc.Guest, thumbupStats)
group.GET("/history", authSvc.User, antispamSvc.ServeHTTP, dmHistory)
group.GET("/history/list", authSvc.User, antispamSvc.ServeHTTP, dmHistoryV2)
group.GET("/history/index", authSvc.User, antispamSvc.ServeHTTP, dmHistoryIndex)
group.POST("/thumbup/add", authSvc.User, thumbupDM)
group.POST("/post", authSvc.User, dmPost)
group.POST("/edit/state", authSvc.User, editState)
group.POST("/edit/pool", authSvc.User, editPool)
group.POST("/filter/up/add", authSvc.User, antispamSvc.ServeHTTP, addUpFilterID)
group.GET("/recent", authSvc.User, dmUpRecent)
group.GET("/upper/config", authSvc.User, dmUpConfig)
group.POST("/advance/config", authSvc.User, upAdvancePermit)
group.GET("/filter/up", authSvc.User, upFilters)
group.POST("/filter/up/edit", authSvc.User, editUpFilters)
group.GET("/advert", authSvc.Guest, dmAdvert)
subtitle := group.Group("/subtitle")
{
subtitle.GET("/lans", authSvc.User, subtitleLans)
subtitle.POST("/del", authSvc.User, subtitleDel)
subtitle.POST("/lock", authSvc.User, subtitleLock)
subtitle.POST("/sign", authSvc.User, subtitleSign)
subtitle.GET("/show", authSvc.User, subtitleShow)
subtitle.GET("/archive/name", authSvc.User, subtitleArchiveName)
subtitle.POST("/draft/save", authSvc.User, draftSave)
subtitle.POST("/assit/audit", authSvc.User, assitAudit)
subtitle.GET("/permission", authSvc.User, subtitlePermission)
subtitle.GET("/waveform", authSvc.User, waveForm)
subtitle.POST("/filter", authSvc.User, subtitleFilter)
subtitle.GET("/report/tag", authSvc.User, subtitleReportTag)
subtitle.POST("/report/add", authSvc.User, subtitleReportAdd)
subtitle.GET("/search/assist", authSvc.User, searchAssist)
subtitle.GET("/search/author/list", authSvc.User, authorList)
}
}
}
// ping check server ok.
func ping(c *bm.Context) {
if err := dmSvc.Ping(c); err != nil {
log.Error("dm2 service ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,306 @@
package http
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"strings"
"testing"
"time"
"go-common/app/interface/main/dm2/model"
)
const (
_host = "http://127.0.0.1:6701"
_host2 = "http://api.bilibili.com"
_host3 = "http://uat-api.bilibili.co"
)
var (
cookie = `sid=88dol9eo; fts=1508407962; LIVE_BUVID=AUTO4115084079913953; UM_distinctid=15f3436b684ab-08804fe751374a-31657c00-1fa400-15f3436b685298; pgv_pvi=3618563072; rpdid=kmilkmximpdoswqploqxw; biliMzIsnew=1; biliMzTs=null; buvid3=CBB97852-6CF6-4D3A-B97F-5A9AD1D5827F26561infoc; finger=14bc3c4e; pgv_si=s6534896640; purl_token=bilibili_1511162275; DedeUserID=3078992; DedeUserID__ckMd5=55845496fd6119b5; SESSDATA=7bf20cf0%2C1513762568%2C258e3d17; bili_jct=160db0def61324719de104b7bfe1e3ef; _cnt_pm=0; _cnt_notify=0; _dfcaptcha=b5463dc96d22c22164a8c0e5a1ba9e96; member_v2=1`
dmLikeActURL = _host2 + "/x/v2/dm/thumbup/add"
dmLikeListURL = _host2 + "/x/v2/dm/thumbup/stats"
dmEditURL = _host + "/x/internal/v2/dm/edit/state"
dmPoolURL = _host + "/x/internal/v2/dm/edit/pool"
dmUpSearchURL = _host3 + "/x/v2/dm/search"
dmRecentURL = _host + "/x/internal/v2/dm/recent"
updateMaskURL = _host3 + "/x/internal/v2/dm/mask/update"
editUpFiltersURL = _host + "/x/v2/dm/filter/up/edit"
)
func TestEditUpFilter(t *testing.T) {
fliters := model.UpFilter{
Filter: "zzzzzz",
Comment: "",
}
p := url.Values{}
p.Set("active", "1")
p.Set("type", "0")
filter, err := json.Marshal(fliters)
if err != nil {
return
}
fmt.Print(string(filter))
p.Set("filters", string(filter))
mh := md5.Sum([]byte(p.Encode() + "3cf6bd1b0ff671021da5f424fea4b04a"))
p.Set("sign", hex.EncodeToString(mh[:]))
reqURL := editUpFiltersURL + "?" + p.Encode()
fmt.Println(reqURL)
body, err := opost(reqURL)
if err != nil {
t.Errorf("url(%s) error(%s)", reqURL, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestRecent(t *testing.T) {
params := url.Values{}
params.Set("uid", "27515256")
params.Set("page", "5")
//params.Set("mid", "27515313")
params.Set("order", "ctime")
params.Set("size", "1")
params.Set("appkey", "53e2fa226f5ad348")
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
mh := md5.Sum([]byte(params.Encode() + "3cf6bd1b0ff671021da5f424fea4b04a"))
params.Set("sign", hex.EncodeToString(mh[:]))
s := dmRecentURL + "?" + params.Encode()
body, err := oget(s)
if err != nil {
t.Errorf("url(%s) error(%s)", s, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestDMEdit(t *testing.T) {
params := url.Values{}
params.Set("oid", "5")
params.Set("type", "1")
params.Set("mid", "27515313")
params.Set("dmids", "719149463")
params.Set("state", "0")
params.Set("appkey", "53e2fa226f5ad348")
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
mh := md5.Sum([]byte(params.Encode() + "3cf6bd1b0ff671021da5f424fea4b04a"))
params.Set("sign", hex.EncodeToString(mh[:]))
s := dmEditURL + "?" + params.Encode()
body, err := opost(s)
if err != nil {
t.Errorf("url(%s) error(%s)", s, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestDMPool(t *testing.T) {
params := url.Values{}
params.Set("cid", "5")
params.Set("mid", "27515313")
params.Set("dmids", "719149463")
params.Set("pool", "2")
params.Set("appkey", "53e2fa226f5ad348")
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
mh := md5.Sum([]byte(params.Encode() + "3cf6bd1b0ff671021da5f424fea4b04a"))
params.Set("sign", hex.EncodeToString(mh[:]))
s := dmPoolURL + "?" + params.Encode()
body, err := opost(s)
if err != nil {
t.Errorf("url(%s) error(%s)", s, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestLikeDM(t *testing.T) {
params := url.Values{}
params.Set("oid", "5")
params.Set("dmid", "719149462")
params.Set("op", "1")
reqURL := dmLikeActURL + "?" + params.Encode()
body, err := cpost(reqURL)
if err != nil {
t.Errorf("url(%s) error(%s)", reqURL, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestUpdateMask(t *testing.T) {
params := url.Values{}
params.Set("cid", "10109227")
params.Set("time", "30")
params.Set("fps", "20")
params.Set("plat", "1")
params.Set("count", "20")
params.Set("list", "26777486_s0_0_1499")
params.Set("appkey", "8f62754d8d594e90")
params.Set("ts", strconv.FormatInt(1527564095, 10))
data := params.Encode()
if strings.IndexByte(data, '+') > -1 {
data = strings.Replace(data, "+", "%20", -1)
}
mh := md5.Sum([]byte(data + "test"))
params.Set("sign", hex.EncodeToString(mh[:]))
s := updateMaskURL + "?" + params.Encode()
body, err := opost(s)
if err != nil {
t.Errorf("url(%s) error(%s)", s, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestLikeList(t *testing.T) {
params := url.Values{}
params.Set("oid", "27139273")
params.Set("ids", "719149462,719149463")
reqURL := dmLikeListURL + "?" + params.Encode()
fmt.Println(reqURL)
body, err := cget(reqURL)
if err != nil {
t.Errorf("url(%s) error(%s)", reqURL, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
fmt.Println(string(body))
}
func TestDMUpSearch(t *testing.T) {
params := url.Values{}
params.Set("oid", "10131156")
params.Set("type", "1")
params.Set("appkey", "53e2fa226f5ad348")
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
mh := md5.Sum([]byte(params.Encode() + "3cf6bd1b0ff671021da5f424fea4b04a"))
params.Set("sign", hex.EncodeToString(mh[:]))
reqURL := dmUpSearchURL + "?" + params.Encode()
fmt.Println(reqURL)
body, err := oget(reqURL)
if err != nil {
t.Errorf("url(%s) error(%s)", reqURL, err)
t.FailNow()
}
if err = ccode(body); err != nil {
t.Fatal(err, string(body))
t.FailNow()
}
t.Logf("======%+v", body)
fmt.Println(string(body))
}
// oget http get request
func oget(url string) (body []byte, err error) {
resp, err := http.Get(url)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
return
}
// ccode check code == 0
func ccode(body []byte) (err error) {
var d interface{}
err = json.Unmarshal(body, d)
if err != nil {
return
}
ma, ok := d.(map[string]interface{})
if !ok {
return
}
code := ma["code"].(int)
if code != 0 {
err = errors.New("code != 0")
return
}
return
}
// opost http post request
func opost(url string) (body []byte, err error) {
resp, err := http.Post(url, "", nil)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
return
}
func cpost(url string) (body []byte, err error) {
client := &http.Client{}
req, err := http.NewRequest("POST", url, nil)
if err != nil {
return
}
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
req.Header.Add("Accept-Language", "ja,zh-CN;q=0.8,zh;q=0.6")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Cookie", cookie)
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0")
resp, err := client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
return
}
func cget(url string) (body []byte, err error) {
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return
}
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
req.Header.Add("Accept-Language", "ja,zh-CN;q=0.8,zh;q=0.6")
req.Header.Add("Connection", "keep-alive")
req.Header.Add("Cookie", cookie)
req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0")
resp, err := client.Do(req)
if err != nil {
return
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
return
}

View File

@@ -0,0 +1,116 @@
package http
import (
"strconv"
"go-common/app/interface/main/dm2/model"
"go-common/app/interface/main/dm2/model/oplog"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/xstr"
)
// editState edit dm state.
// 0:正常1:删除 2:保护 3:取消保护
func editState(c *bm.Context) {
var (
p = c.Request.Form
dmids = make([]int64, 0)
)
mid, _ := c.Get("mid")
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
state, err := strconv.ParseInt(p.Get("state"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
ids, err := xstr.SplitInts(p.Get("dmids"))
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
for _, dmid := range ids {
if dmid == 0 {
log.Warn("dmid is zero")
continue
}
dmids = append(dmids, dmid)
}
if len(dmids) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
switch state {
case 0, 1:
err = dmSvc.EditDMState(c, int32(tp), mid.(int64), oid, int32(state), dmids, oplog.SourceUp, oplog.OperatorUp)
if err != nil {
log.Error("dmSvc.EditDMState(mid:%d, oid:%d, state:%d, dmids:%v) error(%v)", mid.(int64), oid, state, dmids, err)
c.JSON(nil, err)
return
}
err = dmSvc.UptSearchDMState(c, dmids, oid, int32(state), int32(tp))
case 2, 3:
var (
affectIds []int64
)
attr := model.AttrYes
if state == 3 {
attr = model.AttrNo
}
affectIds, err = dmSvc.EditDMAttr(c, int32(tp), mid.(int64), oid, model.AttrProtect, attr, dmids, oplog.SourceUp, oplog.OperatorUp)
if err != nil {
log.Error("dmSvc.EditDMAttr(mid:%d, oid:%d, attr:%d, dmids:%v) error(%v)", mid.(int64), oid, attr, dmids, err)
c.JSON(nil, err)
return
}
if len(affectIds) > 0 {
err = dmSvc.UptSearchDMAttr(c, affectIds, oid, attr, int32(tp))
}
default:
err = ecode.RequestErr
}
c.JSON(nil, err)
}
func editPool(c *bm.Context) {
p := c.Request.Form
mid, _ := c.Get("mid")
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
pool, err := strconv.ParseInt(p.Get("pool"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
dmids, err := xstr.SplitInts(p.Get("dmids"))
if err != nil || len(dmids) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
err = dmSvc.EditDMPool(c, int32(tp), mid.(int64), oid, int32(pool), dmids, oplog.SourceUp, oplog.OperatorUp)
if err != nil {
log.Error("dmSvc.EditDMStat(oid:%d dmids:%v) error(%v)", oid, dmids, err)
c.JSON(nil, err)
return
}
err = dmSvc.UptSearchDMPool(c, dmids, oid, int32(pool), int32(tp))
c.JSON(nil, err)
}

View File

@@ -0,0 +1,42 @@
package http
import (
"strconv"
"strings"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func updateMask(c *bm.Context) {
p := c.Request.Form
var (
cid, plat, fps, maskTime int64
list string
err error
)
if cid, err = strconv.ParseInt(p.Get("cid"), 10, 64); err != nil || cid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if plat, err = strconv.ParseInt(p.Get("plat"), 10, 64); err != nil || plat < 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if p.Get("time") != "" {
if maskTime, err = strconv.ParseInt(p.Get("time"), 10, 64); err != nil || maskTime < 0 {
c.JSON(nil, ecode.RequestErr)
return
}
}
if p.Get("fps") != "" {
fps, err = strconv.ParseInt(p.Get("fps"), 10, 64)
if err != nil || fps <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
}
list = strings.Replace(p.Get("list"), " ", "", -1)
err = dmSvc.UpdateMask(c, cid, maskTime, int32(fps), int8(plat), list)
c.JSON(nil, err)
}

View File

@@ -0,0 +1,149 @@
package http
import (
"strconv"
"go-common/app/interface/main/dm2/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// dmUpSearch danmu content List by cid
func dmUpSearch(c *bm.Context) {
p := c.Request.Form
mid, _ := c.Get("mid")
params := &model.SearchDMParams{
Mids: p.Get("mids"),
Mode: p.Get("modes"),
Pool: p.Get("pool"),
ProgressFrom: model.CondIntNil,
ProgressTo: model.CondIntNil,
CtimeFrom: p.Get("ctime_from"),
CtimeTo: p.Get("ctime_to"),
Pn: 1,
Ps: 100,
Sort: "desc",
Order: "ctime",
Keyword: p.Get("keyword"),
Attrs: p.Get("attrs"),
State: "0,2,6",
}
tp, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
params.Type = int32(tp)
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
log.Error("param err oid %s %v", p.Get("oid"), err)
c.JSON(nil, ecode.RequestErr)
return
}
params.Oid = oid
if p.Get("pn") != "" {
if params.Pn, err = strconv.ParseInt(p.Get("pn"), 10, 64); err != nil {
log.Error("param err page number %s %v", p.Get("pn"), err)
c.JSON(nil, ecode.RequestErr)
return
}
}
if p.Get("ps") != "" {
if params.Ps, err = strconv.ParseInt(p.Get("ps"), 10, 64); err != nil {
log.Error("param err page_size %s %v", p.Get("page_size"), err)
c.JSON(nil, ecode.RequestErr)
return
}
}
if p.Get("progress_from") != "" {
if params.ProgressFrom, err = strconv.ParseInt(p.Get("progress_from"), 10, 64); err != nil {
log.Error("param err progress_from %s %v", p.Get("progress_from"), err)
c.JSON(nil, ecode.RequestErr)
return
}
params.ProgressFrom = params.ProgressFrom * 1000
}
if p.Get("progress_to") != "" {
if params.ProgressTo, err = strconv.ParseInt(p.Get("progress_to"), 10, 64); err != nil {
log.Error("param err progress_to %s %v", p.Get("progress_to"), err)
c.JSON(nil, ecode.RequestErr)
return
}
params.ProgressTo = params.ProgressTo * 1000
}
if p.Get("order") != "" {
params.Order = p.Get("order")
}
if p.Get("sort") != "" {
params.Sort = p.Get("sort")
}
data, err := dmSvc.DMUpSearch(c, mid.(int64), params)
c.JSON(data, err)
}
// dmUpRecent get dm list by mid fron redis
func dmUpRecent(c *bm.Context) {
var (
err error
v = new(struct {
Pn int64 `form:"pn" default:"1"`
Ps int64 `form:"ps" default:"100"`
})
)
if err = c.Bind(v); err != nil {
return
}
mid, _ := c.Get("mid")
c.JSON(dmSvc.DMUpRecent(c, mid.(int64), v.Pn, v.Ps))
}
// 统计一个每个时间段弹幕数
func dmDistribution(c *bm.Context) {
p := c.Request.Form
typ, err := strconv.ParseInt(p.Get("type"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
interval, err := strconv.ParseInt(p.Get("interval"), 10, 64)
if err != nil || interval <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
data, err := dmSvc.DMDistribution(c, int32(typ), oid, int32(interval))
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}
func dmUpConfig(c *bm.Context) {
mid, _ := c.Get("mid")
advPermit, err := dmSvc.AdvancePermit(c, mid.(int64))
if err != nil {
c.JSON(nil, err)
return
}
data := map[string]interface{}{
"advance_permit": advPermit,
}
c.JSON(data, nil)
}
func upAdvancePermit(c *bm.Context) {
mid, _ := c.Get("mid")
p := c.Request.Form
permit, err := strconv.ParseInt(p.Get("advance_permit"), 10, 64)
if err != nil || int8(permit) > model.AdvPermitForbid {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, dmSvc.UpdateAdvancePermit(c, mid.(int64), int8(permit)))
}

View File

@@ -0,0 +1,267 @@
package http
import (
"strconv"
"go-common/app/interface/main/dm2/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
func subtitleLanAdd(c *bm.Context) {
var (
err error
v = new(struct {
Code uint8 `form:"code" validate:"required"`
Lan string `form:"lan" validate:"required"`
DocEn string `form:"doc_en" validate:"required"`
DocZh string `form:"doc_zh" validate:"required"`
IsDelete bool `form:"is_delete"`
})
)
if err = c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.SubtitleLanOp(c, v.Code, v.Lan, v.DocZh, v.DocEn, v.IsDelete))
}
func subtitleFilter(c *bm.Context) {
var (
err error
v = new(struct {
Words string `form:"words" validate:"required"`
})
)
if err = c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SubtitleFilter(c, v.Words))
}
func draftSave(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
Aid int64 `form:"aid" validate:"required" `
Lan string `form:"lan" validate:"required"`
Submit bool `form:"submit"`
Sign bool `form:"sign"`
OriginSubtitleID int64 `form:"origin_subtitle_id"`
Data string `form:"data" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SaveSubtitleDraft(c, v.Aid, v.Oid, v.Type, mid.(int64), v.Lan, v.Submit, v.Sign, v.OriginSubtitleID, []byte(v.Data)))
}
func assitAudit(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
SubtitleID int64 `form:"subtitle_id" validate:"required"`
Pass bool `form:"pass"`
RejectComment string `form:"reject_comment"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.AuditSubtitle(c, v.Oid, v.SubtitleID, mid.(int64), v.Pass, v.RejectComment))
}
func subtitleDel(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
SubtitleID int64 `form:"subtitle_id" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.DelSubtitle(c, v.Oid, v.SubtitleID, mid.(int64)))
}
// 锁定发布字幕
func subtitleLock(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
SubtitleID int64 `form:"subtitle_id" validate:"required"`
Lock bool `form:"lock"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.SubtitleLock(c, v.Oid, v.Type, mid.(int64), v.SubtitleID, v.Lock))
}
// 署名字幕
func subtitleSign(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
SubtitleID int64 `form:"subtitle_id" validate:"required"`
Sign bool `form:"sign"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.SubtitleSign(c, v.Oid, v.Type, mid.(int64), v.SubtitleID, v.Sign))
}
func subtitleArchiveName(c *bm.Context) {
var (
v = new(struct {
Aid int64 `form:"aid" validate:"required"`
})
)
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.ArchiveName(c, v.Aid))
}
// 查看字幕内容
func subtitleShow(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
SubtitleID int64 `form:"subtitle_id" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SubtitleShow(c, v.Oid, v.SubtitleID, mid.(int64)))
}
func subtitleLans(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SubtitleLans(c, v.Oid, v.Type, mid.(int64)))
}
func searchAssist(c *bm.Context) {
var (
v = new(struct {
Oid int64 `form:"oid"`
Type int32 `form:"type"`
Aid int64 `form:"aid"`
Status int32 `form:"status"`
Page int32 `form:"page"`
Size int32 `form:"size" validate:"max=100"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SearchAssist(c, v.Aid, v.Oid, v.Type, mid.(int64), v.Status, v.Page, v.Size))
}
func authorList(c *bm.Context) {
var (
v = new(struct {
Status int32 `form:"status"`
Page int32 `form:"page"`
Size int32 `form:"size" validate:"max=100"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.SearchAuthor(c, mid.(int64), v.Status, v.Page, v.Size))
}
func subtitlePermission(c *bm.Context) {
var (
v = new(struct {
Aid int64 `form:"aid" validate:"required"`
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err := c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.SubtitlePermission(c, v.Aid, v.Oid, v.Type, mid.(int64)))
}
// waveForm .
func waveForm(c *bm.Context) {
var (
err error
v = new(struct {
Aid int64 `form:"aid" validate:"required"`
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
})
)
mid, _ := c.Get("mid")
if err = c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.WaveForm(c, v.Aid, v.Oid, v.Type, mid.(int64)))
}
// waveFormCallBack .
func waveFormCallBack(c *bm.Context) {
var (
oid int64
err error
v = new(struct {
OK int32 `json:"ok"`
Info string `json:"info"`
})
)
if err = c.BindWith(v, binding.JSON); err != nil {
return
}
if oid, err = strconv.ParseInt(c.Request.URL.Query().Get("oid"), 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, dmSvc.WaveFormCallBack(c, oid, 1, v.OK, v.Info))
}
func subtitleReportAdd(c *bm.Context) {
var (
err error
v = new(model.SubtitleReportAddParam)
)
mid, _ := c.Get("mid")
if err = c.Bind(v); err != nil {
return
}
c.JSON(nil, dmSvc.SubtitleReportAdd(c, mid.(int64), v))
}
func subtitleReportTag(c *bm.Context) {
c.JSON(dmSvc.SubtitleReportList(c))
}

View File

@@ -0,0 +1,62 @@
package http
import (
"strconv"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/xstr"
)
func thumbupDM(c *bm.Context) {
p := c.Request.Form
mid, _ := c.Get("mid")
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
dmid, err := strconv.ParseInt(p.Get("dmid"), 10, 64)
if err != nil || dmid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
op, err := strconv.ParseInt(p.Get("op"), 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if err = dmSvc.ThumbupDM(c, oid, dmid, mid.(int64), int8(op)); err != nil {
log.Error("dmSvc.ThumbupDM(oid:%d,dmid:%d) error(%v)", oid, dmid, err)
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
}
func thumbupStats(c *bm.Context) {
var (
mid int64
p = c.Request.Form
)
oid, err := strconv.ParseInt(p.Get("oid"), 10, 64)
if err != nil || oid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if midI, ok := c.Get("mid"); ok {
mid = midI.(int64)
}
dmids, err := xstr.SplitInts(p.Get("ids"))
if err != nil || len(dmids) == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
data, err := dmSvc.ThumbupList(c, oid, mid, dmids)
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}

View File

@@ -0,0 +1,23 @@
package http
import bm "go-common/library/net/http/blademaster"
func view(c *bm.Context) {
var (
mid int64
v = new(struct {
Oid int64 `form:"oid" validate:"required"`
Type int32 `form:"type" validate:"required"`
Aid int64 `form:"aid"`
Plat int32 `form:"plat"`
})
)
iMid, ok := c.Get("mid")
if ok {
mid = iMid.(int64)
}
if err := c.Bind(v); err != nil {
return
}
c.JSON(dmSvc.View(c, mid, v.Aid, v.Oid, v.Type, v.Plat))
}