From 997da898ebf0e8dbeaed2ac24b665325214fc5e1 Mon Sep 17 00:00:00 2001 From: Nikita Lutsenko Date: Sat, 27 Feb 2016 02:23:57 -0800 Subject: [PATCH] Split mongodb connection creation from DatabaseController. --- spec/DatabaseController.spec.js | 16 +++++----- .../Storage/Mongo/MongoStorageAdapter.js | 29 +++++++++++++++++++ src/Controllers/DatabaseController.js | 20 +++++-------- src/DatabaseAdapter.js | 12 ++++++-- 4 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 src/Adapters/Storage/Mongo/MongoStorageAdapter.js diff --git a/spec/DatabaseController.spec.js b/spec/DatabaseController.spec.js index 6ec8bfc0..3c55e1dd 100644 --- a/spec/DatabaseController.spec.js +++ b/spec/DatabaseController.spec.js @@ -1,15 +1,17 @@ -var DatabaseController = require('../src/Controllers/DatabaseController'); +'use strict'; + +let DatabaseController = require('../src/Controllers/DatabaseController'); +let MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAdapter'); describe('DatabaseController', () => { - it('can be constructed', (done) => { - var database = new DatabaseController('mongodb://localhost:27017/test', - { + it('can be constructed', done => { + let adapter = new MongoStorageAdapter('mongodb://localhost:27017/test'); + let databaseController = new DatabaseController(adapter, { collectionPrefix: 'test_' - }); - database.connect().then(done, (error) => { + }); + databaseController.connect().then(done, error => { console.log('error', error.stack); fail(); }); }); - }); diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js new file mode 100644 index 00000000..e4995cba --- /dev/null +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -0,0 +1,29 @@ + +let mongodb = require('mongodb'); +let MongoClient = mongodb.MongoClient; + +export class MongoStorageAdapter { + // Private + _uri: string; + // Public + connectionPromise; + database; + + constructor(uri: string) { + this._uri = uri; + } + + connect() { + if (this.connectionPromise) { + return this.connectionPromise; + } + + this.connectionPromise = MongoClient.connect(this._uri).then(database => { + this.database = database; + }); + return this.connectionPromise; + } +} + +export default MongoStorageAdapter; +module.exports = MongoStorageAdapter; // Required for tests diff --git a/src/Controllers/DatabaseController.js b/src/Controllers/DatabaseController.js index ed6241ce..ca1033e9 100644 --- a/src/Controllers/DatabaseController.js +++ b/src/Controllers/DatabaseController.js @@ -2,7 +2,6 @@ // Parse database. var mongodb = require('mongodb'); -var MongoClient = mongodb.MongoClient; var Parse = require('parse/node').Parse; var Schema = require('./../Schema'); @@ -10,10 +9,10 @@ var transform = require('./../transform'); // options can contain: // collectionPrefix: the string to put in front of every collection name. -function DatabaseController(mongoURI, options = {}) { - this.mongoURI = mongoURI; +function DatabaseController(adapter, { collectionPrefix } = {}) { + this.adapter = adapter; - this.collectionPrefix = options.collectionPrefix; + this.collectionPrefix = collectionPrefix; // We don't want a mutable this.schema, because then you could have // one request that uses different schemas for different parts of @@ -28,17 +27,12 @@ function DatabaseController(mongoURI, options = {}) { // this.db will be populated with a Mongo "Db" object when the // promise resolves successfully. DatabaseController.prototype.connect = function() { - if (this.connectionPromise) { - // There's already a connection in progress. - return this.connectionPromise; + if (this.adapter.connectionPromise) { + return this.adapter.connectionPromise; } - - this.connectionPromise = Promise.resolve().then(() => { - return MongoClient.connect(this.mongoURI); - }).then((db) => { - this.db = db; + return this.adapter.connect().then(() => { + this.db = this.adapter.database; }); - return this.connectionPromise; }; // Returns a promise for a Mongo collection. diff --git a/src/DatabaseAdapter.js b/src/DatabaseAdapter.js index f4d43771..feb9311e 100644 --- a/src/DatabaseAdapter.js +++ b/src/DatabaseAdapter.js @@ -13,9 +13,12 @@ // * destroy(className, query, options) // * This list is incomplete and the database process is not fully modularized. // -// Default is DatabaseController, which uses mongo at this time. +// Default is MongoStorageAdapter. -var adapter = require('./Controllers/DatabaseController'); +import DatabaseController from './Controllers/DatabaseController'; +import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter'; + +let adapter = MongoStorageAdapter; var dbConnections = {}; var databaseURI = 'mongodb://localhost:27017/parse'; var appDatabaseURIs = {}; @@ -44,9 +47,12 @@ function getDatabaseConnection(appId: string, collectionPrefix: string) { } var dbURI = (appDatabaseURIs[appId] ? appDatabaseURIs[appId] : databaseURI); - dbConnections[appId] = new adapter(dbURI, { + + let storageAdapter = new adapter(dbURI); + dbConnections[appId] = new DatabaseController(storageAdapter, { collectionPrefix: collectionPrefix }); + dbConnections[appId].connect(); return dbConnections[appId]; }