Files
platform/web/handlers/verifier.go

86 lines
1.8 KiB
Go
Raw Normal View History

2025-03-18 17:57:07 +08:00
package handlers
import (
"errors"
"platform/pkg/env"
"platform/web/auth"
2025-03-18 17:57:07 +08:00
"platform/web/services"
2026-04-15 16:56:24 +08:00
s "platform/web/services"
2025-03-18 17:57:07 +08:00
"regexp"
"strconv"
"github.com/gofiber/fiber/v2"
"github.com/redis/go-redis/v9"
2025-03-18 17:57:07 +08:00
)
type VerifierReq struct {
2026-04-15 16:56:24 +08:00
Purpose s.VerifierSmsPurpose `json:"purpose"`
Phone string `json:"phone"`
2025-03-18 17:57:07 +08:00
}
2026-04-15 16:56:24 +08:00
func SendSmsCode(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitOfficialClient()
if err != nil {
return err
}
2025-03-18 17:57:07 +08:00
// 解析请求参数
req := new(VerifierReq)
if err := c.BodyParser(req); err != nil {
return err
}
match, err := regexp.MatchString(`^1[3-9]\d{9}$`, req.Phone)
if err != nil {
return err
}
if !match {
return fiber.NewError(fiber.StatusBadRequest, "手机号格式错误")
}
// 发送身份验证码
2026-04-15 16:56:24 +08:00
err = s.Verifier.SendSms(c.Context(), req.Phone, req.Purpose)
2025-03-18 17:57:07 +08:00
if err != nil {
2026-04-15 16:56:24 +08:00
var sErr s.VerifierServiceSendLimitErr
2025-03-18 17:57:07 +08:00
if errors.As(err, &sErr) {
return fiber.NewError(fiber.StatusTooManyRequests, strconv.Itoa(int(sErr)))
}
return err
}
// 发送成功
return nil
}
2026-04-15 16:56:24 +08:00
func SendSmsCodeForPassword(c *fiber.Ctx) error {
ac, err := auth.GetAuthCtx(c).PermitUser()
if err != nil {
return err
}
if err := s.Verifier.SendSms(c.Context(), ac.User.Phone, s.VerifierSmsPurposePassword); err != nil {
var sErr s.VerifierServiceSendLimitErr
if errors.As(err, &sErr) {
return fiber.NewError(fiber.StatusTooManyRequests, strconv.Itoa(int(sErr)))
}
return err
}
return nil
}
func DebugGetSmsCode(c *fiber.Ctx) error {
if env.RunMode != env.RunModeDev {
return fiber.NewError(fiber.StatusForbidden, "not allowed")
}
code, err := services.Verifier.GetSms(c.Context(), c.Params("phone"))
if err != nil {
if errors.Is(err, redis.Nil) {
return c.SendString("还没有验证码")
}
return err
}
return c.SendString(code)
}