419 lines
11 KiB
Go
419 lines
11 KiB
Go
|
package http
|
|||
|
|
|||
|
import (
|
|||
|
"strconv"
|
|||
|
|
|||
|
"go-common/app/interface/main/reply/conf"
|
|||
|
model "go-common/app/interface/main/reply/model/reply"
|
|||
|
xmodel "go-common/app/interface/main/reply/model/xreply"
|
|||
|
"go-common/library/ecode"
|
|||
|
"go-common/library/log"
|
|||
|
bm "go-common/library/net/http/blademaster"
|
|||
|
"go-common/library/net/metadata"
|
|||
|
)
|
|||
|
|
|||
|
func subReplyByCursor(ctx *bm.Context) {
|
|||
|
params := ctx.Request.Form
|
|||
|
oid, err := strconv.ParseInt(params.Get("oid"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
var build int64
|
|||
|
appStr := params.Get("mobi_app")
|
|||
|
buildStr := params.Get("build")
|
|||
|
if buildStr != "" {
|
|||
|
build, err = strconv.ParseInt(buildStr, 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("strconv.ParseInt(build %s) err(%v)", buildStr, err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
otyp, err := strconv.ParseInt(params.Get("type"), 10, 8)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var size int64
|
|||
|
if params.Get("size") != "" {
|
|||
|
size, err = strconv.ParseInt(params.Get("size"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if size <= 0 || size > int64(conf.Conf.Reply.MaxPageSize) {
|
|||
|
size = int64(conf.Conf.Reply.MaxPageSize)
|
|||
|
}
|
|||
|
var (
|
|||
|
rootID int64
|
|||
|
replyID int64
|
|||
|
cursor *model.Cursor
|
|||
|
)
|
|||
|
|
|||
|
if params.Get("rpid") != "" {
|
|||
|
// jump subReply
|
|||
|
replyID, err = strconv.ParseInt(params.Get("rpid"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
rootID, cursor, err = rpSvr.NewSubCursorByReplyID(ctx, oid, int8(otyp), replyID, int(size), model.OrderASC)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
} else {
|
|||
|
var maxID, minID int64
|
|||
|
if params.Get("min_id") != "" {
|
|||
|
minID, err = strconv.ParseInt(params.Get("min_id"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if params.Get("max_id") != "" {
|
|||
|
maxID, err = strconv.ParseInt(params.Get("max_id"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
cursor, err = model.NewCursor(maxID, minID, int(size), model.OrderASC)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if rootID <= 0 {
|
|||
|
rootID, err = strconv.ParseInt(params.Get("root"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, ecode.RequestErr)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
var (
|
|||
|
showFolded bool
|
|||
|
scene int64
|
|||
|
)
|
|||
|
|
|||
|
// 消息中心折叠的评论也要给加回来,这里约定他们传一个scene=1
|
|||
|
if params.Get("scene") != "" {
|
|||
|
scene, _ = strconv.ParseInt(params.Get("scene"), 10, 64)
|
|||
|
}
|
|||
|
if model.ShouldShowFolded(params.Get("mobi_app"), build, scene) {
|
|||
|
showFolded = true
|
|||
|
}
|
|||
|
// 这里老版本折叠评论也要显示
|
|||
|
cursorParams := &model.CursorParams{
|
|||
|
IP: metadata.String(ctx, metadata.RemoteIP),
|
|||
|
Oid: oid,
|
|||
|
RootID: rootID,
|
|||
|
OTyp: int8(otyp),
|
|||
|
HTMLEscape: params.Get("mobi_app") == "",
|
|||
|
Cursor: cursor,
|
|||
|
ShowFolded: showFolded,
|
|||
|
}
|
|||
|
|
|||
|
if m, ok := ctx.Get("mid"); ok {
|
|||
|
cursorParams.Mid = m.(int64)
|
|||
|
}
|
|||
|
cursorRes, err := rpSvr.GetSubReplyListByCursor(ctx, cursorParams)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
var blacklist, assist int
|
|||
|
if mid := cursorParams.Mid; mid > 0 {
|
|||
|
if !rpSvr.IsWhiteAid(cursorParams.Oid, int8(cursorParams.OTyp)) {
|
|||
|
if rpSvr.RelationBlocked(ctx, cursorRes.Subject.Mid, mid) {
|
|||
|
blacklist = 1
|
|||
|
}
|
|||
|
if ok, _ := rpSvr.CheckAssist(ctx, cursorRes.Subject.Mid, mid); ok {
|
|||
|
assist = 1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
var config xmodel.ReplyConfig
|
|||
|
config.ShowFloor = 1
|
|||
|
if !rpSvr.ShowFloor(cursorParams.Oid, cursorParams.OTyp) {
|
|||
|
config.ShowFloor = 0
|
|||
|
}
|
|||
|
rootReply := cursorRes.Roots[0]
|
|||
|
if showFolded {
|
|||
|
rootReply.Folder.HasFolded = false
|
|||
|
}
|
|||
|
rpSvr.EmojiReplaceI(appStr, build, rootReply)
|
|||
|
data := map[string]interface{}{
|
|||
|
"assist": assist,
|
|||
|
"blacklist": blacklist,
|
|||
|
"upper": map[string]interface{}{
|
|||
|
"mid": cursorRes.Subject.Mid,
|
|||
|
},
|
|||
|
"root": rootReply,
|
|||
|
"cursor": map[string]interface{}{
|
|||
|
"all_count": rootReply.RCount,
|
|||
|
"max_id": cursorRes.CursorRangeMax,
|
|||
|
"min_id": cursorRes.CursorRangeMin,
|
|||
|
"size": len(rootReply.Replies),
|
|||
|
},
|
|||
|
"config": config,
|
|||
|
}
|
|||
|
ctx.JSON(data, err)
|
|||
|
}
|
|||
|
|
|||
|
func replyByCursor(ctx *bm.Context) {
|
|||
|
params := ctx.Request.Form
|
|||
|
buvid := ctx.Request.Header.Get("buvid")
|
|||
|
oid, err := strconv.ParseInt(params.Get("oid"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
otyp, err := strconv.ParseInt(params.Get("type"), 10, 8)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var sort int64
|
|||
|
if params.Get("sort") != "" {
|
|||
|
sort, err = strconv.ParseInt(params.Get("sort"), 10, 8)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
plat := int64(model.PlatWeb)
|
|||
|
if params.Get("plat") != "" {
|
|||
|
plat, err = strconv.ParseInt(params.Get("plat"), 10, 8)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var build int64
|
|||
|
if params.Get("build") != "" {
|
|||
|
build, err = strconv.ParseInt(params.Get("build"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var size int64
|
|||
|
if params.Get("size") != "" {
|
|||
|
size, err = strconv.ParseInt(params.Get("size"), 10, 32)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if size <= 0 || size > int64(conf.Conf.Reply.MaxPageSize) {
|
|||
|
size = int64(conf.Conf.Reply.MaxPageSize)
|
|||
|
}
|
|||
|
|
|||
|
var (
|
|||
|
replyID int64
|
|||
|
cursor *model.Cursor
|
|||
|
)
|
|||
|
|
|||
|
if params.Get("rpid") != "" {
|
|||
|
// jump root reply
|
|||
|
replyID, err = strconv.ParseInt(params.Get("rpid"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
cursor, err = rpSvr.NewCursorByReplyID(ctx, oid, int8(otyp), replyID, int(size), model.OrderDESC)
|
|||
|
} else {
|
|||
|
var maxID, minID int64
|
|||
|
if params.Get("min_id") != "" {
|
|||
|
minID, err = strconv.ParseInt(params.Get("min_id"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
if params.Get("max_id") != "" {
|
|||
|
maxID, err = strconv.ParseInt(params.Get("max_id"), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
cursor, err = model.NewCursor(maxID, minID, int(size), model.OrderDESC)
|
|||
|
}
|
|||
|
if err != nil {
|
|||
|
log.Warn("%v", err)
|
|||
|
err = ecode.RequestErr
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
appStr := params.Get("mobi_app")
|
|||
|
var showFolded bool
|
|||
|
// 对于根评论 scene传0, 只需要做版本的兼容即可
|
|||
|
if model.ShouldShowFolded(params.Get("mobi_app"), build, 0) {
|
|||
|
showFolded = true
|
|||
|
}
|
|||
|
cursorParams := &model.CursorParams{
|
|||
|
IP: metadata.String(ctx, metadata.RemoteIP),
|
|||
|
Oid: oid,
|
|||
|
OTyp: int8(otyp),
|
|||
|
Sort: int8(sort),
|
|||
|
HTMLEscape: appStr == "",
|
|||
|
Cursor: cursor,
|
|||
|
HotSize: 5,
|
|||
|
Mid: metadata.Int64(ctx, metadata.Mid),
|
|||
|
ShowFolded: showFolded,
|
|||
|
}
|
|||
|
|
|||
|
if m, ok := ctx.Get("mid"); ok {
|
|||
|
cursorParams.Mid = m.(int64)
|
|||
|
}
|
|||
|
|
|||
|
cursorRes, err := rpSvr.GetRootReplyListByCursor(ctx, cursorParams)
|
|||
|
if err != nil {
|
|||
|
ctx.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
var blacklist, assist int
|
|||
|
if mid := cursorParams.Mid; mid > 0 {
|
|||
|
if !rpSvr.IsWhiteAid(cursorParams.Oid, int8(cursorParams.OTyp)) {
|
|||
|
if rpSvr.RelationBlocked(ctx, cursorRes.Subject.Mid, mid) {
|
|||
|
blacklist = 1
|
|||
|
}
|
|||
|
if ok, _ := rpSvr.CheckAssist(ctx, cursorRes.Subject.Mid, mid); ok {
|
|||
|
assist = 1
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
rpSvr.EmojiReplace(int8(plat), build, cursorRes.Roots...)
|
|||
|
rpSvr.EmojiReplaceI(appStr, build, cursorRes.Roots...)
|
|||
|
cursorRes.Roots = rpSvr.FilDelReply(cursorRes.Roots)
|
|||
|
m := map[string]interface{}{
|
|||
|
"assist": assist,
|
|||
|
"blacklist": blacklist,
|
|||
|
"replies": cursorRes.Roots,
|
|||
|
"upper": map[string]interface{}{
|
|||
|
"mid": cursorRes.Subject.Mid,
|
|||
|
},
|
|||
|
"cursor": map[string]interface{}{
|
|||
|
"all_count": cursorRes.Subject.ACount,
|
|||
|
"max_id": cursorRes.CursorRangeMax,
|
|||
|
"min_id": cursorRes.CursorRangeMin,
|
|||
|
"size": len(cursorRes.Roots),
|
|||
|
},
|
|||
|
}
|
|||
|
if cursorRes.Header != nil {
|
|||
|
rpSvr.EmojiReplace(int8(plat), build, cursorRes.Header.Hots...)
|
|||
|
rpSvr.EmojiReplace(int8(plat), build, cursorRes.Header.TopAdmin)
|
|||
|
rpSvr.EmojiReplace(int8(plat), build, cursorRes.Header.TopUpper)
|
|||
|
rpSvr.EmojiReplaceI(appStr, build, cursorRes.Header.Hots...)
|
|||
|
rpSvr.EmojiReplaceI(appStr, build, cursorRes.Header.TopAdmin)
|
|||
|
rpSvr.EmojiReplaceI(appStr, build, cursorRes.Header.TopUpper)
|
|||
|
cursorRes.Header.Hots = rpSvr.FilDelReply(cursorRes.Header.Hots)
|
|||
|
showEntry, showAdmin, showFloor := 1, 1, 1
|
|||
|
if config, _ := rpSvr.GetReplyLogConfig(ctx, cursorRes.Subject, 1); config != nil {
|
|||
|
showEntry = int(config.ShowEntry)
|
|||
|
showAdmin = int(config.ShowAdmin)
|
|||
|
}
|
|||
|
if !rpSvr.ShowFloor(cursorParams.Oid, cursorParams.OTyp) {
|
|||
|
showFloor = 0
|
|||
|
}
|
|||
|
m["config"] = map[string]int{
|
|||
|
"showentry": showEntry,
|
|||
|
"showadmin": showAdmin,
|
|||
|
"showfloor": showFloor,
|
|||
|
}
|
|||
|
if cursorRes.Subject.RCount <= 20 && len(cursorRes.Header.Hots) > 0 {
|
|||
|
cursorRes.Header.Hots = cursorRes.Header.Hots[:0]
|
|||
|
}
|
|||
|
m["hots"] = cursorRes.Header.Hots
|
|||
|
m["notice"] = rpSvr.RplyNotice(ctx, int8(plat), build, appStr, buvid)
|
|||
|
m["top"] = map[string]interface{}{
|
|||
|
"admin": cursorRes.Header.TopAdmin,
|
|||
|
"upper": cursorRes.Header.TopUpper,
|
|||
|
}
|
|||
|
}
|
|||
|
ctx.JSON(m, err)
|
|||
|
}
|
|||
|
|
|||
|
func dialogByCursor(c *bm.Context) {
|
|||
|
var mid int64
|
|||
|
v := new(struct {
|
|||
|
Oid int64 `form:"oid" validate:"required"`
|
|||
|
Type int8 `form:"type" validate:"required"`
|
|||
|
Root int64 `form:"root" validate:"required"`
|
|||
|
Dialog int64 `form:"dialog" validate:"required"`
|
|||
|
Size int `form:"size" validate:"min=1"`
|
|||
|
MinFloor int64 `form:"min_floor"`
|
|||
|
MaxFloor int64 `form:"max_floor"`
|
|||
|
Plat int64 `form:"plat"`
|
|||
|
Build int64 `form:"build"`
|
|||
|
MobiApp string `form:"mobi_app"`
|
|||
|
})
|
|||
|
// buvid := c.Request.Header.Get("buvid")
|
|||
|
var err error
|
|||
|
err = c.Bind(v)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if v.Size > conf.Conf.Reply.MaxPageSize {
|
|||
|
v.Size = conf.Conf.Reply.MaxPageSize
|
|||
|
}
|
|||
|
if m, ok := c.Get("mid"); ok {
|
|||
|
mid = m.(int64)
|
|||
|
}
|
|||
|
cursor, err := model.NewCursor(v.MaxFloor, v.MinFloor, v.Size, model.OrderASC)
|
|||
|
if err != nil {
|
|||
|
err = ecode.RequestErr
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
rps, dialogCursor, dialogMeta, err := rpSvr.DialogByCursor(c, mid, v.Oid, v.Type, v.Root, v.Dialog, cursor)
|
|||
|
if err != nil {
|
|||
|
log.Error("rpSvr.DialogByCursor error (%v)", err)
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
rpSvr.EmojiReplaceI(v.MobiApp, v.Build, rps...)
|
|||
|
var config xmodel.ReplyConfig
|
|||
|
config.ShowFloor = 1
|
|||
|
if !rpSvr.ShowFloor(v.Oid, v.Type) {
|
|||
|
config.ShowFloor = 0
|
|||
|
}
|
|||
|
data := map[string]interface{}{
|
|||
|
"cursor": dialogCursor,
|
|||
|
"dialog": dialogMeta,
|
|||
|
"replies": rps,
|
|||
|
"config": config,
|
|||
|
}
|
|||
|
c.JSON(data, nil)
|
|||
|
}
|