From 20a05ea1957d906c688c9db45a98cf65e3352f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=80=A7=E9=A9=8A?= Date: Sun, 9 Nov 2025 17:27:08 +0800 Subject: [PATCH] fix: submit verification code --- generate/api/member.api | 1 + .../user/submit_verification_code_logic.go | 54 +++++++++++++++---- internal/types/types.go | 1 + 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/generate/api/member.api b/generate/api/member.api index a4aa893..9c05241 100644 --- a/generate/api/member.api +++ b/generate/api/member.api @@ -134,6 +134,7 @@ type ( // SubmitVerificationCodeReq 提交驗證碼以完成驗證 SubmitVerificationCodeReq { + Account string `json:"account" validate:"required` Purpose string `json:"purpose" validate:"required,oneof=email_verification phone_verification"` VerifyCode string `json:"verify_code" validate:"required,len=6"` Authorization diff --git a/internal/logic/user/submit_verification_code_logic.go b/internal/logic/user/submit_verification_code_logic.go index 0adb44c..017e6bf 100644 --- a/internal/logic/user/submit_verification_code_logic.go +++ b/internal/logic/user/submit_verification_code_logic.go @@ -28,31 +28,65 @@ func NewSubmitVerificationCodeLogic(ctx context.Context, svcCtx *svc.ServiceCont } func (l *SubmitVerificationCodeLogic) SubmitVerificationCode(req *types.SubmitVerificationCodeReq) (*types.RespOK, error) { - var ct mbr.GenerateCodeType + acc := "" + ct := mbr.GenerateCodeTypeEmail switch req.Purpose { case "email_verification": - ct = mbr.GenerateCodeTypeEmail + if !isValidEmail(req.Account) { + return nil, errs.InputInvalidFormatError("email is invalid") + } + acc = req.Account case "phone_verification": + phone, isPhone := normalizeTaiwanMobile(req.Account) + if !isPhone { + return nil, errs.InputInvalidFormatError("phone number is invalid") + } + acc = phone ct = mbr.GenerateCodeTypePhone default: - return &types.RespOK{}, errs.InputInvalidRangeError("failed to get correct verification type") - } - - info, err := l.svcCtx.AccountUC.GetUserAccountInfo(l.ctx, member.GetUIDByAccountRequest{Account: token.LoginID(l.ctx)}) - if err != nil { - return nil, err + return &types.RespOK{}, errs.InputInvalidRangeError("") } // 先驗證,不刪除 - if err = l.svcCtx.AccountUC.CheckRefreshCode(l.ctx, member.VerifyRefreshCodeRequest{ + if err := l.svcCtx.AccountUC.CheckRefreshCode(l.ctx, member.VerifyRefreshCodeRequest{ VerifyCode: req.VerifyCode, - LoginID: info.Data.LoginID, + LoginID: acc, CodeType: ct, }); err != nil { e := errs.AuthForbiddenError("failed to get verify code").Wrap(err) return nil, e } + uid := token.UID(l.ctx) + switch req.Purpose { + case "email_verification": + err := l.svcCtx.AccountUC.BindVerifyEmail(l.ctx, uid, acc) + if err != nil { + return nil, err + } + case "phone_verification": + err := l.svcCtx.AccountUC.BindVerifyPhone(l.ctx, uid, acc) + if err != nil { + return nil, err + } + default: + return &types.RespOK{}, errs.InputInvalidRangeError("") + } + + err := l.svcCtx.AccountUC.UpdateStatus(l.ctx, member.UpdateStatusRequest{ + UID: uid, + Status: mbr.AccountStatusActive, + }) + if err != nil { + return nil, err + } + + // 真的刪除 + _ = l.svcCtx.AccountUC.VerifyRefreshCode(l.ctx, member.VerifyRefreshCodeRequest{ + VerifyCode: req.VerifyCode, + LoginID: acc, + CodeType: ct, + }) return &types.RespOK{}, nil } diff --git a/internal/types/types.go b/internal/types/types.go index 8517317..c74ede7 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -105,6 +105,7 @@ type RespOK struct { } type SubmitVerificationCodeReq struct { + Account string `json:"account" validate:"required` Purpose string `json:"purpose" validate:"required,oneof=email_verification phone_verification"` VerifyCode string `json:"verify_code" validate:"required,len=6"` Authorization