Spaces:
Running
Running
| package utils | |
| import ( | |
| "errors" | |
| "abdanhafidz.com/go-boilerplate/models/dto" | |
| http_error "abdanhafidz.com/go-boilerplate/models/error" | |
| "github.com/gin-gonic/gin" | |
| "gorm.io/gorm" | |
| ) | |
| func ResponseOK[Tdata any, TMetaData any](c *gin.Context, metaData TMetaData, data Tdata) { | |
| c.JSON(200, dto.SuccessResponse[Tdata]{ | |
| Status: "success", | |
| Data: data, | |
| Message: "Data retrieved Successfully!", | |
| MetaData: metaData, | |
| }) | |
| } | |
| func ResponseFAILED[TMetaData any](c *gin.Context, metaData TMetaData, err error) { | |
| if errors.Is(err, http_error.BAD_REQUEST_ERROR) { | |
| c.JSON(400, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "Invalid request format!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.MAILGUN_CONFIG_ERROR) || errors.Is(err, http_error.SEND_EMAIL_FAILED) { | |
| c.JSON(500, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: err.Error(), | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.INTERNAL_SERVER_ERROR) || errors.Is(err, gorm.ErrInvalidField) || errors.Is(err, gorm.ErrInvalidData) || errors.Is(err, gorm.ErrInvalidValue) { | |
| c.JSON(500, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "Internal Server Error!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.UNAUTHORIZED) || errors.Is(err, http_error.INVALID_TOKEN) { | |
| c.JSON(401, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "Unauthorized, you don't have permission to access this service!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.PAYMENT_REQUIRED) { | |
| c.JSON(402, dto.SuccessResponse[TMetaData]{ | |
| Status: "action_required", | |
| Data: metaData, | |
| Message: http_error.PAYMENT_REQUIRED.Error(), | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.NOT_FOUND_ERROR) || errors.Is(err, http_error.DATA_NOT_FOUND) || errors.Is(err, gorm.ErrRecordNotFound) { | |
| c.JSON(404, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "There is not data with given credential / given parameter!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.DUPLICATE_DATA) || errors.Is(err, gorm.ErrDuplicatedKey) { | |
| c.JSON(409, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "Data already exists, duplicated key not allowed!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.TIMEOUT) { | |
| c.JSON(504, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: "Server took to long to respond!", | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.FORBIDDEN_ERROR) || errors.Is(err, http_error.INVALID_CODE) || errors.Is(err, http_error.EMAIL_NOT_VERIFIED) { | |
| c.JSON(403, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: err.Error(), | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else if errors.Is(err, http_error.EVENT_START_DATE_IN_PAST) || | |
| errors.Is(err, http_error.EVENT_START_DATE_INVALID) || | |
| errors.Is(err, http_error.EVENT_END_DATE_INVALID) || | |
| errors.Is(err, http_error.INVALID_DATE_FORMAT) { | |
| c.JSON(400, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: err.Error(), | |
| MetaData: metaData, | |
| }) | |
| return | |
| } else { | |
| c.JSON(500, dto.ErrorResponse{ | |
| Status: "error", | |
| Error: err.Error(), | |
| Message: err.Error(), | |
| MetaData: metaData, | |
| }) | |
| return | |
| } | |
| } | |
| 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 | |
| } else { | |
| ResponseOK(c, metaData, data) | |
| c.Abort() | |
| return | |
| } | |
| } | |
| } | |