247 lines
6.1 KiB
Go
247 lines
6.1 KiB
Go
package httphelper
|
||
|
||
import (
|
||
"archive/zip"
|
||
"bytes"
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/winc-link/hummingbird/internal/pkg/constants"
|
||
"github.com/winc-link/hummingbird/internal/pkg/errort"
|
||
"github.com/winc-link/hummingbird/internal/pkg/i18n"
|
||
"github.com/winc-link/hummingbird/internal/pkg/logger"
|
||
"io"
|
||
"net/http"
|
||
"os"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"google.golang.org/grpc/codes"
|
||
"google.golang.org/grpc/status"
|
||
)
|
||
|
||
func RenderFail(ctx context.Context, err error, w http.ResponseWriter, lc logger.LoggingClient) {
|
||
lc.Errorf("renderFail: %v", err)
|
||
errw := errort.NewCommonEdgeXWrapper(err)
|
||
|
||
resp := CommonResponse{
|
||
Result: []interface{}{},
|
||
Success: false,
|
||
ErrorMsg: i18n.TransCode(ctx, errw.Code(), nil),
|
||
ErrorCode: errw.Code(),
|
||
}
|
||
|
||
encode(resp, w)
|
||
}
|
||
|
||
func RenderFailNoLog(ctx context.Context, err error, w http.ResponseWriter) {
|
||
errw := errort.NewCommonEdgeXWrapper(err)
|
||
|
||
resp := CommonResponse{
|
||
Result: []interface{}{},
|
||
Success: false,
|
||
ErrorMsg: i18n.TransCode(ctx, errw.Code(), nil),
|
||
ErrorCode: errw.Code(),
|
||
}
|
||
encode(resp, w)
|
||
}
|
||
|
||
type ResPageResult struct {
|
||
List interface{} `json:"list"`
|
||
Total uint32 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"pageSize"`
|
||
}
|
||
|
||
func Result(code uint32, data interface{}, msg string, w http.ResponseWriter, lc logger.LoggingClient) {
|
||
success := false
|
||
if code == errort.DefaultSuccess {
|
||
success = true
|
||
}
|
||
if data == nil {
|
||
data = []interface{}{}
|
||
}
|
||
resp := CommonResponse{
|
||
Result: data,
|
||
Success: success,
|
||
ErrorMsg: msg,
|
||
ErrorCode: code,
|
||
}
|
||
encode(resp, w)
|
||
}
|
||
|
||
func ResultSuccess(data interface{}, w http.ResponseWriter, lc logger.LoggingClient) {
|
||
Result(errort.DefaultSuccess, data, "success", w, lc)
|
||
}
|
||
|
||
func ResultNoLog(code uint32, data interface{}, msg string, w http.ResponseWriter) {
|
||
success := false
|
||
if code == errort.DefaultSuccess {
|
||
success = true
|
||
}
|
||
if data == nil {
|
||
data = []interface{}{}
|
||
}
|
||
resp := CommonResponse{
|
||
Result: data,
|
||
Success: success,
|
||
ErrorMsg: msg,
|
||
ErrorCode: code,
|
||
}
|
||
encode(resp, w)
|
||
}
|
||
|
||
func ResultSuccessNoLog(data interface{}, w http.ResponseWriter) {
|
||
ResultNoLog(errort.DefaultSuccess, data, "success", w)
|
||
}
|
||
|
||
func ResultZipFile(c *gin.Context, lc logger.LoggingClient, fileName string, file *os.File) {
|
||
buf := new(bytes.Buffer)
|
||
zw := zip.NewWriter(buf)
|
||
|
||
defer file.Close()
|
||
defer zw.Close()
|
||
|
||
writer, err := zw.Create(fileName)
|
||
if err != nil {
|
||
lc.Errorf("failed to zip create header %v", err)
|
||
c.JSON(http.StatusOK, NewFailCommonResponse(err))
|
||
return
|
||
}
|
||
_, err = io.Copy(writer, file)
|
||
if err != nil {
|
||
lc.Errorf("failed to io copy %v", err)
|
||
c.JSON(http.StatusOK, NewFailCommonResponse(err))
|
||
return
|
||
}
|
||
|
||
// 主动关闭,将buf的zip内容写完
|
||
zw.Close()
|
||
|
||
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s.zip", fileName))
|
||
c.Data(http.StatusOK, "application/octet-stream", buf.Bytes())
|
||
}
|
||
|
||
func ResultExcelData(c *gin.Context, fileName string, data *bytes.Buffer) {
|
||
c.Header("Response-Type", "blob")
|
||
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", fileName))
|
||
c.Data(http.StatusOK, "application/octet-stream", data.Bytes())
|
||
}
|
||
|
||
func NewPageResult(responses interface{}, total uint32, page int, pageSize int) ResPageResult {
|
||
if responses == nil {
|
||
responses = make([]interface{}, 0)
|
||
}
|
||
return ResPageResult{
|
||
List: responses,
|
||
Total: total,
|
||
Page: page,
|
||
PageSize: pageSize,
|
||
}
|
||
}
|
||
|
||
type CommonResponse struct {
|
||
Success bool `json:"success"` // 接口是否成功
|
||
ErrorCode uint32 `json:"errorCode"` // 错误码
|
||
ErrorMsg string `json:"errorMsg,omitempty"` // 错误信息
|
||
SuccessMsg string `json:"successMsg,omitempty"` // 成功信息
|
||
Result interface{} `json:"result" swaggertype:"object"` // 返回结果
|
||
}
|
||
|
||
func (r CommonResponse) Error() error {
|
||
if r.Success {
|
||
return nil
|
||
}
|
||
return errort.NewCommonErr(r.ErrorCode, fmt.Errorf(r.ErrorMsg))
|
||
}
|
||
|
||
// deprecated
|
||
func NewFailCommonResponse(err error) CommonResponse {
|
||
errw := errort.NewCommonEdgeXWrapper(err)
|
||
|
||
return CommonResponse{
|
||
Success: false,
|
||
ErrorMsg: err.Error(),
|
||
ErrorCode: errw.Code(),
|
||
Result: []interface{}{},
|
||
}
|
||
}
|
||
|
||
func NewFailWithI18nResponse(ctx context.Context, err error) CommonResponse {
|
||
errw := errort.NewCommonEdgeXWrapper(err)
|
||
|
||
return CommonResponse{
|
||
Success: false,
|
||
ErrorMsg: i18n.TransCode(ctx, errw.Code(), nil),
|
||
ErrorCode: errw.Code(),
|
||
Result: []interface{}{},
|
||
}
|
||
}
|
||
|
||
func NewSuccessCommonResponse(data interface{}) CommonResponse {
|
||
if data == nil {
|
||
data = []interface{}{}
|
||
}
|
||
return CommonResponse{
|
||
Success: true,
|
||
ErrorMsg: "success",
|
||
ErrorCode: errort.DefaultSuccess,
|
||
Result: data,
|
||
}
|
||
}
|
||
|
||
// deprecated
|
||
func encode(i interface{}, w http.ResponseWriter) {
|
||
w.Header().Add(constants.ContentType, constants.ContentTypeJSON)
|
||
|
||
enc := json.NewEncoder(w)
|
||
err := enc.Encode(i)
|
||
if err != nil {
|
||
http.Error(w, err.Error(), http.StatusBadRequest)
|
||
return
|
||
}
|
||
}
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// websocket response Render
|
||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
func WsResultFail(code uint32, msg string) CommonResponse {
|
||
resp := CommonResponse{
|
||
Result: []interface{}{},
|
||
Success: false,
|
||
ErrorMsg: msg,
|
||
ErrorCode: code,
|
||
}
|
||
return resp
|
||
}
|
||
|
||
func WsResult(code uint32, data interface{}, errMsg string, successMsg string) CommonResponse {
|
||
if data == nil {
|
||
data = []interface{}{}
|
||
}
|
||
isSuccess := true
|
||
if code != errort.DefaultSuccess {
|
||
isSuccess = false
|
||
}
|
||
resp := CommonResponse{
|
||
Result: data,
|
||
Success: isSuccess,
|
||
ErrorCode: code,
|
||
ErrorMsg: errMsg,
|
||
SuccessMsg: successMsg,
|
||
}
|
||
return resp
|
||
}
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// rpc response Render
|
||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
func RenderRpcFail(err error, lc logger.LoggingClient) error {
|
||
lc.Errorf("renderRpcFail: %+v", err)
|
||
|
||
errw := errort.NewCommonEdgeXWrapper(err)
|
||
st := status.New(codes.Code(errw.Code()), err.Error())
|
||
return st.Err()
|
||
}
|