Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"callback.go",
"http.go",
"push.go",
"report.go",
"setting.go",
],
importpath = "go-common/app/interface/main/push/http",
tags = ["automanaged"],
deps = [
"//app/interface/main/push/conf:go_default_library",
"//app/interface/main/push/service:go_default_library",
"//app/service/main/push/dao/huawei:go_default_library",
"//app/service/main/push/dao/jpush:go_default_library",
"//app/service/main/push/dao/mi:go_default_library",
"//app/service/main/push/dao/oppo:go_default_library",
"//app/service/main/push/model:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/time: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,271 @@
package http
import (
"encoding/json"
"io/ioutil"
"net/url"
"strconv"
"strings"
"go-common/app/service/main/push/dao/huawei"
"go-common/app/service/main/push/dao/jpush"
"go-common/app/service/main/push/dao/mi"
"go-common/app/service/main/push/dao/oppo"
pushmdl "go-common/app/service/main/push/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var mobis = map[string]int{
"android": pushmdl.MobiAndroid,
"android_i": pushmdl.MobiAndroid,
"iphone": pushmdl.MobiIPhone,
"ipad": pushmdl.MobiIPad,
"android_comic": pushmdl.MobiAndroidComic,
}
func huaweiCallback(c *bm.Context) {
var (
err error
res = make(map[string]interface{})
)
defer func() {
c.JSONMap(res, err)
}()
bs, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
res["errno"] = ecode.RequestErr
res["errmsg"] = "param error"
log.Error("huawei callback param(%s) error", bs)
return
}
cb := new(huawei.Callback)
if err = json.Unmarshal(bs, &cb); err != nil {
res["errno"] = ecode.RequestErr
res["errmsg"] = "param error"
log.Error("huawei callback param(%s) error(%v)", bs, err)
return
}
if err = pushSrv.CallbackHuawei(c, cb); err != nil {
res["errno"] = err
res["errmsg"] = err.Error()
log.Error("huawei callback param(%s) error(%v)", bs, err)
return
}
res["errno"] = ecode.OK
res["errmsg"] = "success"
}
func miCallback(c *bm.Context) {
param := c.Request.Form
d := param.Get("data")
if d == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("xiaomi callback param empty")
return
}
m := map[string]*mi.Callback{}
if err := json.Unmarshal([]byte(d), &m); err != nil {
c.JSON(nil, ecode.RequestErr)
log.Error("xiaomi callback param(%s) error(%v)", d, err)
return
}
c.JSON(nil, pushSrv.CallbackXiaomi(c, m))
}
func miRegidCallback(c *bm.Context) {
params := c.Request.Form
appID := params.Get("app_id")
if appID == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("app_id is empty")
return
}
appVer := params.Get("app_version")
if appVer == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("app_version is empty")
return
}
appPkg := params.Get("app_pkg")
if appPkg == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("app_pkg is empty")
return
}
regid := params.Get("regid")
if regid == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("regid is empty")
return
}
auth := strings.TrimPrefix(c.Request.Header.Get("Authorization"), "key=")
if auth == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("auth is empty")
return
}
cb := &mi.RegidCallback{
AppID: appID,
AppVer: appVer,
AppPkg: appPkg,
AppSecret: auth,
Regid: regid,
}
c.JSON(nil, pushSrv.CallbackXiaomiRegid(c, cb))
}
func oppoCallback(c *bm.Context) {
bs, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
c.JSON(nil, ecode.RequestErr)
log.Error("huawei callback param(%s) error", bs)
return
}
var cb []*oppo.Callback
if err = json.Unmarshal(bs, &cb); err != nil {
c.JSON(nil, ecode.RequestErr)
log.Error("oppo callback param(%s) error(%v)", bs, err)
return
}
param := c.Request.Form
task := param.Get("task")
if task == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("oppo callback task empty")
return
}
c.JSON(nil, pushSrv.CallbackOppo(c, task, cb))
}
func jpushCallback(ctx *bm.Context) {
bs, err := ioutil.ReadAll(ctx.Request.Body)
if err != nil {
log.Error("jpush batch callback param(%s) error(%v)", bs, err)
ctx.JSON(nil, ecode.RequestErr)
return
}
var cbs []*jpush.CallbackReply
if err = json.Unmarshal(bs, &cbs); err != nil {
log.Error("jpush batch callback param(%s) error(%v)", bs, err)
ctx.JSON(nil, ecode.RequestErr)
return
}
ctx.JSON(nil, pushSrv.CallbackJpush(ctx, cbs))
}
func iOSCallback(c *bm.Context) {
params := c.Request.Form
task := params.Get("task")
if task == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("task is empty")
return
}
p := params.Get("mobi_app")
if p == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("mobi_app is empty")
return
}
token := params.Get("tid")
if token == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("tid is empty")
return
}
c.JSON(nil, pushSrv.CallbackIOS(c, task, token, mobis[p]))
}
func androidCallback(c *bm.Context) {
// Warn: 刚开始接极光时,极光没有回执功能,只能客户端来做送达回执,数据不准确
// 如今极光提供了送达回执的功能数据不能重复记录所以这里直接return
// 目前这个方法只有极光送达回执在调用(调用方是客户端),直接停用
c.JSON(nil, nil)
}
func clickCallback(c *bm.Context) {
var (
err error
pid int
platform int
params = c.Request.Form
)
task := params.Get("task")
if task == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("task is empty")
return
}
app, _ := strconv.ParseInt(params.Get("app"), 10, 64)
if app <= 0 {
c.JSON(nil, ecode.RequestErr)
log.Error("app error(%s)", params.Get("app"))
return
}
mid, _ := strconv.ParseInt(params.Get("mid"), 10, 64)
p := params.Get("mobi_app")
if p == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("mobi_app is empty")
return
}
pid, ok := mobis[p]
if !ok {
c.JSON(nil, ecode.RequestErr)
log.Error("mobi_app error(%s)", params.Get("mobi_app"))
return
}
sdk, _ := strconv.Atoi(params.Get("push_sdk"))
if sdk == 0 {
c.JSON(nil, ecode.RequestErr)
log.Error("push_sdk error(%s)", params.Get("push_sdk"))
return
}
switch sdk {
case pushmdl.PushSDKApns:
if pid == pushmdl.MobiIPhone {
platform = pushmdl.PlatformIPhone
} else if pid == pushmdl.MobiIPad {
platform = pushmdl.PlatformIPad
}
case pushmdl.PushSDKXiaomi:
platform = pushmdl.PlatformXiaomi
case pushmdl.PushSDKHuawei:
platform = pushmdl.PlatformHuawei
case pushmdl.PushSDKOppo:
platform = pushmdl.PlatformOppo
case pushmdl.PushSDKJpush:
platform = pushmdl.PlatformJpush
default:
c.JSON(nil, ecode.RequestErr)
log.Error("invalid push_sdk value(%d)", sdk)
return
}
token, err := url.QueryUnescape(params.Get("token"))
if err != nil || token == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("token(%s) error(%v)", params.Get("token"), err)
return
}
buvid := c.Request.Header.Get("Buvid")
if buvid == "" {
if buvid, err = url.QueryUnescape(params.Get("buvid")); buvid == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("buvid(%s) error(%v)", params.Get("buvid"), err)
return
}
}
cb := &pushmdl.Callback{
Task: task,
APP: app,
Platform: platform,
Mid: mid,
Pid: pid,
Token: token,
Buvid: buvid,
Click: 1,
}
c.JSON(nil, pushSrv.CallbackClick(c, cb))
}

