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,53 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["mobile_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/app-wall/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"mobile.go",
"service.go",
],
importpath = "go-common/app/interface/main/app-wall/service/mobile",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/app-wall/conf:go_default_library",
"//app/interface/main/app-wall/dao/mobile:go_default_library",
"//app/interface/main/app-wall/model:go_default_library",
"//app/interface/main/app-wall/model/mobile:go_default_library",
"//library/ecode:go_default_library",
"//library/log: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"],
)

View File

@@ -0,0 +1,167 @@
package mobile
import (
"context"
"time"
"go-common/app/interface/main/app-wall/model"
"go-common/app/interface/main/app-wall/model/mobile"
"go-common/library/ecode"
"go-common/library/log"
)
const (
_mobileKey = "mobile"
)
// InOrdersSync insert OrdersSync
func (s *Service) InOrdersSync(c context.Context, ip string, u *mobile.MobileXML, now time.Time) (err error) {
if !s.iplimit(_mobileKey, ip) {
err = ecode.AccessDenied
return
}
var result int64
if result, err = s.dao.InOrdersSync(c, u); err != nil || result == 0 {
log.Error("mobile_s.dao.OrdersSync (%v) error(%v) or result==0", u, err)
}
return
}
// FlowSync update OrdersSync
func (s *Service) FlowSync(c context.Context, u *mobile.MobileXML, ip string) (err error) {
if !s.iplimit(_mobileKey, ip) {
err = ecode.AccessDenied
return
}
var result int64
if result, err = s.dao.FlowSync(c, u); err != nil || result == 0 {
log.Error("mobile_s.dao.OrdersSync(%v) error(%v) or result==0", u, err)
}
return
}
// Activation
func (s *Service) Activation(c context.Context, usermob string, now time.Time) (msg string, err error) {
rows := s.mobileInfo(c, usermob, now)
res, ok := rows[usermob]
if !ok {
err = ecode.NothingFound
msg = "该卡号尚未开通哔哩哔哩专属免流服务"
return
}
for _, u := range res {
if u.Actionid == 1 || (u.Actionid == 2 && now.Unix() <= int64(u.Expiretime)) {
return
}
}
err = ecode.NotModified
msg = "该卡号哔哩哔哩专属免流服务已退订且已过期"
return
}
// Activation
func (s *Service) MobileState(c context.Context, usermob string, now time.Time) (res *mobile.Mobile) {
data := s.mobileInfo(c, usermob, now)
res = s.userState(data, usermob, now)
return
}
// UserFlowState
func (s *Service) UserMobileState(c context.Context, usermob string, now time.Time) (res *mobile.Mobile) {
data := s.mobileInfo(c, usermob, now)
if rows, ok := data[usermob]; ok {
for _, res = range rows {
if res.Actionid == 1 || (res.Actionid == 2 && now.Unix() <= int64(res.Expiretime)) {
res.MobileType = 2
return
}
}
res = &mobile.Mobile{MobileType: 1}
}
res = &mobile.Mobile{MobileType: 1}
return
}
// userState
func (s *Service) userState(user map[string][]*mobile.Mobile, usermob string, now time.Time) (res *mobile.Mobile) {
if rows, ok := user[usermob]; !ok {
res = &mobile.Mobile{MobileType: 1}
} else {
for _, res = range rows {
if res.Actionid == 2 && now.Unix() <= int64(res.Expiretime) {
res.MobileType = 4
break
} else if res.Actionid == 1 {
res.MobileType = 2
break
}
}
if res.MobileType == 0 {
res.MobileType = 3
}
}
log.Info("mobile_state_type:%v mobile_state_usermob:%v", res.MobileType, usermob)
return
}
// mobileInfo
func (s *Service) mobileInfo(c context.Context, usermob string, now time.Time) (res map[string][]*mobile.Mobile) {
var (
err error
m []*mobile.Mobile
tmps []*mobile.Mobile
row = map[string][]*mobile.Mobile{}
)
res = map[string][]*mobile.Mobile{}
if m, err = s.dao.MobileCache(c, usermob); err == nil && len(m) > 0 {
row[usermob] = m
s.pHit.Incr("mobile_cache")
} else {
row, err = s.dao.OrdersUserFlow(c, usermob, now)
if err != nil {
log.Error("mobile_s.dao.OrdersUserFlow error(%v)", err)
return
}
s.pMiss.Incr("mobile_cache")
if user, ok := row[usermob]; ok && len(user) > 0 {
if err = s.dao.AddMobileCache(c, usermob, user); err != nil {
log.Error("s.dao.AddMobileCache error(%v)", err)
return
}
}
}
if ms, ok := row[usermob]; ok && len(ms) > 0 {
for _, m := range ms {
tmp := &mobile.Mobile{}
*tmp = *m
tmp.Productid = ""
tmps = append(tmps, tmp)
}
res[usermob] = tmps
}
return
}
// IsMobileIP is mobile ip
func (s *Service) IsMobileIP(ipUint uint32, ipStr, usermob string) (res *mobile.MobileUserIP) {
res = &mobile.MobileUserIP{
IPStr: ipStr,
IsValide: false,
}
if !model.IsIPv4(ipStr) {
return
}
for _, u := range s.mobileIpCache {
if u.IPStartUint <= ipUint && u.IPEndUint >= ipUint {
res.IsValide = true
return
}
}
log.Error("mobile_user_ip:%v mobile_ip_usermob:%v", ipStr, usermob)
return
}
// mobileIp ip limit
func (s *Service) iplimit(k, ip string) bool {
return true
}

