You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ims/util/rsp/error.go

113 lines
4.1 KiB

2 months ago
package rsp
var (
ErrOK = NewError(200, "OK", "ok") // 表示没有任何错误。
ErrInternal = NewError(500, "InternalError", "系统内部错误") // 客户端请求有效,但服务器处理时发生了意外。
ErrMethodNotAllowed = NewError(405, "MethodNotAllowed", "网络请求方法错误")
ErrNotFound = NewError(404, "NotFound", "请求资源不存在")
ErrLimitExecuted = NewError(403, "LimitExecuted", "访问频次超过限制")
ErrLimitDevice = NewError(400, "LimitDevice", "设备数超过限制")
ErrUnknownError = NewError(400, "UnknownError", "未知错误")
ErrBadParams = NewError(400, "BadParams", "提交的参数不符合要求")
ErrRecordNotFound = NewError(404, "RecordNotFound", "访问的数据不存在")
ErrRecordAlreadyExists = NewError(500, "RecordAlreadyExists", "数据已经存在")
ErrPermissionDenied = NewError(403, "PermissionDenied", "没有操作权限")
ErrServiceUnavailable = NewError(503, "ServiceUnavailable", "系统维护中")
ErrUnauthorized = NewError(401, "Unauthorized", "缺少身份验证凭据或身份凭据错误") // 用户未提供身份验证凭据,或者没有通过身份验证。
ErrForbidden = NewError(403, "Forbidden", "没有资源访问权限") // 用户通过了身份验证,但是不具有访问资源所需的权限。
ErrGone = NewError(410, "Gone", "访问的资源不存在") // 所请求的资源已从这个地址转移,不再可用。
ErrUnsupportedMediaType = NewError(415, "UnsupportedMediaType", "提交的数据格式错误") // 客户端要求的返回格式不支持,比如,API 只能返回 JSON 格式,但是客户端要求返回 XML 格式。
ErrUnprocessableEntity = NewError(422, "UnprocessableEntity", "上传附件错误") // 无法处理客户端上传的附件,导致请求失败。
ErrAlreadyAssociated = NewError(433, "AlreadyAssociated", "数据已被使用")
ErrBadRequest = NewError(400, "BadRequest", "请求无效") // 服务器不理解客户端的请求。
ErrDatabaseException = NewError(500, "DatabaseException", "数据库异常")
ErrCreateFailed = NewError(500, "CreateFailed", "创建数据失败")
ErrUpdateFailed = NewError(500, "UpdateFailed", "更新数据失败")
ErrDeleteFailed = NewError(500, "DeleteFailed", "删除数据失败")
ErrUnimplemented = NewError(500, "Unimplemented", "接口尚未实现")
)
type Error struct {
internal error // 包装的其它错误
status int // HTTP 状态码
code string // 请求错误码
text string // 响应提示消息
data any // 错误携带的响应数据
}
func NewError(status int, code, text string) *Error {
return &Error{nil, status, code, text, nil}
}
func (e *Error) Status() int {
return e.status
}
func (e *Error) Code() string {
return e.code
}
func (e *Error) Text() string {
return e.Text()
}
func (e *Error) Data() any {
return e.data
}
func (e *Error) Internal() error {
return e.internal
}
func (e *Error) Unwrap() error {
return e.Internal()
}
func (e *Error) String() string {
return e.text
}
func (e *Error) Error() string {
return e.text
}
func (e *Error) WithInternal(err error) *Error {
c := *e
c.internal = err
return &c
}
func (e *Error) WithText(text ...string) *Error {
if len(text) == 0 || text[0] == e.text {
return e
}
c := *e
c.text = text[0]
return &c
}
func (e *Error) WithData(data any) *Error {
if e.data == data {
return e
}
c := *e
c.data = data
return &c
}
type Problem struct {
Label string `json:"-" xml:"-"`
Code string `json:"code" xml:"code"`
Message string `json:"message" xml:"message"`
Problems map[string][]*Problem `json:"problems,omitempty" xml:"problems,omitempty"`
}
type Problems map[string][]*Problem
func (p Problems) Add(problem *Problem) {
if _, ok := p[problem.Label]; !ok {
p[problem.Label] = make([]*Problem, 0)
}
p[problem.Label] = append(p[problem.Label], problem)
}