mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-03 20:12:58 +00:00
112 lines
2.9 KiB
Go
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)
|
|
}
|