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,62 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["service_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/model/account:go_default_library",
"//app/interface/main/creative/service:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"account.go",
"service.go",
],
importpath = "go-common/app/interface/main/creative/service/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/creative/conf:go_default_library",
"//app/interface/main/creative/dao/account:go_default_library",
"//app/interface/main/creative/dao/archive:go_default_library",
"//app/interface/main/creative/dao/article:go_default_library",
"//app/interface/main/creative/dao/up:go_default_library",
"//app/interface/main/creative/model/account:go_default_library",
"//app/interface/main/creative/service:go_default_library",
"//app/service/main/account/model:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
"//library/stat/prom:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/time: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,219 @@
package account
import (
"context"
"go-common/library/log"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
"time"
accmdl "go-common/app/interface/main/creative/model/account"
account "go-common/app/service/main/account/model"
"go-common/library/ecode"
xtime "go-common/library/time"
"sync"
)
const creatorMID = 37090048
// MyInfo get use level.
func (s *Service) MyInfo(c context.Context, mid int64, ip string, now time.Time) (m *accmdl.MyInfo, err error) {
var (
idCkCode = 0
res *account.Profile
)
// init myinfo
m = &accmdl.MyInfo{
Mid: mid,
Level: 1,
Activated: true,
Deftime: xtime.Time(now.Add(time.Duration(14400) * time.Second).Unix()),
DeftimeEnd: xtime.Time(now.Add(time.Duration(15*24) * time.Hour).Unix()),
DeftimeMsg: ecode.String(ecode.VideoupDelayTimeErr.Error()).Message(),
IdentifyInfo: &accmdl.IdentifyInfo{
Code: idCkCode,
Msg: accmdl.IdentifyEnum[idCkCode],
},
UploadSize: map[string]bool{
"4-8": false,
"8-16": false,
},
DmSubtitle: true,
}
if res, err = s.acc.Profile(c, mid, ip); err != nil {
log.Error("s.acc.Profile (%d) error(%v)", mid, err)
return
}
if res == nil {
err = ecode.NothingFound
return
}
if res.Silence == 1 {
m.Banned = true
}
if res.EmailStatus == 1 || res.TelStatus == 1 {
m.Activated = true
}
m.Name = res.Name
m.Face = res.Face
m.Level = int(res.Level)
if _, ok := s.exemptIDCheckUps[mid]; ok {
log.Info("s.exemptIDCheckUps (%d) info(%v)", mid, s.exemptIDCheckUps)
idCkCode = 0
} else {
idCkCode, _ = s.acc.IdentifyInfo(c, mid, 0, ip)
}
m.IdentifyInfo.Code = idCkCode
m.IdentifyInfo.Msg = accmdl.IdentifyEnum[idCkCode] // NOTE: exist check
m = s.ignoreLevelUpAndActivated(m, mid, s.exemptZeroLevelAndAnswerUps)
if _, ok := s.uploadTopSizeUps[mid]; ok {
m.UploadSize["4-8"] = true
m.UploadSize["8-16"] = true
}
return
}
// type为12的白名单人员免账号激活免账号升级到1级
func (s *Service) ignoreLevelUpAndActivated(m *accmdl.MyInfo, mid int64, exemptZeroLevelAndAnswerUps map[int64]int64) *accmdl.MyInfo {
if len(exemptZeroLevelAndAnswerUps) > 0 {
_, ok := exemptZeroLevelAndAnswerUps[mid]
if ok && (m.Level < 1 || !m.Activated) {
m.Activated = true
m.Level = 1
}
}
return m
}
// UpInfo get video article pic blink up infos.
func (s *Service) UpInfo(c context.Context, mid int64, ip string) (v *accmdl.UpInfo, err error) {
cache := true
if v, err = s.acc.UpInfoCache(c, mid); err != nil {
s.pCacheMiss.Incr("upinfo_cache")
err = nil
cache = false
} else if v != nil {
s.pCacheHit.Incr("upinfo_cache")
return
}
s.pCacheMiss.Incr("upinfo_cache")
var (
g = &errgroup.Group{}
ctx = context.TODO()
)
v = &accmdl.UpInfo{
Archive: accmdl.NotUp,
Article: accmdl.NotUp,
Pic: accmdl.NotUp,
Blink: accmdl.NotUp,
}
g.Go(func() error {
blikCnt, _ := s.acc.Blink(ctx, mid, ip)
if blikCnt > 0 {
v.Blink = accmdl.IsUp
}
return nil
})
g.Go(func() error {
picCnt, _ := s.acc.Pic(c, mid, ip)
if picCnt > 0 {
v.Pic = accmdl.IsUp
}
return nil
})
g.Go(func() error {
arcCnt, _ := s.archive.UpCount(c, mid)
if arcCnt > 0 {
v.Archive = accmdl.IsUp
}
return nil
})
g.Go(func() error {
isAuthor, _ := s.article.IsAuthor(c, mid, ip)
if isAuthor {
v.Article = accmdl.IsUp
}
return nil
})
g.Wait()
if cache {
s.addCache(func() {
s.acc.AddUpInfoCache(context.Background(), mid, v)
})
}
return
}
// RecFollows 推荐关注
func (s *Service) RecFollows(c context.Context, mid int64) (fs []*accmdl.Friend, err error) {
var (
fsMids = []int64{creatorMID}
shouldFollowMids = []int64{}
infos = make(map[int64]*account.Info)
)
ip := metadata.String(c, metadata.RemoteIP)
if shouldFollowMids, err = s.acc.ShouldFollow(c, mid, fsMids, ip); err != nil {
log.Error("s.acc.ShouldFollow mid(%d)|ip(%s)|error(%v)", mid, ip, err)
return
}
if len(shouldFollowMids) > 0 {
if infos, err = s.acc.Infos(c, shouldFollowMids, ip); err != nil {
log.Error("s.acc.Infos mid(%d)|ip(%s)|shouldFollowMids(%+v)|error(%v)", mid, ip, shouldFollowMids, err)
return
}
for mid, info := range infos {
f := &accmdl.Friend{
Mid: mid,
Sign: info.Sign,
Face: info.Face,
Name: info.Name,
}
if mid == creatorMID {
f.Comment = "关注创作中心,获取更多创作情报"
f.ShouldFollow = 0
}
fs = append(fs, f)
}
}
return
}
// Infos 获取多个UP主的信息
func (s *Service) Infos(c context.Context, mids []int64, ip string) (res map[int64]*account.Info, err error) {
return s.acc.Infos(c, mids, ip)
}
// Relations 批量获取mid与其它用户的关系
func (s *Service) Relations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
return s.acc.Relations(c, mid, fids, ip)
}
// FRelations 获取用户与mid的关系Relations的反向
func (s *Service) FRelations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
var (
g errgroup.Group
sm sync.RWMutex
)
res = make(map[int64]int)
for _, v := range fids {
g.Go(func() error {
var r map[int64]int
if r, err = s.acc.Relations(c, v, []int64{mid}, ip); err != nil {
return err
}
sm.Lock()
res[v] = r[mid]
sm.Unlock()
return nil
})
}
if err = g.Wait(); err != nil {
log.Error("s.FRelations(%d,%v) error(%v)", mid, fids, err)
}
return
}
// Cards 批量获取用户的Card
func (s *Service) Cards(c context.Context, mids []int64, ip string) (cards map[int64]*account.Card, err error) {
return s.acc.Cards(c, mids, ip)
}

