Files
juwan-backend/app/email/api/internal/logic/email/sendVerificationCodeLogic.go
T

80 lines
2.0 KiB
Go

// Code scaffolded by goctl. Safe to edit.
// goctl 1.9.2
package email
import (
"context"
"encoding/json"
"fmt"
"time"
"juwan-backend/app/email/api/internal/svc"
"juwan-backend/app/email/api/internal/types"
"juwan-backend/app/email/api/internal/utils"
"github.com/google/uuid"
"github.com/zeromicro/go-zero/core/logx"
)
type SendVerificationCodeLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// 发送邮箱验证码
func NewSendVerificationCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendVerificationCodeLogic {
return &SendVerificationCodeLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *SendVerificationCodeLogic) SendVerificationCode(req *types.SendVerificationCodeReq) (resp *types.SendVerificationCodeResp, err error) {
if l.svcCtx.RedisCluster == nil {
return nil, fmt.Errorf("redis not configured")
}
if l.svcCtx.EmailPusher == nil {
return nil, fmt.Errorf("kafka pusher not configured")
}
code := utils.GenCode()
requestID := uuid.NewString()
redisKey := fmt.Sprintf("%s:%s:%s", req.Email, code, req.Email)
if exists, getErr := l.svcCtx.RedisCluster.Get(l.ctx, redisKey).Result(); getErr == nil && exists != "" {
return nil, fmt.Errorf("verification code already sent, please wait before requesting a new one")
}
if setErr := l.svcCtx.RedisCluster.Set(l.ctx, redisKey, req.Scene, 60*time.Second).Err(); setErr != nil {
return nil, setErr
}
payload := map[string]any{
"type": "verification_code",
"requestId": requestID,
"email": req.Email,
"scene": req.Scene,
"code": code,
"expireIn": 60,
}
messageBytes, marshalErr := json.Marshal(payload)
if marshalErr != nil {
return nil, marshalErr
}
if pushErr := l.svcCtx.EmailPusher.PushWithKey(l.ctx, req.Email, string(messageBytes)); pushErr != nil {
return nil, pushErr
}
resp = &types.SendVerificationCodeResp{
RequestId: requestID,
ExpireInSec: 60,
Message: "verification code send task submitted",
}
return
}