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,43 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"http.go",
"logger.go",
"shorturl.go",
],
importpath = "go-common/app/interface/main/shorturl/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/shorturl/conf:go_default_library",
"//app/interface/main/shorturl/model:go_default_library",
"//app/interface/main/shorturl/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/middleware/verify:go_default_library",
"//library/net/metadata:go_default_library",
"//library/stat: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,48 @@
package http
import (
"go-common/app/interface/main/shorturl/conf"
"go-common/app/interface/main/shorturl/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
// depend service
idfSvc *verify.Verify
suSvr *service.Service
)
// initService .
func initService(c *conf.Config) {
suSvr = service.New(c)
idfSvc = verify.New(c.Verify)
}
// Init init http
func Init(c *conf.Config) {
initService(c)
// init internal router
engineInner := bm.NewServer(c.BM)
engineInner.Use(bm.Recovery(), bm.Trace(), bm.CSRF(), bm.Mobile(), logger())
innerRouter(engineInner)
if err := engineInner.Start(); err != nil {
log.Error("engineInner.Start error(%v)", err)
panic(err)
}
}
// innerRouter .
func innerRouter(e *bm.Engine) {
e.GET("/monitor/ping", ping)
e.GET("/", jump)
b := e.Group("/x/internal/shorturl")
{
b.POST("/add", idfSvc.Verify, add)
b.POST("/update", idfSvc.Verify, shortUpdate)
b.GET("/detail", idfSvc.Verify, shortByID)
b.GET("/list", idfSvc.Verify, shortAll)
b.POST("/del", idfSvc.Verify, shortDel)
}
}

View File

@@ -0,0 +1,68 @@
package http
import (
"fmt"
"strconv"
"strings"
"time"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/stat"
)
// logger is logger middleware
func logger() bm.HandlerFunc {
const noUser = "no_user"
return func(c *bm.Context) {
now := time.Now()
ip := metadata.String(c, metadata.RemoteIP)
req := c.Request
path := req.URL.Path
params := req.Form
c.Next()
mid, _ := c.Get("mid")
userI, _ := c.Get("user")
err := c.Error
cerr := ecode.Cause(err)
dt := time.Since(now)
// user
user, ok := userI.(string)
if !ok || user == "" {
user = noUser
}
realPath := ""
if strings.HasPrefix(path, "/x/internal/shorturl") {
realPath = path[1:]
} else {
realPath = "shorturl"
}
stat.HTTPServer.Incr(user, realPath, strconv.FormatInt(int64(cerr.Code()), 10))
stat.HTTPServer.Timing(user, int64(dt/time.Millisecond), realPath)
lf := log.Infov
errmsg := ""
if err != nil {
errmsg = err.Error()
lf = log.Errorv
}
lf(c,
log.KV("method", req.Method),
log.KV("mid", mid),
log.KV("ip", ip),
log.KV("user", user),
log.KV("path", path),
log.KV("params", params.Encode()),
log.KV("ret", cerr.Code()),
log.KV("msg", cerr.Message()),
log.KV("stack", fmt.Sprintf("%+v", err)),
log.KV("err", errmsg),
)
}
}

View File

@@ -0,0 +1,163 @@
package http
import (
"context"
"net/http"
"strconv"
"strings"
"time"
"go-common/app/interface/main/shorturl/conf"
"go-common/app/interface/main/shorturl/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// add short url from long url.
func add(c *bm.Context) {
param := &model.Param{}
if err := c.Bind(param); err != nil {
return
}
// check args
uri := strings.TrimSpace(param.Uri)
if uri == "" {
log.Error("add short url args empty long(%s)", uri)
c.JSON(nil, ecode.RequestErr)
return
}
short, err := suSvr.Add(c, param.Mid, uri)
if err != nil {
log.Error("suSvr.Add error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
data := map[string]string{
"url": conf.Conf.Host.Default + short,
}
c.JSON(data, nil)
}
// jump redirect short url to long url.
func jump(c *bm.Context) {
// check path
if len(c.Request.URL.Path) == 0 || c.Request.URL.Path == "/" || c.Request.URL.Path == "/favicon.ico" || strings.HasPrefix(c.Request.URL.Path, "/x/") {
c.JSON(nil, ecode.NothingFound)
return
}
su, err := suSvr.ShortCache(c, c.Request.URL.Path[1:])
if err != nil {
log.Error("suSvr.Get url(%v) error(%v)", c.Request.URL.Path[1:], err)
c.JSON(nil, err)
return
}
if su == nil || su.Long == "" || su.State == model.StateDelted {
c.JSON(nil, ecode.NothingFound)
return
}
if !strings.HasPrefix(su.Long, "http://") && !strings.HasPrefix(su.Long, "https://") {
su.Long = "http://" + su.Long
return
}
// redirect
http.Redirect(c.Writer, c.Request, su.Long, http.StatusFound)
}
// shortAll get shorturl list
func shortAll(c *bm.Context) {
param := &model.Param{}
if err := c.Bind(param); err != nil {
return
}
pn, err := strconv.Atoi(param.Pn)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(param.Ps)
if err != nil || ps > 20 || ps <= 0 {
ps = 20
}
long := strings.TrimSpace(param.Uri)
data, err := suSvr.ShortLimit(c, pn, ps, param.Mid, long)
if err != nil {
log.Error("suSvr.ShortLimit error(%v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
for _, su := range data {
su.Short = conf.Conf.Host.Default + su.Short
}
c.JSONMap(map[string]interface{}{
"data": data,
"size": 2233,
}, nil)
}
// shortState set state
func shortUpdate(c *bm.Context) {
param := &model.Param{}
if err := c.Bind(param); err != nil {
return
}
uri := strings.TrimSpace(param.Uri)
if uri == "" {
log.Error("add short url args empty long(%s)", param.Uri)
c.JSON(nil, ecode.RequestErr)
return
}
if param.Mid <= 0 {
log.Error("mid less than 0 error(%v)", param.Mid)
c.JSON(nil, ecode.RequestErr)
return
}
err := suSvr.ShortUpdate(context.TODO(), param.ID, param.Mid, uri)
if err != nil {
log.Error("suSvr.ShortUpdate error(%v)", err)
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
}
// shortState set state
func shortDel(c *bm.Context) {
param := &model.Param{}
if err := c.Bind(param); err != nil {
return
}
if param.Mid <= 0 {
log.Error("mid less than 0 error(%v)", param.Mid)
c.JSON(nil, ecode.RequestErr)
return
}
err := suSvr.ShortDel(c, param.ID, param.Mid, time.Now())
if err != nil {
log.Error("suSvr.ShortState error(%v)", err)
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
}
// shortById by id
func shortByID(c *bm.Context) {
param := &model.Param{}
if err := c.Bind(param); err != nil {
return
}
data, err := suSvr.ShortByID(c, param.ID)
if err != nil {
log.Error("suSvr.ShortState error(%v)", err)
c.JSON(nil, err)
return
}
c.JSON(data, nil)
}
func ping(c *bm.Context) {
if err := suSvr.Ping(c); err != nil {
c.AbortWithStatus(http.StatusServiceUnavailable)
log.Error("shorturl service ping error(%v)", err)
}
}