feat: add validate for user signup
This commit is contained in:
parent
344485d082
commit
ba8570857d
@ -93,7 +93,7 @@ components:
|
||||
properties:
|
||||
code:
|
||||
type: string
|
||||
example: FailedOperation.UserAlreadyExists
|
||||
example: FailedOperation.UserExisted
|
||||
message:
|
||||
type: string
|
||||
example: "User already exists."
|
||||
example: "Email already existed."
|
||||
|
1
go.mod
1
go.mod
@ -3,6 +3,7 @@ module git.vinchent.xyz/vinchent/howmuch
|
||||
go 1.23.1
|
||||
|
||||
require (
|
||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2
|
||||
github.com/fsnotify/fsnotify v1.7.0
|
||||
github.com/gin-contrib/cors v1.7.2
|
||||
github.com/gin-gonic/gin v1.10.0
|
||||
|
2
go.sum
2
go.sum
@ -1,3 +1,5 @@
|
||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
|
||||
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
|
||||
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
|
||||
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
|
||||
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
|
||||
|
@ -29,6 +29,7 @@ import (
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/usecase/usecase"
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/pkg/core"
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/pkg/errno"
|
||||
"github.com/asaskevich/govalidator"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
@ -66,9 +67,15 @@ func (uc *UserController) Signup(ctx core.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
// TODO: check params validity (govalidator)
|
||||
_, err := govalidator.ValidateStruct(params)
|
||||
if err != nil {
|
||||
errno := UserParamsErr
|
||||
errno.Message = err.Error()
|
||||
core.WriteResponse(ctx, errno, nil)
|
||||
return
|
||||
}
|
||||
|
||||
_, err := uc.userUsecase.Create(ctx, ¶ms)
|
||||
_, err = uc.userUsecase.Create(ctx, ¶ms)
|
||||
if err != nil {
|
||||
core.WriteResponse(ctx, err, nil)
|
||||
return
|
||||
|
@ -27,10 +27,10 @@ import "time"
|
||||
// User model
|
||||
type User struct {
|
||||
ID int `json:"id"`
|
||||
Email string `json:"email"`
|
||||
FirstName string `json:"first_name"`
|
||||
LastName string `json:"last_name"`
|
||||
Password string `json:"password"`
|
||||
Email string `json:"email" valid:"email"`
|
||||
FirstName string `json:"first_name" valid:"required"`
|
||||
LastName string `json:"last_name" valid:"required"`
|
||||
Password string `json:"password" valid:"required"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
@ -25,12 +25,21 @@ package usecase
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"regexp"
|
||||
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/model"
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/howmuch/usecase/repo"
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/pkg/errno"
|
||||
"git.vinchent.xyz/vinchent/howmuch/internal/pkg/log"
|
||||
)
|
||||
|
||||
var UserExisted = &errno.Errno{
|
||||
HTTP: http.StatusBadRequest,
|
||||
Code: errno.ErrorCode(errno.FailedOperationCode, "UserExisted"),
|
||||
Message: "email already existed.",
|
||||
}
|
||||
|
||||
type userUsecase struct {
|
||||
userRepo repo.UserRepository
|
||||
dbRepo repo.DBRepository
|
||||
@ -51,12 +60,12 @@ func (uuc *userUsecase) Create(ctx context.Context, u *model.User) (*model.User,
|
||||
data, err := uuc.dbRepo.Transaction(
|
||||
ctx,
|
||||
func(txCtx context.Context, tx interface{}) (interface{}, error) {
|
||||
// TODO: should check if the user exists
|
||||
// DB will return an error since we have set email to UNIQUE.
|
||||
// But we may not want to expose the exact db error.
|
||||
|
||||
u, err := uuc.userRepo.Create(txCtx, tx, u)
|
||||
if err != nil {
|
||||
match, _ := regexp.MatchString("SQLSTATE 23505", err.Error())
|
||||
if match {
|
||||
return nil, UserExisted
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user