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,60 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
go_library(
name = "go_default_library",
srcs = [
"dao.go",
"mc.go",
"mysql.go",
"notify.go",
],
importpath = "go-common/app/job/main/passport-game-cloud/dao",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/passport-game-cloud/conf:go_default_library",
"//app/job/main/passport-game-cloud/model:go_default_library",
"//library/cache/memcache:go_default_library",
"//library/database/sql:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
],
)
go_test(
name = "go_default_test",
srcs = [
"dao_test.go",
"mysql_test.go",
"notify_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/passport-game-cloud/conf:go_default_library",
"//app/job/main/passport-game-cloud/model:go_default_library",
"//vendor/github.com/go-sql-driver/mysql:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey: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,63 @@
package dao
import (
"context"
"fmt"
"time"
"go-common/app/job/main/passport-game-cloud/conf"
"go-common/library/cache/memcache"
"go-common/library/database/sql"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
// Dao dao
type Dao struct {
c *conf.Config
getMemberStmt []*sql.Stmt
cloudDB *sql.DB
mc *memcache.Pool
mcExpire int32
gameClient *bm.Client
delGameCacheURI string
}
// New new dao.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
c: c,
cloudDB: sql.NewMySQL(c.DB.Cloud),
mc: memcache.NewPool(c.Memcache.Config),
mcExpire: int32(time.Duration(c.Memcache.Expire) / time.Second),
gameClient: bm.NewClient(c.Game.Client),
delGameCacheURI: c.Game.DelCacheURI,
}
d.getMemberStmt = make([]*sql.Stmt, _memberShard)
for i := 0; i < _memberShard; i++ {
d.getMemberStmt[i] = d.cloudDB.Prepared(fmt.Sprintf(_getMemberInfoSQL, i))
}
return
}
// Ping check dao ok.
func (d *Dao) Ping(c context.Context) (err error) {
if err = d.cloudDB.Ping(c); err != nil {
log.Info("dao.cloudDB.Ping() error(%v)", err)
}
if err = d.pingMC(c); err != nil {
log.Info("dao.pingMC() error(%v)", err)
}
return
}
// Close close connections of mc, cloudDB.
func (d *Dao) Close() (err error) {
if d.cloudDB != nil {
d.cloudDB.Close()
}
if d.mc != nil {
d.mc.Close()
}
return
}

View File

@@ -0,0 +1,20 @@
package dao
import (
"fmt"
"sync"
"go-common/app/job/main/passport-game-cloud/conf"
)
var (
once sync.Once
d *Dao
)
func startDao() {
if err := conf.Init(); err != nil {
panic(fmt.Sprintf("conf.Init() error(%v)", err))
}
d = New(conf.Conf)
}

View File

@@ -0,0 +1,84 @@
package dao
import (
"context"
"strconv"
"go-common/app/job/main/passport-game-cloud/model"
"go-common/library/cache/memcache"
"go-common/library/log"
)
const (
_keyPrefixInfoPB = "pa2_"
_keyPrefixTokenPB = "pt_"
)
func keyInfoPB(mid int64) string {
return _keyPrefixInfoPB + strconv.FormatInt(mid, 10)
}
func keyTokenPB(accessToken string) string {
return _keyPrefixTokenPB + accessToken
}
// pingMC check connection success.
func (d *Dao) pingMC(c context.Context) (err error) {
item := &memcache.Item{
Key: "ping",
Value: []byte{1},
Expiration: d.mcExpire,
}
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Set(item); err != nil {
log.Error("conn.Set(%v) error(%v)", item, err)
}
return
}
// DelInfoCache delete info cache.
func (d *Dao) DelInfoCache(c context.Context, mid int64) (err error) {
key := keyInfoPB(mid)
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(key); err != nil {
if err == memcache.ErrNotFound {
err = nil
return
}
log.Error("conn.Delete(%s) error(%v)", key, err)
}
return
}
// SetTokenCache set token into cache.
func (d *Dao) SetTokenCache(c context.Context, token *model.Perm) (err error) {
item := &memcache.Item{
Key: keyTokenPB(token.AccessToken),
Object: token,
Flags: memcache.FlagProtobuf,
Expiration: d.mcExpire,
}
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Set(item); err != nil {
log.Error("conn.Set(%s) error(%v)", item.Key, err)
}
return
}
// DelTokenCache delete token cache.
func (d *Dao) DelTokenCache(c context.Context, accessToken string) (err error) {
key := keyTokenPB(accessToken)
conn := d.mc.Get(c)
defer conn.Close()
if err = conn.Delete(key); err != nil {
if err == memcache.ErrNotFound {
err = nil
return
}
log.Error("conn.Delete(%s) error(%v)", key, err)
}
return
}

View File

@@ -0,0 +1,143 @@
package dao
import (
"context"
"database/sql"
"fmt"
"go-common/app/job/main/passport-game-cloud/model"
xsql "go-common/library/database/sql"
"go-common/library/log"
)
const (
_memberShard = 30
_addMemberInfoSQL = "INSERT INTO member_%02d (mid,face) VALUES(?,?) ON DUPLICATE KEY UPDATE face=?"
_deleteMemberInfoSQL = "DELETE FROM member_%02d WHERE mid=?"
_getMemberInfoSQL = "SELECT mid,face FROM member_%02d WHERE mid=?"
_addTokenSQL = "INSERT INTO app_perm (mid,appid,app_subid,access_token,create_at,expires) VALUES (?,?,?,?,?,?)"
_updateTokenSQL = "UPDATE app_perm SET expires=? WHERE access_token=? AND expires<?"
_deleteTokenSQL = "DELETE FROM app_perm WHERE access_token=?"
_getTokensSQL = "SELECT access_token FROM app_perm WHERE mid=?"
_addAsoAccountSQL = "INSERT INTO aso_account (mid,userid,uname,pwd,salt,email,tel,country_id,mobile_verified,isleak) VALUES(?,?,?,?,?,?,?,?,?,?)"
_updateAsoAccountSQL = "UPDATE aso_account SET userid=?,uname=?,pwd=?,salt=?,email=?,tel=?,country_id=?,mobile_verified=?,isleak=? WHERE mid=?"
_deleteAsoAccountSQL = "DELETE FROM aso_account WHERE mid=?"
)
func hit(mid int64) int64 {
return mid % _memberShard
}
// AddMemberInfo add member info.
func (d *Dao) AddMemberInfo(c context.Context, info *model.Info) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, fmt.Sprintf(_addMemberInfoSQL, hit(info.Mid)), info.Mid, info.Face, info.Face); err != nil {
log.Error("failed to add member info, dao.cloudDB.Exec(%d, %s, %s) error(%v)", info.Mid, info.Face, info.Face, err)
return
}
return res.RowsAffected()
}
// DelMemberInfo delete member info.
func (d *Dao) DelMemberInfo(c context.Context, mid int64) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, fmt.Sprintf(_deleteMemberInfoSQL, hit(mid)), mid); err != nil {
log.Error("failed to delete member info, dao.cloudDB.Exec(%d) error(%v)", mid, err)
return
}
return res.RowsAffected()
}
// AddToken add token.
func (d *Dao) AddToken(c context.Context, t *model.Perm) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, _addTokenSQL, t.Mid, t.AppID, t.AppSubID, t.AccessToken, t.CreateAt, t.Expires); err != nil {
log.Error("failed to add token, dao.cloudDB.Exec(%d, %d, %d, %s, %d, %d) error(%v)", t.Mid, t.AppID, t.AppSubID, t.AccessToken, t.CreateAt, t.Expires, err)
return
}
return res.RowsAffected()
}
// UpdateToken update token.
func (d *Dao) UpdateToken(c context.Context, t *model.Perm) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, _updateTokenSQL, t.Expires, t.AccessToken, t.Expires); err != nil {
log.Error("failed to update token, dao.cloudDB.Exec(%d, %s, %d) error(%v)", t.Expires, t.AccessToken, t.Expires, err)
return
}
return res.RowsAffected()
}
// DelToken delete token.
func (d *Dao) DelToken(c context.Context, accessToken string) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, _deleteTokenSQL, accessToken); err != nil {
log.Error("failed to delete token, dao.cloudDB.Exec(%s) error(%v)", accessToken, err)
return
}
return res.RowsAffected()
}
// Tokens get tokens by mid.
func (d *Dao) Tokens(c context.Context, mid int64) (res []string, err error) {
var rows *xsql.Rows
if rows, err = d.cloudDB.Query(c, _getTokensSQL, mid); err != nil {
log.Error("failed to get tokens, dao.cloudDB.Tokens(%s) error(%v)", _getTokensSQL, err)
return
}
defer rows.Close()
for rows.Next() {
var at string
if err = rows.Scan(&at); err != nil {
log.Error("row.Scan() error(%v)", err)
res = nil
return
}
res = append(res, at)
}
return
}
// AddAsoAccount add aso account.
func (d *Dao) AddAsoAccount(c context.Context, a *model.AsoAccount) (affected int64, err error) {
var res sql.Result
var telPtr, emailPtr *string
if a.Tel != "" {
telPtr = &a.Tel
}
if a.Email != "" {
emailPtr = &a.Email
}
if res, err = d.cloudDB.Exec(c, _addAsoAccountSQL, a.Mid, a.UserID, a.Uname, a.Pwd, a.Salt, emailPtr, telPtr, a.CountryID, a.MobileVerified, a.Isleak); err != nil {
log.Error("failed to add aso account, dao.cloudDB.Exec() error(%v)", err)
return
}
return res.RowsAffected()
}
// UpdateAsoAccount update aso account.
func (d *Dao) UpdateAsoAccount(c context.Context, a *model.AsoAccount) (affected int64, err error) {
var res sql.Result
var telPtr, emailPtr *string
if a.Tel != "" {
telPtr = &a.Tel
}
if a.Email != "" {
emailPtr = &a.Email
}
if res, err = d.cloudDB.Exec(c, _updateAsoAccountSQL, a.UserID, a.Uname, a.Pwd, a.Salt, emailPtr, telPtr, a.CountryID, a.MobileVerified, a.Isleak, a.Mid); err != nil {
log.Error("failed to add aso account, dao.cloudDB.Exec() error(%v)", err)
return
}
return res.RowsAffected()
}
// DelAsoAccount delete aso account.
func (d *Dao) DelAsoAccount(c context.Context, mid int64) (affected int64, err error) {
var res sql.Result
if res, err = d.cloudDB.Exec(c, _deleteAsoAccountSQL, mid); err != nil {
log.Error("failed to delete aso account, dao.cloudDB.Exec(%s) error(%v)", mid, err)
return
}
return res.RowsAffected()
}

