123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // 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.
- package goai
- import (
- "reflect"
- "github.com/gogf/gf/v2/internal/json"
- "github.com/gogf/gf/v2/os/gstructs"
- "github.com/gogf/gf/v2/text/gstr"
- )
- // RequestBody is specified by OpenAPI/Swagger 3.0 standard.
- type RequestBody struct {
- Description string `json:"description,omitempty"`
- Required bool `json:"required,omitempty"`
- Content Content `json:"content,omitempty"`
- }
- type RequestBodyRef struct {
- Ref string
- Value *RequestBody
- }
- func (r RequestBodyRef) MarshalJSON() ([]byte, error) {
- if r.Ref != "" {
- return formatRefToBytes(r.Ref), nil
- }
- return json.Marshal(r.Value)
- }
- 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 = oai.Components.Schemas.Get(in.BusinessStructName)
- schema, err = oai.structToSchema(in.RequestObject)
- )
- if err != nil {
- return nil, err
- }
- if in.RequestDataField == "" && bizRequestStructSchemaRef != nil {
- // Normal request.
- bizRequestStructSchemaRef.Value.Properties.Iterator(func(key string, ref SchemaRef) bool {
- schema.Properties.Set(key, ref)
- return true
- })
- } else {
- // Common request.
- structFields, _ := gstructs.Fields(gstructs.FieldsInput{
- Pointer: in.RequestObject,
- RecursiveOption: gstructs.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] {
- if err = oai.tagMapToSchema(structField.TagMap(), bizRequestStructSchemaRef.Value); err != nil {
- return nil, err
- }
- schema.Properties.Set(fieldName, *bizRequestStructSchemaRef)
- break
- }
- default:
- if structField.Name() == dataFieldsPartsArray[0] {
- var structFieldInstance = reflect.New(structField.Type().Type).Elem()
- schemaRef, err := oai.getRequestSchemaRef(getRequestSchemaRefInput{
- BusinessStructName: in.BusinessStructName,
- RequestObject: structFieldInstance,
- RequestDataField: gstr.Join(dataFieldsPartsArray[1:], "."),
- })
- if err != nil {
- return nil, err
- }
- schema.Properties.Set(fieldName, *schemaRef)
- break
- }
- }
- }
- }
- return &SchemaRef{
- Value: schema,
- }, nil
- }
|