diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs index da4b7077..083d78a3 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs @@ -25,30 +25,21 @@ internal class MediaEntityGetOperationHandler : MediaEntityOperationalHandler protected override void SetBasicInfo(OpenApiOperation operation) { // Summary - if (EntitySet != null) + if (IsNavigationPropertyPath) { - string typeName = EntitySet.EntityType().Name; - operation.Summary = $"Get media content for {typeName} from {EntitySet.Name}"; + operation.Summary = $"Get media content for the navigation property {NavigationProperty.Name} from {NavigationSource.Name}"; } else { - operation.Summary = $"Get media content for the navigation property {NavigationProperty.Name} from {NavigationSource.Name}"; + string typeName = EntitySet.EntityType().Name; + operation.Summary = $"Get media content for {typeName} from {EntitySet.Name}"; } // OperationId if (Context.Settings.EnableOperationId) { string identifier = Path.LastSegment.Kind == ODataSegmentKind.StreamContent ? "Content" : Path.LastSegment.Identifier; - - if (EntitySet != null) - { - string typeName = EntitySet.EntityType().Name; - operation.OperationId = $"{EntitySet.Name}.{typeName}.Get{Utils.UpperFirstChar(identifier)}"; - } - else // Singleton - { - operation.OperationId = GetOperationId("Get", identifier); - } + operation.OperationId = GetOperationId("Get", identifier); } base.SetBasicInfo(operation); diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs index 9629bae0..d43ffcaf 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs @@ -30,18 +30,31 @@ internal abstract class MediaEntityOperationalHandler : NavigationPropertyOperat /// protected IEdmSingleton Singleton { get; private set; } + /// + /// Gets/Sets flag indicating whether path is navigation property path + /// + protected bool IsNavigationPropertyPath { get; private set; } + /// protected override void Initialize(ODataContext context, ODataPath path) { - // The first segment will either be an entity set navigation source or a singleton navigation source. + // The first segment will either be an EntitySet navigation source or a Singleton navigation source ODataNavigationSourceSegment navigationSourceSegment = path.FirstSegment as ODataNavigationSourceSegment; EntitySet = navigationSourceSegment.NavigationSource as IEdmEntitySet; if (EntitySet == null) { - // Singleton + Singleton = navigationSourceSegment.NavigationSource as IEdmSingleton; + } + + // Check whether path is a navigation property path + IsNavigationPropertyPath = Path.Segments.Contains( + Path.Segments.Where(segment => segment is ODataNavigationPropertySegment).FirstOrDefault()); + + if (IsNavigationPropertyPath) + { + // Initialize navigation property paths from base base.Initialize(context, path); - Singleton = NavigationSource as IEdmSingleton; } } @@ -78,7 +91,7 @@ protected override void SetExtensions(OpenApiOperation operation) } /// - /// Retrieves the operation Id for a navigation property stream path. + /// Retrieves the operation Id for a media entity stream path. /// /// The http method identifier name. /// The stream segment identifier name. @@ -90,7 +103,7 @@ protected string GetOperationId(string prefix, string identifier) IList items = new List { - NavigationSource.Name + EntitySet?.Name ?? Singleton.Name }; ODataSegment lastSegment = Path.Segments.Last(c => c is ODataStreamContentSegment || c is ODataStreamPropertySegment); @@ -98,7 +111,19 @@ protected string GetOperationId(string prefix, string identifier) { if (segment == lastSegment) { - items.Add(prefix + Utils.UpperFirstChar(identifier)); + if (!IsNavigationPropertyPath) + { + string typeName = EntitySet?.EntityType().Name ?? Singleton.EntityType().Name; + items.Add(typeName); + items.Add(prefix + Utils.UpperFirstChar(identifier)); + } + else + { + // Remove the last navigation property segment for navigation property paths, + // as this will be included within the prefixed name of the operation id + items.Remove(NavigationProperty.Name); + items.Add(prefix + Utils.UpperFirstChar(NavigationProperty.Name) + Utils.UpperFirstChar(identifier)); + } break; } else diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs index eb5204c6..8aff1d0a 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs @@ -25,30 +25,21 @@ internal class MediaEntityPutOperationHandler : MediaEntityOperationalHandler protected override void SetBasicInfo(OpenApiOperation operation) { // Summary - if (EntitySet != null) + if (IsNavigationPropertyPath) { - string typeName = EntitySet.EntityType().Name; - operation.Summary = $"Update media content for {typeName} in {EntitySet.Name}"; + operation.Summary = $"Update media content for the navigation property {NavigationProperty.Name} in {NavigationSource.Name}"; } else { - operation.Summary = $"Update media content for the navigation property {NavigationProperty.Name} in {NavigationSource.Name}"; + string typeName = EntitySet.EntityType().Name; + operation.Summary = $"Update media content for {typeName} in {EntitySet.Name}"; } // OperationId if (Context.Settings.EnableOperationId) { string identifier = Path.LastSegment.Kind == ODataSegmentKind.StreamContent ? "Content" : Path.LastSegment.Identifier; - - if (EntitySet != null) - { - string typeName = EntitySet.EntityType().Name; - operation.OperationId = $"{EntitySet.Name}.{typeName}.Update{Utils.UpperFirstChar(identifier)}"; - } - else - { - operation.OperationId = GetOperationId("Update", identifier); - } + operation.OperationId = GetOperationId("Update", identifier); } base.SetBasicInfo(operation); diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs index fa0eed2c..c26574a5 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs @@ -109,7 +109,7 @@ private void VerifyMediaEntityGetOperation(string annotation, bool enableOperati if (enableOperationId) { Assert.Equal("Todos.Todo.GetLogo", getOperation.OperationId); - Assert.Equal("me.photo.GetContent", getOperation2.OperationId); + Assert.Equal("me.GetPhotoContent", getOperation2.OperationId); } else { diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs index 7b410f89..7ec79556 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs @@ -106,7 +106,7 @@ private void VerifyMediaEntityPutOperation(string annotation, bool enableOperati if (enableOperationId) { Assert.Equal("Todos.Todo.UpdateLogo", putOperation.OperationId); - Assert.Equal("me.photo.UpdateContent", putOperation2.OperationId); + Assert.Equal("me.UpdatePhotoContent", putOperation2.OperationId); } else {