mirror of
https://github.com/EZ-Api/ez-api.git
synced 2026-01-13 17:47:51 +00:00
feat(api): wrap JSON responses in envelope
Add response envelope middleware to standardize JSON responses as
`{code,data,message}` with consistent business codes across endpoints.
Update Swagger annotations and tests to reflect the new response shape.
BREAKING CHANGE: API responses are now wrapped in a response envelope; clients must read payloads from `data` and handle `code`/`message` fields.
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/alicebob/miniredis/v2"
|
||||
"github.com/ez-api/ez-api/internal/middleware"
|
||||
"github.com/ez-api/ez-api/internal/model"
|
||||
"github.com/ez-api/ez-api/internal/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
@@ -48,6 +48,7 @@ func TestAdminMasterRealtimeEndpoints(t *testing.T) {
|
||||
adminHandler := NewAdminHandler(db, db, masterSvc, syncSvc, statsSvc, nil)
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.GET("/admin/masters/:id", adminHandler.GetMaster)
|
||||
r.GET("/admin/masters/:id/realtime", adminHandler.GetMasterRealtime)
|
||||
|
||||
@@ -58,9 +59,7 @@ func TestAdminMasterRealtimeEndpoints(t *testing.T) {
|
||||
t.Fatalf("expected 200, got %d body=%s", rr.Code, rr.Body.String())
|
||||
}
|
||||
var view MasterView
|
||||
if err := json.Unmarshal(rr.Body.Bytes(), &view); err != nil {
|
||||
t.Fatalf("unmarshal master view: %v", err)
|
||||
}
|
||||
decodeEnvelope(t, rr, &view)
|
||||
if view.Realtime == nil || view.Realtime.QPS != 2 || view.Realtime.QPSLimit != 5 {
|
||||
t.Fatalf("unexpected realtime in master view: %+v", view.Realtime)
|
||||
}
|
||||
@@ -72,9 +71,7 @@ func TestAdminMasterRealtimeEndpoints(t *testing.T) {
|
||||
t.Fatalf("expected 200, got %d body=%s", rr.Code, rr.Body.String())
|
||||
}
|
||||
var realtime MasterRealtimeView
|
||||
if err := json.Unmarshal(rr.Body.Bytes(), &realtime); err != nil {
|
||||
t.Fatalf("unmarshal realtime: %v", err)
|
||||
}
|
||||
decodeEnvelope(t, rr, &realtime)
|
||||
if realtime.Requests != 12 || realtime.Tokens != 34 || realtime.QPS != 2 {
|
||||
t.Fatalf("unexpected realtime payload: %+v", realtime)
|
||||
}
|
||||
@@ -115,6 +112,7 @@ func TestMasterSelfRealtime(t *testing.T) {
|
||||
}
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.GET("/v1/realtime", withMaster(masterHandler.GetSelfRealtime))
|
||||
|
||||
rr := httptest.NewRecorder()
|
||||
@@ -124,9 +122,7 @@ func TestMasterSelfRealtime(t *testing.T) {
|
||||
t.Fatalf("expected 200, got %d body=%s", rr.Code, rr.Body.String())
|
||||
}
|
||||
var realtime MasterRealtimeView
|
||||
if err := json.Unmarshal(rr.Body.Bytes(), &realtime); err != nil {
|
||||
t.Fatalf("unmarshal realtime: %v", err)
|
||||
}
|
||||
decodeEnvelope(t, rr, &realtime)
|
||||
if realtime.Requests != 6 || realtime.Tokens != 8 {
|
||||
t.Fatalf("unexpected realtime payload: %+v", realtime)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user