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 }