Skip to content

Commit cfbdf01

Browse files
authored
Merge pull request #258 from digitalsadhu/string-ids
fix(remove updateHasManyThrough casting)
2 parents 4b29875 + fa27b9a commit cfbdf01

File tree

2 files changed

+133
-7
lines changed

2 files changed

+133
-7
lines changed

lib/utilities/relationship-utils.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,19 @@ function updateHasManyThrough (
154154
rightPKName,
155155
rightFKValues
156156
) {
157-
return PivotModel.find({ where: { [leftFKName]: Number(leftPKValue) } })
157+
return PivotModel.find({ where: { [leftFKName]: leftPKValue } })
158158
.then(models => {
159-
const existingIds = models.map(model => Number(model[rightFKName]))
160-
const newIds = rightFKValues.map(id => Number(id))
161-
const idsToDelete = _.difference(existingIds, newIds)
159+
const existingIds = models.map(model => model[rightFKName])
160+
const idsToDelete = _.difference(existingIds, rightFKValues)
162161
return PivotModel.destroyAll({
163-
[leftFKName]: Number(leftPKValue),
162+
[leftFKName]: leftPKValue,
164163
[rightFKName]: { inq: idsToDelete }
165164
})
166165
.then(() => {
167-
const idsToAdd = _.difference(newIds, existingIds)
166+
const idsToAdd = _.difference(rightFKValues, existingIds)
168167
return PivotModel.create(
169168
idsToAdd.map(id => ({
170-
[leftFKName]: Number(leftPKValue),
169+
[leftFKName]: leftPKValue,
171170
[rightFKName]: id
172171
}))
173172
)
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
'use strict'
2+
3+
/* global describe, beforeEach, it */
4+
5+
var request = require('supertest')
6+
var loopback = require('loopback')
7+
var expect = require('chai').expect
8+
var JSONAPIComponent = require('../')
9+
var RSVP = require('rsvp')
10+
11+
var app
12+
var Movie, Category, MovieCategory
13+
14+
describe('hasManyThrough upsert', function () {
15+
beforeEach(function (done) {
16+
app = loopback()
17+
app.set('legacyExplorer', false)
18+
var ds = loopback.createDataSource('memory')
19+
// create models
20+
Movie = ds.createModel('movie', {
21+
id: { type: String, id: true },
22+
name: String
23+
})
24+
25+
Category = ds.createModel('category', {
26+
id: { type: String, id: true },
27+
name: String
28+
})
29+
30+
MovieCategory = ds.createModel('movieCategory', {
31+
id: { type: Number, id: true }
32+
})
33+
34+
// add models
35+
app.model(Movie)
36+
app.model(Category)
37+
app.model(MovieCategory)
38+
39+
// set up relationships
40+
Movie.hasMany(Category, { through: MovieCategory })
41+
Category.hasMany(Movie, { through: MovieCategory })
42+
43+
MovieCategory.belongsTo(Movie)
44+
MovieCategory.belongsTo(Category)
45+
makeData()
46+
.then(function () {
47+
done()
48+
})
49+
.catch(function (err) {
50+
done(err)
51+
})
52+
app.use(loopback.rest())
53+
JSONAPIComponent(app, { restApiRoot: '' })
54+
})
55+
56+
it('should make initial data', function (done) {
57+
request(app).get('/movies/M1/categories').end(function (err, res) {
58+
expect(err).to.equal(null)
59+
expect(res.body.data.length).to.equal(2)
60+
expect(res.body.data[0].attributes.name).to.equal('Crime')
61+
done(err)
62+
})
63+
})
64+
65+
it('should handle PATCH', function (done) {
66+
var agent = request(app)
67+
agent
68+
.patch('/movies/M1')
69+
.send({
70+
data: {
71+
id: 1,
72+
type: 'movies',
73+
attributes: {
74+
name: 'The Shawshank Redemption'
75+
},
76+
relationships: {
77+
categories: {
78+
data: [
79+
{ type: 'categories', id: 'C1' },
80+
{ type: 'categories', id: 'C2' },
81+
{ type: 'categories', id: 'C3' }
82+
]
83+
}
84+
}
85+
}
86+
})
87+
.end(function () {
88+
agent.get('/movieCategories').end(function (err, res) {
89+
expect(err).to.equal(null)
90+
expect(res.body.data.length).to.equal(3)
91+
done()
92+
})
93+
})
94+
})
95+
})
96+
97+
function makeData () {
98+
var createMovie = denodeifyCreate(Movie)
99+
var createCategory = denodeifyCreate(Category)
100+
var createAssoc = denodeifyCreate(MovieCategory)
101+
102+
return RSVP.hash({
103+
movie: createMovie({ id: 'M1', name: 'The Shawshank Redemption' }),
104+
categories: RSVP.all([
105+
createCategory({ id: 'C1', name: 'Crime' }),
106+
createCategory({ id: 'C2', name: 'Drama' }),
107+
createCategory({ id: 'C3', name: 'History' }),
108+
createCategory({ id: 'C4', name: 'Comedy' })
109+
])
110+
})
111+
.then(function (models) {
112+
return RSVP.all([
113+
createAssoc({
114+
movieId: models.movie.id,
115+
categoryId: models.categories[0].id
116+
}),
117+
createAssoc({
118+
movieId: models.movie.id,
119+
categoryId: models.categories[2].id
120+
})
121+
])
122+
})
123+
124+
function denodeifyCreate (Model) {
125+
return RSVP.denodeify(Model.create.bind(Model))
126+
}
127+
}

0 commit comments

Comments
 (0)