l_ai_knowledge/internal/errors/errors.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
}