mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"gitlab.com/mbugroup/lti-api.git/internal/common/validation"
|
|
"gitlab.com/mbugroup/lti-api.git/internal/response"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/jackc/pgconn"
|
|
pgconnv5 "github.com/jackc/pgx/v5/pgconn"
|
|
)
|
|
|
|
func ErrorHandler(c *fiber.Ctx, err error) error {
|
|
if message, errorsMap := validation.CustomErrorMessages(err); len(errorsMap) > 0 {
|
|
return response.Error(c, fiber.StatusBadRequest, message, nil)
|
|
}
|
|
|
|
if statusCode, message := mapPgError(err); statusCode != 0 {
|
|
return response.Error(c, statusCode, message, nil)
|
|
}
|
|
|
|
var fiberErr *fiber.Error
|
|
if errors.As(err, &fiberErr) {
|
|
return response.Error(c, fiberErr.Code, fiberErr.Message, nil)
|
|
}
|
|
|
|
return response.Error(c, fiber.StatusInternalServerError, "Internal Server Error", nil)
|
|
}
|
|
|
|
func NotFoundHandler(c *fiber.Ctx) error {
|
|
return response.Error(c, fiber.StatusNotFound, "Endpoint Not Found", nil)
|
|
}
|
|
|
|
func mapPgError(err error) (int, string) {
|
|
code, message := getPgErrorDetails(err)
|
|
if code == "" {
|
|
return 0, ""
|
|
}
|
|
|
|
switch code {
|
|
case "23503":
|
|
return fiber.StatusConflict, "Data tidak bisa dihapus karena masih digunakan oleh data lain."
|
|
case "P0001":
|
|
if strings.HasPrefix(message, "Cannot soft delete") {
|
|
return fiber.StatusConflict, "Data tidak bisa dihapus karena masih digunakan oleh data lain."
|
|
}
|
|
}
|
|
|
|
return 0, ""
|
|
}
|
|
|
|
func getPgErrorDetails(err error) (string, string) {
|
|
var pgErr *pgconn.PgError
|
|
if errors.As(err, &pgErr) {
|
|
return pgErr.Code, pgErr.Message
|
|
}
|
|
|
|
var pgErrV5 *pgconnv5.PgError
|
|
if errors.As(err, &pgErrV5) {
|
|
return pgErrV5.Code, pgErrV5.Message
|
|
}
|
|
|
|
return "", ""
|
|
}
|
|
|
|
func BadRequest(msg string) error {
|
|
return fiber.NewError(fiber.StatusBadRequest, msg)
|
|
}
|
|
|
|
func NotFound(msg string) error {
|
|
return fiber.NewError(fiber.StatusNotFound, msg)
|
|
}
|
|
|
|
func Internal(msg string) error {
|
|
return fiber.NewError(fiber.StatusInternalServerError, msg)
|
|
}
|