View File

@@ -0,0 +1,61 @@
package http
import (
"net/http"
"go-common/app/interface/main/push/conf"
"go-common/app/interface/main/push/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
)
var (
pushSrv *service.Service
authSrv *auth.Auth
)
// Init init http.
func Init(c *conf.Config, srv *service.Service) {
pushSrv = srv
authSrv = auth.New(c.Auth)
engine := bm.DefaultServer(c.HTTPServer)
route(engine)
if err := engine.Start(); err != nil {
log.Error("engine.Start() error(%v)", err)
panic(err)
}
}
func route(e *bm.Engine) {
e.Ping(ping)
g := e.Group("/x/push", bm.CORS())
{
// for APP client
g.POST("/report", authSrv.GuestMobile, report)
g.GET("/report_old", reportOld)
g.POST("/setting/set", authSrv.UserMobile, setSetting)
g.GET("/setting/get", authSrv.UserMobile, setting)
// for test
g.POST("/test/token", testToken)
// for callback
cg := g.Group("/callback")
{
cg.POST("/huawei", huaweiCallback) // 华为送达回执
cg.POST("/xiaomi", miCallback) // 小米送达回执
cg.POST("/xiaomi/regid", miRegidCallback) // 小米token注册回执
cg.POST("/oppo", oppoCallback) // oppo送达回执
cg.POST("/jpush", jpushCallback) // 极光送达回执
cg.POST("/ios", iOSCallback) // iOS送达回执
cg.POST("/android", androidCallback) // Android送达回执
cg.POST("/click", clickCallback) // 所有平台的点击回执
}
}
}
func ping(c *bm.Context) {
if err := pushSrv.Ping(c); err != nil {
log.Error("push-interface ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,80 @@
package http
import (
"context"
"strconv"
"time"
pushmdl "go-common/app/service/main/push/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
xtime "go-common/library/time"
)
func testToken(c *bm.Context) {
params := c.Request.Form
appID, _ := strconv.ParseInt(params.Get("app_id"), 10, 64)
if appID < 1 {
c.JSON(nil, ecode.RequestErr)
log.Error("app_id is wrong: %s", params.Get("app_id"))
return
}
alertTitle := params.Get("alert_title")
if alertTitle == "" {
alertTitle = "哔哩哔哩消息"
}
alertBody := params.Get("alert_body")
if alertBody == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("alert_body is empty")
return
}
token := params.Get("token")
if token == "" {
c.JSON(nil, ecode.RequestErr)
log.Error("token is empty")
return
}
linkType, _ := strconv.Atoi(params.Get("link_type"))
if linkType < 1 {
c.JSON(nil, ecode.RequestErr)
log.Error("link_type is wrong: %s", params.Get("link_type"))
return
}
linkValue := params.Get("link_value")
expireTime, _ := strconv.ParseInt(params.Get("expire_time"), 10, 64)
if expireTime == 0 {
expireTime = time.Now().Add(7 * 24 * time.Hour).Unix()
}
sound, vibration := pushmdl.SwitchOn, pushmdl.SwitchOn
if params.Get("sound") != "" {
if sd, _ := strconv.Atoi(params.Get("sound")); sd == pushmdl.SwitchOff {
sound = pushmdl.SwitchOff
}
}
if params.Get("vibration") != "" {
if vr, _ := strconv.Atoi(params.Get("vibration")); vr == pushmdl.SwitchOff {
vibration = pushmdl.SwitchOff
}
}
passThrough, _ := strconv.Atoi(params.Get("pass_through"))
if passThrough != pushmdl.SwitchOn {
passThrough = pushmdl.SwitchOff
}
img := params.Get("image_url")
info := &pushmdl.PushInfo{
TaskID: pushmdl.TempTaskID(),
APPID: appID,
Title: alertTitle,
Summary: alertBody,
LinkType: int8(linkType),
LinkValue: linkValue,
ExpireTime: xtime.Time(expireTime),
PassThrough: passThrough,
Sound: sound,
Vibration: vibration,
ImageURL: img,
}
c.JSON(nil, pushSrv.TestToken(context.Background(), info, token))
}

View File

@@ -0,0 +1,119 @@
package http
import (
"net/url"
"strconv"
pushmdl "go-common/app/service/main/push/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
const (
timeZoneMin = -12
timeZoneMax = 14
)
func report(c *bm.Context) {
var (
mid int64
params = c.Request.Form
)
midItf, _ := c.Get("mid")
if midItf != nil {
mid = midItf.(int64)
}
platform := params.Get("mobi_app")
if platform == "" {
c.JSON(nil, ecode.RequestErr)
log.Warn("mobi_app is empty")
return
}
buvid := params.Get("buvid")
if buvid == "" {
c.JSON(nil, ecode.RequestErr)
log.Warn("buvid is empty")
return
}
dt := params.Get("device_token")
build, _ := strconv.Atoi(params.Get("build"))
if build < 1 {
c.JSON(nil, ecode.RequestErr)
log.Warn("build is wrong: %s", params.Get("build"))
return
}
pushSDK, _ := strconv.Atoi(params.Get("push_sdk"))
platformID := pushmdl.Platform(platform, pushSDK)
if platformID == pushmdl.PlatformUnknown {
c.JSON(nil, ecode.RequestErr)
log.Warn("push_sdk is wrong: %s", params.Get("push_sdk"))
return
}
tm, _ := strconv.Atoi(params.Get("time_zone"))
if tm < timeZoneMin || tm > timeZoneMax {
c.JSON(nil, ecode.RequestErr)
log.Warn("time_zone is wrong: %s", params.Get("time_zone"))
return
}
ns, _ := strconv.Atoi(params.Get("notify_switch"))
if ns != 0 && ns != 1 {
c.JSON(nil, ecode.RequestErr)
log.Warn("notify_switch is wrong: %s", params.Get("notify_switch"))
return
}
// tp, _ := strconv.Atoi(params.Get("type"))
appID, _ := strconv.ParseInt(params.Get("app_id"), 10, 64)
if appID == 0 {
appID = pushmdl.APPIDBBPhone
}
deviceBrand, _ := url.QueryUnescape(params.Get("mobile_brand"))
deviceModel, _ := url.QueryUnescape(params.Get("mobile_model"))
osVersion, _ := url.QueryUnescape(params.Get("mobile_version"))
r := &pushmdl.Report{
APPID: appID,
PlatformID: platformID,
Mid: mid,
Buvid: buvid,
DeviceToken: dt,
Build: build,
TimeZone: tm,
NotifySwitch: ns,
DeviceBrand: deviceBrand,
DeviceModel: deviceModel,
OSVersion: osVersion,
}
if dt == "" {
log.Warn("device_token is empty(%+v)", r)
c.JSON(nil, nil) // iOS可能取不到device token
return
}
c.JSON(nil, pushSrv.PubReport(c, r))
}
func reportOld(ctx *bm.Context) {
var params = ctx.Request.Form
buvid := params.Get("buvid")
if buvid == "" {
log.Warn("buvid is empty")
ctx.JSON(nil, nil)
return
}
token := params.Get("device_token")
if token == "" {
log.Warn("device_token is empty")
ctx.JSON(nil, nil)
return
}
ma := params.Get("mobi_app")
if ma != "" && ma != "android" && ma != "iphone" && ma != "ipad" {
log.Warn("invalid mobi_app(%s)", ma)
ctx.JSON(nil, nil)
return
}
mid, _ := strconv.ParseInt(params.Get("mid"), 10, 64)
pid, _ := strconv.Atoi(params.Get("pid"))
timezone, _ := strconv.Atoi(params.Get("time_zone"))
version := params.Get("ver")
ctx.JSON(nil, pushSrv.ReportOld(ctx, token, buvid, version, mid, pid, timezone))
}

View File

@@ -0,0 +1,64 @@
package http
import (
"strconv"
pushmdl "go-common/app/service/main/push/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
var settingBizMap = map[int32]string{
pushmdl.UserSettingArchive: "archive",
pushmdl.UserSettingLive: "live",
}
func setSetting(c *bm.Context) {
var (
params = c.Request.Form
midStr, _ = c.Get("mid")
)
mid, _ := midStr.(int64)
if mid <= 0 {
log.Warn("mid(%s) is wrong", midStr)
c.JSON(nil, ecode.RequestErr)
return
}
typ, _ := strconv.Atoi(params.Get("type"))
if _, ok := pushmdl.Settings[typ]; !ok {
log.Warn("type(%s) is wrong", params.Get("type"))
c.JSON(nil, ecode.RequestErr)
return
}
val, _ := strconv.Atoi(params.Get("value"))
if val != pushmdl.SwitchOn && val != pushmdl.SwitchOff {
log.Warn("value(%s) is wrong", params.Get("value"))
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, pushSrv.SetSetting(c, mid, typ, val))
}
func setting(c *bm.Context) {
midStr, _ := c.Get("mid")
mid, _ := midStr.(int64)
if mid <= 0 {
log.Warn("mid(%s) is wrong", midStr)
c.JSON(nil, ecode.RequestErr)
return
}
setting, err := pushSrv.Setting(c, mid)
if err != nil {
c.JSON(nil, err)
return
}
res := make(map[string]int32)
for t, v := range setting {
if _, ok := settingBizMap[t]; !ok {
continue
}
res[settingBizMap[t]] = v
}
c.JSON(res, nil)
}