Skip to content

Commit e8fe1ad

Browse files
committed
Add embed, thanks to @delfi
1 parent f50c9eb commit e8fe1ad

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/router.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ module.exports = function (source) {
101101
filters[key] = utils.toNative(req.query[key])
102102
}
103103
}
104-
104+
105105
// Filter
106106
if (_(filters).isEmpty()) {
107107
array = db(req.params.resource).value()
@@ -144,10 +144,22 @@ module.exports = function (source) {
144144

145145
// GET /:resource/:id
146146
function show (req, res, next) {
147+
var _embed = req.query._embed
147148
var resource = db(req.params.resource)
148149
.get(utils.toNative(req.params.id))
149150

150151
if (resource) {
152+
// Always use an array
153+
_embed = _.isArray(_embed) ? _embed : [_embed]
154+
155+
// Embed other resources based on resource id
156+
_embed.forEach(function () {
157+
var query = {}
158+
query[req.params.resource + 'Id'] = req.params.id
159+
resource[_embed] = db(_embed).where(query)
160+
})
161+
162+
// Return resource
151163
res.jsonp(resource)
152164
} else {
153165
res.status(404).jsonp({})

test/index.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ describe('Server', function () {
111111
})
112112
})
113113

114-
describe('GET /:resource?sort=', function () {
114+
describe('GET /:resource?_sort=', function () {
115115
it('should respond with json and sort on a field', function (done) {
116116
request(server)
117117
.get('/tags?_sort=body')
@@ -200,6 +200,31 @@ describe('Server', function () {
200200
})
201201
})
202202

203+
describe('GET /:resource/:id?_embed=', function () {
204+
it('should respond with corresponding resource and embedded other resource', function (done) {
205+
var posts = db.posts[0]
206+
posts.comments = [db.comments[0], db.comments[1]]
207+
request(server)
208+
.get('/posts/1?_embed=comments')
209+
.expect('Content-Type', /json/)
210+
.expect(posts)
211+
.expect(200, done)
212+
})
213+
})
214+
215+
describe('GET /:resource/:id?_embed=&_embed=', function () {
216+
it('should respond with corresponding resource and embedded other resources', function (done) {
217+
var posts = db.posts[0]
218+
posts.comments = [db.comments[0], db.comments[1]]
219+
posts.refs = [db.refs[0]]
220+
request(server)
221+
.get('/posts/1?_embed=comments&_embed=refs')
222+
.expect('Content-Type', /json/)
223+
.expect(posts)
224+
.expect(200, done)
225+
})
226+
})
227+
203228
describe('POST /:resource', function () {
204229
it('should respond with json, create a resource and increment id',
205230
function (done) {

0 commit comments

Comments
 (0)