Store collection prefix in mongo adapter, and clean up adapter interface (#1472)

This commit is contained in:
Drew
2016-04-13 05:21:53 -07:00
committed by Florent Vilmart
parent 512251eb58
commit 3fb3ce1ab7
6 changed files with 35 additions and 31 deletions

View File

@@ -8,15 +8,15 @@ describe('DatabaseAdapter', () => {
DatabaseAdapter.setAppDatabaseOptions('optionsTest', {foo: "bar"}); DatabaseAdapter.setAppDatabaseOptions('optionsTest', {foo: "bar"});
let optionsTestDatabaseConnection = DatabaseAdapter.getDatabaseConnection('optionsTest'); let optionsTestDatabaseConnection = DatabaseAdapter.getDatabaseConnection('optionsTest');
expect(optionsTestDatabaseConnection instanceof Object).toBe(true); expect(optionsTestDatabaseConnection).toEqual(jasmine.any(Object));
expect(optionsTestDatabaseConnection.adapter._options instanceof Object).toBe(true); expect(optionsTestDatabaseConnection.adapter._mongoOptions).toEqual(jasmine.any(Object));
expect(optionsTestDatabaseConnection.adapter._options.foo).toBe("bar"); expect(optionsTestDatabaseConnection.adapter._mongoOptions.foo).toBe("bar");
DatabaseAdapter.setAppDatabaseURI('noOptionsTest', 'mongodb://localhost:27017/noOptionsTest'); DatabaseAdapter.setAppDatabaseURI('noOptionsTest', 'mongodb://localhost:27017/noOptionsTest');
let noOptionsTestDatabaseConnection = DatabaseAdapter.getDatabaseConnection('noOptionsTest'); let noOptionsTestDatabaseConnection = DatabaseAdapter.getDatabaseConnection('noOptionsTest');
expect(noOptionsTestDatabaseConnection instanceof Object).toBe(true); expect(noOptionsTestDatabaseConnection).toEqual(jasmine.any(Object));
expect(noOptionsTestDatabaseConnection.adapter._options instanceof Object).toBe(false); expect(noOptionsTestDatabaseConnection.adapter._mongoOptions).toEqual(jasmine.any(Object));
done(); done();
}); });

View File

