Skip to content

OpenAPI: Generalization of naming conventions #1123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Dec 21, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 8 additions & 10 deletions src/JsonApiDotNetCore.OpenApi/JsonApiOperationIdSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,13 @@ internal sealed class JsonApiOperationIdSelector

private readonly IControllerResourceMapping _controllerResourceMapping;
private readonly JsonNamingPolicy? _namingPolicy;
private readonly ResourceNameFormatter _formatter;

public JsonApiOperationIdSelector(IControllerResourceMapping controllerResourceMapping, JsonNamingPolicy? namingPolicy)
{
ArgumentGuard.NotNull(controllerResourceMapping, nameof(controllerResourceMapping));

_controllerResourceMapping = controllerResourceMapping;
_namingPolicy = namingPolicy;
_formatter = new ResourceNameFormatter(namingPolicy);
}

public string GetOperationId(ApiDescription endpoint)
Expand All @@ -60,7 +58,7 @@ public string GetOperationId(ApiDescription endpoint)

string template = GetTemplate(primaryResourceType.ClrType, endpoint);

return ApplyTemplate(template, primaryResourceType.ClrType, endpoint);
return ApplyTemplate(template, primaryResourceType, endpoint);
}

private static string GetTemplate(Type resourceClrType, ApiDescription endpoint)
Expand Down Expand Up @@ -107,28 +105,28 @@ private static Type GetDocumentType(Type primaryResourceClrType, ApiDescription
return type.IsConstructedGenericType ? type.GetGenericTypeDefinition() : null;
}

private string ApplyTemplate(string operationIdTemplate, Type resourceClrType, ApiDescription endpoint)
private string ApplyTemplate(string operationIdTemplate, ResourceType resourceType, ApiDescription endpoint)
{
if (endpoint.RelativePath == null || endpoint.HttpMethod == null)
{
throw new UnreachableCodeException();
}

string method = endpoint.HttpMethod.ToLowerInvariant();
string primaryResourceName = _formatter.FormatResourceName(resourceClrType).Singularize();
string method = endpoint.HttpMethod!.ToLowerInvariant();
string relationshipName = operationIdTemplate.Contains("[RelationshipName]") ? endpoint.RelativePath.Split("/").Last() : string.Empty;

// @formatter:wrap_chained_method_calls chop_always
// @formatter:keep_existing_linebreaks true

string pascalCaseId = operationIdTemplate
string pascalCaseOperationId = operationIdTemplate
.Replace("[Method]", method)
.Replace("[PrimaryResourceName]", primaryResourceName)
.Replace("[RelationshipName]", relationshipName);
.Replace("[PrimaryResourceName]", resourceType.PublicName.Singularize())
.Replace("[RelationshipName]", relationshipName)
.Pascalize();

// @formatter:keep_existing_linebreaks restore
// @formatter:wrap_chained_method_calls restore

return _namingPolicy != null ? _namingPolicy.ConvertName(pascalCaseId) : pascalCaseId;
return _namingPolicy != null ? _namingPolicy.ConvertName(pascalCaseOperationId) : pascalCaseOperationId;
}
}
11 changes: 11 additions & 0 deletions src/JsonApiDotNetCore.OpenApi/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Text.RegularExpressions;

namespace JsonApiDotNetCore.OpenApi;

