@@ -30,13 +30,17 @@ func (fg *fileGenerator) generateFileDoc(file *descriptor.File) *openapi3.T {
30
30
31
31
fg .doc .Components = new (openapi3.Components )
32
32
fg .doc .Components .Schemas = make (openapi3.Schemas )
33
+ fg .doc .Components .RequestBodies = make (openapi3.RequestBodies )
33
34
34
35
if fg .doc .Paths == nil {
35
36
fg .doc .Paths = & openapi3.Paths {}
36
37
}
37
38
38
39
for _ , svc := range file .Services {
39
- fg .generateServiceDoc (svc )
40
+ err := fg .generateServiceDoc (svc )
41
+ if err != nil {
42
+ grpclog .Errorf ("could not generate service document: %v" , err )
43
+ }
40
44
}
41
45
42
46
for _ , msg := range file .Messages {
@@ -77,6 +81,10 @@ func (fg *fileGenerator) generateMessageSchema(msg *descriptor.Message, excludeF
77
81
properties := make (openapi3.Schemas )
78
82
tempOneOfsProperties := make (map [int32 ]openapi3.Schemas )
79
83
for _ , field := range msg .Fields {
84
+ if slices .Contains (excludeFields , field .FQFN ()) {
85
+ continue
86
+ }
87
+
80
88
fieldDoc := fg .generateFieldDoc (field )
81
89
if field .OneofIndex != nil {
82
90
if tempOneOfsProperties [* field .OneofIndex ] == nil {
@@ -254,10 +262,15 @@ func (fg *fileGenerator) generateEnumSchema(enum *descriptor.Enum) *openapi3.Sch
254
262
}
255
263
}
256
264
257
- func (fg * fileGenerator ) generateServiceDoc (svc * descriptor.Service ) {
265
+ func (fg * fileGenerator ) generateServiceDoc (svc * descriptor.Service ) error {
258
266
for _ , meth := range svc .Methods {
259
- fg .generateMethodDoc (meth )
267
+ err := fg .generateMethodDoc (meth )
268
+ if err != nil {
269
+ return fmt .Errorf ("could not generate method %s doc: %w" , meth .GetName (), err )
270
+ }
260
271
}
272
+
273
+ return nil
261
274
}
262
275
263
276
func (fg * fileGenerator ) generateMethodDoc (meth * descriptor.Method ) error {
@@ -279,26 +292,52 @@ func (fg *fileGenerator) generateMethodDoc(meth *descriptor.Method) error {
279
292
params = append (params , tmpParams ... )
280
293
}
281
294
295
+ pathParamsFQFNs := make ([]string , len (binding .PathParams ))
296
+ for i , param := range binding .PathParams {
297
+ pathParamsFQFNs [i ] = param .Target .FQFN ()
298
+ }
299
+
282
300
switch binding .HTTPMethod {
283
301
case "POST" , "PUT" , "PATCH" :
284
302
// For POST, PUT, PATCH, add request body
285
- requestBody = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().WithContent (
286
- openapi3 .NewContentWithJSONSchemaRef (fg .getMessageSchemaRef (meth .RequestType )))}
303
+ if len (pathParamsFQFNs ) > 0 {
304
+ messageSchema := fg .generateMessageSchema (meth .RequestType , pathParamsFQFNs )
305
+
306
+ name := fg .resolveName (meth .RequestType .FQMN ())
307
+ resultRef := fmt .Sprintf ("#/components/requestBodies/%s" , name )
287
308
309
+ fg .doc .Components .RequestBodies [name ] = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().WithContent (
310
+ openapi3 .NewContentWithJSONSchemaRef (messageSchema .NewRef ()))}
311
+
312
+ requestBody = & openapi3.RequestBodyRef {Ref : resultRef }
313
+ } else {
314
+ requestBody = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().
315
+ WithJSONSchemaRef (fg .getMessageSchemaRef (meth .RequestType ))}
316
+ }
288
317
}
289
318
}
290
319
291
- responseSchema := & openapi3.ResponseRef {
292
- Ref : fg .getMessageSchemaRef (meth .ResponseType ).RefString (),
320
+ defaultResponse , err := fg .defaultResponse ()
321
+ if err != nil {
322
+ return fmt .Errorf ("could not get default response: %w" , err )
293
323
}
294
324
325
+ successResponseSchema := openapi3 .NewResponse ().
326
+ WithJSONSchemaRef (fg .getMessageSchemaRef (meth .ResponseType ))
327
+
328
+ defaultResponseSchema := openapi3 .NewResponse ().
329
+ WithJSONSchemaRef (fg .getMessageSchemaRef (defaultResponse ))
330
+
331
+ responses := openapi3 .NewResponses (openapi3 .WithStatus (200 , & openapi3.ResponseRef {Value : successResponseSchema }),
332
+ openapi3 .WithName ("default" , defaultResponseSchema ))
333
+
295
334
operation := & openapi3.Operation {
296
335
Tags : []string {meth .Service .GetName ()},
297
336
Summary : opOpts .GetSummary (),
298
337
Description : opOpts .GetDescription (),
299
338
OperationID : fg .getOperationName (meth .Service .GetName (), meth .GetName (), bindingIdx ),
300
339
RequestBody : requestBody ,
301
- Responses : openapi3 . NewResponses ( openapi3 . WithStatus ( 200 , responseSchema )) ,
340
+ Responses : responses ,
302
341
Parameters : params ,
303
342
}
304
343
@@ -370,13 +409,13 @@ func (fg *fileGenerator) messageToParameters(message *descriptor.Message,
370
409
371
410
switch paramType {
372
411
case openapi3 .ParameterInPath :
373
- param := openapi3 .NewPathParameter (field .GetJsonName ())
412
+ param := openapi3 .NewPathParameter (field .GetName ())
374
413
param .Schema = schema
375
414
params = append (params , & openapi3.ParameterRef {
376
415
Value : param ,
377
416
})
378
417
case openapi3 .ParameterInQuery :
379
- param := openapi3 .NewQueryParameter (field .GetJsonName ())
418
+ param := openapi3 .NewQueryParameter (field .GetName ())
380
419
param .Schema = schema
381
420
params = append (params , & openapi3.ParameterRef {
382
421
Value : param ,
0 commit comments