Spaces:
Runtime error
Runtime error
File size: 3,668 Bytes
d834a80 7a9f9c6 d834a80 44c4b7e d834a80 ca18868 d834a80 44c4b7e d834a80 44c4b7e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | package utils
import (
"errors"
dto "whatsapp-backend/models/dto"
http_error "whatsapp-backend/models/error"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"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,
Message: "Invalid request format!",
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.INTERNAL_SERVER_ERROR) {
c.JSON(500, dto.ErrorResponse{
Status: "error",
Error: err,
Message: "Internal Server Error!",
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.UNAUTHORIZED) {
c.JSON(401, dto.ErrorResponse{
Status: "error",
Error: err,
Message: "Unauthorized, you don't have permission to access this service!",
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.DATA_NOT_FOUND) || errors.Is(err, gorm.ErrRecordNotFound) {
c.JSON(404, dto.ErrorResponse{
Status: "error",
Error: err,
Message: "There is not data with given credential / given parameter!",
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.TIMEOUT) {
c.JSON(504, dto.ErrorResponse{
Status: "error",
Error: err,
Message: "Server took to long to respond!",
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.FORBIDDEN) || errors.Is(err, http_error.ERR_INVALID_CSRF) {
c.JSON(403, dto.ErrorResponse{
Status: "error",
Error: err,
Message: "Forbidden action!",
MetaData: metaData,
})
return
} else {
// Check for Validation Errors
var validationErrors validator.ValidationErrors
if errors.As(err, &validationErrors) {
friendlyErrors := make([]string, len(validationErrors))
for i, fieldError := range validationErrors {
friendlyErrors[i] = msgForTag(fieldError)
}
c.JSON(400, dto.ErrorResponse{
Status: "error",
Error: friendlyErrors,
Message: "Validation Failed",
MetaData: nil,
})
return
}
if errors.Is(err, http_error.ERR_USER_NOT_FOUND) || errors.Is(err, http_error.ERR_WRONG_PASSWORD) {
c.JSON(401, dto.ErrorResponse{
Status: "error",
Error: err,
Message: err.Error(),
MetaData: metaData,
})
return
} else if errors.Is(err, http_error.ERR_USER_ALREADY_EXISTS) {
c.JSON(409, dto.ErrorResponse{
Status: "error",
Error: err,
Message: err.Error(),
MetaData: metaData,
})
return
}
// Default to 500
c.JSON(500, dto.ErrorResponse{
Status: "error",
Error: err,
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
}
}
}
func msgForTag(fe validator.FieldError) string {
switch fe.Tag() {
case "required":
return "This field is required"
case "email":
return "Invalid email format"
case "min":
return fe.Field() + " must be longer than " + fe.Param() + " characters"
case "max":
return fe.Field() + " must be shorter than " + fe.Param() + " characters"
}
return fe.Error() // Default error message
}
|