View File

@@ -0,0 +1,105 @@
package account
import (
"context"
"time"
"go-common/app/interface/main/creative/conf"
"go-common/app/interface/main/creative/dao/account"
"go-common/app/interface/main/creative/dao/archive"
"go-common/app/interface/main/creative/dao/article"
"go-common/app/interface/main/creative/dao/up"
"go-common/app/interface/main/creative/service"
"go-common/library/log"
"go-common/library/stat/prom"
)
//Service struct.
type Service struct {
c *conf.Config
acc *account.Dao
article *article.Dao
archive *archive.Dao
up *up.Dao
exemptIDCheckUps map[int64]int64
exemptZeroLevelAndAnswerUps map[int64]int64
uploadTopSizeUps map[int64]int64
missch chan func()
pCacheHit *prom.Prom
pCacheMiss *prom.Prom
}
//New get service.
func New(c *conf.Config, rpcdaos *service.RPCDaos) *Service {
s := &Service{
c: c,
acc: rpcdaos.Acc,
article: rpcdaos.Art,
archive: rpcdaos.Arc,
up: rpcdaos.Up,
missch: make(chan func(), 1024),
pCacheHit: prom.CacheHit,
pCacheMiss: prom.CacheMiss,
}
s.loadExemptIDCheckUps()
s.loadExemptZeroLevelAndAnswer()
s.loadUpSpecialUploadTopSize()
go s.loadproc()
go s.cacheproc()
return s
}
// loadproc
func (s *Service) loadproc() {
for {
time.Sleep(5 * time.Minute)
s.loadExemptIDCheckUps()
s.loadExemptZeroLevelAndAnswer()
s.loadUpSpecialUploadTopSize()
}
}
// loadExemptIDCheckUps 白名单人员,免实名认证 type=8.
func (s *Service) loadExemptIDCheckUps() {
ups, err := s.up.UpSpecial(context.TODO(), 8)
if err != nil {
return
}
s.exemptIDCheckUps = ups
log.Info("exemptIDCheckUps ups: (%v)", len(ups))
}
// loadExemptIDCheckUps 白名单人员免账号激活免账号升级到1级 type=12
func (s *Service) loadExemptZeroLevelAndAnswer() {
ups, err := s.up.UpSpecial(context.TODO(), 12)
if err != nil {
return
}
s.exemptZeroLevelAndAnswerUps = ups
}
// loadUpSpecialUploadTopSize 投稿名单限制升级 上传视频可以超过4G,但是在8G以下 type=16
func (s *Service) loadUpSpecialUploadTopSize() {
ups, err := s.up.UpSpecial(context.TODO(), 16)
if err != nil {
return
}
s.uploadTopSizeUps = ups
}
// AddCache add to chan for cache
func (s *Service) addCache(f func()) {
select {
case s.missch <- f:
default:
log.Warn("cacheproc chan full")
}
}
// cacheproc is a routine for execute closure.
func (s *Service) cacheproc() {
for {
f := <-s.missch
f()
}
}

