51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package error
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type AppError struct {
|
|
Code int `json:"code"`
|
|
Message string `json:"message"`
|
|
Details string `json:"details,omitempty"`
|
|
}
|
|
|
|
var (
|
|
ErrNotFound = errors.New("not found")
|
|
ErrInvalidInput = errors.New("invalid input")
|
|
ErrUnauthorized = errors.New("unauthorized")
|
|
ErrInternalServer = errors.New("internal server error")
|
|
)
|
|
|
|
func Handle(logger *zap.Logger, err error) (int, AppError) {
|
|
switch {
|
|
case errors.Is(err, ErrNotFound):
|
|
return http.StatusNotFound, AppError{
|
|
Code: http.StatusNotFound,
|
|
Message: "Resource not found",
|
|
Details: err.Error()}
|
|
|
|
case errors.Is(err, ErrInvalidInput):
|
|
return http.StatusBadRequest, AppError{
|
|
Code: http.StatusBadRequest,
|
|
Message: "Invalid request data",
|
|
Details: err.Error()}
|
|
|
|
case errors.Is(err, ErrUnauthorized):
|
|
return http.StatusUnauthorized, AppError{
|
|
Code: http.StatusUnauthorized,
|
|
Message: "Unauthorized access",
|
|
Details: err.Error()}
|
|
|
|
default:
|
|
logger.Error("Internal server error", zap.Error(err))
|
|
return http.StatusInternalServerError, AppError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "Internal server error",
|
|
Details: ""}
|
|
}
|
|
}
|