From 1551c42b35caa56cb975d3a81bec65646be1f91b Mon Sep 17 00:00:00 2001 From: Drew Gross Date: Thu, 7 Apr 2016 01:17:45 -0700 Subject: [PATCH] Schema format cleanup --- .../Storage/Mongo/MongoSchemaCollection.js | 13 ++++++++- src/Schema.js | 28 +++++++++---------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js index f64867a76d..2f5adbbfb4 100644 --- a/src/Adapters/Storage/Mongo/MongoSchemaCollection.js +++ b/src/Adapters/Storage/Mongo/MongoSchemaCollection.js @@ -115,9 +115,20 @@ class MongoSchemaCollection { }); } + // Add a collection. Currently the input is in mongo format, but that will change to Parse format in a + // later PR. Returns a promise that is expected to resolve with the newly created schema, in Parse format. + // If the class already exists, returns a promise that rejects with undefined as the reason. If the collection + // can't be added for a reason other than it already existing, requirements for rejection reason are TBD. addSchema(name: string, fields) { let mongoObject = _mongoSchemaObjectFromNameFields(name, fields); - return this._collection.insertOne(mongoObject); + return this._collection.insertOne(mongoObject) + .then(result => mongoSchemaToParseSchema(result.ops[0])) + .catch(error => { + if (error.code === 11000) { //Mongo's duplicate key error + return Promise.reject(); + } + return Promise.reject(error); + }); } updateSchema(name: string, update) { diff --git a/src/Schema.js b/src/Schema.js index d4bdfc2b81..8311ef482e 100644 --- a/src/Schema.js +++ b/src/Schema.js @@ -132,17 +132,16 @@ function validateCLP(perms) { }); }); } -// Valid classes must: -// Be one of _User, _Installation, _Role, _Session OR -// Be a join table OR -// Include only alpha-numeric and underscores, and not start with an underscore or number var joinClassRegex = /^_Join:[A-Za-z0-9_]+:[A-Za-z0-9_]+/; var classAndFieldRegex = /^[A-Za-z][A-Za-z0-9_]*$/; function classNameIsValid(className) { - return (systemClasses.indexOf(className) > -1 || - className === '_SCHEMA' || //TODO: remove this, as _SCHEMA is not a valid class name for storing Parse Objects. + // Valid classes must: + return ( + // Be one of _User, _Installation, _Role, _Session OR + systemClasses.indexOf(className) > -1 || + // Be a join table OR joinClassRegex.test(className) || - //Class names have the same constraints as field names, but also allow the previous additional names. + // Include only alpha-numeric and underscores, and not start with an underscore or number fieldNameIsValid(className) ); } @@ -272,14 +271,13 @@ class Schema { } return this._collection.addSchema(className, mongoObject.result) - //TODO: Move this logic into the database adapter - .then(result => MongoSchemaCollection._TESTmongoSchemaToParseSchema(result.ops[0])) - .catch(error => { - if (error.code === 11000) { //Mongo's duplicate key error - throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, `Class ${className} already exists.`); - } - return Promise.reject(error); - }); + .catch(error => { + if (error === undefined) { + throw new Parse.Error(Parse.Error.INVALID_CLASS_NAME, `Class ${className} already exists.`); + } else { + throw new Parse.Error(Parse.Error.INTERNAL_SERVER_ERROR, 'Database adapter error.'); + } + }); } updateClass(className, submittedFields, classLevelPermissions, database) {