GCW-SiTukang / utils /response_util.go
Ryu2804
Deploy files from GitHub repository
fc1e49b
Raw
History Blame Contribute Delete
3.39 kB
package utils
import (
"errors"
"net/http"
dto "situkang/models/dto"
http_error "situkang/models/error"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
func JSONSuccess[TData any](c *gin.Context, status int, message string, data TData, meta any) {
c.JSON(status, dto.SuccessResponse[TData]{
Status: "success",
Message: message,
Data: data,
Meta: meta,
})
}
func JSONError(c *gin.Context, status int, code string, message string, fieldErrors []dto.FieldError) {
c.JSON(status, dto.ErrorResponse{
Status: "error",
Message: message,
ErrorCode: code,
Errors: fieldErrors,
})
}
func ResponseOK[Tdata any, TMetaData any](c *gin.Context, metaData TMetaData, data Tdata) {
JSONSuccess(c, http.StatusOK, "", data, metaData)
}
func ResponseFAILED(c *gin.Context, metaData any, err error) {
status, code, message := resolveError(err)
JSONError(c, status, code, message, nil)
}
func SendResponse[Tdata any, TMetaData any](c *gin.Context, metaData TMetaData, data Tdata, err error) {
if !c.IsAborted() {
if err != nil {
ResponseFAILED(c, metaData, err)
c.Abort()
return
}
ResponseOK(c, metaData, data)
c.Abort()
return
}
}
func resolveError(err error) (int, string, string) {
if errors.Is(err, http_error.BAD_REQUEST_ERROR) {
return http.StatusBadRequest, "VALIDATION_ERROR", "Invalid request format"
}
if errors.Is(err, http_error.VALIDATION_ERROR) {
return http.StatusBadRequest, "VALIDATION_ERROR", err.Error()
}
if errors.Is(err, http_error.UNAUTHORIZED) {
return http.StatusUnauthorized, "UNAUTHORIZED", "Unauthorized"
}
if errors.Is(err, http_error.INVALID_CREDENTIALS) || errors.Is(err, http_error.WRONG_PASSWORD) {
return http.StatusUnauthorized, "INVALID_CREDENTIALS", "Email atau password salah"
}
if errors.Is(err, http_error.FORBIDDEN) {
return http.StatusForbidden, "FORBIDDEN", "Forbidden"
}
if errors.Is(err, http_error.DATA_NOT_FOUND) || errors.Is(err, gorm.ErrRecordNotFound) {
return http.StatusNotFound, "NOT_FOUND", "Resource not found"
}
if errors.Is(err, http_error.EMAIL_ALREADY_EXISTS) {
return http.StatusConflict, "EMAIL_ALREADY_EXISTS", "Email sudah terdaftar"
}
if errors.Is(err, http_error.PHONE_ALREADY_EXISTS) {
return http.StatusConflict, "PHONE_ALREADY_EXISTS", "Nomor telepon sudah terdaftar"
}
if errors.Is(err, http_error.DUPLICATE_DATA) {
return http.StatusConflict, "DUPLICATE_DATA", "Duplicate resource"
}
if errors.Is(err, http_error.INSUFFICIENT_BALANCE) {
return http.StatusUnprocessableEntity, "INSUFFICIENT_BALANCE", "Saldo tidak mencukupi"
}
if errors.Is(err, http_error.INVALID_STATUS_TRANSITION) {
return http.StatusUnprocessableEntity, "INVALID_STATUS_TRANSITION", "Transisi status tidak valid"
}
if errors.Is(err, http_error.CANCEL_NOT_ALLOWED) {
return http.StatusUnprocessableEntity, "CANCEL_NOT_ALLOWED", "Pesanan tidak dapat dibatalkan karena worker sudah tiba di lokasi"
}
if errors.Is(err, http_error.TIMEOUT) {
return http.StatusGatewayTimeout, "TIMEOUT", "Request timed out"
}
if errors.Is(err, http_error.NOT_IMPLEMENTED) {
return http.StatusNotImplemented, "NOT_IMPLEMENTED", "Endpoint not implemented"
}
if errors.Is(err, http_error.INTERNAL_SERVER_ERROR) {
return http.StatusInternalServerError, "INTERNAL_ERROR", "Internal server error"
}
return http.StatusInternalServerError, "INTERNAL_ERROR", err.Error()
}