Response Helpers
Dokumentasi struct dan helper functions untuk standardisasi API response.
Response Structs
Response (Basic)
Struct dasar untuk semua API response dengan pagination.
type Response struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
Info Info `json:"info"`
Data interface{} `json:"data,omitempty"`
}
Contoh Response:
{
"code": 200,
"status": true,
"message": "Data retrieved successfully",
"info": {
"page": 1,
"perPage": 10,
"totalPages": 5,
"totalData": 50
},
"data": [...]
}
Info
Struct untuk informasi pagination.
type Info struct {
Page int `json:"page,omitempty"`
PerPage int `json:"perPage,omitempty"`
TotalPages int `json:"totalPages,omitempty"`
TotalData int `json:"totalData,omitempty"`
}
ResponseError
Struct untuk error response tanpa data dan info.
type ResponseError struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
}
Contoh:
{
"code": 400,
"status": false,
"message": "Invalid request body"
}
AuthResponse
Struct khusus untuk response authentication (tanpa info pagination).
type AuthResponse struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
Data interface{} `json:"data,omitempty"`
}
Generic Response Structs
ResponseData[T]
Typed response dengan Go generics untuk type safety.
type ResponseData[T any] struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
Info Info `json:"info"`
Data T `json:"data,omitempty"`
}
Penggunaan:
// Untuk single data
var response ResponseData[models.Pengguna]
// Untuk array data
var response ResponseData[[]models.Pengguna]
ResponseDataCustomInfo[T, I]
Response dengan custom info structure.
type ResponseDataCustomInfo[T any, I any] struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
Info I `json:"info"`
Data T `json:"data,omitempty"`
}
Penggunaan:
type CustomInfo struct {
Page int `json:"page"`
TotalData int `json:"totalData"`
ExtraField string `json:"extraField"`
}
var response ResponseDataCustomInfo[[]User, CustomInfo]
ResponseDataUpsert[T]
Response untuk operasi create/update tanpa pagination info.
type ResponseDataUpsert[T any] struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
Data T `json:"data,omitempty"`
}
Helper Functions
SendError
Mengirim error response ke client.
func SendError(ctx *gin.Context, err error)
Penggunaan:
func GetUser(ctx *gin.Context) {
user, err := repository.GetById(id)
if err != nil {
helpers.SendError(ctx, helpers.NewNotFound("User not found"))
return
}
// ...
}
Behavior:
- Jika error adalah
*ResponseError, gunakan code dari error - Jika error biasa, return HTTP 500 Internal Server Error
Best Practices
-
Gunakan Generic Types untuk type safety
// ✅ Good
var response helpers.ResponseData[models.User]
// ❌ Avoid
var response helpers.Response
response.Data = user // interface{} - no type safety -
Konsisten dengan Response Format
- Success:
code: 200/201,status: true - Error:
code: 4xx/5xx,status: false
- Success:
-
Selalu Sertakan Message yang Informatif
// ✅ Good
Message: "Pengguna dengan NoPegawai 12345 tidak ditemukan"
// ❌ Avoid
Message: "Error"