Skip to content

Commit 3c090dc

Browse files
authored
fix(mongoose): smart has many relationships for mongoose major versions 6 and 7 (#1053)
1 parent 7bba9ce commit 3c090dc

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

src/services/has-many-getter.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class HasManyGetter {
5151
if (field.reference) {
5252
query.populate({
5353
path: field.field,
54+
strictPopulate: false,
5455
});
5556
}
5657
});

src/services/resource-getter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class ResourceGetter {
1515
const schema = Interface.Schemas.schemas[utils.getModelName(this._model)];
1616
_.each(schema.fields, (field) => {
1717
if (field.reference) {
18-
query.populate(field.field);
18+
query.populate({ path: field.field, strictPopulate: false });
1919
}
2020
});
2121
}

src/services/resource-updater.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class ResourceUpdater {
3535
);
3636

3737
_.each(schema.fields, (field) => {
38-
if (field.reference) { query.populate(field.field); }
38+
if (field.reference) { query.populate({ path: field.field, strictPopulate: false }); }
3939
});
4040

4141
try {

test/tests/services/resource-getter.test.js

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const options = { Mongoose: mongoose, connections: { mongoose } };
1111

1212
describe('service > resource-getter', () => {
1313
let ReviewModel;
14+
let UserModel;
1415
let scopeSpy;
1516

1617
beforeAll(async () => {
@@ -24,16 +25,36 @@ describe('service > resource-getter', () => {
2425
fields: [
2526
{ field: '_id', type: 'String' },
2627
{ field: 'rating', type: 'Number' },
28+
{ field: 'reviewer', type: 'String', reference: 'User._id' },
29+
],
30+
},
31+
User: {
32+
name: 'User',
33+
idField: '_id',
34+
primaryKeys: ['_id'],
35+
isCompositePrimary: false,
36+
searchFields: ['name'],
37+
fields: [
38+
{ field: '_id', type: 'String' },
39+
{ field: 'name', type: 'String' },
2740
],
2841
},
2942
},
3043
};
3144

3245
await mongooseConnect();
3346

34-
ReviewModel = mongoose.model('ReviewsRGet', new mongoose.Schema({
47+
const UserSchema = new mongoose.Schema({
48+
_id: { type: 'ObjectId' },
49+
name: { type: String },
50+
});
51+
UserModel = mongoose.model('User', UserSchema, 'users');
52+
53+
const ReviewSchema = new mongoose.Schema({
3554
rating: { type: Number },
36-
}));
55+
reviewer: { type: 'ObjectId', ref: 'User' },
56+
});
57+
ReviewModel = mongoose.model('ReviewsRGet', ReviewSchema);
3758
});
3859

3960
afterAll(async () => {
@@ -43,6 +64,7 @@ describe('service > resource-getter', () => {
4364

4465
beforeEach(async () => {
4566
await ReviewModel.deleteMany({});
67+
await UserModel.deleteMany({});
4668
});
4769

4870
it('should reject when the record does not exists', async () => {
@@ -68,4 +90,33 @@ describe('service > resource-getter', () => {
6890
rating: 0,
6991
});
7092
});
93+
94+
describe('when fetching with referenced field', () => {
95+
it('should return the record properly', async () => {
96+
expect.assertions(1);
97+
98+
await loadFixture(UserModel, [
99+
{ _id: '64fad8058f3de3f425abc85c', name: 'Bobby' },
100+
]);
101+
await loadFixture(ReviewModel, [
102+
{ _id: '507f1f77bcf86cd799439011', rating: 5, reviewer: '64fad8058f3de3f425abc85c' },
103+
]);
104+
105+
const params = {
106+
...baseParams,
107+
recordId: '507f1f77bcf86cd799439011',
108+
};
109+
const getter = new ResourceGetter(ReviewModel, params, options, user);
110+
expect(await getter.perform()).toStrictEqual({
111+
__v: 0, // mongoose version
112+
_id: new mongoose.Types.ObjectId('507f1f77bcf86cd799439011'),
113+
rating: 5,
114+
reviewer: {
115+
__v: 0, // mongoose version
116+
_id: new mongoose.Types.ObjectId('64fad8058f3de3f425abc85c'),
117+
name: 'Bobby',
118+
},
119+
});
120+
});
121+
});
71122
});

0 commit comments

Comments
 (0)