internal static class StringExtensions
{
public static string Pascalize(this string source)
{
return Regex.Replace(source, "(?:^|-|_| +)(.)", match => match.Groups[1].Value.ToUpper());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public async Task Disposed_attribute_registration_for_document_does_not_affect_r
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand Down Expand Up @@ -64,7 +64,7 @@ public async Task Attribute_registration_can_be_used_for_multiple_requests()
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest
{
AirtimeInHours = 100
Expand Down Expand Up @@ -111,7 +111,7 @@ public async Task Request_is_unaffected_by_attribute_registration_for_different_
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId1,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand All @@ -123,7 +123,7 @@ public async Task Request_is_unaffected_by_attribute_registration_for_different_
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId2,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand Down Expand Up @@ -166,7 +166,7 @@ public async Task Attribute_values_can_be_changed_after_attribute_registration()
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest
{
IsInMaintenance = true
Expand Down Expand Up @@ -209,7 +209,7 @@ public async Task Attribute_registration_is_unaffected_by_successive_attribute_r
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId1,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand All @@ -218,7 +218,7 @@ public async Task Attribute_registration_is_unaffected_by_successive_attribute_r
{
Data = new AirplaneDataInPostRequest
{
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPostRequest()
}
};
Expand Down Expand Up @@ -260,7 +260,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_disposed_att
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId1,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand All @@ -278,7 +278,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_disposed_att
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId2,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest
{
ManufacturedInCity = "Everett"
Expand Down Expand Up @@ -319,7 +319,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_disposed_att
{
Data = new AirplaneDataInPostRequest
{
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPostRequest()
}
};
Expand All @@ -337,7 +337,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_disposed_att
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest
{
ManufacturedInCity = "Everett"
Expand Down Expand Up @@ -381,7 +381,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_attribute_re
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId1,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand All @@ -393,7 +393,7 @@ public async Task Attribute_registration_is_unaffected_by_preceding_attribute_re
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId2,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest()
}
};
Expand Down
24 changes: 12 additions & 12 deletions test/OpenApiClientTests/LegacyClient/RequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,23 +63,23 @@ public async Task Partial_posting_resource_with_selected_relationships_produces_
{
Data = new FlightDataInPostRequest
{
Type = FlightsResourceType.Flights,
Type = FlightResourceType.Flights,
Relationships = new FlightRelationshipsInPostRequest
{
Purser = new ToOneFlightAttendantInRequest
{
Data = new FlightAttendantIdentifier
{
Id = "bBJHu",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
}
},
BackupPurser = new NullableToOneFlightAttendantInRequest
{
Data = new FlightAttendantIdentifier
{
Id = "NInmX",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
}
}
}
Expand Down Expand Up @@ -143,7 +143,7 @@ public async Task Partial_posting_resource_produces_expected_request()
{
Data = new AirplaneDataInPostRequest
{
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPostRequest
{
Name = name,
Expand Down Expand Up @@ -195,7 +195,7 @@ public async Task Partial_patching_resource_produces_expected_request()
Data = new AirplaneDataInPatchRequest
{
Id = airplaneId,
Type = AirplanesResourceType.Airplanes,
Type = AirplaneResourceType.Airplanes,
Attributes = new AirplaneAttributesInPatchRequest
{
LastServicedAt = lastServicedAt
Expand Down Expand Up @@ -326,7 +326,7 @@ public async Task Patching_ToOne_relationship_produces_expected_request()
Data = new FlightAttendantIdentifier
{
Id = "bBJHu",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
}
};

Expand Down Expand Up @@ -384,12 +384,12 @@ public async Task Posting_ToMany_relationship_produces_expected_request()
{
new()
{
Type = FlightAttendantsResourceType.FlightAttendants,
Type = FlightAttendantResourceType.FlightAttendants,
Id = "bBJHu"
},
new()
{
Type = FlightAttendantsResourceType.FlightAttendants,
Type = FlightAttendantResourceType.FlightAttendants,
Id = "NInmX"
}
}
Expand Down Expand Up @@ -436,12 +436,12 @@ public async Task Patching_ToMany_relationship_produces_expected_request()
new()
{
Id = "bBJHu",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
},
new()
{
Id = "NInmX",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
}
}
};
Expand Down Expand Up @@ -487,12 +487,12 @@ public async Task Deleting_ToMany_relationship_produces_expected_request()
new()
{
Id = "bBJHu",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
},
new()
{
Id = "NInmX",
Type = FlightAttendantsResourceType.FlightAttendants
Type = FlightAttendantResourceType.FlightAttendants
}
}
};
Expand Down
Loading