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.
267 lines
7.8 KiB
267 lines
7.8 KiB
package member |
|
|
|
import ( |
|
"context" |
|
|
|
"go-common/app/interface/main/account/model" |
|
accmdl "go-common/app/service/main/account/model" |
|
arcmdl "go-common/app/service/main/archive/model/archive" |
|
memmdl "go-common/app/service/main/member/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
) |
|
|
|
const ( |
|
_maxMonthlyOfficialSubmitTimes = 3 |
|
) |
|
|
|
// IdentifyInfo get user identify info. |
|
func (s *Service) IdentifyInfo(c context.Context, mid int64, ip string) (res *model.Identification, err error) { |
|
var rid *model.IdentifyInfo |
|
if rid, err = s.accDao.IdentifyInfo(c, mid, ip); err != nil { |
|
log.Error("s.memRPC.IdentifyInfo(%d) err(%+v)", mid, err) |
|
return |
|
} |
|
res = &model.Identification{} |
|
switch rid.Identify { |
|
case model.APIIdentifyOk: |
|
res.Identification = model.IdentifyOK |
|
case model.APIIdentifyNoInfo: |
|
res.Identification = model.IdentifyNotOK |
|
default: |
|
log.Error("unknow mid(%d) identify(%d) status", mid, rid.Identify) |
|
} |
|
return |
|
} |
|
|
|
// SubmitOfficial is. |
|
func (s *Service) SubmitOfficial(c context.Context, mid int64, apply *model.OfficialApply) error { |
|
//ip := metadata.String(c, metadata.RemoteIP) |
|
if apply.Role == memmdl.OfficialRoleUp || apply.Role == memmdl.OfficialRoleIdentify { |
|
cons, err := s.OfficialConditions(c, mid) |
|
if err != nil { |
|
return err |
|
} |
|
if !cons.AllPass() { |
|
log.Warn("Unexpected official apply submited: mid: %d conditons: %+v apply: %+v", mid, cons, apply) |
|
return ecode.RequestErr |
|
} |
|
} |
|
|
|
// 是否超出本月提交次数限制 |
|
times, err := s.accDao.GetMonthlyOfficialSubmittedTimes(c, mid) |
|
if err != nil { |
|
log.Error("Faield to get monthly official submitted times with mid %d: %+v", mid, err) |
|
} |
|
if times >= _maxMonthlyOfficialSubmitTimes { |
|
log.Warn("User %d is exceed max monthly official submitted times") |
|
return ecode.LimitExceed |
|
} |
|
|
|
ood, err := s.memRPC.OfficialDoc(c, &memmdl.ArgMid{Mid: mid}) |
|
// 是否已经存在审核中的申请 |
|
if err == nil && ood != nil && ood.State == memmdl.OfficialStateWait { |
|
return nil |
|
} |
|
|
|
if apply.Telephone != "" { |
|
if apply.TelVerifyCode == 0 { |
|
log.Error("Invalid tel verify code: mid: %d code:%d", mid, apply.TelVerifyCode) |
|
return ecode.RequestErr |
|
} |
|
vcode, verr := s.accDao.GetVerifyCode(c, mid, apply.Telephone) |
|
if verr != nil { |
|
log.Error("Failed to get verify code: %d, %s: %+v", mid, apply.Telephone, verr) |
|
return ecode.CaptchaErr |
|
} |
|
if apply.TelVerifyCode != vcode { |
|
log.Error("Failed to verify telephone verification code: %s, %d, %d", apply.Telephone, apply.TelVerifyCode, vcode) |
|
return ecode.CaptchaErr |
|
} |
|
} |
|
|
|
arg := &memmdl.ArgOfficialDoc{ |
|
Mid: mid, |
|
Name: apply.Name, |
|
Role: apply.Role, |
|
Title: apply.Title, |
|
Desc: apply.Desc, |
|
|
|
Operator: apply.Operator, |
|
Telephone: apply.Telephone, |
|
Email: apply.Email, |
|
Address: apply.Address, |
|
Company: apply.Company, |
|
CreditCode: apply.CreditCode, |
|
Organization: apply.Organization, |
|
OrganizationType: apply.OrganizationType, |
|
BusinessLicense: apply.BusinessLicense, |
|
BusinessScale: apply.BusinessScale, |
|
BusinessLevel: apply.BusinessLevel, |
|
BusinessAuth: apply.BusinessAuth, |
|
Supplement: apply.Supplement, |
|
Professional: apply.Professional, |
|
Identification: apply.Identification, |
|
OfficialSite: apply.OfficialSite, |
|
RegisteredCapital: apply.RegisteredCapital, |
|
|
|
SubmitSource: "user", // 来自 account-interface 的全部为 user |
|
} |
|
|
|
pros, err := s.accRPC.ProfileWithStat3(c, &accmdl.ArgMid{Mid: mid}) |
|
if err != nil { |
|
log.Error("Failed to call ProfileWithStat3(%d): %+v", mid, err) |
|
return err |
|
} |
|
arg.Realname = int8(pros.Identification) |
|
|
|
if err := s.accDao.DelVerifyCode(c, mid, apply.Telephone); err != nil { |
|
log.Error("Failed to delete verify code: mid: %d: mobile: %s: %+v", mid, apply.Telephone, err) |
|
} |
|
if _, err = s.accDao.IncreaseMonthlyOfficialSubmittedTimes(c, mid); err != nil { |
|
log.Error("Failed to increase monthly official submitted times with mid: %d: %+v", mid, err) |
|
} |
|
return s.memRPC.SetOfficialDoc(c, arg) |
|
} |
|
|
|
// OfficialConditions is. |
|
func (s *Service) OfficialConditions(c context.Context, mid int64) (*model.OfficialConditions, error) { |
|
con := new(model.OfficialConditions) |
|
pros, err := s.accRPC.ProfileWithStat3(c, &accmdl.ArgMid{Mid: mid}) |
|
if err != nil { |
|
log.Error("Failed to call ProfileWithStat3(%d): %+v", mid, err) |
|
return nil, err |
|
} |
|
if pros.Rank >= 10000 { |
|
con.IsFormal = true |
|
} |
|
// 1 正常号码,2 虚拟号码 |
|
if pros.TelStatus >= 1 { |
|
con.BindTel = true |
|
} |
|
if pros.Identification == 1 { |
|
con.Realname = true |
|
} |
|
if pros.Follower >= 100000 { |
|
con.FollowerCount = true |
|
} |
|
|
|
arcCount, err := s.arcRPC.UpCount2(c, &arcmdl.ArgUpCount2{Mid: mid}) |
|
if err != nil { |
|
log.Error("Failed to call s.arcRPC.UpCount2(%d): %+v", mid, err) |
|
// return nil, err |
|
} |
|
if err == nil && arcCount >= 1 { |
|
con.ArchiveCount = true |
|
} |
|
|
|
// 累计播放数 |
|
// upStat, err := s.upRPC.UpStatBase(c, &upmdl.ArgMidWithDate{Mid: mid}) |
|
// if err != nil { |
|
// log.Error("Failed to call s.upRPC.UpStatBase(%d): %+v", mid, err) |
|
// } |
|
// if err == nil && upStat != nil && upStat.View >= 1000000 { |
|
// con.ViewCount = true |
|
// } |
|
|
|
return con, nil |
|
} |
|
|
|
// UploadImage article upload cover. |
|
func (s *Service) UploadImage(c context.Context, fileType string, body []byte) (url string, err error) { |
|
if len(body) == 0 { |
|
err = ecode.FileNotExists |
|
return |
|
} |
|
if len(body) > s.c.BFS.MaxFileSize { |
|
err = ecode.FileTooLarge |
|
return |
|
} |
|
url, err = s.accDao.UploadImage(c, fileType, body, s.c.BFS) |
|
if err != nil { |
|
log.Error("account-interface: s.bfs.Upload error(%v)", err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
// MobileVerify is. |
|
func (s *Service) MobileVerify(c context.Context, mid int64, mobile string, country int64) error { |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
vcode, err := s.accDao.GenVerifyCode(c, mid, mobile) |
|
if err != nil { |
|
log.Error("Failed to generate verify code: %+v", err) |
|
return err |
|
} |
|
return s.accDao.SendMobileVerify(c, vcode, country, mobile, ip) |
|
} |
|
|
|
// OfficialDoc is. |
|
func (s *Service) OfficialDoc(c context.Context, mid int64) (*memmdl.OfficialDoc, error) { |
|
ip := metadata.String(c, metadata.RemoteIP) |
|
od, err := s.memRPC.OfficialDoc(c, &memmdl.ArgMid{Mid: mid, RealIP: ip}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
return od, nil |
|
} |
|
|
|
// MonthlyOfficialSubmittedTimes is |
|
func (s *Service) MonthlyOfficialSubmittedTimes(c context.Context, mid int64) *model.OfficialSubmittedTimes { |
|
result := &model.OfficialSubmittedTimes{ |
|
Submitted: 0, |
|
Remain: _maxMonthlyOfficialSubmitTimes, |
|
} |
|
times, err := s.accDao.GetMonthlyOfficialSubmittedTimes(c, mid) |
|
if err != nil { |
|
log.Warn("Failed to get monthly official submitted times with mid: %d: %+v", mid, err) |
|
return result |
|
} |
|
result.Submitted = times |
|
if result.Submitted > _maxMonthlyOfficialSubmitTimes { |
|
result.Submitted = _maxMonthlyOfficialSubmitTimes |
|
} |
|
result.Remain = _maxMonthlyOfficialSubmitTimes - result.Submitted |
|
return result |
|
} |
|
|
|
// OfficialAutoFillDoc is |
|
func (s *Service) OfficialAutoFillDoc(ctx context.Context, mid int64) (*memmdl.OfficialDoc, error) { |
|
res := &memmdl.OfficialDoc{ |
|
Mid: mid, |
|
} |
|
// default name |
|
info, err := s.accRPC.Info3(ctx, &accmdl.ArgMid{Mid: mid}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
res.Name = info.Name |
|
// default from cm api |
|
func() { |
|
cminfo, err := s.accDao.BusinessAccountInfo(ctx, mid) |
|
if err != nil { |
|
log.Error("Failed to get cm business account info with mid: %d: %+v", mid, err) |
|
return |
|
} |
|
if cminfo.Nickname != "" { |
|
res.Name = cminfo.Nickname |
|
} |
|
if cminfo.CertificationTitle != "" { |
|
res.Title = cminfo.CertificationTitle |
|
} |
|
if cminfo.CreditCode != "" { |
|
res.CreditCode = cminfo.CreditCode |
|
} |
|
if cminfo.CompanyName != "" { |
|
res.Company = cminfo.CompanyName |
|
} |
|
if cminfo.Organization != "" { |
|
res.Organization = cminfo.Organization |
|
} |
|
if cminfo.OrganizationType != "" { |
|
res.OrganizationType = cminfo.OrganizationType |
|
} |
|
}() |
|
return res, nil |
|
}
|
|
|