diff --git a/src/Adapters/Storage/Mongo/MongoCollection.js b/src/Adapters/Storage/Mongo/MongoCollection.js index 1e501824..12c9df66 100644 --- a/src/Adapters/Storage/Mongo/MongoCollection.js +++ b/src/Adapters/Storage/Mongo/MongoCollection.js @@ -76,17 +76,6 @@ export default class MongoCollection { return this._mongoCollection.updateMany(query, update); } - // Atomically find and delete an object based on query. - // The result is the promise with an object that was in the database before deleting. - // Postgres Note: Translates directly to `DELETE * FROM ... RETURNING *`, which will return data after delete is done. - findOneAndDelete(query) { - // arguments: query, sort - return this._mongoCollection.findAndRemove(query, []).then(document => { - // Value is the object where mongo returns multiple fields. - return document.value; - }); - } - deleteOne(query) { return this._mongoCollection.deleteOne(query); } diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index 8d4fc4ff..d5752088 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -63,7 +63,7 @@ DatabaseController.prototype.validateClassName = function(className) { DatabaseController.prototype.loadSchema = function(acceptor = returnsTrue) { if (!this.schemaPromise) { - this.schemaPromise = this.adaptiveCollection('_SCHEMA').then(collection => { + this.schemaPromise = this.schemaCollection().then(collection => { delete this.schemaPromise; return Schema.load(collection); }); @@ -74,7 +74,7 @@ DatabaseController.prototype.loadSchema = function(acceptor = returnsTrue) { if (acceptor(schema)) { return schema; } - this.schemaPromise = this.adaptiveCollection('_SCHEMA').then(collection => { + this.schemaPromise = this.schemaCollection().then(collection => { delete this.schemaPromise; return Schema.load(collection); }); diff --git a/src/Routers/SchemasRouter.js b/src/Routers/SchemasRouter.js index 74b15285..a0a90ef2 100644 --- a/src/Routers/SchemasRouter.js +++ b/src/Routers/SchemasRouter.js @@ -15,23 +15,22 @@ function classNameMismatchResponse(bodyClass, pathClass) { } function getAllSchemas(req) { - return req.config.database.adaptiveCollection('_SCHEMA') - .then(collection => collection.find({})) + return req.config.database.schemaCollection() + .then(collection => collection.getAllSchemas()) .then(schemas => schemas.map(Schema.mongoSchemaToSchemaAPIResponse)) .then(schemas => ({ response: { results: schemas } })); } function getOneSchema(req) { const className = req.params.className; - return req.config.database.adaptiveCollection('_SCHEMA') - .then(collection => collection.find({ '_id': className }, { limit: 1 })) - .then(results => { - if (results.length != 1) { + return req.config.database.schemaCollection() + .then(collection => collection.findSchema(className)) + .then(mongoSchema => { + if (!mongoSchema) { throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, `Class ${className} does not exist.`); } - return results[0]; - }) - .then(schema => ({ response: Schema.mongoSchemaToSchemaAPIResponse(schema) })); + return { response: Schema.mongoSchemaToSchemaAPIResponse(mongoSchema) }; + }); } function createSchema(req) { @@ -142,8 +141,8 @@ function deleteSchema(req) { .then(() => { // We've dropped the collection now, so delete the item from _SCHEMA // and clear the _Join collections - return req.config.database.adaptiveCollection('_SCHEMA') - .then(coll => coll.findOneAndDelete({ _id: req.params.className })) + return req.config.database.schemaCollection() + .then(coll => coll.findAndDeleteSchema(req.params.className)) .then(document => { if (document === null) { //tried to delete non-existent class diff --git a/src/Schema.js b/src/Schema.js index a3bf8245..2a048a54 100644 --- a/src/Schema.js +++ b/src/Schema.js @@ -184,7 +184,7 @@ class Schema { reloadData() { this.data = {}; this.perms = {}; - return this._collection.find({}).then(results => { + return this._collection.getAllSchemas().then(results => { for (let obj of results) { let className = null; let classData = {}; @@ -231,7 +231,7 @@ class Schema { return Promise.reject(mongoObject); } - return this._collection.insertOne(mongoObject.result) + return this._collection.addSchema(className, mongoObject.result) .then(result => result.ops[0]) .catch(error => { if (error.code === 11000) { //Mongo's duplicate key error @@ -268,7 +268,7 @@ class Schema { 'schema is frozen, cannot add: ' + className); } // We don't have this class. Update the schema - return this._collection.insertOne({ _id: className }).then(() => { + return this._collection.addSchema(className).then(() => { // The schema update succeeded. Reload the schema return this.reloadData(); }, () => { @@ -288,14 +288,13 @@ class Schema { // Sets the Class-level permissions for a given className, which must exist. setPermissions(className, perms) { - var query = {_id: className}; var update = { _metadata: { class_permissions: perms } }; update = {'$set': update}; - return this._collection.updateOne(query, update).then(() => { + return this._collection.updateSchema(className, update).then(() => { // The update succeeded. Reload the schema return this.reloadData(); }); @@ -353,12 +352,12 @@ class Schema { // We don't have this field. Update the schema. // Note that we use the $exists guard and $set to avoid race // conditions in the database. This is important! - var query = { _id: className }; + let query = {}; query[key] = { '$exists': false }; var update = {}; update[key] = type; update = {'$set': update}; - return this._collection.upsertOne(query, update).then(() => { + return this._collection.upsertSchema(className, query, update).then(() => { // The update succeeded. Reload the schema return this.reloadData(); }, () => { @@ -428,7 +427,7 @@ class Schema { }); }) // Save the _SCHEMA object - .then(() => this._collection.updateOne({ _id: className }, { $unset: { [fieldName]: null } })); + .then(() => this._collection.updateSchema(className, { $unset: { [fieldName]: null } })); }); }