Package for conversation different request forms to Service layer DTO (Data Transfer Object).
Structure tags (default dto
) available for linking fields with different names in source or destination structure, also snake_case tags will be assigned to CamelCase.
For example:
type SignUpStep1Form struct {
Firstname string `json:"firstname" validate:"attr=firstname,min=1,max=50" dto:"name"`
Lastname string `json:"lastname" validate:"attr=lastname,max=50"`
}
type SignUpStep2Form struct {
Username string `json:"username" validate:"attr=username,min=3,max=32"`
Email string `json:"email" validate:"attr=email,email" dto:"contact_email"`
}
type SignUpDTO struct {
Name string
Lastname string
Path string `dto:"username"`
ContactEmail string
}
formDTO := SignUpDTO{}
err := dto.RequestToDTO(&formDTO, &requestStep1, &requestStep2)
Controller
package controllers
import (
"github.com/censync/go-api-structure/service"
"github.com/censync/go-dto"
"github.com/censync/go-validator"
"github.com/gin-gonic/gin"
)
// Input JSON form with validation rules
type SignUpForm struct {
Username string `json:"username" validate:"attr=username,min=3,max=32"`
Firstname string `json:"firstname" validate:"attr=firstname,min=1,max=50"`
Lastname string `json:"lastname" validate:"attr=lastname,max=50"`
Email string `json:"email" validate:"attr=email,email"`
}
type SignUpDTO struct {
Username string
Firstname string
Lastname string
Email string
}
func TestMethod(ctx *gin.Context) {
request := SignUpForm{}
ctx.BindJSON(&request)
errs := validator.Validate(&request)
if !errs.IsEmpty() {
ctx.JSON(400, errs)
return
}
formDTO := SignUpDTO{}
err := dto.RequestToDTO(&formDTO, &request)
if err != nil {
ctx.JSON(400, map[string]string{
"error": err.Error(),
})
return
}
err = service.AppService().SignUp(&formDTO)
if err != nil {
ctx.JSON(400, map[string]string{
"error": err.Error(),
})
return
}
ctx.Status(200)
return
}
Service
func (s *Service) SignUp(dto *SignUpDTO) error {
// Process user sign up
}