Create & Init Project...
This commit is contained in:
61
app/interface/main/app-interface/service/relation/BUILD
Normal file
61
app/interface/main/app-interface/service/relation/BUILD
Normal file
@ -0,0 +1,61 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_test",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = [
|
||||
"relation_test.go",
|
||||
"service_test.go",
|
||||
],
|
||||
embed = [":go_default_library"],
|
||||
rundir = ".",
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"//app/interface/main/app-interface/conf:go_default_library",
|
||||
"//app/interface/main/app-interface/model/relation:go_default_library",
|
||||
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"relation.go",
|
||||
"service.go",
|
||||
],
|
||||
importpath = "go-common/app/interface/main/app-interface/service/relation",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//app/interface/main/app-interface/conf:go_default_library",
|
||||
"//app/interface/main/app-interface/dao/account:go_default_library",
|
||||
"//app/interface/main/app-interface/dao/live:go_default_library",
|
||||
"//app/interface/main/app-interface/dao/relation:go_default_library",
|
||||
"//app/interface/main/app-interface/model/live:go_default_library",
|
||||
"//app/interface/main/app-interface/model/relation:go_default_library",
|
||||
"//app/service/main/account/model:go_default_library",
|
||||
"//app/service/main/relation/model:go_default_library",
|
||||
"//library/ecode:go_default_library",
|
||||
"//library/log:go_default_library",
|
||||
"//library/sync/errgroup: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"],
|
||||
)
|
166
app/interface/main/app-interface/service/relation/relation.go
Normal file
166
app/interface/main/app-interface/service/relation/relation.go
Normal file
@ -0,0 +1,166 @@
|
||||
package relation
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"hash/crc32"
|
||||
"sort"
|
||||
|
||||
"go-common/app/interface/main/app-interface/model/live"
|
||||
model "go-common/app/interface/main/app-interface/model/relation"
|
||||
account "go-common/app/service/main/account/model"
|
||||
relation "go-common/app/service/main/relation/model"
|
||||
"go-common/library/ecode"
|
||||
"go-common/library/log"
|
||||
"go-common/library/sync/errgroup"
|
||||
)
|
||||
|
||||
var (
|
||||
_emptyFollowings = []*model.Following{}
|
||||
_emptyTagInfos = []*model.Tag{}
|
||||
)
|
||||
|
||||
// Followings get user followings list.
|
||||
func (s *Service) Followings(c context.Context, vmid, mid int64, pn, ps int, version uint64, order string) (f []*model.Following, crc32v uint32, total int, err error) {
|
||||
res, err := s.relDao.Followings(c, vmid)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
total = len(res)
|
||||
if order == "asc" {
|
||||
sort.Sort(model.ByMTime(res))
|
||||
}
|
||||
start, end := (pn-1)*ps, pn*ps
|
||||
switch {
|
||||
case start >= len(res):
|
||||
res = res[:0]
|
||||
case end >= len(res):
|
||||
res = res[start:]
|
||||
default:
|
||||
res = res[start:end]
|
||||
}
|
||||
if len(res) == 0 {
|
||||
f = _emptyFollowings
|
||||
return
|
||||
}
|
||||
data := []byte(fmt.Sprintf("%s", res))
|
||||
crc32v = crc32.Checksum(data, crc32.IEEETable)
|
||||
if uint64(crc32v) == version {
|
||||
err = ecode.NotModified
|
||||
return
|
||||
}
|
||||
var fids []int64
|
||||
for _, r := range res {
|
||||
fids = append(fids, r.Mid)
|
||||
}
|
||||
var (
|
||||
flm map[int64]*relation.Following
|
||||
cardm map[int64]*account.Card
|
||||
sm map[int64]*live.Status
|
||||
)
|
||||
g, ctx := errgroup.WithContext(c)
|
||||
g.Go(func() (err error) {
|
||||
cardm, err = s.accDao.Cards3(ctx, fids)
|
||||
return
|
||||
})
|
||||
// !self, compute !self user and up's followings' attr
|
||||
if mid != vmid && mid != 0 {
|
||||
g.Go(func() (err error) {
|
||||
if flm, err = s.relDao.Relations(ctx, mid, fids); err != nil {
|
||||
log.Error("%+v", err)
|
||||
err = nil
|
||||
}
|
||||
return
|
||||
})
|
||||
}
|
||||
g.Go(func() error {
|
||||
sm, _ = s.liveDao.StatusInfo(ctx, fids)
|
||||
return nil
|
||||
})
|
||||
if err = g.Wait(); err != nil {
|
||||
log.Error("%+v", err)
|
||||
return
|
||||
}
|
||||
f = make([]*model.Following, 0, len(res))
|
||||
for _, r := range res {
|
||||
fl := &model.Following{Following: r}
|
||||
if _, ok := cardm[r.Mid]; ok {
|
||||
fl.Face = cardm[r.Mid].Face
|
||||
fl.Uname = cardm[r.Mid].Name
|
||||
fl.Sign = cardm[r.Mid].Sign
|
||||
if mid != vmid {
|
||||
if f, ok := flm[r.Mid]; ok {
|
||||
fl.Attribute = f.Attribute
|
||||
} else {
|
||||
fl.Attribute = relation.AttrNoRelation
|
||||
}
|
||||
}
|
||||
fl.OfficialVerify = cardm[r.Mid].Official
|
||||
fl.Vip.Type = int(cardm[r.Mid].Vip.Type)
|
||||
fl.Vip.VipStatus = int(cardm[r.Mid].Vip.Status)
|
||||
fl.Vip.DueDate = cardm[r.Mid].Vip.DueDate
|
||||
if status, ok := sm[r.Mid]; ok {
|
||||
fl.Live = status.LiveStatus
|
||||
}
|
||||
}
|
||||
f = append(f, fl)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Service) Tag(c context.Context, mid, tid int64, pn, ps int) (t []*model.Tag, err error) {
|
||||
mids, err := s.relDao.Tag(c, mid, tid)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
start, end := (pn-1)*ps, pn*ps
|
||||
switch {
|
||||
case start >= len(mids):
|
||||
mids = mids[:0]
|
||||
case end >= len(mids):
|
||||
mids = mids[start:]
|
||||
default:
|
||||
mids = mids[start:end]
|
||||
}
|
||||
if len(mids) == 0 {
|
||||
t = _emptyTagInfos
|
||||
return
|
||||
}
|
||||
var (
|
||||
cardm map[int64]*account.Card
|
||||
sm map[int64]*live.Status
|
||||
)
|
||||
g, ctx := errgroup.WithContext(c)
|
||||
g.Go(func() (err error) {
|
||||
cardm, err = s.accDao.Cards3(ctx, mids)
|
||||
return
|
||||
})
|
||||
g.Go(func() error {
|
||||
sm, _ = s.liveDao.StatusInfo(ctx, mids)
|
||||
return nil
|
||||
})
|
||||
if err = g.Wait(); err != nil {
|
||||
log.Error("%+v", err)
|
||||
return
|
||||
}
|
||||
|
||||
t = make([]*model.Tag, 0, len(mids))
|
||||
for _, mid = range mids {
|
||||
tag := &model.Tag{Mid: mid}
|
||||
if _, ok := cardm[mid]; ok {
|
||||
tag.Mid = mid
|
||||
tag.Face = cardm[mid].Face
|
||||
tag.Uname = cardm[mid].Name
|
||||
tag.Sign = cardm[mid].Sign
|
||||
tag.OfficialVerify = cardm[mid].Official
|
||||
tag.Vip.Type = int(cardm[mid].Vip.Type)
|
||||
tag.Vip.VipStatus = int(cardm[mid].Vip.Status)
|
||||
tag.Vip.DueDate = cardm[mid].Vip.DueDate
|
||||
}
|
||||
if status, ok := sm[mid]; ok {
|
||||
tag.Live = status.LiveStatus
|
||||
}
|
||||
t = append(t, tag)
|
||||
}
|
||||
return
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
package relation
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
|
||||
"go-common/app/interface/main/app-interface/conf"
|
||||
model "go-common/app/interface/main/app-interface/model/relation"
|
||||
)
|
||||
|
||||
var (
|
||||
s *Service
|
||||
)
|
||||
|
||||
func init() {
|
||||
dir, _ := filepath.Abs("../../cmd/app-interface-test.toml")
|
||||
flag.Set("conf", dir)
|
||||
conf.Init()
|
||||
s = New(conf.Conf)
|
||||
time.Sleep(3 * time.Second)
|
||||
}
|
||||
|
||||
func TestService_Followings(t *testing.T) {
|
||||
type args struct {
|
||||
c context.Context
|
||||
vmid int64
|
||||
mid int64
|
||||
pn int
|
||||
ps int
|
||||
version uint64
|
||||
order string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantF []*model.Following
|
||||
wantCrc32v uint32
|
||||
wantTotal int
|
||||
wantErr error
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
Convey(tt.name, t, func() {
|
||||
gotF, gotCrc32v, gotTotal, err := s.Followings(tt.args.c, tt.args.vmid, tt.args.mid, tt.args.pn, tt.args.ps, tt.args.version, tt.args.order)
|
||||
So(gotF, ShouldResemble, tt.wantF)
|
||||
So(gotCrc32v, ShouldResemble, tt.wantCrc32v)
|
||||
So(gotTotal, ShouldResemble, tt.wantTotal)
|
||||
So(err, ShouldEqual, tt.wantErr)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestService_Tag(t *testing.T) {
|
||||
type args struct {
|
||||
c context.Context
|
||||
mid int64
|
||||
tid int64
|
||||
pn int
|
||||
ps int
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
s *Service
|
||||
args args
|
||||
wantT []*model.Tag
|
||||
wantErr error
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
gotT, err := tt.s.Tag(tt.args.c, tt.args.mid, tt.args.tid, tt.args.pn, tt.args.ps)
|
||||
So(gotT, ShouldResemble, tt.wantT)
|
||||
So(err, ShouldEqual, tt.wantErr)
|
||||
})
|
||||
}
|
||||
}
|
29
app/interface/main/app-interface/service/relation/service.go
Normal file
29
app/interface/main/app-interface/service/relation/service.go
Normal file
@ -0,0 +1,29 @@
|
||||
package relation
|
||||
|
||||
import (
|
||||
"go-common/app/interface/main/app-interface/conf"
|
||||
accdao "go-common/app/interface/main/app-interface/dao/account"
|
||||
livedao "go-common/app/interface/main/app-interface/dao/live"
|
||||
reldao "go-common/app/interface/main/app-interface/dao/relation"
|
||||
)
|
||||
|
||||
// Service is favorite.
|
||||
type Service struct {
|
||||
c *conf.Config
|
||||
// dao
|
||||
accDao *accdao.Dao
|
||||
relDao *reldao.Dao
|
||||
liveDao *livedao.Dao
|
||||
}
|
||||
|
||||
// New new favorite。
|
||||
func New(c *conf.Config) (s *Service) {
|
||||
s = &Service{
|
||||
c: c,
|
||||
// dao
|
||||
accDao: accdao.New(c),
|
||||
relDao: reldao.New(c),
|
||||
liveDao: livedao.New(c),
|
||||
}
|
||||
return s
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package relation
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"go-common/app/interface/main/app-interface/conf"
|
||||
)
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
type args struct {
|
||||
c *conf.Config
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantS *Service
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if gotS := New(tt.args.c); !reflect.DeepEqual(gotS, tt.wantS) {
|
||||
t.Errorf("New() = %v, want %v", gotS, tt.wantS)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user