2024-08-23 17:04:19 +02:00
package utils
import (
"errors"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
"gorm.io/gorm"
"log"
"net/http"
"strings"
)
import (
"fmt"
)
func ControllerError ( c * gin . Context , err error ) {
// Check for record not found errors
if errors . Is ( err , gorm . ErrRecordNotFound ) {
CustomControllerError ( c , http . StatusNotFound , "Record not found" )
return
}
// Check for validation errors
var validationErrors validator . ValidationErrors
if errors . As ( err , & validationErrors ) {
message := handleValidationError ( validationErrors )
CustomControllerError ( c , http . StatusBadRequest , message )
return
}
log . Println ( err )
c . JSON ( http . StatusInternalServerError , gin . H { "error" : "Something went wrong" } )
}
func handleValidationError ( validationErrors validator . ValidationErrors ) string {
var errorMessages [ ] string
for _ , ve := range validationErrors {
fieldName := ve . Field ( )
var errorMessage string
switch ve . Tag ( ) {
case "required" :
errorMessage = fmt . Sprintf ( "%s is required" , fieldName )
case "email" :
errorMessage = fmt . Sprintf ( "%s must be a valid email address" , fieldName )
case "username" :
2024-09-03 22:35:18 +02:00
errorMessage = fmt . Sprintf ( "%s must only contain lowercase letters, numbers, underscores, dots, hyphens, and '@' symbols and not start or end with a special character" , fieldName )
2024-08-23 17:04:19 +02:00
case "url" :
errorMessage = fmt . Sprintf ( "%s must be a valid URL" , fieldName )
case "min" :
errorMessage = fmt . Sprintf ( "%s must be at least %s characters long" , fieldName , ve . Param ( ) )
case "max" :
errorMessage = fmt . Sprintf ( "%s must be at most %s characters long" , fieldName , ve . Param ( ) )
case "urlList" :
errorMessage = fmt . Sprintf ( "%s must be a list of valid URLs" , fieldName )
default :
errorMessage = fmt . Sprintf ( "%s is invalid" , fieldName )
}
2024-08-24 00:49:08 +02:00
2024-08-23 17:04:19 +02:00
errorMessages = append ( errorMessages , errorMessage )
}
// Join all the error messages into a single string
combinedErrors := strings . Join ( errorMessages , ", " )
return combinedErrors
}
func CustomControllerError ( c * gin . Context , statusCode int , message string ) {
// Capitalize the first letter of the message
message = strings . ToUpper ( message [ : 1 ] ) + message [ 1 : ]
c . JSON ( statusCode , gin . H { "error" : message } )
}