Skip to content

Commit 1d1ac7f

Browse files
committed
git merge master
2 parents a983d18 + 4cc00b0 commit 1d1ac7f

File tree

12 files changed

+161
-40
lines changed

12 files changed

+161
-40
lines changed

JsonApiDotNetCore/Controllers/ControllerBuilder.cs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
1+
using System;
42
using System.Reflection;
3+
using System.Linq;
54
using JsonApiDotNetCore.Abstractions;
65
using JsonApiDotNetCore.Data;
76

87
namespace JsonApiDotNetCore.Controllers
98
{
10-
public class ControllerBuilder
9+
public class ControllerBuilder : IControllerBuilder
1110
{
12-
private readonly JsonApiContext _context;
13-
14-
public ControllerBuilder(JsonApiContext context)
11+
private JsonApiContext _context { get; set; }
12+
public IJsonApiController BuildController(JsonApiContext context)
1513
{
1614
_context = context;
17-
}
18-
19-
public IJsonApiController BuildController()
20-
{
2115
var overrideController = GetOverrideController();
2216
return overrideController ?? new JsonApiController(_context, new ResourceRepository(_context));
2317
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using JsonApiDotNetCore.Abstractions;
2+
3+
namespace JsonApiDotNetCore.Controllers
4+
{
5+
public interface IControllerBuilder
6+
{
7+
IJsonApiController BuildController(JsonApiContext context);
8+
}
9+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
using System.Collections.Generic;
2-
using System.Reflection;
31
using Microsoft.AspNetCore.Mvc;
2+
using System.Reflection;
3+
using System.Collections.Generic;
44

55
namespace JsonApiDotNetCore.Controllers
66
{
77
public interface IJsonApiController
88
{
9-
ObjectResult Delete(string id);
109
ObjectResult Get();
1110
ObjectResult Get(string id);
12-
ObjectResult Patch(string id, Dictionary<PropertyInfo, object> entityPatch);
1311
ObjectResult Post(object entity);
12+
ObjectResult Patch(string id, Dictionary<PropertyInfo, object> entityPatch);
13+
ObjectResult Delete(string id);
1414
}
15-
}
15+
}

JsonApiDotNetCore/Data/ResourceRepository.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
using System;
2+
using System.Reflection;
23
using System.Collections.Generic;
34
using System.Linq;
4-
using System.Linq.Expressions;
55
using JsonApiDotNetCore.Abstractions;
6-
using System.Reflection;
76
using JsonApiDotNetCore.Extensions;
87
using JsonApiDotNetCore.Routing;
98
using Microsoft.EntityFrameworkCore;

JsonApiDotNetCore/Extensions/IServiceCollectionExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using AutoMapper;
33
using JsonApiDotNetCore.Configuration;
4+
using JsonApiDotNetCore.Controllers;
45
using JsonApiDotNetCore.Routing;
56
using Microsoft.Extensions.DependencyInjection;
67

@@ -12,7 +13,7 @@ public static void AddJsonApi(this IServiceCollection services, Action<IJsonApiM
1213
{
1314
var configBuilder = new JsonApiConfigurationBuilder(configurationAction);
1415
var config = configBuilder.Build();
15-
IRouter router = new Router(config);
16+
IRouter router = new Router(config, new RouteBuilder(config), new ControllerBuilder());
1617
services.AddSingleton(_ => router);
1718
}
1819
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Microsoft.AspNetCore.Http;
2+
3+
namespace JsonApiDotNetCore.Routing
4+
{
5+
public interface IRouteBuilder
6+
{
7+
Route BuildFromRequest(HttpRequest request);
8+
}
9+
}

JsonApiDotNetCore/Routing/RouteBuilder.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,30 @@
66

77
namespace JsonApiDotNetCore.Routing
88
{
9-
public class RouteBuilder
9+
public class RouteBuilder : IRouteBuilder
1010
{
1111
private RouteDefinition _baseRouteDefinition;
1212
private string _baseResourceId;
13-
private readonly HttpRequest _request;
1413
private readonly JsonApiModelConfiguration _configuration;
1514

16-
public RouteBuilder(HttpRequest request, JsonApiModelConfiguration configuration)
15+
public RouteBuilder(JsonApiModelConfiguration configuration)
1716
{
18-
_request = request;
1917
_configuration = configuration;
2018
}
2119

22-
public Route BuildFromRequest()
20+
public Route BuildFromRequest(HttpRequest request)
2321
{
24-
var remainingPathString = SetBaseRouteDefinition();
22+
var remainingPathString = SetBaseRouteDefinition(request.Path);
2523

2624
if (PathStringIsEmpty(remainingPathString))
2725
{ // {baseResource}
28-
return new Route(_baseRouteDefinition.ModelType, _request.Method, null, _baseRouteDefinition);
26+
return new Route(_baseRouteDefinition.ModelType, request.Method, null, _baseRouteDefinition);
2927
}
3028

3129
remainingPathString = SetBaseResourceId(remainingPathString);
3230
if (PathStringIsEmpty(remainingPathString))
3331
{ // {baseResource}/{baseResourceId}
34-
return new Route(_baseRouteDefinition.ModelType, _request.Method, _baseResourceId, _baseRouteDefinition);
32+
return new Route(_baseRouteDefinition.ModelType, request.Method, _baseResourceId, _baseRouteDefinition);
3533
}
3634

3735
// { baseResource}/{ baseResourceId}/{relatedResourceName}
@@ -43,20 +41,20 @@ public Route BuildFromRequest()
4341
}
4442

4543
var relationshipType = GetTypeOfRelatedResource(relatedResource);
46-
return new RelationalRoute(_baseRouteDefinition.ModelType, _request.Method, _baseResourceId, _baseRouteDefinition, relationshipType, relatedResource);
44+
return new RelationalRoute(_baseRouteDefinition.ModelType, request.Method, _baseResourceId, _baseRouteDefinition, relationshipType, relatedResource);
4745
}
4846

4947
private bool PathStringIsEmpty(PathString pathString)
5048
{
5149
return pathString.HasValue ? string.IsNullOrEmpty(pathString.ToString().TrimStart('/')) : true;
5250
}
5351

54-
private PathString SetBaseRouteDefinition()
52+
private PathString SetBaseRouteDefinition(PathString path)
5553
{
5654
foreach (var rte in _configuration.Routes)
5755
{
5856
PathString remainingPathString;
59-
if (_request.Path.StartsWithSegments(new PathString(rte.PathString), StringComparison.OrdinalIgnoreCase, out remainingPathString))
57+
if (path.StartsWithSegments(new PathString(rte.PathString), StringComparison.OrdinalIgnoreCase, out remainingPathString))
6058
{
6159
_baseRouteDefinition = rte;
6260
return remainingPathString;
@@ -76,7 +74,6 @@ private Type GetTypeOfRelatedResource(string relationshipName)
7674
return ModelAccessor.GetTypeFromModelRelationshipName(_baseRouteDefinition.ModelType, relationshipName);
7775
}
7876

79-
8077
// TODO: Why is this here?
8178
public static string BuildRoute(string nameSpace, string resourceCollectionName)
8279
{

JsonApiDotNetCore/Routing/Router.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System;
2+
using System.Text;
23
using JsonApiDotNetCore.Abstractions;
34
using JsonApiDotNetCore.Configuration;
45
using JsonApiDotNetCore.Controllers;
56
using JsonApiDotNetCore.Services;
67
using Microsoft.AspNetCore.Http;
78
using Microsoft.AspNetCore.Mvc;
9+
using Newtonsoft.Json;
810

911
namespace JsonApiDotNetCore.Routing
1012
{
@@ -13,17 +15,21 @@ public class Router : IRouter
1315
private readonly JsonApiModelConfiguration _jsonApiModelConfiguration;
1416
private IServiceProvider _serviceProvider;
1517
private JsonApiContext _jsonApiContext;
18+
private IRouteBuilder _routeBuilder;
19+
private IControllerBuilder _controllerBuilder;
1620

17-
public Router(JsonApiModelConfiguration configuration)
21+
public Router(JsonApiModelConfiguration configuration, IRouteBuilder routeBuilder, IControllerBuilder controllerBuilder)
1822
{
1923
_jsonApiModelConfiguration = configuration;
24+
_routeBuilder = routeBuilder;
25+
_controllerBuilder = controllerBuilder;
2026
}
2127

2228
public bool HandleJsonApiRoute(HttpContext context, IServiceProvider serviceProvider)
2329
{
2430
_serviceProvider = serviceProvider;
2531

26-
var route = new RouteBuilder(context.Request, _jsonApiModelConfiguration).BuildFromRequest();
32+
var route = _routeBuilder.BuildFromRequest(context.Request);
2733
if (route == null) return false;
2834

2935
InitializeContext(context, route);
@@ -40,7 +46,8 @@ private void InitializeContext(HttpContext context, Route route)
4046

4147
private void CallController()
4248
{
43-
var controller = new ControllerBuilder(_jsonApiContext).BuildController();
49+
var controller = _controllerBuilder.BuildController(_jsonApiContext);
50+
4451
var result = ActivateControllerMethod(controller);
4552

4653
result.Value = SerializeResult(result.Value);
@@ -76,7 +83,7 @@ private void SendResponse(ObjectResult result)
7683
var context = _jsonApiContext.HttpContext;
7784
context.Response.StatusCode = result.StatusCode ?? 500;
7885
context.Response.ContentType = "application/vnd.api+json";
79-
context.Response.WriteAsync(result.Value == null ? "" : result.Value.ToString());
86+
context.Response.WriteAsync(result.Value == null ? "" : result.Value.ToString(), Encoding.UTF8);
8087
context.Response.Body.Flush();
8188
}
8289
}

JsonApiDotNetCoreExample/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"Data": {
3-
"ConnectionString": "User ID=postgres;Password=postgres;Host=localhost;Port=5432;Database=JsonApiDotNetCoreExample;Pooling=true;"
3+
"ConnectionString": "User ID=dotnet;Host=localhost;Port=5432;Database=JsonApiDotNetCoreExample;Pooling=true;"
44
},
55
"Logging": {
66
"IncludeScopes": false,

JsonApiDotNetCoreTests/Extensions/IServiceCollectionExtensionsTests.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using JsonApiDotNetCore.Routing;
33
using JsonApiDotNetCore.Extensions;
44
using JsonApiDotNetCoreTests.Helpers;
5+
using Microsoft.EntityFrameworkCore;
56

67
namespace JsonApiDotNetCoreTests.Extensions.UnitTests
78
{
@@ -16,10 +17,12 @@ public void AddJsonApi_AddsRouterToServiceCollection()
1617
var serviceCollection = new ServiceCollection();
1718

1819
// act
19-
serviceCollection.AddJsonApi(config => {});
20+
serviceCollection.AddJsonApi(config => {
21+
config.UseContext<DbContext>();
22+
});
2023

2124
// assert
22-
Assert.True(serviceCollection.ContainsType(typeof(Router)));
25+
Assert.True(serviceCollection.ContainsType(typeof(IRouter)));
2326
}
2427
}
2528
}

0 commit comments

Comments
 (0)