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