private async Task WriteBodyPath(OpenApiOperation operation, Entity entity, OperationType operationType, Method method)
        {
            if (operation.Tags == null)
            {
                operation.Tags = new List <OpenApiTag>();
            }
            operation.Tags.Add(new OpenApiTag()
            {
                Name =
                    method.Tag != null ? method.Tag :
                    entity.Tag != null ? entity.Tag :
                    codeConvention.GetTag(entity, method)
            });

            var operationId = method.OperationId;

            if (method.OperationId == null)
            {
                operationId = codeConvention.GetOperationId(entity, method);
            }
            operation.OperationId = operationId;
            if (method.OperationName != null || method.OperationId == null)
            {
                operation.AddExtension("x-operation-name", new OpenApiString(method.OperationName ?? codeConvention.GetOperationName(entity, method)));
            }
            IGenericSPSerializer?serializer = serializerResolver.GetSerialializerOrNull(null, entity, method);

            var(inputParameters, outputParameters) = await parametersProvider.GetApiParameters(new Filter.ParameterInterceptorContext(entity, method, true), method.IgnoreParameters, dbConnection);

            var context = new OperationResponseContext(entity, method, sPMiddlewareOptions.AlwaysWrapJson,
                                                       outputParameters);

            operation.Responses = GetDefaultResponse(codeConvention.GetResultTypeName(method),
                                                     outputParameters.Length > 0 ? codeConvention.GetOutputObjectTypeName(method) : null,
                                                     context);

            if (serializer != null)
            {
                operation.Responses = serializer.ModifyResponses(operation.Responses, context);
            }


            if (operationType != OperationType.Get && inputParameters.Any(p => p.WebApiName != null && !entity.ContainsPathParameter(p.WebApiName)))
            {
                if (operation.RequestBody == null)
                {
                    operation.RequestBody = new OpenApiRequestBody();
                }
                operation.RequestBody.Required    = true;
                operation.RequestBody.Description = "Parameters for " + method.SP.ToString();
                bool requireFormData = inputParameters.Any(p => p.RequiresFormData);
                operation.RequestBody.Content.Add(requireFormData ? "multipart/form-data" : "application /json", new OpenApiMediaType()
                {
                    Schema = new OpenApiSchema()
                    {
                        Reference = new OpenApiReference()
                        {
                            Type = ReferenceType.Schema,
                            Id   = codeConvention.GetParameterObjectName(entity, method)
                        }
                    }
                });
            }
            if (operation.Parameters == null)
            {
                operation.Parameters = new List <OpenApiParameter>();
            }
            if (operationType == OperationType.Get)
            {
                foreach (var item in inputParameters.Where(p => p.WebApiName != null && !entity.ContainsPathParameter(p.WebApiName)))
                {
                    var schema = item.GetSchema();

                    operation.Parameters.Add(new OpenApiParameter()
                    {
                        Name     = item.WebApiName,
                        In       = ParameterLocation.Query,
                        Required = false,
                        Schema   = new OpenApiSchema()
                        { // IsNullable etc are ignore intentionally
                            Type   = schema.Type,
                            Format = schema.Format
                        }
                    });
                }
            }
            foreach (var item in inputParameters.Where(p => p.WebApiName != null && entity.ContainsPathParameter(p.WebApiName)))
            {
                var schema = item.GetSchema();
                operation.Parameters.Add(new OpenApiParameter()
                {
                    Name     = item.WebApiName,
                    In       = ParameterLocation.Path,
                    Required = true,
                    Schema   = new OpenApiSchema()
                    {
                        Type   = schema.Type,
                        Format = schema.Format
                    }
                });
            }
        }
        protected virtual OpenApiResponses GetDefaultResponse(string resultTypeName, string?outputObjectName,
                                                              OperationResponseContext context)
        {
            OpenApiResponses responses = new OpenApiResponses();
            OpenApiResponse  response  = new OpenApiResponse();

            response.Description = $"OK"; // Required as per spec

            OpenApiSchema arrayOfResult =
                new OpenApiSchema()
            {
                Type = "array",
                Xml  = new OpenApiXml()
                {
                    Name = "table"
                },
                UniqueItems = false,
                Items       = new OpenApiSchema()
                {
                    Reference = new OpenApiReference()
                    {
                        Type = ReferenceType.Schema,
                        Id   = resultTypeName
                    }
                }
            };
            OpenApiSchema schema = arrayOfResult;

            if (outputObjectName != null || context.AlwaysWrapJson)
            {
                schema = new OpenApiSchema()
                {
                    Type       = "object",
                    Required   = new HashSet <string>(new string[] { codeConvention.FirstResultKey }),
                    Properties = new Dictionary <string, OpenApiSchema>()
                    {
                        { codeConvention.FirstResultKey, arrayOfResult },
                        { codeConvention.OtherResultsKey, new OpenApiSchema()
                          {
                              Type  = "array",
                              Items = new OpenApiSchema()
                              {
                                  Type  = "array",
                                  Items = new OpenApiSchema()
                                  {
                                      Type = "object",
                                      AdditionalPropertiesAllowed = true
                                  }
                              }
                          } }
                    }
                };
                if (outputObjectName != null)
                {
                    schema.Properties.Add(codeConvention.OutputParametersKey, new OpenApiSchema()
                    {
                        Reference = new OpenApiReference()
                        {
                            Type = ReferenceType.Schema,
                            Id   = outputObjectName
                        }
                    });
                    schema.Required.Add(codeConvention.OutputParametersKey);
                }
            }
            response.Content.Add("application/json", new OpenApiMediaType()
            {
                Schema = schema
            });
            responses.Add("200", response);
            return(responses);
        }