Skip to content

Commit 1954a32

Browse files
committed
🐛 Handle missing to-one related resource.
Correctly handle missing to-one related resource by returning a `null` resource that following the specification (see http://jsonapi.org/format/#fetching-relationships). Fixes #97.
1 parent f16cc00 commit 1954a32

File tree

6 files changed

+32
-3
lines changed

6 files changed

+32
-3
lines changed

example/resources/comments.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ jsonApi.define({
3535
body: "I like XML better",
3636
timestamp: "2017-06-20",
3737
author: { type: "people", id: "32fb0105-acaa-4adb-9ec4-8b49633695e1", meta: { created: "2010-01-01" } }
38+
},
39+
{
40+
id: "2f716574-cef6-4238-8285-520911af86c1",
41+
type: "comments",
42+
body: "Wibble wibble.",
43+
timestamp: "2017-12-31",
44+
author: null
3845
}
3946
]
4047
});

lib/postProcess.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ postProcess._fetchRelatedResources = function(request, mainResource, callback) {
3535

3636
// Fetch the other objects
3737
var dataItems = mainResource[request.params.relation];
38+
39+
if (!dataItems) return callback(null, [ null ]);
40+
3841
if (!(dataItems instanceof Array)) dataItems = [ dataItems ];
3942

4043
var resourcesToFetch = dataItems.reduce(function(map, dataItem) {

lib/routes/related.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ relatedRoute.register = function() {
5757
}
5858
request.resourceConfig = jsonApi._resources[relation._settings.__one || relation._settings.__many];
5959
response = responseHelper._generateResponse(request, resourceConfig, relatedResources);
60-
response.included = [ ];
60+
if (relatedResources !== null) {
61+
response.included = [ ];
62+
}
6163
postProcess.handle(request, response, callback);
6264
}
6365
], function(err) {

test/_preResourceValidationCheck.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var jsonApiTestServer = require("../example/server.js");
77
describe("Testing jsonapi-server", function() {
88

99
[ { name: "articles", count: 4 },
10-
{ name: "comments", count: 2 },
10+
{ name: "comments", count: 3 },
1111
{ name: "people", count: 4 },
1212
{ name: "photos", count: 3 },
1313
{ name: "tags", count: 5 }

test/get-resource-id-related.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,23 @@ describe("Testing jsonapi-server", function() {
6666
});
6767
});
6868

69+
it("with null data", function(done) {
70+
var url = "http://localhost:16006/rest/comments/2f716574-cef6-4238-8285-520911af86c1/author";
71+
helpers.request({
72+
method: "GET",
73+
url: url
74+
}, function(err, res, json) {
75+
assert.equal(err, null);
76+
json = helpers.validateJson(json);
77+
assert.equal(res.statusCode, "200", "Expecting 200 OK");
78+
assert.strictEqual(json.data, null);
79+
assert(!("included" in json), "Null resource not NOT have `includes` attribute");
80+
81+
done();
82+
83+
});
84+
});
85+
6986
it("with fields", function(done) {
7087
var url = "http://localhost:16006/rest/articles/de305d54-75b4-431b-adb2-eb6b9e546014/author?fields[people]=email";
7188
helpers.request({

test/zzPostResourceValidationCheck.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var jsonApiTestServer = require("../example/server.js");
77
describe("Testing jsonapi-server", function() {
88

99
[ { name: "articles", count: 4 },
10-
{ name: "comments", count: 1 },
10+
{ name: "comments", count: 2 },
1111
{ name: "people", count: 4 },
1212
{ name: "photos", count: 4 },
1313
{ name: "tags", count: 5 }

0 commit comments

Comments
 (0)