go-common/app/interface/main/feedback/http/feedback.go

481 lines
12 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package http
import (
"io/ioutil"
"mime/multipart"
"path"
"strconv"
"strings"
"sync"
"time"
"unicode/utf8"
"go-common/app/interface/main/feedback/conf"
"go-common/app/interface/main/feedback/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/sync/errgroup"
)
const (
_timeFromat = "2006-01-02 15:04:05"
)
// addReply
func addReply(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
// params
buvid := header.Get("Buvid")
system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
content := params.Get("content")
imgURL := params.Get("img_url")
logURL := params.Get("log_url")
device := params.Get("device")
channel := params.Get("channel")
entrance := params.Get("entrance")
netState := params.Get("net_state")
netOperator := params.Get("net_operator")
agencyArea := params.Get("agency_area")
platform := params.Get("platform")
browser := params.Get("browser")
qq := params.Get("qq")
mobiApp := params.Get("mobi_app")
email := params.Get("email")
tagStr := params.Get("tag_id")
// check params
if buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now()))
}
func addWebReply(c *bm.Context) {
params := c.Request.Form
// system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
sidStr := params.Get("session_id")
content := params.Get("content")
imgURL := params.Get("img_url")
logURL := params.Get("log_url")
// device := params.Get("device")
buvid := params.Get("buvid")
// channel := params.Get("channel")
netState := params.Get("net_state")
netOperator := params.Get("net_operator")
agencyArea := params.Get("agency_area")
platform := params.Get("platform")
browser := params.Get("browser")
qq := params.Get("qq")
email := params.Get("email")
tagStr := params.Get("tag_id")
aidStr := params.Get("aid")
var (
mid int64
sid int64
err error
)
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
sid, _ = strconv.ParseInt(sidStr, 10, 64)
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
if platform == "" {
platform = "ugc"
}
c.JSON(feedbackSvr.AddWebReply(c, mid, sid, tagID, aidStr, filtered(content), imgURL, netState, netOperator, agencyArea, platform, version, buvid, browser, qq, email, time.Now()))
}
//replys
func replys(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
buvid := header.Get("Buvid")
system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
platform := params.Get("platform")
mobiApp := params.Get("mobi_app")
device := params.Get("device")
pnStr := params.Get("pn")
psStr := params.Get("ps")
entrance := params.Get("entrance")
// check params
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
if mid == 0 && buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps < 1 || ps > conf.Conf.Feedback.ReplysNum {
ps = conf.Conf.Feedback.ReplysNum
}
rs, isEndReply, err := feedbackSvr.Replys(c, buvid, platform, mobiApp, device, system, version, entrance, mid, pn, ps)
if err != nil {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": rs,
"is_end_reply": isEndReply,
}
c.JSONMap(res, err)
}
func sessions(c *bm.Context) {
params := c.Request.Form
tagid := params.Get("tag_id")
platform := params.Get("platform")
stateStr := params.Get("state")
midStr := params.Get("mid")
start := params.Get("start")
end := params.Get("end")
pnStr := params.Get("pn")
psStr := params.Get("ps")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
var (
etime time.Time
)
if start == "" {
start = "00-00-00 00:00:00"
}
stime, _ := time.Parse(_timeFromat, start)
etime, _ = time.Parse(_timeFromat, end)
if end == "" {
etime = time.Now()
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps < 0 || ps > 10 {
ps = 10
}
total, sessions, err := feedbackSvr.Sessions(c, mid, stateStr, tagid, platform, stime, etime, ps, pn)
if err != nil {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": sessions,
"total": total,
}
c.JSONMap(res, err)
}
func sessionsClose(c *bm.Context) {
params := c.Request.Form
sidStr := params.Get("session_id")
sid, err := strconv.ParseInt(sidStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, feedbackSvr.UpdateSessionState(c, 3, sid))
}
func replyTag(c *bm.Context) {
params := c.Request.Form
tp := params.Get("type") // NOTE: player
platform := params.Get("platform")
c.JSON(model.Tags[tp][platform], nil)
}
func ugcTag(c *bm.Context) {
params := c.Request.Form
tp := params.Get("type")
platform := params.Get("platform")
mold, err := strconv.Atoi(tp)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(feedbackSvr.Tags(c, mid, mold, platform))
}
func webReply(c *bm.Context) {
params := c.Request.Form
sidStr := params.Get("session_id")
sid, err := strconv.ParseInt(sidStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(feedbackSvr.WebReplys(c, sid, mid))
}
func filtered(content string) string {
v := make([]rune, 0, len(content))
for _, c := range content {
if c != utf8.RuneError {
v = append(v, c)
}
}
return string(v)
}
func playerCheck(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
platform, ipChangeTimes int
mid, checkTime, aid, connectSpeed, ioSpeed int64
region, school string
err error
)
platformStr := params.Get("platform")
if platform = model.FormPlatForm(platformStr); platform == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if region = params.Get("region"); region == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if school = params.Get("school"); school == "" {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
checkTimeStr := params.Get("check_time")
if checkTime, err = strconv.ParseInt(checkTimeStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
aid, _ = strconv.ParseInt(params.Get("aid"), 10, 64)
ipChangeTimesStr := params.Get("ip_change_times")
if ipChangeTimes, err = strconv.Atoi(ipChangeTimesStr); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
connectSpeedStr := params.Get("connect_speed")
if connectSpeed, err = strconv.ParseInt(connectSpeedStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
ioSpeedStr := params.Get("io_speed")
if ioSpeed, err = strconv.ParseInt(ioSpeedStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, feedbackSvr.PlayerCheck(c, platform, ipChangeTimes, mid, checkTime, aid, connectSpeed, ioSpeed, region, school, header.Get("X-Cache-Server-Addr")))
}
// addReplyH5 add from H5
func addReplyH5(c *bm.Context) {
c.Request.ParseMultipartForm(model.MaxUploadSize)
header := c.Request.Header
params := c.Request.MultipartForm
buvid := header.Get("Buvid")
var system, version, midStr, content, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, mobiApp, email, tagStr string
// params
if len(params.Value["system"]) > 0 {
system = params.Value["system"][0]
}
if len(params.Value["version"]) > 0 {
version = params.Value["version"][0]
}
if len(params.Value["mid"]) > 0 {
midStr = params.Value["mid"][0]
}
if len(params.Value["content"]) > 0 {
content = params.Value["content"][0]
}
if len(params.Value["log_url"]) > 0 {
logURL = params.Value["log_url"][0]
}
if len(params.Value["device"]) > 0 {
device = params.Value["device"][0]
}
if len(params.Value["channel"]) > 0 {
channel = params.Value["channel"][0]
}
if len(params.Value["entrance"]) > 0 {
entrance = params.Value["entrance"][0]
}
if len(params.Value["net_state"]) > 0 {
netState = params.Value["net_state"][0]
}
if len(params.Value["net_operator"]) > 0 {
netOperator = params.Value["net_operator"][0]
}
if len(params.Value["agency_area"]) > 0 {
agencyArea = params.Value["agency_area"][0]
}
if len(params.Value["platform"]) > 0 {
platform = params.Value["platform"][0]
}
if len(params.Value["browser"]) > 0 {
browser = params.Value["browser"][0]
}
if len(params.Value["qq"]) > 0 {
qq = params.Value["qq"][0]
}
if len(params.Value["mobi_app"]) > 0 {
mobiApp = params.Value["mobi_app"][0]
}
if len(params.Value["email"]) > 0 {
email = params.Value["email"][0]
}
if len(params.Value["buvid"]) > 0 && buvid == "" {
buvid = params.Value["buvid"][0]
}
if len(params.Value["tag_id"]) > 0 {
tagStr = params.Value["tag_id"][0]
}
// check params
if buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
imgs := c.Request.MultipartForm.File["imgs"]
var (
imgURL string
urls []string
mutex = sync.Mutex{}
)
g, ctx := errgroup.WithContext(c)
for k, fh := range imgs {
if k == conf.Conf.Feedback.ImgLimit {
break
}
var (
img multipart.File
url string
fileName string
fileTpye string
body []byte
)
if img, err = fh.Open(); err != nil {
log.Error("H5 addReply Open %s failed", fh.Filename)
err = nil
continue
}
defer img.Close()
fileName = fh.Filename
fileTpye = strings.TrimPrefix(path.Ext(fileName), ".")
if body, err = ioutil.ReadAll(img); err != nil {
log.Error("H5 addReply ioutil.ReadAll %s failed", fh.Filename)
err = nil
continue
}
g.Go(func() (err error) {
if url, err = feedbackSvr.Upload(ctx, "", fileTpye, time.Now(), body); err != nil {
log.Error("H5 addReply Upload %s failed", fh.Filename)
err = nil
return
}
mutex.Lock()
urls = append(urls, url)
mutex.Unlock()
return
})
}
if err = g.Wait(); err != nil {
log.Error("%+v", err)
return
}
if len(urls) > 0 {
imgURL = strings.Join(urls, ";")
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now()))
}