View File

@@ -0,0 +1,57 @@
package account
import (
"context"
"flag"
"go-common/app/interface/main/creative/conf"
accmdl "go-common/app/interface/main/creative/model/account"
"path/filepath"
"testing"
"time"
"go-common/app/interface/main/creative/service"
. "github.com/smartystreets/goconvey/convey"
)
var (
s *Service
)
func init() {
dir, _ := filepath.Abs("../../cmd/creative.toml")
flag.Set("conf", dir)
conf.Init()
rpcdaos := service.NewRPCDaos(conf.Conf)
s = New(conf.Conf, rpcdaos)
time.Sleep(time.Second)
}
func WithService(f func(s *Service)) func() {
return func() {
Reset(func() {})
f(s)
}
}
func Test_Account(t *testing.T) {
var (
c = context.TODO()
err error
MID = int64(2089809)
localHost = "127.0.0.1"
v *accmdl.UpInfo
m *accmdl.MyInfo
ip = ""
)
Convey("MyInfo", t, WithService(func(s *Service) {
m, err = s.MyInfo(c, MID, ip, time.Now())
So(err, ShouldBeNil)
So(m, ShouldNotBeNil)
}))
Convey("UpInfo", t, WithService(func(s *Service) {
v, err = s.UpInfo(c, MID, localHost)
So(err, ShouldBeNil)
So(v, ShouldNotBeNil)
}))
}