package member import ( "biz-member-gateway/internal/domain" "context" "code.30cm.net/digimon/app-cloudep-member-server/pkg/domain/member" "code.30cm.net/digimon/library-go/errs" "code.30cm.net/digimon/library-go/errs/code" "biz-member-gateway/internal/svc" "biz-member-gateway/internal/types" "github.com/zeromicro/go-zero/core/logx" memberProto "code.30cm.net/digimon/proto-all/pkg/member" ) type CheckVerifyCodeLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // NewCheckVerifyCodeLogic 確認邀請 - 綁定會員 func NewCheckVerifyCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CheckVerifyCodeLogic { return &CheckVerifyCodeLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *CheckVerifyCodeLogic) CheckVerifyCode(req *types.CheckoutVerifyReq) (resp *types.RespOK, err error) { var account string accountType := member.GetAccountTypeByCode(req.CodeType) switch accountType { case member.AccountTypePhone: phone, isPhone := normalizeTaiwanMobile(req.Account) if !isPhone { return nil, errs.InvalidFormat("phone number is invalid") } account = phone case member.AccountTypeMail: if !isValidEmail(req.Account) { return nil, errs.InvalidFormat("email is invalid") } account = req.Account default: return nil, errs.InvalidFormat("invalid account type") } ct := member.GetGetCodeNameByCode(req.CodeType) if _, err := l.svcCtx.MemberRPC.CheckRefreshCode(l.ctx, &memberProto.VerifyRefreshCodeReq{ VerifyCode: req.VerifyCode, Account: account, CodeType: int32(ct), }); err != nil { return nil, errs.Forbidden("failed to get verify code").Wrap(err) } // 處理綁定 Email 或 Phone switch ct { case member.GenerateCodeTypeEmail: if _, err := l.svcCtx.MemberRPC.BindVerifyEmail(l.ctx, &memberProto.BindVerifyEmailReq{ Uid: req.UID, Email: account, }); err != nil { return nil, errs.DatabaseErrorWithScope( code.CloudEPMember, domain.FailedToCheckVerifyCodeErrorCode, "failed to bind email", err.Error()) } case member.GenerateCodeTypePhone: if _, err := l.svcCtx.MemberRPC.BindVerifyPhone(l.ctx, &memberProto.BindVerifyPhoneReq{ Uid: req.UID, Phone: account, }); err != nil { return nil, errs.DatabaseErrorWithScope( code.CloudEPMember, domain.FailedToCheckVerifyCodeErrorCode, "failed to bind phone", err.Error()) } } // 更新帳戶狀態 _, err = l.svcCtx.MemberRPC.UpdateStatus(l.ctx, &memberProto.UpdateStatusReq{ Uid: req.UID, Status: memberProto.MemberStatus(member.AccountStatusActive), }) if err != nil { return nil, errs.DatabaseErrorWithScope( code.CloudEPMember, domain.FailedToCheckVerifyCodeErrorCode, "failed to update status", err.Error()) } // 最後刪除驗證碼 if _, err := l.svcCtx.MemberRPC.VerifyRefreshCode(l.ctx, &memberProto.VerifyRefreshCodeReq{ VerifyCode: req.VerifyCode, Account: account, CodeType: int32(ct), }); err != nil { return nil, errs.Forbidden("failed to get verify code").Wrap(err) } return &types.RespOK{}, nil }