Skip to content

Commit 5013fef

Browse files
author
Chris Santero
committed
allow specifying resource-level metadata in builders
1 parent 62a8b05 commit 5013fef

9 files changed

Lines changed: 32 additions & 17 deletions

JSONAPI.Tests/Documents/Builders/FallbackDocumentBuilderTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public async Task Creates_single_resource_document_for_registered_non_collection
3232
var mockDocument = new Mock<ISingleResourceDocument>(MockBehavior.Strict);
3333

3434
var singleResourceDocumentBuilder = new Mock<ISingleResourceDocumentBuilder>(MockBehavior.Strict);
35-
singleResourceDocumentBuilder.Setup(b => b.BuildDocument(objectContent, It.IsAny<string>(), null, null)).Returns(mockDocument.Object);
35+
singleResourceDocumentBuilder.Setup(b => b.BuildDocument(objectContent, It.IsAny<string>(), null, null, null)).Returns(mockDocument.Object);
3636

3737
var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
3838
var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);
@@ -113,7 +113,7 @@ public async Task Creates_resource_collection_document_for_non_queryable_enumera
113113
var mockQueryableDocumentBuilder = new Mock<IQueryableResourceCollectionDocumentBuilder>(MockBehavior.Strict);
114114
var mockResourceCollectionDocumentBuilder = new Mock<IResourceCollectionDocumentBuilder>(MockBehavior.Strict);
115115
mockResourceCollectionDocumentBuilder
116-
.Setup(b => b.BuildDocument(items, "https://www.example.com/", It.IsAny<string[]>(), It.IsAny<IMetadata>()))
116+
.Setup(b => b.BuildDocument(items, "https://www.example.com/", It.IsAny<string[]>(), It.IsAny<IMetadata>(), null))
117117
.Returns(() => (mockDocument.Object));
118118

119119
// Act

JSONAPI.Tests/Documents/Builders/RegistryDrivenSingleResourceDocumentBuilderTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ public void Returns_correct_document_for_resource()
176176

177177
// Act
178178
var documentBuilder = new RegistryDrivenSingleResourceDocumentBuilder(mockRegistry.Object, linkConventions);
179-
var document = documentBuilder.BuildDocument(country, "http://www.example.com", new[] { "provinces.capital", "continent" }, metadata);
179+
var document = documentBuilder.BuildDocument(country, "http://www.example.com", new[] { "provinces.capital", "continent" }, metadata, null);
180180

181181
// Assert
182182
document.PrimaryData.Id.Should().Be("4");
@@ -258,7 +258,7 @@ public void Returns_correct_document_for_null_resource()
258258

259259
// Act
260260
var documentBuilder = new RegistryDrivenSingleResourceDocumentBuilder(mockRegistry.Object, linkConventions);
261-
var document = documentBuilder.BuildDocument(null, "http://www.example.com", null, null);
261+
var document = documentBuilder.BuildDocument(null, "http://www.example.com", null, null, null);
262262

263263
// Assert
264264
document.PrimaryData.Should().BeNull();

JSONAPI/Documents/Builders/DefaultQueryableResourceCollectionDocumentBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task<IResourceCollectionDocument> BuildDocument<T>(IQueryable<T> qu
5151

5252
var results = await _enumerationTransformer.Enumerate(paginatedQuery, cancellationToken);
5353
var metadata = await GetDocumentMetadata(query, filteredQuery, sortedQuery, paginationResults, cancellationToken);
54-
return _resourceCollectionDocumentBuilder.BuildDocument(results, linkBaseUrl, includes, metadata);
54+
return _resourceCollectionDocumentBuilder.BuildDocument(results, linkBaseUrl, includes, metadata, null);
5555
}
5656

5757
/// <summary>

JSONAPI/Documents/Builders/FallbackDocumentBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public async Task<IJsonApiDocument> BuildDocument(object obj, HttpRequestMessage
8080
var buildDocumentMethod =
8181
_openBuildDocumentFromEnumerableMethod.Value.MakeGenericMethod(enumerableElementType);
8282
return
83-
(dynamic)buildDocumentMethod.Invoke(_resourceCollectionDocumentBuilder, new[] { obj, linkBaseUrl, new string[] { }, null });
83+
(dynamic)buildDocumentMethod.Invoke(_resourceCollectionDocumentBuilder, new[] { obj, linkBaseUrl, new string[] { }, null, null });
8484
}
8585

8686
// Single resource object

JSONAPI/Documents/Builders/IResourceCollectionDocumentBuilder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ public interface IResourceCollectionDocumentBuilder
1515
/// <param name="includePathExpressions">A list of dot-separated paths to include in the compound document.
1616
/// If this collection is null or empty, no linkage will be included.</param>
1717
/// <param name="metadata">Metadata for the top-level</param>
18+
/// <param name="resourceMetadata">Metadata to associate with individual resource objects</param>
1819
/// <typeparam name="TModel"></typeparam>
1920
/// <returns></returns>
20-
IResourceCollectionDocument BuildDocument<TModel>(IEnumerable<TModel> primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata metadata);
21+
IResourceCollectionDocument BuildDocument<TModel>(IEnumerable<TModel> primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata metadata,
22+
IDictionary<object, IMetadata> resourceMetadata = null);
2123
}
2224
}

