Merge pull request 'feat-IRONFANS-212-Robin' (#883) from feat-IRONFANS-212-Robin into test

Reviewed-on: https://git.wishpal.cn/wishpal_ironfan/service/pulls/883
This commit is contained in:
chenhao 2024-12-11 18:23:53 +08:00
commit e97e4b3e74
9 changed files with 158 additions and 24 deletions

View File

@ -30,9 +30,12 @@ const (
AudNotifTemp_NameChangeApplied = 1732523339 // 用户修改昵称
AudNotifTemp_NamePassed = 1732523340 // 用户修改昵称成功(todo)
AudNotifTemp_NameRollbacked = 1732523341 // 用户修改昵称被驳回(todo)
AudNotifTemp_StreamerBasicInfoApplied = 1732523342 // 提交申请入驻材料
AudNotifTemp_StreamerBasicInfoPassed = 1732523343 // 运营后台审核通过申请入驻
AudNotifTemp_StreamerBasicInfoRejected = 1732523344 // 运营后台审核未通过申请入驻
AudNotifTemp_StreamerBasicInfoApplied = 1732523342 // 提交达人入驻材料
AudNotifTemp_StreamerBasicInfoPassed = 1732523343 // 运营后台审核通过达人入驻
AudNotifTemp_StreamerBasicInfoRejected = 1732523344 // 运营后台审核未通过达人入驻
AudNotifTemp_GuildRegistrationApplied = 1733900290 // 提交公会入驻材料
AudNotifTemp_GuildRegistrationPassed = 1733900291 // 运营后台审核通过公会入驻
AudNotifTemp_GuildRegistrationRejected = 1733900292 // 运营后台审核未通过公会入驻
AudNotifTemp_StreamerDetailsApplied = 1732523345 // 提交完善资料材料
AudNotifTemp_StreamerDetailsPassed = 1732523346 // 运营后台审核通过完善资料
AudNotifTemp_StreamerDetailsRejected = 1732523347 // 运营后台审核写上备注并未通过完善资料

6
api/consts/regexp.go Normal file
View File

@ -0,0 +1,6 @@
package consts
const (
AppHyperlinkRegexp = "app_hyperlink"
H5HyperlinkRegexp = "h5_hyperlink"
)

View File

@ -3,6 +3,7 @@ package service
import (
"service/api/consts"
"service/api/interfaces"
accountproto "service/api/proto/account/proto"
accountpunishmentproto "service/api/proto/accountpunishment/proto"
streamerproto "service/api/proto/streamer/proto"
zoneproto "service/api/proto/zone/proto"
@ -238,6 +239,7 @@ func (handler *NotifBuilderHandler) handleSysZoneCreated() {
argsMap := make(map[string]any)
argsMap["thumbnail"] = preview
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
argsMap["hyperlink_params_map"] = util.NewHyperLinkParamsMapBuilder().NewEnds("app", "h5").WriteParamToAllEnd("mid", zone.GetMid()).Map()
DefaultService.utilWriteNotifInfoByMap(ctx, consts.SysNotifTemp_ZoneCreated, zone.GetMid(), argsMap)
}
@ -304,9 +306,11 @@ func (handler *NotifBuilderHandler) handleAudStreamerBasicInfoPassed() {
func (handler *NotifBuilderHandler) handleAudStreamerBasicInfoRejected() {
handler.handlerMap[consts.AudNotifTemp_StreamerBasicInfoRejected] = func(ctx *gin.Context, args ...any) {
mids := args[0].([]int64)
remarks := args[1].(string)
for _, mid := range mids {
DefaultService.utilWriteNotifInfo(ctx, consts.AudNotifTemp_StreamerBasicInfoRejected, mid, remarks)
argsMap := make(map[string]any)
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
DefaultService.utilWriteNotifInfoByMap(ctx, consts.AudNotifTemp_StreamerBasicInfoRejected, mid, argsMap)
}
}
}
@ -332,7 +336,11 @@ func (handler *NotifBuilderHandler) handleAudStreamerDetailsRejected() {
mids := args[0].([]int64)
remarks := args[1].(string)
for _, mid := range mids {
DefaultService.utilWriteNotifInfo(ctx, consts.AudNotifTemp_StreamerDetailsRejected, mid, remarks)
argsMap := make(map[string]any)
argsMap["template_params"] = []any{remarks}
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
DefaultService.utilWriteNotifInfoByMap(ctx, consts.AudNotifTemp_StreamerDetailsRejected, mid, argsMap)
}
}
}
@ -485,6 +493,24 @@ func (handler *NotifBuilderHandler) handleAudMomentRejected() {
handler.handlerMap[consts.AudNotifTemp_MomentRejected] = func(ctx *gin.Context, args ...any) {
moment := args[0].(*dbstruct.Moment)
ctStr := util.FormatTsAsNotifT(moment.GetCt())
// 获取缩略图
preview := &dbstruct.MediaComponent{}
if len(moment.MediaComp.GetImageIds()) > 0 { // 取首图
imageIds := moment.MediaComp.GetImageIds()
preview.ImageIds = util.Int64Slice([]int64{imageIds[0]})
} else if len(moment.MediaComp.GetVideoIds()) > 0 { // 取封面
mediaFillables := make([]mediafiller.MediaFillable, 0)
mediaFillables = append(mediaFillables, moment.MediaComp)
coverIds, _ := mediafiller.GetCoverIds(ctx, mediaFillables)
preview.ImageIds = util.Int64Slice(coverIds)
}
argsMap := make(map[string]any)
argsMap["template_params"] = []any{ctStr}
argsMap["thumbnail"] = preview
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
argsMap["hyperlink_params_map"] = util.NewHyperLinkParamsMapBuilder().NewEnds("app", "h5").WriteParamToAllEnd("id", moment.GetId()).Map()
DefaultService.utilWriteNotifInfo(ctx, consts.AudNotifTemp_MomentRejected, moment.GetMid(), ctStr)
}
}
@ -540,6 +566,7 @@ func (handler *NotifBuilderHandler) handleAudZoneMomentRejected() {
argsMap["template_params"] = []any{ctStr, cTypeDesc, mTypeDesc, remarks}
argsMap["thumbnail"] = preview
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
argsMap["hyperlink_params_map"] = util.NewHyperLinkParamsMapBuilder().NewEnds("app", "h5").WriteParamToAllEnd("id", zonemoment.GetId()).Map()
DefaultService.utilWriteNotifInfoByMap(ctx, consts.AudNotifTemp_ZoneMomentRejected, zonemoment.GetMid(), argsMap)
}
@ -594,6 +621,7 @@ func (handler *NotifBuilderHandler) handleAudZoneMomentReeditionRejected() {
argsMap["template_params"] = []any{ctStr, cTypeDesc, mTypeDesc, remarks}
argsMap["thumbnail"] = preview
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
argsMap["hyperlink_params_map"] = util.NewHyperLinkParamsMapBuilder().NewEnds("app", "h5").WriteParamToAllEnd("id", zonemoment.GetId()).Map()
DefaultService.utilWriteNotifInfoByMap(ctx, consts.AudNotifTemp_ZoneMomentReeditionRejected, zonemoment.GetMid(), argsMap)
}
@ -637,11 +665,14 @@ func (handler *NotifBuilderHandler) handleVasZoneSuperfanshipPurchased_User() {
handler.handlerMap[consts.VasNotifTemp_ZoneSuperfanshipPurchased_User] = func(ctx *gin.Context, args ...any) {
order := args[0].(*dbstruct.Order)
streamer, _ := _DefaultStreamer.OpListByMid(ctx, &streamerproto.OpListByMidReq{Mid: goproto.Int64(order.GetUid())})
streamerAcct, _ := _DefaultAccount.OpListByMid(ctx, &accountproto.OpListByMidReq{Mid: goproto.Int64(order.GetUid())})
argsMap := make(map[string]any)
argsMap["template_params"] = util.FormatTsAsNotifT(order.GetSuperfanshipUntil())
argsMap["template_params"] = []any{streamerAcct.GetName(), util.FormatTsAsNotifT(order.GetSuperfanshipUntil())}
argsMap["thumbnail"] = streamer.Album
argsMap["build_hyperlink"] = DefaultService.utilBuildInwardHyperLink
argsMap["hyperlink_params_map"] = util.NewHyperLinkParamsMapBuilder().NewEnds("app", "h5").WriteParamToAllEnd("mid", order.GetUid()).Map()
argsMap["link_text_template_params"] = []any{streamerAcct.GetName()}
DefaultService.utilWriteNotifInfoByMap(ctx, consts.VasNotifTemp_ZoneSuperfanshipPurchased_User, order.GetMid(), argsMap)
}

View File

@ -76,6 +76,7 @@ import (
"service/library/payclients/wxpaycli"
"service/library/payclients/yeepaycli"
"service/library/redis"
"service/library/regexpcli"
"strconv"
"strings"
"time"
@ -217,6 +218,7 @@ func (s *Service) Init(c any) (err error) {
}
yeepaycli.Init(cfg.Yeepay)
regexpcli.Init()
s.cron = cron.NewCron(store)
@ -2099,7 +2101,7 @@ func (s *Service) OpApproveStreamerAuthApprovalBasic(ctx *gin.Context, req *stre
// 发送通知
DefaultNotifBuilderHandler.Handle(ctx)(
consts.AudNotifTemp_StreamerBasicInfoRejected)(mids, util.DerefString(req.Remarks))
consts.AudNotifTemp_StreamerBasicInfoRejected)(mids)
return
}

View File

@ -36,10 +36,12 @@ import (
"service/library/mediafiller"
"service/library/mycrypto"
"service/library/redis"
"service/library/regexpcli"
"service/library/validator"
"strings"
"time"
"github.com/dlclark/regexp2"
"github.com/gin-gonic/gin"
"github.com/qiniu/qmgo"
"go.mongodb.org/mongo-driver/mongo"
@ -2299,7 +2301,12 @@ func (s *Service) utilWriteNotifInfoByMap(ctx *gin.Context, notifTempId int64, o
buildHyperLink, ok := mp["build_hyperlink"]
if ok {
notifBuilder.BuildHyperLink = buildHyperLink.(func(ctx *gin.Context, frontendRouteId int64) ([]*dbstruct.NotifHyperlink, error))
notifBuilder.BuildHyperLink = buildHyperLink.(func(ctx *gin.Context, frontendRouteId int64, argsMap map[string]map[string]any) ([]*dbstruct.NotifHyperlink, error))
}
hyperLinkParamsMap, ok := mp["hyperlink_params_map"]
if ok {
notifBuilder.HyperLinkParamsMap = hyperLinkParamsMap.(map[string]map[string]any)
}
notifBuilders = append(notifBuilders, notifBuilder)
@ -2327,7 +2334,8 @@ func (s *Service) utilCalcAccountPunishmentEndNotifTime(acctpunishment *dbstruct
return notifTime, nil
}
func (s *Service) utilBuildInwardHyperLink(ctx *gin.Context, frontendRouteId int64) ([]*dbstruct.NotifHyperlink, error) {
func (s *Service) utilBuildInwardHyperLink(ctx *gin.Context, frontendRouteId int64,
argsMap map[string]map[string]any) ([]*dbstruct.NotifHyperlink, error) {
// 获取跳转路径
frontendroute, err := _DefaultFrontendRoute.GetById(ctx, frontendRouteId)
@ -2336,16 +2344,35 @@ func (s *Service) utilBuildInwardHyperLink(ctx *gin.Context, frontendRouteId int
return make([]*dbstruct.NotifHyperlink, 0), err
}
// 将跳转路径的占位符替换
appRoute, err := regexpcli.GetRegexp(consts.AppHyperlinkRegexp).ReplaceFunc(
frontendroute.GetAppRoutePath(), func(m regexp2.Match) string {
return fmt.Sprint(argsMap["app"][m.Groups()[1].String()])
}, -1, -1)
if err != nil {
logger.Error("regexp2 ReplaceFunc fail, err: %v", err)
return make([]*dbstruct.NotifHyperlink, 0), err
}
h5Route, err := regexpcli.GetRegexp(consts.H5HyperlinkRegexp).ReplaceFunc(
frontendroute.GetAppRoutePath(), func(m regexp2.Match) string {
return fmt.Sprintf("%v%v", m.String(), argsMap["h5"][m.Groups()[2].String()])
}, -1, -1)
if err != nil {
logger.Error("regexp2 ReplaceFunc fail, err: %v", err)
return make([]*dbstruct.NotifHyperlink, 0), err
}
hyperlinks := make([]*dbstruct.NotifHyperlink, 0)
hyperlinks = append(hyperlinks, &dbstruct.NotifHyperlink{
Action: goproto.String(consts.FrontendRouteAction_Inward),
Params: frontendroute.AppRoutePath,
Params: goproto.String(appRoute),
})
hyperlinks = append(hyperlinks, &dbstruct.NotifHyperlink{
Action: goproto.String(consts.FrontendRouteAction_Inward),
Params: frontendroute.H5RoutePath,
Params: goproto.String(h5Route),
})
return hyperlinks, nil

39
bizcommon/util/builder.go Normal file
View File

@ -0,0 +1,39 @@
package util
type HyperlinkParamsMapBuilder struct {
mp map[string]map[string]any
}
func NewHyperLinkParamsMapBuilder() *HyperlinkParamsMapBuilder {
return &HyperlinkParamsMapBuilder{
mp: make(map[string]map[string]any),
}
}
func (builder *HyperlinkParamsMapBuilder) NewEnd(end string) *HyperlinkParamsMapBuilder {
builder.mp[end] = make(map[string]any)
return builder
}
func (builder *HyperlinkParamsMapBuilder) NewEnds(ends ...string) *HyperlinkParamsMapBuilder {
for _, end := range ends {
builder.mp[end] = make(map[string]any)
}
return builder
}
func (builder *HyperlinkParamsMapBuilder) WriteParam(end, key string, value any) *HyperlinkParamsMapBuilder {
builder.mp[end][key] = value
return builder
}
func (builder *HyperlinkParamsMapBuilder) WriteParamToAllEnd(key string, value any) *HyperlinkParamsMapBuilder {
for _, mp := range builder.mp {
mp[key] = value
}
return builder
}
func (builder *HyperlinkParamsMapBuilder) Map() map[string]map[string]any {
return builder.mp
}

View File

@ -127,17 +127,18 @@ type NotifRecentReceive struct {
}
type NotifBuilder struct {
TemplateId int64 // 模板id
TemplateParams []any // 模板参数
ObjMids []int64 // 目标Mids
ObjType int64 // 目标类型
LinkTextTemplateParams []any // 链接模板参数
Thumbnail *MediaComponent // 缩略图
HyperLinks []*NotifHyperlink // 超链接数组
PushTime int64 // 推送时间
SetNid func(ctx *gin.Context, nid int64) error // nid存储函数一般用于取消推送
GetNid func() int64 // nid访问器
BuildHyperLink func(ctx *gin.Context, frontendRouteId int64) ([]*NotifHyperlink, error) // 超链接组装函数
TemplateId int64 // 模板id
TemplateParams []any // 模板参数
ObjMids []int64 // 目标Mids
ObjType int64 // 目标类型
LinkTextTemplateParams []any // 链接模板参数
Thumbnail *MediaComponent // 缩略图
HyperLinks []*NotifHyperlink // 超链接数组
PushTime int64 // 推送时间
SetNid func(ctx *gin.Context, nid int64) error // nid存储函数一般用于取消推送
GetNid func() int64 // nid访问器
BuildHyperLink func(ctx *gin.Context, frontendRouteId int64, argsMap map[string]map[string]any) ([]*NotifHyperlink, error) // 超链接组装函数
HyperLinkParamsMap map[string]map[string]any // 超链接参数map
}
// 消息内超链接信息

View File

@ -174,7 +174,7 @@ func AssembleNotification(ctx *gin.Context, notifBuilder *dbstruct.NotifBuilder)
if len(notifBuilder.HyperLinks) > 0 {
hyperlinks = notifBuilder.HyperLinks
} else if notifBuilder.BuildHyperLink != nil && cfg.FrontendRouteId > 0 {
hyperlinks, err = notifBuilder.BuildHyperLink(ctx, cfg.FrontendRouteId)
hyperlinks, err = notifBuilder.BuildHyperLink(ctx, cfg.FrontendRouteId, notifBuilder.HyperLinkParamsMap)
if err != nil {
logger.Error("BuildHyperLink fail, err: %v", err)
}

View File

@ -0,0 +1,25 @@
package regexpcli
import (
"service/api/consts"
"github.com/dlclark/regexp2"
)
var defaultRegexpClient *Client
type Client struct {
regexpMap map[string]*regexp2.Regexp
}
func Init() {
defaultRegexpClient = new(Client)
defaultRegexpClient.regexpMap = make(map[string]*regexp2.Regexp)
defaultRegexpClient.regexpMap[consts.AppHyperlinkRegexp] = regexp2.MustCompile(`\[(.*?)\]`, 0)
defaultRegexpClient.regexpMap[consts.H5HyperlinkRegexp] = regexp2.MustCompile(`(\?|&)(.*?)=`, 0)
}
func GetRegexp(str string) *regexp2.Regexp {
return defaultRegexpClient.regexpMap[str]
}