From 8aef7c059597049740afa5772eedb7811085fffc Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 30 Sep 2020 13:53:06 +0300 Subject: [PATCH 1/4] Update media entity operation id generation --- .../Operation/MediaEntityGetOperationHandler.cs | 2 +- .../Operation/MediaEntityOperationalHandler.cs | 2 +- .../Operation/MediaEntityPutOperationHandler.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs index da4b7077..406a5f39 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs @@ -43,7 +43,7 @@ protected override void SetBasicInfo(OpenApiOperation operation) if (EntitySet != null) { string typeName = EntitySet.EntityType().Name; - operation.OperationId = $"{EntitySet.Name}.{typeName}.Get{Utils.UpperFirstChar(identifier)}"; + operation.OperationId = $"{EntitySet.Name}.{typeName}.Get{Utils.UpperFirstChar(typeName)}{Utils.UpperFirstChar(identifier)}"; } else // Singleton { diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs index 9629bae0..93efc402 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityOperationalHandler.cs @@ -98,7 +98,7 @@ protected string GetOperationId(string prefix, string identifier) { if (segment == lastSegment) { - items.Add(prefix + Utils.UpperFirstChar(identifier)); + 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..f3b000ab 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityPutOperationHandler.cs @@ -43,7 +43,7 @@ protected override void SetBasicInfo(OpenApiOperation operation) if (EntitySet != null) { string typeName = EntitySet.EntityType().Name; - operation.OperationId = $"{EntitySet.Name}.{typeName}.Update{Utils.UpperFirstChar(identifier)}"; + operation.OperationId = $"{EntitySet.Name}.{typeName}.Update{Utils.UpperFirstChar(typeName)}{Utils.UpperFirstChar(identifier)}"; } else { From a9024399682a70fa56a66246c27ee9473dd18b76 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 30 Sep 2020 17:26:47 +0300 Subject: [PATCH 2/4] Update tests --- .../Operation/MediaEntityGetOperationHandlerTests.cs | 4 ++-- .../Operation/MediaEntityPutOperationHandlerTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs index fa0eed2c..8d95f7fd 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs @@ -108,8 +108,8 @@ 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("Todos.Todo.GetTodoLogo", getOperation.OperationId); + Assert.Equal("me.photo.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..0f418157 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs @@ -105,8 +105,8 @@ 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("Todos.Todo.UpdateTodoLogo", putOperation.OperationId); + Assert.Equal("me.photo.UpdatePhotoContent", putOperation2.OperationId); } else { From e0f3bab814a19cd8c3020540733c27b32d29427f Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 2 Oct 2020 10:54:53 +0300 Subject: [PATCH 3/4] Refactor out operation id generation into abstract class --- .../MediaEntityGetOperationHandler.cs | 19 +++------- .../MediaEntityOperationalHandler.cs | 37 ++++++++++++++++--- .../MediaEntityPutOperationHandler.cs | 19 +++------- 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs b/src/Microsoft.OpenApi.OData.Reader/Operation/MediaEntityGetOperationHandler.cs index 406a5f39..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(typeName)}{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 93efc402..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(NavigationProperty.Name) + 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 f3b000ab..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(typeName)}{Utils.UpperFirstChar(identifier)}"; - } - else - { - operation.OperationId = GetOperationId("Update", identifier); - } + operation.OperationId = GetOperationId("Update", identifier); } base.SetBasicInfo(operation); From c34745b6588a9eda7bbc70c16f448ca377a2a07c Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Fri, 2 Oct 2020 10:55:42 +0300 Subject: [PATCH 4/4] Update media entity tests --- .../Operation/MediaEntityGetOperationHandlerTests.cs | 4 ++-- .../Operation/MediaEntityPutOperationHandlerTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs index 8d95f7fd..c26574a5 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityGetOperationHandlerTests.cs @@ -108,8 +108,8 @@ private void VerifyMediaEntityGetOperation(string annotation, bool enableOperati if (enableOperationId) { - Assert.Equal("Todos.Todo.GetTodoLogo", getOperation.OperationId); - Assert.Equal("me.photo.GetPhotoContent", getOperation2.OperationId); + Assert.Equal("Todos.Todo.GetLogo", getOperation.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 0f418157..7ec79556 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Operation/MediaEntityPutOperationHandlerTests.cs @@ -105,8 +105,8 @@ private void VerifyMediaEntityPutOperation(string annotation, bool enableOperati if (enableOperationId) { - Assert.Equal("Todos.Todo.UpdateTodoLogo", putOperation.OperationId); - Assert.Equal("me.photo.UpdatePhotoContent", putOperation2.OperationId); + Assert.Equal("Todos.Todo.UpdateLogo", putOperation.OperationId); + Assert.Equal("me.UpdatePhotoContent", putOperation2.OperationId); } else {