JSONAPI/Documents/Builders/ISingleResourceDocumentBuilder.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace JSONAPI.Documents.Builders
1+
using System.Collections.Generic;
2+
3+
namespace JSONAPI.Documents.Builders
24
{
35
/// <summary>
46
/// Builds a response document from primary data objects
@@ -13,7 +15,9 @@ public interface ISingleResourceDocumentBuilder
1315
/// <param name="includePathExpressions">A list of dot-separated paths to include in the compound document.
1416
/// If this collection is null or empty, no linkage will be included.</param>
1517
/// <param name="topLevelMetadata">Metadata to serialize at the top level of the document</param>
18+
/// <param name="resourceMetadata">Metadata about individual resource objects</param>
1619
/// <returns></returns>
17-
ISingleResourceDocument BuildDocument(object primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata topLevelMetadata);
20+
ISingleResourceDocument BuildDocument(object primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata topLevelMetadata,
21+
IDictionary<object, IMetadata> resourceMetadata = null);
1822
}
1923
}

JSONAPI/Documents/Builders/RegistryDrivenDocumentBuilder.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ internal static bool PathExpressionMatchesCurrentPath(string currentPath, string
4646
/// <param name="currentPath"></param>
4747
/// <param name="includePathExpressions"></param>
4848
/// <param name="linkBaseUrl"></param>
49+
/// <param name="resourceObjectMetadata"></param>
4950
/// <returns></returns>
5051
protected ResourceObject CreateResourceObject(object modelObject, IDictionary<string, IDictionary<string, ResourceObject>> idDictionariesByType,
51-
string currentPath, string[] includePathExpressions, string linkBaseUrl)
52+
string currentPath, string[] includePathExpressions, string linkBaseUrl, IDictionary<object, IMetadata> resourceObjectMetadata)
5253
{
5354
if (modelObject == null) return null;
5455

@@ -97,7 +98,7 @@ protected ResourceObject CreateResourceObject(object modelObject, IDictionary<st
9798
if (!idDictionary.TryGetValue(identifier.Id, out relatedResourceObject))
9899
{
99100
relatedResourceObject = CreateResourceObject(relatedResource, idDictionariesByType,
100-
childPath, includePathExpressions, linkBaseUrl);
101+
childPath, includePathExpressions, linkBaseUrl, resourceObjectMetadata);
101102
idDictionary[identifier.Id] = relatedResourceObject;
102103
}
103104
}
@@ -122,7 +123,7 @@ protected ResourceObject CreateResourceObject(object modelObject, IDictionary<st
122123
if (!idDictionary.TryGetValue(identifier.Id, out relatedResourceObject))
123124
{
124125
relatedResourceObject = CreateResourceObject(relatedResource, idDictionariesByType,
125-
childPath, includePathExpressions, linkBaseUrl);
126+
childPath, includePathExpressions, linkBaseUrl, resourceObjectMetadata);
126127
idDictionary[identifier.Id] = relatedResourceObject;
127128
}
128129

@@ -142,7 +143,13 @@ protected ResourceObject CreateResourceObject(object modelObject, IDictionary<st
142143
}
143144

144145
var resourceId = resourceTypeRegistration.GetIdForResource(modelObject);
145-
return new ResourceObject(resourceTypeRegistration.ResourceTypeName, resourceId, attributes, relationships);
146+
147+
IMetadata thisResourceObjectsMetadata;
148+
if (resourceObjectMetadata != null)
149+
resourceObjectMetadata.TryGetValue(modelObject, out thisResourceObjectsMetadata);
150+
else
151+
thisResourceObjectsMetadata = null;
152+
return new ResourceObject(resourceTypeRegistration.ResourceTypeName, resourceId, attributes, relationships, metadata: thisResourceObjectsMetadata);
146153
}
147154

148155
/// <summary>

JSONAPI/Documents/Builders/RegistryDrivenResourceCollectionDocumentBuilder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ public RegistryDrivenResourceCollectionDocumentBuilder(IResourceTypeRegistry res
1919
{
2020
}
2121

22-
public IResourceCollectionDocument BuildDocument<TModel>(IEnumerable<TModel> primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata metadata)
22+
public IResourceCollectionDocument BuildDocument<TModel>(IEnumerable<TModel> primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata metadata,
23+
IDictionary<object, IMetadata> resourceMetadata = null)
2324
{
2425
var idDictionariesByType = new Dictionary<string, IDictionary<string, ResourceObject>>();
2526
var primaryDataResources =
26-
primaryData.Select(d => (IResourceObject)CreateResourceObject(d, idDictionariesByType, null, includePathExpressions, linkBaseUrl))
27+
primaryData.Select(d => (IResourceObject)CreateResourceObject(d, idDictionariesByType, null, includePathExpressions, linkBaseUrl, resourceMetadata))
2728
.ToArray();
2829

2930
var relatedData = idDictionariesByType.Values.SelectMany(d => d.Values).Cast<IResourceObject>().ToArray();

JSONAPI/Documents/Builders/RegistryDrivenSingleResourceDocumentBuilder.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ public RegistryDrivenSingleResourceDocumentBuilder(IResourceTypeRegistry resourc
1919
{
2020
}
2121

22-
public ISingleResourceDocument BuildDocument(object primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata topLevelMetadata)
22+
public ISingleResourceDocument BuildDocument(object primaryData, string linkBaseUrl, string[] includePathExpressions, IMetadata topLevelMetadata,
23+
IDictionary<object, IMetadata> resourceMetadata = null)
2324
{
2425
var idDictionariesByType = new Dictionary<string, IDictionary<string, ResourceObject>>();
25-
var primaryDataResource = CreateResourceObject(primaryData, idDictionariesByType, null, includePathExpressions, linkBaseUrl);
26+
var primaryDataResource = CreateResourceObject(primaryData, idDictionariesByType, null, includePathExpressions, linkBaseUrl, resourceMetadata);
2627

2728
var relatedData = idDictionariesByType.Values.SelectMany(d => d.Values).Cast<IResourceObject>().ToArray();
2829
var document = new SingleResourceDocument(primaryDataResource, relatedData, topLevelMetadata);

0 commit comments

Comments
 (0)