Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@ -0,0 +1,38 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"bangumi.go",
"http.go",
],
importpath = "go-common/app/interface/main/spread/http",
tags = ["automanaged"],
deps = [
"//app/interface/main/spread/conf:go_default_library",
"//app/interface/main/spread/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/render: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,40 @@
package http
import (
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func bangumiContent(c *bm.Context) {
v := new(struct {
Pn int `form:"pn" default:"1"`
Ps int `form:"ps" validate:"min=1,max=1000" default:"20"`
Type int8 `form:"type" validate:"required"`
Appkey string `form:"appkey" validate:"required"`
})
if err := c.Bind(v); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
data, err := svc.BangumiContent(c, v.Pn, v.Ps, v.Type, v.Appkey)
Render(c, data.Code, data.Message, data.Result, data.Total, err)
}
func bangumiOff(c *bm.Context) {
v := new(struct {
Pn int `form:"pn" default:"1"`
Ps int `form:"ps" validate:"min=1,max=1000" default:"20"`
Type int8 `form:"type" validate:"required"`
Timestamp int64 `form:"timestamp"`
Appkey string `form:"appkey" validate:"required"`
})
if err := c.Bind(v); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if v.Pn == 0 {
v.Pn = 1
}
data, err := svc.BangumiOff(c, v.Pn, v.Ps, v.Type, v.Timestamp, v.Appkey)
Render(c, data.Code, data.Message, data.Result, data.Total, err)
}

View File

@ -0,0 +1,138 @@
package http
import (
"crypto/md5"
"encoding/hex"
"net/http"
"net/url"
"strings"
"go-common/app/interface/main/spread/conf"
"go-common/app/interface/main/spread/service"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/render"
)
var (
svc *service.Service
business = make(map[string]string)
)
// Init init
func Init(c *conf.Config) {
initService(c)
// init router
engine := bm.DefaultServer(c.BM)
outerRouter(engine)
if err := engine.Start(); err != nil {
log.Error("xhttp.Serve error(%v)", err)
panic(err)
}
for _, b := range c.Businesses {
business[b.Appkey] = b.AppSecret
}
}
// initService init services.
func initService(c *conf.Config) {
svc = service.New(c)
}
// outerRouter init outer router api path.
func outerRouter(e *bm.Engine) {
//init api
e.Ping(ping)
group := e.Group("/x/spread", Verify)
{
bangumi := group.Group("/bangumi")
{
bangumi.GET("/content", bangumiContent)
bangumi.GET("/offshelve", bangumiOff)
}
}
}
// ping check server ok.
func ping(c *bm.Context) {
}
// Verify will inject into handler func as verify required
func Verify(ctx *bm.Context) {
var (
secret string
ok bool
)
req := ctx.Request
params := req.Form
if req.Method == "POST" {
// Give priority to sign in url query, otherwise check sign in post form.
q := req.URL.Query()
if q.Get("sign") != "" {
params = q
}
}
// check timestamp is not empty (TODO : Check if out of some seconds.., like 100s)
if params.Get("ts") == "" {
log.Error("ts is empty")
ctx.JSON(nil, ecode.RequestErr)
ctx.Abort()
return
}
sign := params.Get("sign")
params.Del("sign")
sappkey := params.Get("appkey")
secret, ok = business[sappkey]
if !ok {
ctx.JSON(nil, ecode.AppKeyInvalid)
ctx.Abort()
return
}
if hsign := paramsSign(params, sappkey, secret, true); hsign != sign {
if hsign1 := paramsSign(params, sappkey, secret, false); hsign1 != sign {
log.Error("Get sign: %s, expect %s", sign, hsign)
ctx.JSON(nil, ecode.SignCheckErr)
ctx.Abort()
return
}
}
}
// Render .
func Render(c *bm.Context, code int, msg string, data interface{}, total int64, err error) {
c.Error = err
bcode := ecode.Cause(err)
if err != nil {
c.Render(http.StatusOK, render.JSON{
Code: bcode.Code(),
Message: bcode.Message(),
Data: data,
})
return
}
c.Render(http.StatusOK, render.MapJSON{
"code": code,
"message": msg,
"data": data,
"total": total,
})
}
// sign is used to sign form params by given condition.
func paramsSign(params url.Values, appkey string, secret string, lower bool) (hexdigest string) {
data := params.Encode()
if strings.IndexByte(data, '+') > -1 {
data = strings.Replace(data, "+", "%20", -1)
}
if lower {
data = strings.ToLower(data)
}
digest := md5.Sum([]byte(data + secret))
hexdigest = hex.EncodeToString(digest[:])
return
}