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() }