go-common/app/job/main/account-summary/service/sync.go
2019-04-22 18:49:16 +08:00

209 lines
4.7 KiB
Go

package service
import (
"context"
"sync"
"go-common/app/job/main/account-summary/model"
member "go-common/app/service/main/member/model"
"go-common/app/service/main/member/model/block"
relation "go-common/app/service/main/relation/model"
"go-common/library/log"
xtime "go-common/library/time"
)
func (s *Service) block(ctx context.Context, mid int64) (*model.BlockSummary, error) {
bl, err := s.dao.MemberService.BlockInfo(ctx, &block.RPCArgInfo{MID: mid})
if err != nil {
return nil, err
}
blSummary := &model.BlockSummary{
EmbedMid: model.EmbedMid{Mid: bl.MID},
BlockStatus: int64(bl.BlockStatus),
StartTime: model.Datetime(xtime.Time(bl.StartTime)),
EndTime: model.Datetime(xtime.Time(bl.EndTime)),
}
return blSummary, nil
}
func (s *Service) relationStat(ctx context.Context, mid int64) (*model.RelationStat, error) {
stat, err := s.dao.RelationService.Stat(ctx, &relation.ArgMid{Mid: mid})
if err != nil {
return nil, err
}
reStat := &model.RelationStat{
EmbedMid: model.EmbedMid{Mid: stat.Mid},
Follower: stat.Follower,
Following: stat.Following,
Whisper: stat.Whisper,
Black: stat.Black,
}
return reStat, nil
}
func (s *Service) passportSummary(ctx context.Context, mid int64) (*model.PassportSummary, error) {
ps := &model.PassportSummary{
EmbedMid: model.EmbedMid{Mid: mid},
}
wg := &sync.WaitGroup{}
wg.Add(1)
go func() error {
defer wg.Done()
pp, err := s.dao.PassportProfile(ctx, mid)
if err != nil {
log.Error("Failed to fetch passport profile: %+v", err)
return err
}
ps.TelStatus = pp.TelStatus()
ps.CountryID = pp.CountryCode
ps.JoinIP = pp.JoinIP
ps.JoinTime = model.Datetime(pp.JoinTime)
ps.EmailSuffix = pp.EmailSuffix()
return nil
}()
wg.Add(1)
go func() error {
defer wg.Done()
origin, err := s.dao.AsoAccountRegOrigin(ctx, mid)
if err != nil {
log.Error("Failed to fetch passport aso account reg origin: %+v", err)
return err
}
ps.RegType = origin.RegType
ps.OriginType = origin.OriginType
return nil
}()
wg.Wait()
return ps, nil
}
func (s *Service) member(ctx context.Context, mid int64) (*model.MemberBase, *model.MemberExp, *model.MemberOfficial, error) {
mb, err := s.dao.MemberService.Member(ctx, &member.ArgMemberMid{Mid: mid})
if err != nil {
return nil, nil, nil, err
}
var base *model.MemberBase
if mb.BaseInfo != nil {
base = &model.MemberBase{
EmbedMid: model.EmbedMid{Mid: mb.Mid},
Name: mb.Name,
Face: mb.Face,
Rank: int64(mb.Rank),
Sex: mb.Sex,
Sign: mb.Sign,
Birthday: model.Date(mb.Birthday),
}
}
var exp *model.MemberExp
if mb.LevelInfo != nil {
exp = &model.MemberExp{
EmbedMid: model.EmbedMid{Mid: mb.Mid},
Exp: int64(mb.NowExp),
}
}
var of *model.MemberOfficial
if mb.OfficialInfo != nil {
of = &model.MemberOfficial{
EmbedMid: model.EmbedMid{Mid: mb.Mid},
Role: int64(mb.Role),
Title: mb.Title,
Description: mb.Desc,
}
}
return base, exp, of, nil
}
func (s *Service) syncMember(ctx context.Context, mid int64) error {
base, exp, of, err := s.member(ctx, mid)
if err != nil {
return err
}
syncable := make([]Syncable, 0, 3)
if base != nil {
syncable = append(syncable, base)
}
if exp != nil {
syncable = append(syncable, exp)
}
if of != nil {
syncable = append(syncable, of)
}
for _, data := range syncable {
if err := s.SyncToHBase(ctx, data); err != nil {
return err
}
}
return nil
}
func (s *Service) syncRelationStat(ctx context.Context, mid int64) error {
reStat, err := s.relationStat(ctx, mid)
if err != nil {
return err
}
if err := s.SyncToHBase(ctx, reStat); err != nil {
return err
}
return nil
}
func (s *Service) syncBlock(ctx context.Context, mid int64) error {
blSummary, err := s.block(ctx, mid)
if err != nil {
return err
}
if err := s.SyncToHBase(ctx, blSummary); err != nil {
return err
}
return nil
}
func (s *Service) syncPassportSummary(ctx context.Context, mid int64) error {
ps, err := s.passportSummary(ctx, mid)
if err != nil {
return err
}
if err := s.SyncToHBase(ctx, ps); err != nil {
return err
}
return nil
}
func (s *Service) syncRangeproc(ctx context.Context, start, end int64, worker uint64) {
log.Info("Sync with range: start: %d, end %d, worker: %d", start, end, worker)
syncChan := make(chan int64, worker*128)
defer close(syncChan)
// initial
wg := sync.WaitGroup{}
wg.Add(1)
for i := uint64(0); i < worker; i++ {
go func() {
defer wg.Done()
for mid := range syncChan {
if err := s.SyncOne(context.Background(), mid); err != nil {
log.Error("Failed to sync user with mid: %d: %+v", mid, err)
}
}
}()
}
for j := start; j <= end; j++ {
syncChan <- j
}
wg.Wait()
}