diff --git a/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/CamelCaseFormatter.cs b/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/CamelCaseFormatter.cs
index 904dd07b..20b955ce 100644
--- a/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/CamelCaseFormatter.cs
+++ b/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/CamelCaseFormatter.cs
@@ -32,6 +32,6 @@ namespace JsonApiDotNetCore.Graph
public sealed class CamelCaseFormatter: BaseResourceNameFormatter
{
///
- public override string ApplyCasingConvention(string properName) => char.ToLowerInvariant(properName[0]) + properName.Substring(1);
+ public override string ApplyCasingConvention(string properName) => char.ToLower(properName[0]) + properName.Substring(1);
}
}
diff --git a/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/KebabCaseFormatter.cs b/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/KebabCaseFormatter.cs
index b07c273f..62baa3de 100644
--- a/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/KebabCaseFormatter.cs
+++ b/src/JsonApiDotNetCore/Graph/ResourceNameFormatters/KebabCaseFormatter.cs
@@ -36,25 +36,32 @@ public sealed class KebabCaseFormatter : BaseResourceNameFormatter
///
public override string ApplyCasingConvention(string properName)
{
+ if (properName.Length == 0)
+ {
+ return properName;
+ }
+
var chars = properName.ToCharArray();
- if (chars.Length > 0)
+ var builder = new StringBuilder();
+
+ for (var i = 0; i < chars.Length; i++)
{
- var builder = new StringBuilder();
- for (var i = 0; i < chars.Length; i++)
+ if (char.IsUpper(chars[i]))
{
- if (char.IsUpper(chars[i]))
- {
- var hashedString = i > 0 ? $"-{char.ToLower(chars[i])}" : $"{char.ToLower(chars[i])}";
- builder.Append(hashedString);
- }
- else
+ if (i > 0)
{
- builder.Append(chars[i]);
+ builder.Append('-');
}
+
+ builder.Append(char.ToLower(chars[i]));
+ }
+ else
+ {
+ builder.Append(chars[i]);
}
- return builder.ToString();
}
- return properName;
+
+ return builder.ToString();
}
}
}
diff --git a/src/JsonApiDotNetCore/Middleware/CurrentRequestMiddleware.cs b/src/JsonApiDotNetCore/Middleware/CurrentRequestMiddleware.cs
index 6f296135..ff19a00e 100644
--- a/src/JsonApiDotNetCore/Middleware/CurrentRequestMiddleware.cs
+++ b/src/JsonApiDotNetCore/Middleware/CurrentRequestMiddleware.cs
@@ -84,7 +84,7 @@ private string GetRelationshipId()
private string[] SplitCurrentPath()
{
var path = _httpContext.Request.Path.Value;
- var ns = $"/{GetNameSpace()}";
+ var ns = $"/{_options.Namespace}";
var nonNameSpaced = path.Replace(ns, "");
nonNameSpaced = nonNameSpaced.Trim('/');
var individualComponents = nonNameSpaced.Split('/');
@@ -96,11 +96,11 @@ private string GetBasePath(string resourceName = null)
var r = _httpContext.Request;
if (_options.RelativeLinks)
{
- return GetNameSpace();
+ return _options.Namespace;
}
- var ns = GetNameSpace();
+
var customRoute = GetCustomRoute(r.Path.Value, resourceName);
- var toReturn = $"{r.Scheme}://{r.Host}/{ns}";
+ var toReturn = $"{r.Scheme}://{r.Host}/{_options.Namespace}";
if (customRoute != null)
{
toReturn += $"/{customRoute}";
@@ -110,12 +110,11 @@ private string GetBasePath(string resourceName = null)
private object GetCustomRoute(string path, string resourceName)
{
- var ns = GetNameSpace();
var trimmedComponents = path.Trim('/').Split('/').ToList();
var resourceNameIndex = trimmedComponents.FindIndex(c => c == resourceName);
var newComponents = trimmedComponents.Take(resourceNameIndex).ToArray();
var customRoute = string.Join('/', newComponents);
- if (customRoute == ns)
+ if (customRoute == _options.Namespace)
{
return null;
}
@@ -125,15 +124,10 @@ private object GetCustomRoute(string path, string resourceName)
}
}
- private string GetNameSpace()
- {
- return _options.Namespace;
- }
-
private bool PathIsRelationship()
{
var actionName = (string)_routeValues["action"];
- return actionName.ToLower().Contains("relationships");
+ return actionName.ToLowerInvariant().Contains("relationships");
}
private async Task IsValidAsync()
diff --git a/test/UnitTests/Builders/ContextGraphBuilder_Tests.cs b/test/UnitTests/Builders/ContextGraphBuilder_Tests.cs
index ccb8eb2a..fc66d36f 100644
--- a/test/UnitTests/Builders/ContextGraphBuilder_Tests.cs
+++ b/test/UnitTests/Builders/ContextGraphBuilder_Tests.cs
@@ -63,7 +63,7 @@ public void Resources_Without_Names_Specified_Will_Use_Default_Formatter()
public void Resources_Without_Names_Specified_Will_Use_Configured_Formatter()
{
// Arrange
- var builder = new ResourceGraphBuilder(new CamelCaseNameFormatter());
+ var builder = new ResourceGraphBuilder(new CamelCaseFormatter());
builder.AddResource();
// Act
@@ -93,7 +93,7 @@ public void Attrs_Without_Names_Specified_Will_Use_Default_Formatter()
public void Attrs_Without_Names_Specified_Will_Use_Configured_Formatter()
{
// Arrange
- var builder = new ResourceGraphBuilder(new CamelCaseNameFormatter());
+ var builder = new ResourceGraphBuilder(new CamelCaseFormatter());
builder.AddResource();
// Act
@@ -128,16 +128,5 @@ public sealed class TestResource : Identifiable
}
public class RelatedResource : Identifiable { }
-
- public sealed class CamelCaseNameFormatter : IResourceNameFormatter
- {
- public string ApplyCasingConvention(string properName) => ToCamelCase(properName);
-
- public string FormatPropertyName(PropertyInfo property) => ToCamelCase(property.Name);
-
- public string FormatResourceName(Type resourceType) => ToCamelCase(resourceType.Name.Pluralize());
-
- private string ToCamelCase(string str) => Char.ToLowerInvariant(str[0]) + str.Substring(1);
- }
}
}