Appearance
バリデーション実装
リクエストパラメータのバリデーションを実装します。
cf.
- https://echo.labstack.com/guide/request/#validate-data
- https://pkg.go.dev/github.com/go-playground/validator/v10
事前準備
validatorパッケージをインストールします:
shell
go get github.com/go-playground/validator/v10実装
下記以外は標準ライブラリ使用時の実装に従います。
internal/validation
バリデータを実装します。
validator.go
go
package validation
import (
"github.com/go-playground/validator/v10"
)
type CustomValidator struct {
validator *validator.Validate
}
func NewCustomValidator() *CustomValidator {
return &CustomValidator{validator: validator.New()}
}
func (cv *CustomValidator) Validate(i any) error {
if err := cv.validator.Struct(i); err != nil {
return err
}
return nil
}internal/bootstrap/
server.go
バリデータを初期化するため下記を宣言します:
go
e := echo.New()
e.Validator = validation.NewCustomValidator()internal/presentation/handler/model
validateタグを用いてバリデーションを宣言し、c.Validateで値の検証を行います。
user_model.go
go
type loginRequest struct {
Name string `json:"name" example:"nob"` // ユーザ名
Password string `json:"password" example:"passwd" validate:"required"` // パスワード
}
func NewLoginRequest(c *echo.Context) (loginRequest, error) {
req := new(loginRequest)
if err := c.Bind(req); err != nil {
return loginRequest{}, errors.New("invalid request")
}
if err := c.Validate(req); err != nil {
return loginRequest{}, apperrors.NewValidationError(err)
}
return *req, nil
}internal/presentation/handler
NewLoginRequestからバリデーションエラーが返ってきた場合、そのエラーをAPIレスポンスとして返します。
user_handler.go
go
req, err := model.NewLoginRequest(c)
if err != nil {
return c.JSON(httperror.ToHttpErrorResponse(err))
}