Skip to content

Commit 205052f

Browse files
authored
Merge pull request #51 from matsuri-tech/fix/schema-ewget
fix: add type information for GwGET
2 parents 0d3efc6 + 5677a47 commit 205052f

File tree

2 files changed

+105
-20
lines changed

2 files changed

+105
-20
lines changed

endpoints_test.go

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ func (handler SampleHandler) GetWithQueryWrapper(c echo.Context) (SampleModel, e
4343
}, nil
4444
}
4545

46+
func (handler SampleHandler) Patch(c echo.Context, req SampleModel) error {
47+
return nil
48+
}
49+
4650
func NewSampleHandler() SampleHandler {
4751
return SampleHandler{}
4852
}
@@ -92,6 +96,12 @@ func newRoute(e *echo.Echo) *EchoWrapper {
9296
Query: "",
9397
Desc: "get all samples",
9498
}, GetAllSamplesOutput{})
99+
GwPATCHNoContent(samples, "/:id", sampleHandler.Patch, Desc{
100+
Name: "patchSample",
101+
Query: "",
102+
Desc: "patch a sample",
103+
Versions: []string{"v2"},
104+
})
95105

96106
return ew
97107
}
@@ -210,6 +220,42 @@ func TestEchoWrapper_GenerateOpenApi(t *testing.T) {
210220
}
211221
],
212222
"summary": "createSample"
223+
},
224+
"patch": {
225+
"description": "patch a sample",
226+
"operationId": "patchSample",
227+
"parameters": [
228+
{
229+
"description": "Generated by endpoints-go",
230+
"in": "path",
231+
"name": "id",
232+
"required": true,
233+
"schema": {
234+
"type": "string"
235+
}
236+
}
237+
],
238+
"requestBody": {
239+
"content": {
240+
"application/json": {
241+
"schema": {
242+
"type": "object"
243+
}
244+
}
245+
},
246+
"description": "Generated by endpoints-go"
247+
},
248+
"responses": {
249+
"200": {
250+
"description": "Generated by endpoints-go"
251+
}
252+
},
253+
"security": [
254+
{
255+
"auth": []
256+
}
257+
],
258+
"summary": "patchSample"
213259
}
214260
},
215261
"/samples/{id}/another": {
@@ -326,7 +372,9 @@ func TestEchoWrapper_Generate(t *testing.T) {
326372
"method": "GET",
327373
"path": "samples/:id?yearMonth=2021-01",
328374
"request": null,
329-
"response": null
375+
"response": {
376+
"$ref": "#/$defs/SampleModel"
377+
}
330378
},
331379
"getSamplesWithQueryAnother": {
332380
"authSchema": {
@@ -373,7 +421,9 @@ func TestEchoWrapper_Generate(t *testing.T) {
373421
"header": ""
374422
},
375423
"request": null,
376-
"response": null
424+
"response": {
425+
"$ref": "#/$defs/SampleModel"
426+
}
377427
},
378428
"getSamplesWithQueryAnother": {
379429
"authSchema": {
@@ -415,6 +465,19 @@ func TestEchoWrapper_Generate(t *testing.T) {
415465
"response": {
416466
"$ref": "#/$defs/GetAllSamplesOutput"
417467
}
468+
},
469+
"patchSample": {
470+
"authSchema": {
471+
"header": "",
472+
"type": ""
473+
},
474+
"desc": "patch a sample",
475+
"method": "PATCH",
476+
"path": "samples/:id",
477+
"request": {
478+
"$ref": "#/$defs/SampleModel"
479+
},
480+
"response": null
418481
}
419482
}
420483
},

wrapper.go

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -203,49 +203,60 @@ func makeHandlerNoContent[Req any](h func(ctx echo.Context, req Req) error) echo
203203
// handlerの戻り値がnilの場合は、c.NoContent(http.StatusOK)として返す
204204
// NOTE: Go1.20時点では、メソッドがtype parameterをもてないので関数として定義されている
205205
func EwGET[Resp any](w *EchoWrapper, path string, h func(ctx echo.Context) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
206-
return w.GET(path, makeHandlerNoRequest(h), desc, m...)
206+
var resp Resp
207+
return w.GETTyped(path, makeHandlerNoRequest(h), desc, resp, m...)
207208
}
208209

209210
// 詳細についてはEwGETを見よ
210211
// 返すべきresponseがないケースでは、EwPOSTNoContentを使うこと
211212
func EwPOST[Req any, Resp any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
212-
return w.POST(path, makeHandler(h), desc, m...)
213+
var req Req
214+
var resp Resp
215+
return w.POSTTyped(path, makeHandler(h), desc, req, resp, m...)
213216
}
214217

215218
// 詳細についてはEwGETを見よ
216219
func EwPOSTNoContent[Req any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
217-
return w.POST(path, makeHandlerNoContent(h), desc, m...)
220+
var req Req
221+
return w.POSTTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
218222
}
219223

220224
// 詳細についてはEwGETを見よ
221225
// 返すべきresponseがないケースでは、EwPUTNoContentを使うこと
222226
func EwPUT[Req any, Resp any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
223-
return w.PUT(path, makeHandler(h), desc, m...)
227+
var req Req
228+
var resp Resp
229+
return w.PUTTyped(path, makeHandler(h), desc, req, resp, m...)
224230
}
225231

226232
// 詳細についてはEwGETを見よ
227233
func EwPUTNoContent[Req any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
228-
return w.PUT(path, makeHandlerNoContent(h), desc, m...)
234+
var req Req
235+
return w.PUTTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
229236
}
230237

231238
// 詳細についてはEwGETを見よ
232239
func EwPATCH[Req any, Resp any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
233-
return w.PATCH(path, makeHandler(h), desc, m...)
240+
var req Req
241+
var resp Resp
242+
return w.PATCHTyped(path, makeHandler(h), desc, req, resp, m...)
234243
}
235244

236245
// 詳細についてはEwGETを見よ
237246
func EwPATCHNoContent[Req any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
238-
return w.PATCH(path, makeHandlerNoContent(h), desc, m...)
247+
var req Req
248+
return w.PATCHTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
239249
}
240250

241251
// 詳細についてはEwGETを見よ
242252
func EwDELETE[Resp any](w *EchoWrapper, path string, h func(ctx echo.Context) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
243-
return w.DELETE(path, makeHandlerNoRequest(h), desc, m...)
253+
var resp Resp
254+
return w.DELETETyped(path, makeHandlerNoRequest(h), desc, resp, m...)
244255
}
245256

246257
// 詳細についてはEwGETを見よ
247258
func EwDELETENoContent[Req any](w *EchoWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
248-
return w.DELETE(path, makeHandlerNoContent(h), desc, m...)
259+
return w.DELETETyped(path, makeHandlerNoContent(h), desc, nil, m...)
249260
}
250261

251262
func (w *EchoWrapper) Group(prefix string, m ...echo.MiddlewareFunc) *GroupWrapper {
@@ -350,47 +361,58 @@ func (g *GroupWrapper) DELETETyped(path string, h echo.HandlerFunc, desc Desc, r
350361

351362
// 詳細についてはEwGETを見よ
352363
func GwGET[Resp any](g *GroupWrapper, path string, h func(ctx echo.Context) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
353-
return g.GET(path, makeHandlerNoRequest(h), desc, m...)
364+
var resp Resp
365+
return g.GETTyped(path, makeHandlerNoRequest(h), desc, resp, m...)
354366
}
355367

356368
// 詳細についてはEwGETを見よ
357369
func GwPOST[Req any, Resp any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
358-
return g.POST(path, makeHandler(h), desc, m...)
370+
var req Req
371+
var resp Resp
372+
return g.POSTTyped(path, makeHandler(h), desc, req, resp, m...)
359373
}
360374

361375
// 詳細についてはEwGETを見よ
362376
func GwPOSTNoContent[Req any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
363-
return g.POST(path, makeHandlerNoContent(h), desc, m...)
377+
var req Req
378+
return g.POSTTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
364379
}
365380

366381
// 詳細についてはEwGETを見よ
367382
func GwPUT[Req any, Resp any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
368-
return g.PUT(path, makeHandler(h), desc, m...)
383+
var req Req
384+
var resp Resp
385+
return g.PUTTyped(path, makeHandler(h), desc, req, resp, m...)
369386
}
370387

371388
// 詳細についてはEwGETを見よ
372389
func GwPUTNoContent[Req any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
373-
return g.PUT(path, makeHandlerNoContent(h), desc, m...)
390+
var req Req
391+
return g.PUTTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
374392
}
375393

376394
// 詳細についてはEwGETを見よ
377395
func GwPATCH[Req any, Resp any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
378-
return g.PATCH(path, makeHandler(h), desc, m...)
396+
var req Req
397+
var resp Resp
398+
return g.PATCHTyped(path, makeHandler(h), desc, req, resp, m...)
379399
}
380400

381401
// 詳細についてはEwGETを見よ
382402
func GwPATCHNoContent[Req any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
383-
return g.PATCH(path, makeHandlerNoContent(h), desc, m...)
403+
var req Req
404+
return g.PATCHTyped(path, makeHandlerNoContent(h), desc, req, nil, m...)
384405
}
385406

386407
// 詳細についてはEwGETを見よ
387408
func GwDELETE[Resp any](g *GroupWrapper, path string, h func(ctx echo.Context) (Resp, error), desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
388-
return g.DELETE(path, makeHandlerNoRequest(h), desc, m...)
409+
var resp Resp
410+
return g.DELETETyped(path, makeHandlerNoRequest(h), desc, resp, m...)
389411
}
390412

391413
// 詳細についてはEwGETを見よ
392414
func GwDELETENoContent[Req any](g *GroupWrapper, path string, h func(ctx echo.Context, req Req) error, desc Desc, m ...echo.MiddlewareFunc) *echo.Route {
393-
return g.DELETE(path, makeHandlerNoContent(h), desc, m...)
415+
return g.DELETETyped(path, makeHandlerNoContent(h), desc, nil, m...)
394416
}
395417

396418
type Desc struct {

0 commit comments

Comments
 (0)