Skip to content

Commit e432a6b

Browse files
authored
Update logic for isolated worker (#368)
1 parent 124278a commit e432a6b

File tree

7 files changed

+120
-8
lines changed

7 files changed

+120
-8
lines changed

src/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/Document.cs

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Dynamic;
23
using System.IO;
34
using System.Linq;
45
using System.Reflection;
@@ -11,8 +12,13 @@
1112
using Microsoft.OpenApi;
1213
using Microsoft.OpenApi.Models;
1314

15+
using Newtonsoft.Json.Converters;
16+
using Newtonsoft.Json.Linq;
17+
using Newtonsoft.Json;
1418
using Newtonsoft.Json.Serialization;
1519

20+
using YamlDotNet.Serialization;
21+
1622
using GenericExtensions = Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions.GenericExtensions;
1723
using HttpRequestDataObjectExtensions = Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions.HttpRequestDataObjectExtensions;
1824
using OpenApiDocumentExtensions = Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Extensions.OpenApiDocumentExtensions;
@@ -43,7 +49,6 @@ public Document(IDocumentHelper helper)
4349
public Document(OpenApiDocument openApiDocument)
4450
{
4551
this.OpenApiDocument = openApiDocument;
46-
4752
}
4853

4954
/// <inheritdoc />
@@ -173,7 +178,7 @@ public IDocument Build(Assembly assembly, OpenApiVersionType version = OpenApiVe
173178
}
174179

175180
operation.Security = this._helper.GetOpenApiSecurityRequirement(method, this._strategy);
176-
operation.Parameters = this._helper.GetOpenApiParameters(method, trigger, this._strategy, this._collection);
181+
operation.Parameters = this._helper.GetOpenApiParameters(method, trigger, this._strategy, this._collection, version);
177182
operation.RequestBody = this._helper.GetOpenApiRequestBody(method, this._strategy, this._collection, version);
178183
operation.Responses = this._helper.GetOpenApiResponses(method, this._strategy, this._collection, version);
179184

@@ -208,12 +213,64 @@ public async Task<string> RenderAsync(OpenApiSpecVersion version, OpenApiFormat
208213

209214
private string Render(OpenApiSpecVersion version, OpenApiFormat format)
210215
{
216+
//var serialised = default(string);
217+
//using (var sw = new StringWriter())
218+
//{
219+
// OpenApiDocumentExtensions.Serialise(this.OpenApiDocument, sw, version, format);
220+
// serialised = sw.ToString();
221+
//}
222+
223+
//return serialised;
224+
225+
// This is the interim solution to resolve:
226+
// https://github.com/Azure/azure-functions-openapi-extension/issues/365
227+
//
228+
// It will be removed when the following issue is resolved:
229+
// https://github.com/microsoft/OpenAPI.NET/issues/747
230+
var jserialised = default(string);
231+
using (var sw = new StringWriter())
232+
{
233+
OpenApiDocumentExtensions.Serialise(this.OpenApiDocument, sw, version, OpenApiFormat.Json);
234+
jserialised = sw.ToString();
235+
}
236+
237+
var yserialised = default(string);
211238
using (var sw = new StringWriter())
212239
{
213-
OpenApiDocumentExtensions.Serialise(this.OpenApiDocument, sw, version, format);
240+
OpenApiDocumentExtensions.Serialise(this.OpenApiDocument, sw, version, OpenApiFormat.Yaml);
241+
yserialised = sw.ToString();
242+
}
243+
244+
if (version != OpenApiSpecVersion.OpenApi2_0)
245+
{
246+
return format == OpenApiFormat.Json ? jserialised : yserialised;
247+
}
248+
249+
var jo = JsonConvert.DeserializeObject<JObject>(jserialised);
250+
var jts = jo.DescendantsAndSelf()
251+
.Where(p => p.Type == JTokenType.Property && (p as JProperty).Name == "parameters")
252+
.SelectMany(p => p.Values<JArray>().SelectMany(q => q.Children<JObject>()))
253+
.Where(p => p.Value<string>("in") == null)
254+
.Where(p => p.Value<string>("description") != null)
255+
.Where(p => p.Value<string>("description").Contains("[formData]"))
256+
.ToList();
257+
foreach (var jt in jts)
258+
{
259+
jt["in"] = "formData";
260+
jt["description"] = jt.Value<string>("description").Replace("[formData]", string.Empty);
261+
}
214262

215-
return sw.ToString();
263+
var serialised = JsonConvert.SerializeObject(jo, Formatting.Indented);
264+
if (format == OpenApiFormat.Json)
265+
{
266+
return serialised;
216267
}
268+
269+
var converter = new ExpandoObjectConverter();
270+
var deserialised = JsonConvert.DeserializeObject<ExpandoObject>(serialised, converter);
271+
serialised = new SerializerBuilder().Build().Serialize(deserialised);
272+
273+
return serialised;
217274
}
218275
}
219276
}