View File

@@ -0,0 +1,82 @@
package dao
import (
"context"
"testing"
"go-common/app/job/main/passport-game-cloud/model"
"github.com/go-sql-driver/mysql"
"github.com/pkg/errors"
. "github.com/smartystreets/goconvey/convey"
)
func TestDao_PingMySQL(t *testing.T) {
once.Do(startDao)
if err := d.cloudDB.Ping(context.TODO()); err != nil {
t.Errorf("dao.cloudDB.Ping() error(%v)", err)
t.FailNow()
}
}
func TestDao_AddMemberInfo(t *testing.T) {
once.Do(startDao)
info := &model.Info{
Mid: 110000130,
Face: "/bfs/face/bbc031c4b7bdabb6635a246ce7386ccb587c5214811111.jpg",
}
if a, err := d.AddMemberInfo(context.TODO(), info); err != nil {
t.FailNow()
} else {
t.Logf("a: %d", a)
}
}
func TestDao_UpdateAsoAccount(t *testing.T) {
once.Do(startDao)
Convey("update a aso account", t, func() {
account := &model.AsoAccount{
Mid: 12047569,
UserID: "bili_1710676855",
Uname: "Bili_12047569",
Pwd: "3686c9d96ae6896fe117319ba6c07087",
Salt: "pdMXF856",
Email: "62fe0d616162f56ecab3e12a2de83ea6",
Tel: "bdb27b0300e3984e48e7aea5c672a243",
CountryID: 1,
MobileVerified: 1,
Isleak: 0,
}
affected, err := d.UpdateAsoAccount(context.TODO(), account)
So(err, ShouldBeNil)
So(affected, ShouldEqual, 1)
})
}
func TestDao_AddAsoAccount(t *testing.T) {
once.Do(startDao)
account := &model.AsoAccount{
Mid: 12047569,
UserID: "bili_1710676855",
Uname: "Bili_12047569",
Pwd: "3686c9d96ae6896fe117319ba6c07087",
Salt: "pdMXF856",
Email: "62fe0d616162f56ecab3e12a2de83ea6",
Tel: "bdb27b0300e3984e48e7aea5c672a243",
CountryID: 1,
MobileVerified: 1,
Isleak: 0,
}
if _, err := d.AddAsoAccount(context.TODO(), account); err != nil {
switch nErr := errors.Cause(err).(type) {
case *mysql.MySQLError:
if nErr.Number != 1062 {
t.Errorf("expected MySQL error 1062 but got error(%v)", err)
t.FailNow()
}
}
} else {
t.FailNow()
}
}

