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,54 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"memcached.go",
"sports.go",
],
importpath = "go-common/app/interface/main/activity/dao/sports",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/activity/conf:go_default_library",
"//app/interface/main/activity/model/sports:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/stat/prom: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"],
)
go_test(
name = "go_default_test",
srcs = ["sports_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/activity/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)

View File

@@ -0,0 +1,54 @@
package sports
import (
"context"
"encoding/json"
"fmt"
"go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_preQq = "q_"
)
func keyQq(tp int64) string {
return fmt.Sprintf("%s%d", _preQq, tp)
}
// QqCache get qq from cache
func (d *Dao) QqCache(c context.Context, tp int64) (rs *json.RawMessage, err error) {
var (
mckey = keyQq(tp)
conn = d.mc.Get(c)
item *memcache.Item
)
defer conn.Close()
if item, err = conn.Get(mckey); err != nil {
if err == memcache.ErrNotFound {
err = nil
} else {
log.Error("conn.Get error(%v)", err)
}
return
}
if err = conn.Scan(item, &rs); err != nil {
log.Error("item.Scan error(%v)", err)
}
return
}
// SetQqCache set qq to cache
func (d *Dao) SetQqCache(c context.Context, v *json.RawMessage, tp int64) (err error) {
var (
conn = d.mc.Get(c)
mckey = keyQq(tp)
)
defer conn.Close()
if err = conn.Set(&memcache.Item{Key: mckey, Object: v, Flags: memcache.FlagJSON, Expiration: d.mcQqExpire}); err != nil {
log.Error("conn.Set error(%v)", err)
return
}
return
}

View File

@@ -0,0 +1,127 @@
package sports
import (
"context"
"encoding/json"
"io"
"io/ioutil"
"net/http"
"net/url"
"time"
"go-common/app/interface/main/activity/conf"
"go-common/app/interface/main/activity/model/sports"
"go-common/library/cache/memcache"
"go-common/library/ecode"
xecocde "go-common/library/ecode"
"go-common/library/log"
xhttp "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/stat/prom"
)
const (
_qqAppID = "9"
_qqAppKey = "TWF0Y2hVbmlvbjpBUFBLRVk6OQ=="
_newsAppID = "openapi_for_bilibili"
_newsAppKey = "d2c0d130c49baadc3d43fc731caecd43"
)
// PromError stat and log.
func PromError(name string, format string, args ...interface{}) {
prom.BusinessErrCount.Incr(name)
log.Error(format, args...)
}
// Dao dao.
type Dao struct {
// http
httpSports *xhttp.Client
dClient *http.Client
// sports api
sportsURI, newsURI string
mc *memcache.Pool
mcQqExpire int32
}
// New dao new.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
httpSports: xhttp.NewClient(c.HTTPClientSports),
dClient: http.DefaultClient,
sportsURI: c.Host.Sports,
newsURI: c.Host.QqNews,
mc: memcache.NewPool(c.Memcache.Like),
mcQqExpire: int32(time.Duration(c.Memcache.QqExpire) / time.Second),
}
return
}
// Qq get qq.
func (d *Dao) Qq(c context.Context, params url.Values, route string) (rs *json.RawMessage, err error) {
ip := metadata.String(c, metadata.RemoteIP)
var res struct {
Code int `json:"code"`
Data json.RawMessage `json:"data"`
}
params.Del("route")
params.Set("appId", _qqAppID)
params.Set("appKey", _qqAppKey)
if err = d.httpSports.Get(c, d.sportsURI+"/"+route, ip, params, &res); err != nil {
log.Error("d.httpSports.Get(%s) err(%v)", d.sportsURI+"/"+route+"?"+params.Encode(), err)
return
}
if res.Code != ecode.OK.Code() {
log.Error("d.httpSports.Get(%s) param(%v) ecode err(%d)", d.sportsURI, params, res.Code)
err = ecode.Int(res.Code)
return
}
rs = &res.Data
return
}
// QqNews get qq news.
func (d *Dao) QqNews(c context.Context, params url.Values, route string) (rs *sports.QqRes, err error) {
var (
req *http.Request
resp *http.Response
cancel func()
)
params.Set("chlid", "news_news_football")
params.Set("appkey", _newsAppKey)
params.Set("appid", _newsAppID)
if req, err = http.NewRequest("GET", d.newsURI+"/"+route+"?"+params.Encode(), nil); err != nil {
log.Error("QqNews http.NewRequest(%s) error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
return
}
c, cancel = context.WithTimeout(c, time.Duration(conf.Conf.Rule.DTimeout))
defer cancel()
req = req.WithContext(c)
if resp, err = d.dClient.Do(req); err != nil {
log.Error("QqNews httpClient.Do(%s) error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
return
}
defer resp.Body.Close()
if resp.StatusCode >= http.StatusBadRequest {
log.Error("QqNews url(%s) resp.StatusCode error(%v)", d.newsURI+"/"+route+"?"+params.Encode(), err)
return
}
bs, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("QqNews ioutil.ReadAll() error(%v)", err)
return
} else if len(bs) == 0 {
return
}
if e := json.Unmarshal(bs, &rs); e != nil {
if e != io.EOF {
log.Error("json decode body(%s) error(%v)", string(bs), e)
}
}
if rs.Ret != 0 {
err = xecocde.ActivityServerTimeout
rs = nil
return
}
return
}

View File

@@ -0,0 +1,39 @@
package sports
import (
"context"
"flag"
"net/url"
"path/filepath"
"testing"
"go-common/app/interface/main/activity/conf"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func WithDao(f func(d *Dao)) func() {
return func() {
dir, _ := filepath.Abs("../cmd/activity-test.toml")
flag.Set("conf", dir)
conf.Init()
if d == nil {
d = New(conf.Conf)
}
f(d)
}
}
func TestDao_Qq(t *testing.T) {
Convey("test dao Qq", t, WithDao(func(d *Dao) {
var (
params url.Values
route = "matchUnion/fetchData"
)
res, err := d.Qq(context.Background(), params, route)
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
}))
}