2025-05-02 15:12:18 +07:00

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: ""}
}
}