bilibili-backup/app/service/main/account/server/http/http.go
2019-04-22 02:59:20 +00:00

136 lines
3.1 KiB
Go

package http
import (
"encoding/json"
"net/http"
"go-common/app/service/main/account/conf"
"go-common/app/service/main/account/model"
"go-common/app/service/main/account/service"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
v "go-common/library/net/http/blademaster/middleware/verify"
)
var (
accSvc *service.Service
verify *v.Verify
)
// Init init account service.
func Init(c *conf.Config, s *service.Service) {
accSvc = s
verify = v.New(c.Verify)
// engine
engine := bm.DefaultServer(c.BM)
innerRouter(engine)
// init inner server
if err := engine.Start(); err != nil {
log.Error("engine.Start() error(%v)", err)
panic(err)
}
}
func filterByAppkey(keys []string) func(*bm.Context) {
allowed := make(map[string]struct{}, len(keys))
for _, k := range keys {
allowed[k] = struct{}{}
}
return func(ctx *bm.Context) {
req := ctx.Request
params := req.Form
appkey := params.Get("appkey")
if _, ok := allowed[appkey]; !ok {
log.Error("appkey: %s try to access %s failed", appkey, req.URL)
ctx.JSON(nil, ecode.AccessDenied)
ctx.Abort()
return
}
}
}
// innerRouter init inner router.
func innerRouter(e *bm.Engine) {
e.Ping(ping)
e.Register(register)
group := e.Group("/x/internal/v3/account", verify.Verify)
{
group.GET("/info", info)
group.GET("/info/by/name", infoByName)
group.GET("/infos", infos)
group.GET("/card", card)
group.GET("/cards", cards)
group.GET("/vip", vip)
group.GET("/vips", vips)
group.GET("/profile", profile)
group.GET("/profile/stat", profileWithStat)
group.GET("/privacy", filterByAppkey(conf.Conf.AppkeyFilter.Privacy), privacy)
group.GET("/cache/del", cacheDel)
group.POST("/cache/clear", cacheClear)
}
v2Group := e.Group("/x/internal/account/v2", verify.Verify)
{
v2Group.GET("/myinfo", v2MyInfo)
v2Group.GET("/userinfo", v2MyInfo)
}
v1Group := e.Group("/x/internal/account", verify.Verify)
{
v1Group.GET("/info", v1Info)
v1Group.GET("/infos", v1Infos)
v1Group.GET("/card", v1Card)
v1Group.GET("/vip", v1Vip)
}
}
// ping check server ok.
func ping(c *bm.Context) {
if err := accSvc.Ping(c); err != nil {
log.Error("ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
// register support discovery.
func register(c *bm.Context) {
c.JSON(map[string]struct{}{}, nil)
}
// cache del
func cacheDel(c *bm.Context) {
p := new(model.ParamModify)
if err := c.Bind(p); err != nil {
return
}
c.JSON(nil, accSvc.DelCache(c, p.Mid, p.ModifiedAttr))
}
// cache clear
func cacheClear(c *bm.Context) {
p := new(model.ParamMsg)
if err := c.Bind(p); err != nil {
return
}
var m struct {
New struct {
Mid int64 `json:"mid"`
} `json:"new,omitempty"`
Mid int64 `json:"mid"`
Action string `json:"action"`
}
if err := json.Unmarshal([]byte(p.Msg), &m); err != nil {
c.JSON(nil, err)
return
}
mid := m.Mid
if mid == 0 {
mid = m.New.Mid
}
if mid == 0 {
log.Warn("cache clear no mid msg(%s)", p.Msg)
return
}
log.Info("Try to delete cache with mid: %d and param: %+v", mid, p)
c.JSON(nil, accSvc.DelCache(c, mid, m.Action))
}