src/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/Extensions/DocumentHelperExtensions.cs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,69 @@ public static OpenApiOperation GetOpenApiOperation(this IDocumentHelper helper,
150150
/// <param name="trigger"><see cref="HttpTriggerAttribute"/> instance.</param>
151151
/// <param name="namingStrategy"><see cref="NamingStrategy"/> instance to create the JSON schema from .NET Types.</param>
152152
/// <param name="collection"><see cref="VisitorCollection"/> instance to process parameters.</param>
153+
/// <param name="version"><see cref="OpenApiVersionType"/> value.</param>
153154
/// <returns>List of <see cref="OpenApiParameter"/> instance.</returns>
154-
public static List<OpenApiParameter> GetOpenApiParameters(this IDocumentHelper helper, MethodInfo element, HttpTriggerAttribute trigger, NamingStrategy namingStrategy, VisitorCollection collection)
155+
public static List<OpenApiParameter> GetOpenApiParameters(this IDocumentHelper helper, MethodInfo element, HttpTriggerAttribute trigger, NamingStrategy namingStrategy, VisitorCollection collection, OpenApiVersionType version)
155156
{
156157
var parameters = element.GetCustomAttributes<OpenApiParameterAttribute>(inherit: false)
157158
.Where(p => p.Deprecated == false)
158159
.Select(p => p.ToOpenApiParameter(namingStrategy, collection))
159160
.ToList();
160161

162+
// This is the interim solution to resolve:
163+
// https://github.com/Azure/azure-functions-openapi-extension/issues/365
164+
//
165+
// It will be removed when the following issue is resolved:
166+
// https://github.com/microsoft/OpenAPI.NET/issues/747
167+
if (version == OpenApiVersionType.V3)
168+
{
169+
return parameters;
170+
}
171+
172+
var attributes = element.GetCustomAttributes<OpenApiRequestBodyAttribute>(inherit: false);
173+
if (!attributes.Any())
174+
{
175+
return parameters;
176+
}
177+
178+
var contents = attributes.Where(p => p.Deprecated == false)
179+
.Where(p => p.ContentType == "application/x-www-form-urlencoded" || p.ContentType == "multipart/form-data")
180+
.Select(p => p.ToOpenApiMediaType(namingStrategy, collection, version));
181+
if (!contents.Any())
182+
{
183+
return parameters;
184+
}
185+
186+
var @ref = contents.First().Schema.Reference;
187+
var schemas = helper.GetOpenApiSchemas(new[] { element }.ToList(), namingStrategy, collection);
188+
var schema = schemas.SingleOrDefault(p => p.Key == @ref.Id);
189+
if (schema.IsNullOrDefault())
190+
{
191+
return parameters;
192+
}
193+
194+
var properties = schema.Value.Properties;
195+
foreach (var property in properties)
196+
{
197+
var value = property.Value;
198+
if ((value.Type == "string" && value.Format == "binary") || (value.Type == "string" && value.Format == "base64"))
199+
{
200+
value.Type = "file";
201+
value.Format = null;
202+
}
203+
204+
var parameter = new OpenApiParameter()
205+
{
206+
Name = property.Key,
207+
Description = $"[formData]{value.Description}",
208+
Required = bool.TryParse($"{value.Required}", out var result) ? result : false,
209+
Deprecated = value.Deprecated,
210+
Schema = value,
211+
};
212+
213+
parameters.Add(parameter);
214+
}
215+
161216
// // TODO: Should this be forcibly provided?
162217
// // This needs to be provided separately.
163218
// if (trigger.AuthLevel != AuthorizationLevel.Anonymous)

src/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/Microsoft.Azure.Functions.Worker.Extensions.OpenApi.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.0.12" />
3636
<PackageReference Include="Microsoft.Azure.Functions.Worker.Core" Version="1.1.0" />
3737
<!-- <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Abstractions" Version="1.0.0" /> -->
38+
<PackageReference Include="YamlDotNet" Version="11.2.1" />
3839
</ItemGroup>
3940

4041
<ItemGroup>

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/DocumentHelper.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Visitors;
1212
using Microsoft.OpenApi.Models;
1313

14-
using Newtonsoft.Json.Linq;
1514
using Newtonsoft.Json.Serialization;
1615

1716
namespace Microsoft.Azure.WebJobs.Extensions.OpenApi.Core

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Extensions/DocumentHelperExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public static OpenApiOperation GetOpenApiOperation(this IDocumentHelper helper,
146146
/// <param name="trigger"><see cref="HttpTriggerAttribute"/> instance.</param>
147147
/// <param name="namingStrategy"><see cref="NamingStrategy"/> instance to create the JSON schema from .NET Types.</param>
148148
/// <param name="collection"><see cref="VisitorCollection"/> instance to process parameters.</param>
149-
/// <param name="version">OpenAPI spec version.</param>
149+
/// <param name="version"><see cref="OpenApiVersionType"/> value.</param>
150150
/// <returns>List of <see cref="OpenApiParameter"/> instance.</returns>
151151
public static List<OpenApiParameter> GetOpenApiParameters(this IDocumentHelper helper, MethodInfo element, HttpTriggerAttribute trigger, NamingStrategy namingStrategy, VisitorCollection collection, OpenApiVersionType version)
152152
{

src/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
<PackageReference Include="System.IO.FileSystem.Primitives" Version="4.3.0" />
3333
<PackageReference Include="System.Runtime.Handles" Version="4.3.0" />
3434
<PackageReference Include="System.Runtime.InteropServices" Version="4.3.0" />
35-
<PackageReference Include="YamlDotNet" Version="11.2.1" />
3635
</ItemGroup>
3736

3837
<ItemGroup>

src/Microsoft.Azure.WebJobs.Extensions.OpenApi/Microsoft.Azure.WebJobs.Extensions.OpenApi.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
<ItemGroup>
3737
<PackageReference Include="Microsoft.Azure.WebJobs.Script.Abstractions" Version="1.0.0-preview" />
38+
<PackageReference Include="YamlDotNet" Version="11.2.1" />
3839
</ItemGroup>
3940

4041
<ItemGroup>

0 commit comments

Comments
 (0)