For the complete documentation index, see llms.txt. This page is also available as Markdown.

Validation

Salah satu prinsip keamanan paling dasar dalam pengembangan API adalah: jangan pernah percaya input dari client. Setiap data yang masuk harus divalidasi sebelum diproses.

Validasi terdiri dari dua jenis:

  1. Input validation – Memeriksa format data (email, panjang string, required, dll)

  2. Business validation – Memeriksa aturan bisnis (apakah user sudah exist, stok cukup, dll)

Bab ini akan fokus pada input validation menggunakan library go-playground/validator/v10.

📂 Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

🔗 github.com/jacky-htg/workshop/tree/main/15-validation

15.1 Jenis Validasi yang Dibutuhkan

Untuk endpoint User, kita memiliki aturan validasi berikut:

Field
Aturan
Pesan Error

name

Required, min 3 karakter, max 100

"Name is required / too short / too long"

username

Required, min 3 karakter, max 50

"Username is required / too short / too long"

password

Required, min 10 karakter

"Password is required / too short"

email

Required, format email

"Email is required / must be valid"

15.2 Menambahkan Tag Validator ke DTO

Update DTO dengan menambahkan tag validate:

// internal/dto/user_request.go
package dto

import (
	"workshop/internal/model"
)

type UserRequest struct {
	Name     string `json:"name" validate:"required,min=3,max=100"`
	Username string `json:"username" validate:"required,min=3,max=50"`
	Password string `json:"password" validate:"required,min=10"`
	Email    string `json:"email" validate:"required,email"`
	IsActive bool   `json:"is_active"`
}

func (u *UserRequest) Transform(user *model.User) {
	user.Name = u.Name
	user.Username = u.Username
	user.Password = u.Password
	user.Email = u.Email
	user.IsActive = u.IsActive
}

type UserUpdateRequest struct {
	Name     string `json:"name"  validate:"required,min=3,max=100"`
	IsActive bool   `json:"is_active"`
}

func (u *UserUpdateRequest) Transform(user *model.User) {
	user.Name = u.Name
	user.IsActive = u.IsActive
}

15.3 Validator Instance (Singleton via Dependency Injection)

Validator v10 memiliki cache untuk struktur yang divalidasi. Sebaiknya instance-nya dibuat sekali dan di-inject ke handler:

15.4 Helper untuk Format Error Validation

Validator mengembalikan error dengan tipe validator.ValidationErrors yang berisi banyak field error. Kita buat helper untuk mengubahnya menjadi map yang lebih ramah client:

15.5 Update Response untuk Mendukung Multiple Error

Response perlu menampung multiple error messages. Ubah SetError untuk menerima parameter data any:

15.6 Implementasi Validasi di Handler

Validasi dilakukan di handler layer (bukan service) karena:

  • Validasi format input tidak memerlukan logika bisnis

  • Service tetap fokus pada aturan bisnis

15.7 Update Routing untuk Inject Validator

15.8 Update Server Main

15.9 Contoh Response Validasi Error

Ketika client mengirim request dengan data tidak valid:

Request (password terlalu pendek):

Response :

Contoh error multiple field :

15.10 Ringkasan Validasi Berdasarkan Layer

Layer
Jenis Validasi
Contoh

Handler

Input validation

Required, min, max, email format

Service

Business validation

User already exists, stock cukup, status aktif

Repository

Data integrity

Tidak ada validasi di sini

Ringkasan Bab 15

Di bab ini kita telah belajar:

Konsep
Implementasi

Validation library

go-playground/validator/v10

Validation tags

validate:"required,min=3,email"

Single validator instance

Di bootstrap, di-inject ke handler

Error formatter

FormatValidationErrors() untuk multiple errors

Response enhancement

SetError sekarang support data any untuk detail error

Manfaat yang kita peroleh:

  • ✅ Input terjamin valid sebelum diproses

  • ✅ Client mendapat feedback spesifik field mana yang error

  • ✅ Multiple error dalam satu response

  • ✅ Separation of concerns: handler urus format, service urus logika

Yang akan datang:

  • Saat ini belum ada autentikasi

  • Bab selanjutnya: Middleware – membangun pipeline untuk logging, auth, recovery, dll

Last updated