View File

@@ -0,0 +1,33 @@
package dao
import (
"context"
"net/url"
"strconv"
"go-common/library/ecode"
"go-common/library/log"
)
// NotifyGame to notify game.
func (d *Dao) NotifyGame(c context.Context, mid int64, accessToken, action string) (err error) {
params := url.Values{}
params.Set("modifiedAttr", action)
params.Set("mid", strconv.FormatInt(mid, 10))
if accessToken != "" {
params.Set("access_token", accessToken)
}
params.Set("from", "passport-game-cloud-job")
var res struct {
Code int `json:"code"`
}
if err = d.gameClient.Get(c, d.delGameCacheURI, "127.0.0.1", params, &res); err != nil {
log.Error("failed to notify game, d.gameClient.Get(%s) error(%v)", d.delGameCacheURI+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
err = ecode.Int(res.Code)
log.Error("failed to notify game, url(%s) err(%v)", d.delGameCacheURI+"?"+params.Encode(), err)
}
return
}

View File

@@ -0,0 +1,17 @@
package dao
import (
"context"
"testing"
)
func TestDao_NotifyGame(t *testing.T) {
once.Do(startDao)
mid := int64(4780461)
ak := "3cf80530cccafaa9ed675d8a493c1a89#tx"
action := "changePwd"
if err := d.NotifyGame(context.TODO(), mid, ak, action); err != nil {
t.Errorf("dao.NotifyGame(%d, %s, %s) error(%v)", mid, ak, action, err)
t.FailNow()
}
}