forked from JointCloud/pcm-coordinator
143 lines
4.3 KiB
Go
143 lines
4.3 KiB
Go
/*
|
||
|
||
Copyright (c) [2023] [pcm]
|
||
[pcm-coordinator] is licensed under Mulan PSL v2.
|
||
You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||
You may obtain a copy of Mulan PSL v2 at:
|
||
http://license.coscl.org.cn/MulanPSL2
|
||
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||
EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||
See the Mulan PSL v2 for more details.
|
||
|
||
*/
|
||
|
||
package result
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"github.com/pkg/errors"
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
"github.com/zeromicro/go-zero/rest/httpx"
|
||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/helper/xerr"
|
||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
|
||
"go.opentelemetry.io/otel/trace"
|
||
"google.golang.org/grpc/status"
|
||
"net/http"
|
||
)
|
||
|
||
type Body struct {
|
||
Code int `json:"code"`
|
||
Msg string `json:"msg"`
|
||
Data interface{} `json:"data,omitempty"`
|
||
TraceID string `json:"traceId,omitempty"`
|
||
}
|
||
|
||
// http返回
|
||
func HttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
|
||
if err == nil {
|
||
//成功返回
|
||
body := Body{}
|
||
utils.Convert(resp, &body)
|
||
if body.Msg == "" && body.Code == 0 {
|
||
body.Code = 200
|
||
body.Msg = "success"
|
||
body.TraceID = traceIDFromContext(r.Context())
|
||
body.Data = resp
|
||
httpx.OkJson(w, body)
|
||
return
|
||
} else if body.Msg == "success" {
|
||
body.Code = 200
|
||
body.TraceID = traceIDFromContext(r.Context())
|
||
httpx.OkJson(w, body)
|
||
} else {
|
||
body.TraceID = traceIDFromContext(r.Context())
|
||
httpx.OkJson(w, body)
|
||
}
|
||
} else {
|
||
//错误返回
|
||
errcode := xerr.SERVER_COMMON_ERROR
|
||
errmsg := "服务器开小差啦,稍后再来试一试"
|
||
|
||
causeErr := errors.Cause(err) // err类型
|
||
if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型
|
||
//自定义CodeError
|
||
errcode = e.GetErrCode()
|
||
errmsg = e.GetErrMsg()
|
||
} else if gstatus, ok := status.FromError(causeErr); ok { // grpc err错误
|
||
grpcCode := uint32(gstatus.Code())
|
||
if xerr.IsCodeErr(grpcCode) { //区分自定义错误跟系统底层、db等错误,底层、db错误不能返回给前端
|
||
errcode = grpcCode
|
||
errmsg = gstatus.Message()
|
||
} else {
|
||
errmsg = err.Error()
|
||
}
|
||
} else { //返回原始错误
|
||
errmsg = err.Error()
|
||
}
|
||
|
||
logx.WithContext(r.Context()).Errorf("【API-ERR】 : %+v ", err)
|
||
// 判断如果err内容为"name already exists",则将resp作为body.Data的信息返回
|
||
if errmsg == "name already exists" {
|
||
body := Body{
|
||
Code: 409,
|
||
Msg: errmsg,
|
||
TraceID: traceIDFromContext(r.Context()),
|
||
Data: resp,
|
||
}
|
||
httpx.WriteJson(w, http.StatusBadRequest, body)
|
||
} else {
|
||
httpx.WriteJson(w, http.StatusBadRequest, Error(errcode, errmsg, r.Context()))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 授权的http方法
|
||
func AuthHttpResult(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
|
||
|
||
if err == nil {
|
||
//成功返回
|
||
r := Success(resp, r.Context())
|
||
httpx.WriteJson(w, http.StatusOK, r)
|
||
} else {
|
||
//错误返回
|
||
errcode := xerr.SERVER_COMMON_ERROR
|
||
errmsg := "服务器开小差啦,稍后再来试一试"
|
||
|
||
causeErr := errors.Cause(err) // err类型
|
||
if e, ok := causeErr.(*xerr.CodeError); ok { //自定义错误类型
|
||
//自定义CodeError
|
||
errcode = e.GetErrCode()
|
||
errmsg = e.GetErrMsg()
|
||
} else {
|
||
if gstatus, ok := status.FromError(causeErr); ok { // grpc err错误
|
||
grpcCode := uint32(gstatus.Code())
|
||
if xerr.IsCodeErr(grpcCode) { //区分自定义错误跟系统底层、db等错误,底层、db错误不能返回给前端
|
||
errcode = grpcCode
|
||
errmsg = gstatus.Message()
|
||
}
|
||
}
|
||
}
|
||
|
||
logx.WithContext(r.Context()).Errorf("【GATEWAY-ERR】 : %+v ", err)
|
||
|
||
httpx.WriteJson(w, http.StatusUnauthorized, Error(errcode, errmsg, r.Context()))
|
||
}
|
||
}
|
||
|
||
// http 参数错误返回
|
||
func ParamErrorResult(r *http.Request, w http.ResponseWriter, err error) {
|
||
errMsg := fmt.Sprintf("%s ,%s", xerr.MapErrMsg(xerr.REUQEST_PARAM_ERROR), err.Error())
|
||
httpx.WriteJson(w, http.StatusBadRequest, Error(xerr.REUQEST_PARAM_ERROR, errMsg, r.Context()))
|
||
}
|
||
|
||
func traceIDFromContext(ctx context.Context) string {
|
||
spanCtx := trace.SpanContextFromContext(ctx)
|
||
if spanCtx.HasTraceID() {
|
||
return spanCtx.TraceID().String()
|
||
}
|
||
|
||
return ""
|
||
}
|