Files
full/all/internal/server/response.go

79 lines
1.9 KiB
Go

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
}