153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
package errors
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
)
 | 
						|
 | 
						|
// ErrorCode defines the error code type
 | 
						|
type ErrorCode int
 | 
						|
 | 
						|
// System error codes
 | 
						|
const (
 | 
						|
	// Common error codes (1000-1999)
 | 
						|
	ErrBadRequest         ErrorCode = 1000
 | 
						|
	ErrUnauthorized       ErrorCode = 1001
 | 
						|
	ErrForbidden          ErrorCode = 1002
 | 
						|
	ErrNotFound           ErrorCode = 1003
 | 
						|
	ErrMethodNotAllowed   ErrorCode = 1004
 | 
						|
	ErrConflict           ErrorCode = 1005
 | 
						|
	ErrTooManyRequests    ErrorCode = 1006
 | 
						|
	ErrInternalServer     ErrorCode = 1007
 | 
						|
	ErrServiceUnavailable ErrorCode = 1008
 | 
						|
	ErrTimeout            ErrorCode = 1009
 | 
						|
	ErrValidation         ErrorCode = 1010
 | 
						|
 | 
						|
	// Tenant related error codes (2000-2099)
 | 
						|
	ErrTenantNotFound      ErrorCode = 2000
 | 
						|
	ErrTenantAlreadyExists ErrorCode = 2001
 | 
						|
	ErrTenantInactive      ErrorCode = 2002
 | 
						|
	ErrTenantNameRequired  ErrorCode = 2003
 | 
						|
	ErrTenantInvalidStatus ErrorCode = 2004
 | 
						|
 | 
						|
	// Add more error codes here
 | 
						|
)
 | 
						|
 | 
						|
// AppError defines the application error structure
 | 
						|
type AppError struct {
 | 
						|
	Code     ErrorCode `json:"code"`
 | 
						|
	Message  string    `json:"message"`
 | 
						|
	Details  any       `json:"details,omitempty"`
 | 
						|
	HTTPCode int       `json:"-"`
 | 
						|
}
 | 
						|
 | 
						|
// Error implements the error interface
 | 
						|
func (e *AppError) Error() string {
 | 
						|
	return fmt.Sprintf("error code: %d, error message: %s", e.Code, e.Message)
 | 
						|
}
 | 
						|
 | 
						|
// WithDetails adds error details
 | 
						|
func (e *AppError) WithDetails(details any) *AppError {
 | 
						|
	e.Details = details
 | 
						|
	return e
 | 
						|
}
 | 
						|
 | 
						|
// NewBadRequestError creates a bad request error
 | 
						|
func NewBadRequestError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrBadRequest,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusBadRequest,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewUnauthorizedError creates an unauthorized error
 | 
						|
func NewUnauthorizedError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrUnauthorized,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusUnauthorized,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewForbiddenError creates a forbidden error
 | 
						|
func NewForbiddenError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrForbidden,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusForbidden,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewNotFoundError creates a not found error
 | 
						|
func NewNotFoundError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrNotFound,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusNotFound,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewConflictError creates a conflict error
 | 
						|
func NewConflictError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrConflict,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusConflict,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewInternalServerError creates an internal server error
 | 
						|
func NewInternalServerError(message string) *AppError {
 | 
						|
	if message == "" {
 | 
						|
		message = "服务器内部错误"
 | 
						|
	}
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrInternalServer,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusInternalServerError,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewValidationError creates a validation error
 | 
						|
func NewValidationError(message string) *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrValidation,
 | 
						|
		Message:  message,
 | 
						|
		HTTPCode: http.StatusBadRequest,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Tenant related errors
 | 
						|
func NewTenantNotFoundError() *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrTenantNotFound,
 | 
						|
		Message:  "租户不存在",
 | 
						|
		HTTPCode: http.StatusNotFound,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewTenantAlreadyExistsError creates a tenant already exists error
 | 
						|
func NewTenantAlreadyExistsError() *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrTenantAlreadyExists,
 | 
						|
		Message:  "租户已存在",
 | 
						|
		HTTPCode: http.StatusConflict,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewTenantInactiveError creates a tenant inactive error
 | 
						|
func NewTenantInactiveError() *AppError {
 | 
						|
	return &AppError{
 | 
						|
		Code:     ErrTenantInactive,
 | 
						|
		Message:  "租户已停用",
 | 
						|
		HTTPCode: http.StatusForbidden,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// IsAppError checks if the error is an AppError type
 | 
						|
func IsAppError(err error) (*AppError, bool) {
 | 
						|
	appErr, ok := err.(*AppError)
 | 
						|
	return appErr, ok
 | 
						|
}
 |