Files
Tomas Dvorak 55d0284b2a uppdate
2026-02-24 10:33:08 +01:00

112 lines
2.9 KiB
Go

package utils
import (
"fmt"
"net/http"
)
type ErrorCode string
const (
ErrInternal ErrorCode = "INTERNAL_ERROR"
ErrBadRequest ErrorCode = "BAD_REQUEST"
ErrUnauthorized ErrorCode = "UNAUTHORIZED"
ErrForbidden ErrorCode = "FORBIDDEN"
ErrNotFound ErrorCode = "NOT_FOUND"
ErrConflict ErrorCode = "CONFLICT"
ErrValidation ErrorCode = "VALIDATION_ERROR"
ErrRateLimit ErrorCode = "RATE_LIMIT_EXCEEDED"
ErrServiceUnavailable ErrorCode = "SERVICE_UNAVAILABLE"
)
type AppError struct {
Code ErrorCode `json:"code"`
Message string `json:"message"`
Details string `json:"details,omitempty"`
HTTPStatus int `json:"-"`
}
func (e *AppError) Error() string {
if e.Details != "" {
return fmt.Sprintf("%s: %s (%s)", e.Code, e.Message, e.Details)
}
return fmt.Sprintf("%s: %s", e.Code, e.Message)
}
func NewAppError(code ErrorCode, message string, httpStatus int) *AppError {
return &AppError{
Code: code,
Message: message,
HTTPStatus: httpStatus,
}
}
func NewAppErrorWithDetails(code ErrorCode, message string, httpStatus int, details string) *AppError {
return &AppError{
Code: code,
Message: message,
Details: details,
HTTPStatus: httpStatus,
}
}
func WrapError(err error, code ErrorCode, message string, httpStatus int) *AppError {
return &AppError{
Code: code,
Message: message,
Details: err.Error(),
HTTPStatus: httpStatus,
}
}
func IsAppError(err error) (*AppError, bool) {
if appErr, ok := err.(*AppError); ok {
return appErr, true
}
return nil, false
}
func BadRequest(message string) *AppError {
return NewAppError(ErrBadRequest, message, http.StatusBadRequest)
}
func BadRequestWithDetails(message, details string) *AppError {
return NewAppErrorWithDetails(ErrBadRequest, message, http.StatusBadRequest, details)
}
func Unauthorized(message string) *AppError {
return NewAppError(ErrUnauthorized, message, http.StatusUnauthorized)
}
func Forbidden(message string) *AppError {
return NewAppError(ErrForbidden, message, http.StatusForbidden)
}
func NotFound(message string) *AppError {
return NewAppError(ErrNotFound, message, http.StatusNotFound)
}
func Conflict(message string) *AppError {
return NewAppError(ErrConflict, message, http.StatusConflict)
}
func ValidationErr(message string) *AppError {
return NewAppError(ErrValidation, message, http.StatusBadRequest)
}
func InternalError(message string) *AppError {
return NewAppError(ErrInternal, message, http.StatusInternalServerError)
}
func InternalErrorWithDetails(message, details string) *AppError {
return NewAppErrorWithDetails(ErrInternal, message, http.StatusInternalServerError, details)
}
func RateLimitExceeded(message string) *AppError {
return NewAppError(ErrRateLimit, message, http.StatusTooManyRequests)
}
func ServiceUnavailable(message string) *AppError {
return NewAppError(ErrServiceUnavailable, message, http.StatusServiceUnavailable)
}