@@ -5,9 +5,11 @@ let MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAda
describe('DatabaseController', () => { describe('DatabaseController', () => {
it('can be constructed', done => { it('can be constructed', done => {
let adapter = new MongoStorageAdapter('mongodb://localhost:27017/test'); let adapter = new MongoStorageAdapter({
uri: 'mongodb://localhost:27017/test'
});
let databaseController = new DatabaseController(adapter, { let databaseController = new DatabaseController(adapter, {
collectionPrefix: 'test_' collectionPrefix: 'test_'
}); });
databaseController.connect().then(done, error => { databaseController.connect().then(done, error => {
console.log('error', error.stack); console.log('error', error.stack);

View File

@@ -6,8 +6,9 @@ const MongoClient = require('mongodb').MongoClient;
describe('MongoStorageAdapter', () => { describe('MongoStorageAdapter', () => {
it('auto-escapes symbols in auth information', () => { it('auto-escapes symbols in auth information', () => {
spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null)); spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null));
new MongoStorageAdapter('mongodb://user!with@+ symbols:password!with@+ symbols@localhost:1234/parse', {}) new MongoStorageAdapter({
.connect(); uri: 'mongodb://user!with@+ symbols:password!with@+ symbols@localhost:1234/parse'
}).connect();
expect(MongoClient.connect).toHaveBeenCalledWith( expect(MongoClient.connect).toHaveBeenCalledWith(
'mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse', 'mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse',
jasmine.any(Object) jasmine.any(Object)
@@ -16,8 +17,9 @@ describe('MongoStorageAdapter', () => {
it("doesn't double escape already URI-encoded information", () => { it("doesn't double escape already URI-encoded information", () => {
spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null)); spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null));
new MongoStorageAdapter('mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse', {}) new MongoStorageAdapter({
.connect(); uri: 'mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse'
}).connect();
expect(MongoClient.connect).toHaveBeenCalledWith( expect(MongoClient.connect).toHaveBeenCalledWith(
'mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse', 'mongodb://user!with%40%2B%20symbols:password!with%40%2B%20symbols@localhost:1234/parse',
jasmine.any(Object) jasmine.any(Object)
@@ -27,8 +29,9 @@ describe('MongoStorageAdapter', () => {
// https://github.com/ParsePlatform/parse-server/pull/148#issuecomment-180407057 // https://github.com/ParsePlatform/parse-server/pull/148#issuecomment-180407057
it('preserves replica sets', () => { it('preserves replica sets', () => {
spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null)); spyOn(MongoClient, 'connect').and.returnValue(Promise.resolve(null));
new MongoStorageAdapter('mongodb://test:testpass@ds056315-a0.mongolab.com:59325,ds059315-a1.mongolab.com:59315/testDBname?replicaSet=rs-ds059415', {}) new MongoStorageAdapter({
.connect(); uri: 'mongodb://test:testpass@ds056315-a0.mongolab.com:59325,ds059315-a1.mongolab.com:59315/testDBname?replicaSet=rs-ds059415'
}).connect();
expect(MongoClient.connect).toHaveBeenCalledWith( expect(MongoClient.connect).toHaveBeenCalledWith(
'mongodb://test:testpass@ds056315-a0.mongolab.com:59325,ds059315-a1.mongolab.com:59315/testDBname?replicaSet=rs-ds059415', 'mongodb://test:testpass@ds056315-a0.mongolab.com:59325,ds059315-a1.mongolab.com:59315/testDBname?replicaSet=rs-ds059415',
jasmine.any(Object) jasmine.any(Object)

View File

@@ -11,14 +11,20 @@ const MongoSchemaCollectionName = '_SCHEMA';
export class MongoStorageAdapter { export class MongoStorageAdapter {
// Private // Private
_uri: string; _uri: string;
_options: Object; _collectionPrefix: string;
_mongoOptions: Object;
// Public // Public
connectionPromise; connectionPromise;
database; database;
constructor(uri: string, options: Object) { constructor({
uri,
collectionPrefix = '',
mongoOptions = {},
}) {
this._uri = uri; this._uri = uri;
this._options = options; this._collectionPrefix = collectionPrefix;
this._mongoOptions = mongoOptions;
} }
connect() { connect() {
@@ -30,7 +36,7 @@ export class MongoStorageAdapter {
// encoded // encoded
const encodedUri = formatUrl(parseUrl(this._uri)); const encodedUri = formatUrl(parseUrl(this._uri));
this.connectionPromise = MongoClient.connect(encodedUri, this._options).then(database => { this.connectionPromise = MongoClient.connect(encodedUri, this._mongoOptions).then(database => {
this.database = database; this.database = database;
}); });
return this.connectionPromise; return this.connectionPromise;

View File

@@ -15,21 +15,16 @@
// //
// Default is MongoStorageAdapter. // Default is MongoStorageAdapter.
import DatabaseController from './Controllers/DatabaseController'; import DatabaseController from './Controllers/DatabaseController';
import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter'; import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter';
const DefaultDatabaseURI = 'mongodb://localhost:27017/parse'; const DefaultDatabaseURI = 'mongodb://localhost:27017/parse';
let adapter = MongoStorageAdapter;
let dbConnections = {}; let dbConnections = {};
let databaseURI = DefaultDatabaseURI; let databaseURI = DefaultDatabaseURI;
let appDatabaseURIs = {}; let appDatabaseURIs = {};
let appDatabaseOptions = {}; let appDatabaseOptions = {};
function setAdapter(databaseAdapter) {
adapter = databaseAdapter;
}
function setDatabaseURI(uri) { function setDatabaseURI(uri) {
databaseURI = uri; databaseURI = uri;
} }
@@ -68,7 +63,12 @@ function getDatabaseConnection(appId: string, collectionPrefix: string) {
var dbURI = (appDatabaseURIs[appId] ? appDatabaseURIs[appId] : databaseURI); var dbURI = (appDatabaseURIs[appId] ? appDatabaseURIs[appId] : databaseURI);
let storageAdapter = new adapter(dbURI, appDatabaseOptions[appId]); let storageAdapter = new MongoStorageAdapter({
uri: dbURI,
collectionPrefix: collectionPrefix,
mongoOptions: appDatabaseOptions[appId]
});
dbConnections[appId] = new DatabaseController(storageAdapter, { dbConnections[appId] = new DatabaseController(storageAdapter, {
collectionPrefix: collectionPrefix collectionPrefix: collectionPrefix
}); });
@@ -76,9 +76,7 @@ function getDatabaseConnection(appId: string, collectionPrefix: string) {
} }
module.exports = { module.exports = {
dbConnections: dbConnections,
getDatabaseConnection: getDatabaseConnection, getDatabaseConnection: getDatabaseConnection,
setAdapter: setAdapter,
setDatabaseURI: setDatabaseURI, setDatabaseURI: setDatabaseURI,
setAppDatabaseOptions: setAppDatabaseOptions, setAppDatabaseOptions: setAppDatabaseOptions,
setAppDatabaseURI: setAppDatabaseURI, setAppDatabaseURI: setAppDatabaseURI,

View File

@@ -84,7 +84,6 @@ class ParseServer {
appId = requiredParameter('You must provide an appId!'), appId = requiredParameter('You must provide an appId!'),
masterKey = requiredParameter('You must provide a masterKey!'), masterKey = requiredParameter('You must provide a masterKey!'),
appName, appName,
databaseAdapter,
filesAdapter, filesAdapter,
push, push,
loggerAdapter, loggerAdapter,
@@ -127,10 +126,6 @@ class ParseServer {
}) })
} }
if (databaseAdapter) {
DatabaseAdapter.setAdapter(databaseAdapter);
}
if (databaseOptions) { if (databaseOptions) {
DatabaseAdapter.setAppDatabaseOptions(appId, databaseOptions); DatabaseAdapter.setAppDatabaseOptions(appId, databaseOptions);
} }