init push
This commit is contained in:
106
internal/shared/pkg/apperrorsx/enrich.go
Normal file
106
internal/shared/pkg/apperrorsx/enrich.go
Normal file
@@ -0,0 +1,106 @@
|
||||
package apperrorsx
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
|
||||
"wucher/internal/transport/http/jsonapi"
|
||||
)
|
||||
|
||||
var (
|
||||
registryByCode map[string]Def
|
||||
registryByErrorCode map[string]Def
|
||||
)
|
||||
|
||||
func init() {
|
||||
registryByCode = make(map[string]Def, len(Registry))
|
||||
registryByErrorCode = make(map[string]Def, len(Registry))
|
||||
for _, def := range Registry {
|
||||
registryByCode[def.Code] = def
|
||||
registryByErrorCode[def.ErrorCode] = def
|
||||
}
|
||||
}
|
||||
|
||||
func EnrichErrorObjects(status int, errs []jsonapi.ErrorObject) []jsonapi.ErrorObject {
|
||||
out := make([]jsonapi.ErrorObject, 0, len(errs))
|
||||
for i := range errs {
|
||||
obj := errs[i]
|
||||
obj.Status = strconv.Itoa(status)
|
||||
|
||||
def := inferDef(status, obj)
|
||||
if obj.Code == "" && def.Code != "" {
|
||||
obj.Code = def.Code
|
||||
}
|
||||
if obj.ErrorCode == "" && def.ErrorCode != "" {
|
||||
obj.ErrorCode = def.ErrorCode
|
||||
}
|
||||
if obj.Title == "" && def.Title != "" {
|
||||
obj.Title = def.Title
|
||||
}
|
||||
out = append(out, obj)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func inferDef(status int, obj jsonapi.ErrorObject) Def {
|
||||
if obj.Code != "" {
|
||||
if def, ok := registryByCode[obj.Code]; ok {
|
||||
def.Status = status
|
||||
def.ErrorCode = Build(status, moduleFromErrorCode(def.ErrorCode), caseFromErrorCode(def.ErrorCode), def.Code, def.Message).ErrorCode
|
||||
return def
|
||||
}
|
||||
}
|
||||
if obj.ErrorCode != "" {
|
||||
if def, ok := registryByErrorCode[obj.ErrorCode]; ok {
|
||||
return def
|
||||
}
|
||||
}
|
||||
|
||||
switch status {
|
||||
case fiber.StatusBadRequest:
|
||||
return ErrInvalidRequest
|
||||
case fiber.StatusUnauthorized:
|
||||
return ErrUserUnauthorized
|
||||
case fiber.StatusForbidden:
|
||||
return ErrForbiddenAccess
|
||||
case fiber.StatusNotFound:
|
||||
return ErrDataNotFound
|
||||
case fiber.StatusConflict:
|
||||
return ErrBusinessRuleFailed
|
||||
case fiber.StatusUnprocessableEntity:
|
||||
return ErrValidation
|
||||
case fiber.StatusTooManyRequests:
|
||||
return ErrPINAttemptLimitReached
|
||||
default:
|
||||
msg := strings.ToLower(strings.TrimSpace(obj.Detail))
|
||||
if strings.Contains(msg, "not found") {
|
||||
return ErrDataNotFound
|
||||
}
|
||||
if strings.Contains(msg, "unauthorized") {
|
||||
return ErrUserUnauthorized
|
||||
}
|
||||
if strings.Contains(msg, "forbidden") {
|
||||
return ErrForbiddenAccess
|
||||
}
|
||||
if strings.Contains(msg, "validation") || strings.Contains(msg, "invalid") {
|
||||
return ErrValidation
|
||||
}
|
||||
return ErrInternal
|
||||
}
|
||||
}
|
||||
|
||||
func moduleFromErrorCode(errorCode string) string {
|
||||
if len(errorCode) >= 5 {
|
||||
return errorCode[3:5]
|
||||
}
|
||||
return ModuleGeneral
|
||||
}
|
||||
|
||||
func caseFromErrorCode(errorCode string) string {
|
||||
if len(errorCode) >= 7 {
|
||||
return errorCode[5:7]
|
||||
}
|
||||
return CaseGeneralInternalError
|
||||
}
|
||||
Reference in New Issue
Block a user