Skip to content

Commit f4a633e

Browse files
Marco129TylerBrock
authored andcommitted
Return correct error when violating unique index (#1763)
1 parent 6cfcb4d commit f4a633e

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

spec/ParseAPI.spec.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
var DatabaseAdapter = require('../src/DatabaseAdapter');
66
var request = require('request');
77
const Parse = require("parse/node");
8+
let Config = require('../src/Config');
89

910
describe('miscellaneous', function() {
1011
it('create a GameScore object', function(done) {
@@ -224,6 +225,34 @@ describe('miscellaneous', function() {
224225
});
225226
});
226227

228+
it('test beforeSave set object acl success', function(done) {
229+
var acl = new Parse.ACL({
230+
'*': { read: true, write: false }
231+
});
232+
Parse.Cloud.beforeSave('BeforeSaveAddACL', function(req, res) {
233+
req.object.setACL(acl);
234+
res.success();
235+
});
236+
237+
var obj = new Parse.Object('BeforeSaveAddACL');
238+
obj.set('lol', true);
239+
obj.save().then(function() {
240+
Parse.Cloud._removeHook('Triggers', 'beforeSave', 'BeforeSaveAddACL');
241+
var query = new Parse.Query('BeforeSaveAddACL');
242+
query.get(obj.id).then(function(objAgain) {
243+
expect(objAgain.get('lol')).toBeTruthy();
244+
expect(objAgain.getACL().equals(acl));
245+
done();
246+
}, function(error) {
247+
fail(error);
248+
done();
249+
});
250+
}, function(error) {
251+
fail(error);
252+
done();
253+
});
254+
});
255+
227256
it('test beforeSave returns value on create and update', (done) => {
228257
var obj = new Parse.Object('BeforeSaveChanged');
229258
obj.set('foo', 'bing');
@@ -1387,4 +1416,25 @@ describe('miscellaneous', function() {
13871416
})
13881417
});
13891418
});
1419+
1420+
it('fail when create duplicate value in unique field', (done) => {
1421+
let obj = new Parse.Object('UniqueField');
1422+
obj.set('unique', 'value');
1423+
obj.save().then(() => {
1424+
expect(obj.id).not.toBeUndefined();
1425+
let config = new Config('test');
1426+
return config.database.adapter.adaptiveCollection('UniqueField')
1427+
}).then(collection => {
1428+
return collection._mongoCollection.createIndex({ 'unique': 1 }, { unique: true })
1429+
}).then(() => {
1430+
let obj = new Parse.Object('UniqueField');
1431+
obj.set('unique', 'value');
1432+
return obj.save()
1433+
}).then(() => {
1434+
return Promise.reject();
1435+
}, error => {
1436+
expect(error.code === Parse.Error.DUPLICATE_VALUE);
1437+
done();
1438+
});
1439+
});
13901440
});

src/Adapters/Storage/Mongo/MongoStorageAdapter.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,14 @@ export class MongoStorageAdapter {
166166
createObject(className, object, schemaController, parseFormatSchema) {
167167
const mongoObject = transform.parseObjectToMongoObjectForCreate(schemaController, className, object, parseFormatSchema);
168168
return this.adaptiveCollection(className)
169-
.then(collection => collection.insertOne(mongoObject));
169+
.then(collection => collection.insertOne(mongoObject))
170+
.catch(error => {
171+
if (error.code === 11000) { // Duplicate value
172+
throw new Parse.Error(Parse.Error.DUPLICATE_VALUE,
173+
'A duplicate value for a field with unique values was provided');
174+
}
175+
return Promise.reject(error);
176+
});
170177
}
171178

172179
// Remove all objects that match the given parse query. Parse Query should be in Parse Format.

0 commit comments

Comments
 (0)