Skip to main content

Error Helpers

Dokumentasi error handling dan factory functions.

ResponseError​

ResponseError adalah custom error type yang mengimplementasikan interface error.

type ResponseError struct {
Code int `json:"code"`
Status bool `json:"status"`
Message string `json:"message"`
}

func (e *ResponseError) Error() string {
return e.Message
}

Factory Functions​

NewBadRequest​

Membuat error HTTP 400 Bad Request.

func NewBadRequest(message string) *ResponseError

Penggunaan:

if req.Email == "" {
return helpers.NewBadRequest("Email is required")
}

Response:

{
"code": 400,
"status": false,
"message": "Email is required"
}

NewUnauthorized​

Membuat error HTTP 401 Unauthorized.

func NewUnauthorized(message string) *ResponseError

Penggunaan:

if !isValidToken {
return helpers.NewUnauthorized("Invalid or expired token")
}

Response:

{
"code": 401,
"status": false,
"message": "Invalid or expired token"
}

NewNotFound​

Membuat error HTTP 404 Not Found.

func NewNotFound(message string) *ResponseError

Penggunaan:

user, err := repository.GetById(id)
if err != nil {
return helpers.NewNotFound("User not found")
}

Response:

{
"code": 404,
"status": false,
"message": "User not found"
}

NewInternalError​

Membuat error HTTP 500 Internal Server Error.

func NewInternalError(message string) *ResponseError

Penggunaan:

if err := db.Save(model); err != nil {
return helpers.NewInternalError("Failed to save data")
}

Response:

{
"code": 500,
"status": false,
"message": "Failed to save data"
}

Usage dengan SendError​

func CreateUser(ctx *gin.Context) {
var req dto.UserCreateRequest

// Binding error
if err := ctx.ShouldBindJSON(&req); err != nil {
helpers.SendError(ctx, helpers.NewBadRequest("Invalid request body"))
return
}

// Validation error
if req.Email == "" {
helpers.SendError(ctx, helpers.NewBadRequest("Email is required"))
return
}

// Business logic error
if exists := repository.CheckByEmail(req.Email); exists {
helpers.SendError(ctx, helpers.NewBadRequest("Email already registered"))
return
}

// Database error
if err := repository.Save(&user); err != nil {
helpers.SendError(ctx, helpers.NewInternalError("Failed to create user"))
return
}

// Success
ctx.JSON(http.StatusCreated, helpers.ResponseDataUpsert[models.User]{
Code: http.StatusCreated,
Status: true,
Message: "User created successfully",
Data: user,
})
}

HTTP Status Code Reference​

Status CodeFactory FunctionUse Case
400NewBadRequestInvalid input, validation error
401NewUnauthorizedAuthentication failed, invalid token
404NewNotFoundResource not found
500NewInternalErrorServer error, database error

Best Practices​

  1. Gunakan Factory Function yang Sesuai

    // ✅ Correct
    helpers.NewNotFound("User not found")

    // ❌ Incorrect
    helpers.NewBadRequest("User not found")
  2. Message yang Informatif

    // ✅ Good
    helpers.NewNotFound(fmt.Sprintf("User with ID %s not found", id))

    // ❌ Avoid
    helpers.NewNotFound("Not found")
  3. Jangan Expose Internal Error ke Client

    // ✅ Good - Generic message ke client, log detail ke server
    logger.Errorf("Database error: %v", err)
    helpers.NewInternalError("Failed to process request")

    // ❌ Avoid - Expose database error
    helpers.NewInternalError(err.Error())