OpenAPI.NET.OData/src/Microsoft.OpenApi.OData.Reader/Operation/EdmOperationImportOperationHandler.cs

158 lines
6 KiB
C#

// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
// ------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.OData.Edm;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.OData.Common;
using Microsoft.OpenApi.OData.Edm;
using Microsoft.OpenApi.OData.Generator;
using Microsoft.OpenApi.OData.Vocabulary.Capabilities;
namespace Microsoft.OpenApi.OData.Operation
{
/// <summary>
/// Base class for <see cref="IEdmOperationImport"/>.
/// </summary>
internal abstract class EdmOperationImportOperationHandler : OperationHandler
{
/// <summary>
/// Gets the <see cref="IEdmOperationImport"/>.
/// </summary>
protected IEdmOperationImport EdmOperationImport { get; private set; }
/// <summary>
/// Gets the <see cref="IEdmOperationImport"/>.
/// </summary>
protected ODataOperationImportSegment OperationImportSegment { get; private set; }
/// <inheritdoc/>
protected override void Initialize(ODataContext context, ODataPath path)
{
base.Initialize(context, path);
OperationImportSegment = path.LastSegment as ODataOperationImportSegment;
EdmOperationImport = OperationImportSegment.OperationImport;
}
/// <inheritdoc/>
protected override void SetBasicInfo(OpenApiOperation operation)
{
operation.Summary = "Invoke " + (EdmOperationImport.IsActionImport() ? "actionImport " : "functionImport ") + EdmOperationImport.Name;
if (Context.Settings.EnableOperationId)
{
if (EdmOperationImport.IsActionImport())
{
operation.OperationId = "ActionImport." + EdmOperationImport.Name;
}
else
{
ODataOperationImportSegment operationImportSegment = Path.LastSegment as ODataOperationImportSegment;
string pathItemName = operationImportSegment.GetPathItemName(Context.Settings, new HashSet<string>());
if (Context.Model.IsOperationImportOverload(EdmOperationImport))
{
string hash = pathItemName.GetHashSHA256();
operation.OperationId = "FunctionImport." + EdmOperationImport.Name + "-" + hash.Substring(0, 4);
}
else
{
operation.OperationId = "FunctionImport." + EdmOperationImport.Name;
}
}
}
base.SetBasicInfo(operation);
}
/// <inheritdoc/>
protected override void SetResponses(OpenApiOperation operation)
{
// The responses object contains a name/value pair for the success case (HTTP response code 200)
// describing the structure of the success response by referencing an appropriate schema
// in the global schemas. In addition, it contains a default name/value pair for
// the OData error response referencing the global responses.
operation.Responses = Context.CreateResponses(EdmOperationImport);
base.SetResponses(operation);
}
/// <inheritdoc/>
protected override void SetSecurity(OpenApiOperation operation)
{
OperationRestrictionsType restriction = Context.Model.GetRecord<OperationRestrictionsType>(EdmOperationImport, CapabilitiesConstants.OperationRestrictions);
if (restriction == null || restriction.Permissions == null)
{
return;
}
operation.Security = Context.CreateSecurityRequirements(restriction.Permissions).ToList();
}
/// <inheritdoc/>
protected override void AppendCustomParameters(OpenApiOperation operation)
{
OperationRestrictionsType restriction = Context.Model.GetRecord<OperationRestrictionsType>(EdmOperationImport, CapabilitiesConstants.OperationRestrictions);
if (restriction == null)
{
return;
}
if (restriction.CustomHeaders != null)
{
AppendCustomParameters(operation, restriction.CustomHeaders, ParameterLocation.Header);
}
if (restriction.CustomQueryOptions != null)
{
AppendCustomParameters(operation, restriction.CustomQueryOptions, ParameterLocation.Query);
}
}
/// <inheritdoc/>
protected override void SetTags(OpenApiOperation operation)
{
operation.Tags = CreateTags(EdmOperationImport);
operation.Tags[0].Extensions.Add(Constants.xMsTocType, new OpenApiString("container"));
Context.AppendTag(operation.Tags[0]);
base.SetTags(operation);
}
private static IList<OpenApiTag> CreateTags(IEdmOperationImport operationImport)
{
if (operationImport.EntitySet != null)
{
var pathExpression = operationImport.EntitySet as IEdmPathExpression;
if (pathExpression != null)
{
return new List<OpenApiTag>
{
new OpenApiTag
{
Name = PathAsString(pathExpression.PathSegments)
}
};
}
}
return new List<OpenApiTag>{
new OpenApiTag
{
Name = operationImport.Name
}
};
}
internal static string PathAsString(IEnumerable<string> path)
{
return String.Join("/", path);
}
}
}