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:
@@ -9,6 +9,7 @@ import (
|
||||
"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"
|
||||
@@ -40,6 +41,7 @@ func TestCreateModel_DefaultsKindChat_AndWritesModelsMeta(t *testing.T) {
|
||||
h, _, mr := newTestHandlerWithRedis(t)
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.POST("/admin/models", h.CreateModel)
|
||||
|
||||
reqBody := map[string]any{
|
||||
@@ -86,6 +88,7 @@ func TestCreateModel_InvalidKind_Returns400(t *testing.T) {
|
||||
h, _, _ := newTestHandlerWithRedis(t)
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.POST("/admin/models", h.CreateModel)
|
||||
|
||||
reqBody := map[string]any{
|
||||
@@ -108,6 +111,7 @@ func TestDeleteModel_RemovesMeta(t *testing.T) {
|
||||
h, db, mr := newTestHandlerWithRedis(t)
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.POST("/admin/models", h.CreateModel)
|
||||
r.DELETE("/admin/models/:id", h.DeleteModel)
|
||||
|
||||
@@ -125,9 +129,7 @@ func TestDeleteModel_RemovesMeta(t *testing.T) {
|
||||
t.Fatalf("expected 201, got %d body=%s", rr.Code, rr.Body.String())
|
||||
}
|
||||
var created model.Model
|
||||
if err := json.Unmarshal(rr.Body.Bytes(), &created); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
decodeEnvelope(t, rr, &created)
|
||||
|
||||
delReq := httptest.NewRequest(http.MethodDelete, fmt.Sprintf("/admin/models/%d", created.ID), nil)
|
||||
delRec := httptest.NewRecorder()
|
||||
@@ -152,6 +154,7 @@ func TestBatchModels_Delete(t *testing.T) {
|
||||
h, db, mr := newTestHandlerWithRedis(t)
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.POST("/admin/models", h.CreateModel)
|
||||
r.POST("/admin/models/batch", h.BatchModels)
|
||||
|
||||
@@ -166,9 +169,7 @@ func TestBatchModels_Delete(t *testing.T) {
|
||||
t.Fatalf("expected 201, got %d body=%s", rr.Code, rr.Body.String())
|
||||
}
|
||||
var created model.Model
|
||||
if err := json.Unmarshal(rr.Body.Bytes(), &created); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
decodeEnvelope(t, rr, &created)
|
||||
return created.ID
|
||||
}
|
||||
|
||||
@@ -225,6 +226,7 @@ func TestBatchBindings_Status(t *testing.T) {
|
||||
}
|
||||
|
||||
r := gin.New()
|
||||
r.Use(middleware.ResponseEnvelope())
|
||||
r.POST("/admin/bindings/batch", h.BatchBindings)
|
||||
|
||||
payload := map[string]any{
|
||||
|
||||
Reference in New Issue
Block a user