Store collection prefix in mongo adapter, and clean up adapter interface (#1472)
This commit is contained in:
@@ -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();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user