Skip to content

Utilitas standar untuk validasi lengkap dan mudah digunakan

Notifications You must be signed in to change notification settings

gogaruda/valigo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

valigo

valigo(Validation Go Lang) adalah modul validasi input berbasis go-playground/validator yang dirancang khusus untuk aplikasi backend Go (Gin).
Modul ini menyederhanakan validasi request JSON, memberikan error yang user friendly, serta mendukung validasi custom dan pelacakan input sebelumnya (old).


🚀 Fitur Utama

  • Validasi otomatis input JSON (ValigoJSON)
  • Validasi logika bisnis (ValigoBusiness)
  • Error message dalam Bahasa Indonesia
  • Mendukung Sanitizable untuk old input
  • Mendukung custom validator tag
  • Bisa di-inject ke handler controller

📦 Instalasi

go get github.com/gogaruda/valigo@v1.0.2

📁 Struktur

valigo/
├── valigo.go                 # Fungsi utama validasi
├── message.go                # Pesan error terstruktur
├── reflect_helper.go         # Ambil nama field dari tag JSON

⚙️ Inisialisasi

Default (tanpa custom validator)

import "github.com/your-org/valigo"

valigo := valigo.NewValigo()

Custom (dengan validator buatan sendiri)

v := validator.New()
v.RegisterValidation("even", func(fl validator.FieldLevel) bool {
	num := fl.Field().Int()
	return num%2 == 0
})

valigo := valigo.NewCustomValigo(v)

Contoh Penggunaan

Struct Input

type RegisterInput struct {
	Email    string `json:"email" validate:"required,email"`
	Password string `json:"password" validate:"required,min=6"`
	Age      int    `json:"age" validate:"required,even"`
}

func (r *RegisterInput) Sanitize() map[string]any {
	return map[string]any{
		"email": r.Email,
		"age":   r.Age,
	}
}

Handler

func (h *UserHandler) Register(c *gin.Context) {
	var input RegisterInput
	if !h.valigo.ValigoJSON(c, &input) {
		return
	}

	// lanjut proses register
}

Validasi Business

errMap := map[string]string{
	"email": "Email sudah digunakan",
}

if !h.valigo.ValigoBusiness(c, input, errMap) {
	return
}

Contoh Response JSON

{
  "code": 400,
  "status": "error",
  "message": "Validasi gagal",
  "errors": {
    "email": "Kolom email harus berupa email yang valid",
    "age": "Kolom age harus berupa angka genap"
  },
  "old": {
    "email": "user@example.com",
    "age": 31
  }
}

Menambahkan Custom Validator

v := validator.New()

v.RegisterValidation("even", func(fl validator.FieldLevel) bool {
	return fl.Field().Int()%2 == 0
})

Lalu gunakan di tag:

Age int `validate:"required,even"`

Tips

  • Gunakan Sanitizable agar input lama dikirim kembali saat error
  • Pisahkan error: validasi teknis (ValigoJSON) dan bisnis (ValigoBusiness)
  • Inject valigo.Valigo ke semua handler controller

Dependensi