View File

@@ -0,0 +1,60 @@
package mobile
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/app-wall/conf"
. "github.com/smartystreets/goconvey/convey"
)
var (
s *Service
)
func WithService(f func(s *Service)) func() {
return func() {
f(s)
}
}
func init() {
dir, _ := filepath.Abs("../../cmd/app-wall-test.toml")
flag.Set("conf", dir)
conf.Init()
s = New(conf.Conf)
time.Sleep(time.Second)
}
func TestActivation(t *testing.T) {
Convey("Unicom Activation", t, WithService(func(s *Service) {
res, err := s.Activation(context.TODO(), "", time.Now())
So(res, ShouldNotBeEmpty)
So(err, ShouldBeNil)
}))
}
func TestMobileState(t *testing.T) {
Convey("Unicom MobileState", t, WithService(func(s *Service) {
res := s.MobileState(context.TODO(), "", time.Now())
So(res, ShouldNotBeEmpty)
}))
}
func TestUserMobileState(t *testing.T) {
Convey("Unicom UserMobileState", t, WithService(func(s *Service) {
res := s.UserMobileState(context.TODO(), "", time.Now())
So(res, ShouldNotBeEmpty)
}))
}
func TestIsMobileIP(t *testing.T) {
Convey("Unicom IsMobileIP", t, WithService(func(s *Service) {
res := s.IsMobileIP(1, "", "")
So(res, ShouldNotBeEmpty)
}))
}

View File

@@ -0,0 +1,78 @@
package mobile
import (
"bufio"
"io"
"os"
"strings"
"time"
"go-common/app/interface/main/app-wall/conf"
mobileDao "go-common/app/interface/main/app-wall/dao/mobile"
"go-common/app/interface/main/app-wall/model"
"go-common/app/interface/main/app-wall/model/mobile"
"go-common/library/log"
"go-common/library/stat/prom"
)
type Service struct {
c *conf.Config
dao *mobileDao.Dao
tick time.Duration
mobileIpCache []*mobile.MobileIP
ipPath string
// prom
pHit *prom.Prom
pMiss *prom.Prom
}
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: mobileDao.New(c),
tick: time.Duration(c.Tick),
mobileIpCache: []*mobile.MobileIP{},
ipPath: c.IPLimit.MobileIPFile,
// prom
pHit: prom.CacheHit,
pMiss: prom.CacheMiss,
}
s.loadIP()
return
}
func (s *Service) loadIP() {
var (
ip *mobile.MobileIP
file *os.File
line string
err error
ips []*mobile.MobileIP
)
if file, err = os.Open(s.ipPath); err != nil {
log.Error("mobileIPFile is null")
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
if line, err = reader.ReadString('\n'); err != nil {
if err == io.EOF {
err = nil
break
}
continue
}
lines := strings.Fields(line)
if len(lines) < 3 {
continue
}
ip = &mobile.MobileIP{
IPStartUint: model.InetAtoN(lines[1]),
IPEndUint: model.InetAtoN(lines[2]),
}
ips = append(ips, ip)
}
s.mobileIpCache = ips
log.Info("loadMobileIPCache success")
}