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
{