refactor: unify all service error codes
This commit is contained in:
78
all/internal/server/response.go
Normal file
78
all/internal/server/response.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.apinb.com/bsm-sdk/core/errcode"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type errorResponse struct {
|
||||
Code int32 `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Details any `json:"details"`
|
||||
Timeseq int64 `json:"timeseq"`
|
||||
}
|
||||
|
||||
func sdkError(err error) error {
|
||||
code := status.Code(err)
|
||||
// SDK business errors already use custom codes and must pass through.
|
||||
if code > codes.Unauthenticated {
|
||||
return err
|
||||
}
|
||||
message := status.Convert(err).Message()
|
||||
var target error
|
||||
switch code {
|
||||
case codes.Canceled:
|
||||
target = errcode.ErrCanceled
|
||||
case codes.InvalidArgument:
|
||||
target = errcode.ErrInvalidArgument
|
||||
case codes.DeadlineExceeded:
|
||||
target = errcode.ErrDeadlineExceeded
|
||||
case codes.NotFound:
|
||||
target = errcode.ErrRecordNotFound
|
||||
case codes.AlreadyExists:
|
||||
target = errcode.ErrAlreadyExists
|
||||
case codes.PermissionDenied:
|
||||
target = errcode.ErrPermissionDenied
|
||||
case codes.ResourceExhausted:
|
||||
target = errcode.ErrResourceExhausted
|
||||
case codes.FailedPrecondition:
|
||||
target = errcode.ErrFailedPrecondition
|
||||
case codes.Aborted:
|
||||
target = errcode.ErrAborted
|
||||
case codes.OutOfRange:
|
||||
target = errcode.ErrOutOfRange
|
||||
case codes.Unimplemented:
|
||||
target = errcode.ErrUnimplemented
|
||||
case codes.Unavailable:
|
||||
target = errcode.ErrUnavailable
|
||||
case codes.DataLoss:
|
||||
target = errcode.ErrDataLoss
|
||||
case codes.Unauthenticated:
|
||||
target = errcode.ErrUnauthenticated
|
||||
case codes.Internal:
|
||||
target = errcode.ErrInternal
|
||||
default:
|
||||
target = errcode.ErrUnknown
|
||||
}
|
||||
if message == "" || message == status.Convert(target).Message() {
|
||||
return target
|
||||
}
|
||||
return errcode.String(target, message)
|
||||
}
|
||||
|
||||
func newErrorResponse(err error) errorResponse {
|
||||
response := errorResponse{
|
||||
Code: 500,
|
||||
Message: err.Error(),
|
||||
Details: "",
|
||||
Timeseq: time.Now().UnixMilli(),
|
||||
}
|
||||
if grpcStatus, ok := status.FromError(err); ok {
|
||||
response.Code = int32(grpcStatus.Code())
|
||||
response.Message = grpcStatus.Message()
|
||||
}
|
||||
return response
|
||||
}
|
||||
Reference in New Issue
Block a user