2021-10-02 18:54:06 +08:00
|
|
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
|
|
//
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
|
2021-10-02 14:52:28 +08:00
|
|
|
package goai
|
|
|
|
|
|
|
|
import (
|
2021-10-11 21:41:56 +08:00
|
|
|
"github.com/gogf/gf/v2/internal/json"
|
|
|
|
"github.com/gogf/gf/v2/internal/structs"
|
|
|
|
"github.com/gogf/gf/v2/text/gstr"
|
2021-10-11 17:10:55 +08:00
|
|
|
"reflect"
|
2021-10-02 14:52:28 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// RequestBody is specified by OpenAPI/Swagger 3.0 standard.
|
|
|
|
type RequestBody struct {
|
|
|
|
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
|
|
|
Required bool `json:"required,omitempty" yaml:"required,omitempty"`
|
|
|
|
Content Content `json:"content,omitempty" yaml:"content,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type RequestBodyRef struct {
|
|
|
|
Ref string
|
|
|
|
Value *RequestBody
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r RequestBodyRef) MarshalJSON() ([]byte, error) {
|
|
|
|
if r.Ref != "" {
|
2021-10-02 18:54:06 +08:00
|
|
|
return formatRefToBytes(r.Ref), nil
|
2021-10-02 14:52:28 +08:00
|
|
|
}
|
|
|
|
return json.Marshal(r.Value)
|
|
|
|
}
|
2021-10-11 17:10:55 +08:00
|
|
|
|
|
|
|
type getRequestSchemaRefInput struct {
|
|
|
|
BusinessStructName string
|
|
|
|
RequestObject interface{}
|
|
|
|
RequestDataField string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (oai *OpenApiV3) getRequestSchemaRef(in getRequestSchemaRefInput) (*SchemaRef, error) {
|
|
|
|
if oai.Config.CommonRequest == nil {
|
|
|
|
return &SchemaRef{
|
|
|
|
Ref: in.BusinessStructName,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
dataFieldsPartsArray = gstr.Split(in.RequestDataField, ".")
|
|
|
|
bizRequestStructSchemaRef, bizRequestStructSchemaRefExist = oai.Components.Schemas[in.BusinessStructName]
|
|
|
|
schema, err = oai.structToSchema(in.RequestObject)
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if in.RequestDataField == "" && bizRequestStructSchemaRefExist {
|
|
|
|
for k, v := range bizRequestStructSchemaRef.Value.Properties {
|
|
|
|
schema.Properties[k] = v
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
structFields, _ := structs.Fields(structs.FieldsInput{
|
|
|
|
Pointer: in.RequestObject,
|
|
|
|
RecursiveOption: structs.RecursiveOptionEmbeddedNoTag,
|
|
|
|
})
|
|
|
|
for _, structField := range structFields {
|
|
|
|
var (
|
|
|
|
fieldName = structField.Name()
|
|
|
|
)
|
|
|
|
if jsonName := structField.TagJsonName(); jsonName != "" {
|
|
|
|
fieldName = jsonName
|
|
|
|
}
|
|
|
|
switch len(dataFieldsPartsArray) {
|
|
|
|
case 1:
|
|
|
|
if structField.Name() == dataFieldsPartsArray[0] {
|
|
|
|
schema.Properties[fieldName] = bizRequestStructSchemaRef
|
|
|
|
break
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
if structField.Name() == dataFieldsPartsArray[0] {
|
|
|
|
var (
|
2021-10-13 22:28:49 +08:00
|
|
|
structFieldInstance = reflect.New(structField.Type().Type).Elem()
|
2021-10-11 17:10:55 +08:00
|
|
|
)
|
|
|
|
schemaRef, err := oai.getRequestSchemaRef(getRequestSchemaRefInput{
|
|
|
|
BusinessStructName: in.BusinessStructName,
|
|
|
|
RequestObject: structFieldInstance,
|
|
|
|
RequestDataField: gstr.Join(dataFieldsPartsArray[1:], "."),
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
schema.Properties[fieldName] = *schemaRef
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return &SchemaRef{
|
|
|
|
Value: schema,
|
|
|
|
}, nil
|
|
|
|
}
|