Skip to content

Commit

Permalink
add prefix token
Browse files Browse the repository at this point in the history
  • Loading branch information
dasiths committed Mar 31, 2020
1 parent 5ae0f4c commit 13ced7e
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 22 deletions.
5 changes: 4 additions & 1 deletion src/SimpleEndPoints/Core/SimpleEndpointBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
namespace SimpleEndpoints.Core
{
[ApiController]
[Route("[endpoint]")]
[Route(EndpointRoute)]
public abstract class SimpleEndpointBase : ControllerBase
{
public const string EndpointRouteToken = "[endpoint]";
public const string EndpointPrefixRouteToken = "[prefix]";
public const string EndpointRoute = EndpointPrefixRouteToken + EndpointRouteToken;
}
}
45 changes: 26 additions & 19 deletions src/SimpleEndPoints/Enrichers/RouteEndpointMetadataEnricher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using SimpleEndpoints.Core;
using SimpleEndpoints.Extensions;

namespace SimpleEndpoints.Enrichers
{
public class RouteEndpointMetadataEnricher : IEndpointMetadataEnricher
{
private const string EndpointPlaceholder = "[endpoint]";
private readonly ILogger<RouteEndpointMetadataEnricher> _logger;
private readonly SimpleEndpointsConfiguration _simpleEndpointsConfiguration;

Expand All @@ -28,36 +28,43 @@ public void Enrich(ControllerModel controller, Action<ControllerModel> next)
if (controller.Selectors.Any())
{
var routeTemplate = controller.Selectors[0].AttributeRouteModel.Template;
var containsEndpointPlaceholder =
routeTemplate.IndexOf(EndpointPlaceholder, StringComparison.OrdinalIgnoreCase) >= 0;
var containsEndpointRouteToken =
routeTemplate.IndexOf(SimpleEndpointBase.EndpointRouteToken, StringComparison.OrdinalIgnoreCase) >= 0;
var containsPrefixRouteToken =
routeTemplate.IndexOf(SimpleEndpointBase.EndpointPrefixRouteToken, StringComparison.OrdinalIgnoreCase) >= 0;

_logger.LogTrace($"RouteTemplate is {routeTemplate} and contains {EndpointPlaceholder} = {containsEndpointPlaceholder}");
_logger.LogTrace($"RouteTemplate is {routeTemplate}");
_logger.LogTrace($"RouteTemplate contains {SimpleEndpointBase.EndpointRouteToken} = {containsEndpointRouteToken}");
_logger.LogTrace($"RouteTemplate contains {SimpleEndpointBase.EndpointPrefixRouteToken} = {containsPrefixRouteToken}");

if (containsEndpointPlaceholder)
routeBuilder.Append(routeTemplate);

if (containsEndpointRouteToken || containsPrefixRouteToken)
{
if (!string.IsNullOrWhiteSpace(_simpleEndpointsConfiguration.RoutePrefix))
if (containsPrefixRouteToken)
{
_logger.LogTrace($"Route prefix of \"{_simpleEndpointsConfiguration.RoutePrefix}/\" applied");
routeBuilder
.Append($"{_simpleEndpointsConfiguration.RoutePrefix}/");
routeBuilder.Replace(
$"{SimpleEndpointBase.EndpointPrefixRouteToken}",
$"{_simpleEndpointsConfiguration.RoutePrefix}/");
}

var controllerNameWithoutEndpointPlaceholder = controller.ControllerName.ReplaceCaseInsensitive(
_simpleEndpointsConfiguration.EndpointNamingConventionEnding,
string.Empty);
if (containsEndpointRouteToken)
{
var controllerNameWithoutEndpoint = controller.ControllerName.ReplaceCaseInsensitive(
_simpleEndpointsConfiguration.EndpointNamingConventionEnding,
string.Empty);

_logger.LogTrace($"Calculated endpoint name: {controllerNameWithoutEndpointPlaceholder}");
routeBuilder.Append(
routeTemplate.ReplaceCaseInsensitive(
$"{EndpointPlaceholder}", controllerNameWithoutEndpointPlaceholder));
}
else
{
routeBuilder.Append(routeTemplate);
_logger.LogTrace($"Calculated endpoint name: {controllerNameWithoutEndpoint}");

routeBuilder.Replace(
$"{SimpleEndpointBase.EndpointRouteToken}", controllerNameWithoutEndpoint);
}
}

foreach (var keyValuePair in _simpleEndpointsConfiguration.RouteTokenDictionary)
{
_logger.LogTrace($"Replacing custom route token [{keyValuePair.Key}] with {keyValuePair.Value}");
routeBuilder.Replace($"[{keyValuePair.Key}]", keyValuePair.Value);
}

Expand Down
2 changes: 1 addition & 1 deletion src/SimpleEndPoints/SimpleEndpoints.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<RepositoryUrl>https://github.com/dasiths/SimpleEndpoints</RepositoryUrl>
<RepositoryType>Git</RepositoryType>
<PackageTags>aspnetcore api controller endpoints</PackageTags>
<Version>1.4.3</Version>
<Version>1.5.0</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public class GreetingAsyncPostWithContradictoryRouteAndHttpMethodEndpoint : Asyn

//Here we are using an endpoint constructed from extending the base class
[SimpleEndpoint(HttpVerb.Get)]
[Route("custom/[endpoint]")]
[Route("[prefix]custom/[endpoint]")]
public class GreetingAsyncGetUsingCustomEndpoint : SimpleEndpointBase
{
[Route("custom-method")]
Expand Down

0 comments on commit 13ced7e

Please sign in to comment.