From 175af3da2cc88a53bf343cfc41abe04e591c638c Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Thu, 8 Feb 2018 21:30:41 -0600 Subject: [PATCH] duplicate value on unique index error --- spec/schemas.spec.js | 24 +++++++++++++++++++ .../Storage/Mongo/MongoStorageAdapter.js | 8 ++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/spec/schemas.spec.js b/spec/schemas.spec.js index 8f689d7189..ed85d1cc17 100644 --- a/spec/schemas.spec.js +++ b/spec/schemas.spec.js @@ -2387,4 +2387,28 @@ describe('schemas', () => { }); }); }); + + it_exclude_dbs(['postgres'])('cannot update to duplicate value on unique index', (done) => { + const index = { + code: 1 + }; + const obj1 = new Parse.Object('UniqueIndexClass'); + obj1.set('code', 1); + const obj2 = new Parse.Object('UniqueIndexClass'); + obj2.set('code', 2); + const adapter = config.database.adapter; + adapter._adaptiveCollection('UniqueIndexClass').then(collection => { + return collection._ensureSparseUniqueIndexInBackground(index); + }).then(() => { + return obj1.save(); + }).then(() => { + return obj2.save(); + }).then(() => { + obj1.set('code', 2); + return obj1.save(); + }).then(done.fail).catch((error) => { + expect(error.code).toEqual(Parse.Error.DUPLICATE_VALUE); + done(); + }); + }); }); diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 5e21734989..71d37340f9 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -421,7 +421,13 @@ export class MongoStorageAdapter implements StorageAdapter { const mongoWhere = transformWhere(className, query, schema); return this._adaptiveCollection(className) .then(collection => collection._mongoCollection.findAndModify(mongoWhere, [], mongoUpdate, { new: true })) - .then(result => mongoObjectToParseObject(className, result.value, schema)); + .then(result => mongoObjectToParseObject(className, result.value, schema)) + .catch(error => { + if (error.code === 11000) { + throw new Parse.Error(Parse.Error.DUPLICATE_VALUE, 'A duplicate value for a field with unique values was provided'); + } + throw error; + }); } // Hopefully we can get rid of this. It's only used for config and hooks.