You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.2 KiB
162 lines
4.2 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"sync" |
|
"time" |
|
|
|
"go-common/app/job/main/passport-user-compare/conf" |
|
"go-common/app/job/main/passport-user-compare/dao" |
|
"go-common/app/job/main/passport-user-compare/model" |
|
"go-common/library/log" |
|
|
|
"github.com/robfig/cron" |
|
) |
|
|
|
const ( |
|
publicKeyConst int8 = 0 |
|
privateKeyConst int8 = 1 |
|
aesKeyConst int8 = 2 |
|
md5KeyConst int8 = 3 |
|
timeFormat = "2006-01-02 15:04:05" |
|
pwdErrorType = 1 |
|
statusErrorType = 2 |
|
telErrorType = 3 |
|
mailErrorType = 4 |
|
safeErrorType = 5 |
|
sinaErrorType = 6 |
|
qqErrorType = 7 |
|
notExistUserBase = 8 |
|
notExistUserTel = 9 |
|
notExistUserMail = 10 |
|
notExistUserSafeQuestion = 11 |
|
notExistUserThirdBind = 12 |
|
userIDErrorType = 13 |
|
notExistUserRegOriginType = 14 |
|
userRegOriginErrorType = 15 |
|
insertAction = "insert" |
|
updateAction = "update" |
|
fullDivSegment int64 = 10 |
|
platformSina int64 = 1 |
|
platformQQ int64 = 2 |
|
filterStart int64 = 1536572121 |
|
filterEnd int64 = 1536616436 |
|
mySQLErrCodeDuplicateEntry = 1062 |
|
) |
|
|
|
var ( |
|
privateKey = "" |
|
publicKey = "" |
|
aesKey = "" |
|
md5slat = "" |
|
dynamicAccountStat = make(map[string]int64, 7) |
|
dynamicAccountInfoStat = make(map[string]int64, 2) |
|
dynamicAccountRegStat = make(map[string]int64, 2) |
|
accountStat = make(map[string]int64, 7) |
|
accountInfoStat = make(map[string]int64, 2) |
|
accountSnsStat = make(map[string]int64, 3) |
|
loc = time.Now().Location() |
|
) |
|
|
|
// Service service. |
|
type Service struct { |
|
c *conf.Config |
|
d *dao.Dao |
|
cron *cron.Cron |
|
fullFixChan chan *model.ErrorFix |
|
incFixChan chan *model.ErrorFix |
|
mu sync.Mutex |
|
countryMap map[int64]string |
|
dataFixSwitch bool |
|
incrDataFixSwitch bool |
|
} |
|
|
|
// New new service |
|
func New(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
d: dao.New(c), |
|
cron: cron.New(), |
|
dataFixSwitch: c.DataFixSwitch, |
|
incrDataFixSwitch: c.IncrDataFixSwitch, |
|
fullFixChan: make(chan *model.ErrorFix, 1024), |
|
incFixChan: make(chan *model.ErrorFix, 2048), |
|
} |
|
var err error |
|
s.countryMap, err = s.d.QueryCountryCode(context.Background()) |
|
if err != nil || len(s.countryMap) == 0 { |
|
log.Error("fail to get country map") |
|
panic(err) |
|
} |
|
|
|
s.initSecret() |
|
if s.c.FullTask.Switch { |
|
log.Info("start full compare and fixed") |
|
go s.fullFixed(s.fullFixChan) |
|
if err := s.cron.AddFunc(s.c.FullTask.CronFullStr, s.fullCompareAndFix); err != nil { |
|
panic(err) |
|
} |
|
s.cron.Start() |
|
} |
|
|
|
if s.c.IncTask.Switch { |
|
log.Info("start inc compare and fixed") |
|
go s.incFixed(s.incFixChan) |
|
if err := s.cron.AddFunc(s.c.IncTask.CronIncStr, s.incCompareAndFix); err != nil { |
|
panic(err) |
|
} |
|
s.cron.Start() |
|
} |
|
|
|
if s.c.DuplicateTask.Switch { |
|
log.Info("start check duplicate job") |
|
if err := s.cron.AddFunc(s.c.DuplicateTask.DuplicateCron, s.checkEmailDuplicateJob); err != nil { |
|
panic(err) |
|
} |
|
if err := s.cron.AddFunc(s.c.DuplicateTask.DuplicateCron, s.checkTelDuplicateJob); err != nil { |
|
panic(err) |
|
} |
|
s.cron.Start() |
|
} |
|
if s.c.FixEmailVerifiedSwitch { |
|
go s.fixEmailVerified() |
|
} |
|
return s |
|
} |
|
|
|
// Ping check server ok. |
|
func (s *Service) Ping(c context.Context) (err error) { |
|
return |
|
} |
|
|
|
// Close close service, including databus and outer service. |
|
func (s *Service) Close() (err error) { |
|
if err = s.d.Close(); err != nil { |
|
panic(err) |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) initSecret() { |
|
res, err := s.d.LoadSecret(context.Background()) |
|
if err != nil { |
|
panic(err) |
|
} |
|
for _, r := range res { |
|
if publicKeyConst == r.KeyType { |
|
publicKey = r.Key |
|
} |
|
if privateKeyConst == r.KeyType { |
|
privateKey = r.Key |
|
} |
|
if aesKeyConst == r.KeyType { |
|
aesKey = r.Key |
|
} |
|
if md5KeyConst == r.KeyType { |
|
md5slat = r.Key |
|
} |
|
} |
|
if len(aesKey) == 0 { |
|
panic("load secret error") |
|
} |
|
}
|
|
|