package constant import ( sdkws "Open_IM/pkg/proto/sdk_ws" "context" "encoding/json" "errors" "fmt" "gorm.io/gorm" ) type ErrInfo struct { ErrCode int32 ErrMsg string DetailErrMsg string } func (e *ErrInfo) Error() string { return e.ErrMsg } func (e *ErrInfo) Code() int32 { return e.ErrCode } var ( ErrNone = ErrInfo{0, "", ""} ErrArgs = ErrInfo{ArgsError, "ArgsError", ""} ErrDatabase = ErrInfo{DatabaseError, "DatabaseError", ""} ErrInternalServer = ErrInfo{ServerInternalError, "ServerInternalError", ""} ErrNetwork = ErrInfo{NetworkError, "NetworkError", ""} ErrNoPermission = ErrInfo{NoPermissionError, "NoPermissionError", ""} ErrIdentity = ErrInfo{IdentityError, "IdentityError", ""} ErrCallback = ErrInfo{ErrMsg: "CallbackError"} ErrCallbackContinue = ErrInfo{ErrMsg: "CallbackContinueError"} ErrUserIDNotFound = ErrInfo{UserIDNotFoundError, "UserIDNotFoundError", ""} ErrGroupIDNotFound = ErrInfo{GroupIDNotFoundError, "GroupIDNotFoundError", ""} ErrRecordNotFound = ErrInfo{RecordNotFoundError, "RecordNotFoundError", ""} ErrRelationshipAlready = ErrInfo{RelationshipAlreadyError, "RelationshipAlreadyError", ""} ErrNotRelationshipYet = ErrInfo{NotRelationshipYetError, "NotRelationshipYetError", ""} ErrOnlyOneOwner = ErrInfo{OnlyOneOwnerError, "OnlyOneOwnerError", ""} ErrInGroupAlready = ErrInfo{InGroupAlreadyError, "InGroupAlreadyError", ""} ErrNotInGroupYet = ErrInfo{NotInGroupYetError, "NotInGroupYetError", ""} ErrDismissedAlready = ErrInfo{DismissedAlreadyError, "DismissedAlreadyError", ""} ErrOwnerNotAllowedQuit = ErrInfo{OwnerNotAllowedQuitError, "OwnerNotAllowedQuitError", ""} ErrRegisteredAlready = ErrInfo{RegisteredAlreadyError, "RegisteredAlreadyError", ""} ErrGroupTypeNotSupport = ErrInfo{GroupTypeNotSupport, "", ""} ErrGroupNoOwner = ErrInfo{GroupNoOwner, "ErrGroupNoOwner", ""} ErrDefaultOther = ErrInfo{DefaultOtherError, "DefaultOtherError", ""} ErrData = ErrInfo{DataError, "DataError", ""} ErrTokenExpired = ErrInfo{TokenExpiredError, "TokenExpiredError", ""} ErrTokenInvalid = ErrInfo{TokenInvalidError, "TokenInvalidError", ""} // ErrTokenMalformed = ErrInfo{TokenMalformedError, "TokenMalformedError", ""} //格式错误 ErrTokenNotValidYet = ErrInfo{TokenNotValidYetError, "TokenNotValidYetError", ""} //还未生效 ErrTokenUnknown = ErrInfo{TokenUnknownError, "TokenUnknownError", ""} //未知错误 ErrTokenKicked = ErrInfo{TokenKickedError, "TokenKickedError", ""} ErrTokenNotExist = ErrInfo{TokenNotExistError, "TokenNotExistError", ""} //在redis中不存在 ErrTokenDifferentPlatformID = ErrInfo{TokenDifferentPlatformIDError, "TokenDifferentPlatformIDError", ""} ErrTokenDifferentUserID = ErrInfo{TokenDifferentUserIDError, "TokenDifferentUserIDError", ""} ErrMessageHasReadDisable = ErrInfo{MessageHasReadDisable, "MessageHasReadDisable", ""} ErrDB = ErrDatabase ErrSendLimit = ErrInternalServer ) func NewErrNetwork(err error) error { return toDetail(err, &ErrNetwork) } func NewErrData(err error) error { return toDetail(err, &ErrData) } func toDetail(err error, info *ErrInfo) *ErrInfo { errInfo := *info errInfo.DetailErrMsg = err.Error() return &errInfo } func ToAPIErrWithErr(err error) *ErrInfo { errComm := errors.New("") var marshalErr *json.MarshalerError errInfo := &ErrInfo{} switch { case errors.As(err, &errComm): if errors.Is(err, gorm.ErrRecordNotFound) { return toDetail(err, &ErrRecordNotFound) } return toDetail(err, &ErrData) case errors.As(err, &marshalErr): return toDetail(err, &ErrData) case errors.As(err, &errInfo): return toDetail(err, errInfo) } return toDetail(err, &ErrDefaultOther) } func SetErrorForResp(err error, commonResp *sdkws.CommonResp) { errInfo := ToAPIErrWithErr(err) commonResp.ErrCode = errInfo.ErrCode commonResp.ErrMsg = errInfo.ErrMsg commonResp.DetailErrMsg = err.Error() } func CommonResp2Err(resp *sdkws.CommonResp) error { if resp.ErrCode != NoError { return errors.New(fmt.Sprintf("call rpc error, errCode is %d, errMsg is %s, detailErrMsg is %s", resp.ErrCode, resp.ErrMsg, resp.DetailErrMsg)) } return nil } func Error2CommResp(ctx context.Context, info ErrInfo, detailErrMsg string) *sdkws.CommonResp { err := &sdkws.CommonResp{ ErrCode: info.ErrCode, ErrMsg: info.ErrMsg, } if detailErrMsg != "" { err.DetailErrMsg = detailErrMsg } return err } const ( FormattingError = 10001 HasRegistered = 10002 NotRegistered = 10003 PasswordErr = 10004 GetIMTokenErr = 10005 RepeatSendCode = 10006 MailSendCodeErr = 10007 SmsSendCodeErr = 10008 CodeInvalidOrExpired = 10009 RegisterFailed = 10010 ResetPasswordFailed = 10011 RegisterLimit = 10012 LoginLimit = 10013 InvitationError = 10014 ) // 通用错误码 const ( NoError = 0 //无错误 ArgsError = 90001 //输入参数错误 DatabaseError = 90002 //redis/mysql等db错误 ServerInternalError = 90003 //服务器内部错误 NetworkError = 90004 //网络错误 NoPermissionError = 90005 //权限不足 GRPCConnIsNil = 90006 //grpc连接空 DefaultOtherError = 90006 //其他错误 DataError = 90007 //数据错误 IdentityError = 90008 // 身份错误 非管理员token,且token中userID与请求userID不一致 ) // 账号错误码 const ( UserIDNotFoundError = 91001 //UserID不存在 或未注册 GroupIDNotFoundError = 91002 //GroupID不存在 RecordNotFoundError = 91002 //记录不存在 ) // 关系链错误码 const ( RelationshipAlreadyError = 92001 //已经是好友关系(或者黑名单) NotRelationshipYetError = 92002 //不是好友关系(或者黑名单) ) // 群组错误码 const ( OnlyOneOwnerError = 93001 //只能有一个群主 InGroupAlreadyError = 93003 //已在群组中 NotInGroupYetError = 93004 //不在群组中 DismissedAlreadyError = 93004 //群组已经解散 OwnerNotAllowedQuitError = 93004 //群主不能退群 GroupTypeNotSupport = 93005 GroupNoOwner = 93006 ) // 用户错误码 const ( RegisteredAlreadyError = 94001 //用户已经注册过了 ) // token错误码 const ( TokenExpiredError = 95001 TokenInvalidError = 95002 TokenMalformedError = 95003 TokenNotValidYetError = 95004 TokenUnknownError = 95005 TokenKickedError = 95006 TokenDifferentPlatformIDError = 95007 TokenDifferentUserIDError = 95008 TokenNotExistError = 95009 ) // 消息错误码 const ( MessageHasReadDisable = 96001 ) // temp var ( ErrServer = ErrInfo{500, "server error", ""} ErrTencentCredential = ErrInfo{400, "ErrTencentCredential", ""} )