You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
11 KiB
418 lines
11 KiB
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) |
|
}
|
|
|