Skip to content

Deprecated the FilesAdapter and DatabaseAdapter in favor of FilesProv… #266

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions Config.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
// A Config object provides information about how a specific app is
// configured.
// mount is the URL for the root of the API; includes http, domain, etc.

// TODO: Cache should get it's providers from the server context, rather than requiring them
var DatabaseProvider = require('./classes/DatabaseProvider');

function Config(applicationId, mount) {
var cache = require('./cache');
var DatabaseAdapter = require('./DatabaseAdapter');
var dbProvider = new DatabaseProvider();

var cacheInfo = cache.apps[applicationId];
this.valid = !!cacheInfo;
if (!this.valid) {
return;
}

this.applicationId = applicationId;
this.collectionPrefix = cacheInfo.collectionPrefix || '';
this.database = DatabaseAdapter.getDatabaseConnection(applicationId);
this.database = dbProvider.getDatabaseConnection(applicationId);
this.masterKey = cacheInfo.masterKey;
this.clientKey = cacheInfo.clientKey;
this.javascriptKey = cacheInfo.javascriptKey;
Expand Down
56 changes: 0 additions & 56 deletions DatabaseAdapter.js

This file was deleted.

29 changes: 0 additions & 29 deletions FilesAdapter.js

This file was deleted.

21 changes: 21 additions & 0 deletions classes/BaseProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
var ServiceProviderInterface = require('../interfaces/ServiceProvider');
var util = require('util');

function BaseProvider(adapter) {
this.adapter = adapter;
};

util.inherits(BaseProvider, ServiceProviderInterface);

function getAdapter() {
return this.adapter;
}

function setAdapter(adapter) {
this.adapter = adapter;
}

BaseProvider.prototype.getAdapter = getAdapter;
BaseProvider.prototype.setAdapter = setAdapter;

module.exports = BaseProvider;
61 changes: 61 additions & 0 deletions classes/DatabaseProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
var BaseProvider = require('./BaseProvider');
var util = require('util');
var cache = require('../cache');

// TODO: Make these instance variables?
var dbConnections = {};
var databaseURI = 'mongodb://localhost:27017/parse';
var appDatabaseURIs = {};

// Singleton for the entire server. TODO: Refactor away from singleton paradigm
var instance = null;

// Adapter is actually the adapter constructor.
// TODO: Refactor so that the provider doesn't have to implement these methods
// TODO: Instantiate the adapter if it's a constructor.
function DatabaseProvider(adapter) {
if (instance) {
return instance;
}

instance = this;

this.adapter = adapter;
};

util.inherits(DatabaseProvider, BaseProvider);

function setDatabaseURI(uri) {
databaseURI = uri;
};

function setAppDatabaseURI(appId, uri) {
appDatabaseURIs[appId] = uri;
}

function getDatabaseConnections() {
return dbConnections;
}

function getDatabaseConnection(appId) {
if (dbConnections[appId]) {
return dbConnections[appId];
}

var adapterClass = this.getAdapter();

var dbURI = (appDatabaseURIs[appId] ? appDatabaseURIs[appId] : databaseURI);
var adapter = new adapterClass(dbURI, {
collectionPrefix: cache.apps[appId]['collectionPrefix']
});
dbConnections[appId] = adapter;
dbConnections[appId].connect();
return dbConnections[appId];
}

DatabaseProvider.prototype.setDatabaseURI = setDatabaseURI;
DatabaseProvider.prototype.setAppDatabaseURI = setAppDatabaseURI;
DatabaseProvider.prototype.getDatabaseConnections = getDatabaseConnections;
DatabaseProvider.prototype.getDatabaseConnection = getDatabaseConnection;

module.exports = DatabaseProvider;
20 changes: 20 additions & 0 deletions classes/FilesProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
var BaseProvider = require('./BaseProvider');
var util = require('util');

// Singleton for the entire server. TODO: Refactor away from singleton paradigm
var instance = null;

// TODO: Instantiate the adapter if it's a constructor.
function FilesProvider(adapter) {
if (instance) {
return instance;
}

instance = this;

this.adapter = adapter;
};

util.inherits(FilesProvider, BaseProvider);

module.exports = FilesProvider;
16 changes: 12 additions & 4 deletions files.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
var bodyParser = require('body-parser'),
Config = require('./Config'),
express = require('express'),
FilesAdapter = require('./FilesAdapter'),
FilesProvider = require('./classes/FilesProvider'),
middlewares = require('./middlewares.js'),
mime = require('mime'),
Parse = require('parse/node').Parse,
Expand All @@ -12,6 +12,12 @@ var bodyParser = require('body-parser'),
var router = express.Router();

var processCreate = function(req, res, next) {
var FilesAdapter = (new FilesProvider()).getAdapter();

if (!FilesAdapter) {
throw new Error('Unable to get an instance of the FilesAdapter');
}

if (!req.body || !req.body.length) {
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
'Invalid file upload.'));
Expand Down Expand Up @@ -40,10 +46,10 @@ var processCreate = function(req, res, next) {
}

var filename = rack() + '_' + req.params.filename + extension;
FilesAdapter.getAdapter().create(req.config, filename, req.body)
FilesAdapter.create(req.config, filename, req.body)
.then(() => {
res.status(201);
var location = FilesAdapter.getAdapter().location(req.config, req, filename);
var location = FilesAdapter.location(req.config, req, filename);
res.set('Location', location);
res.json({ url: location, name: filename });
}).catch((error) => {
Expand All @@ -53,8 +59,10 @@ var processCreate = function(req, res, next) {
};

var processGet = function(req, res) {
var FilesAdapter = (new FilesProvider()).getAdapter();
var config = new Config(req.params.appId);
FilesAdapter.getAdapter().get(config, req.params.filename)

FilesAdapter.get(config, req.params.filename)
.then((data) => {
res.status(200);
var contentType = mime.lookup(req.params.filename);
Expand Down
23 changes: 14 additions & 9 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
var batch = require('./batch'),
bodyParser = require('body-parser'),
cache = require('./cache'),
DatabaseAdapter = require('./DatabaseAdapter'),
express = require('express'),
FilesAdapter = require('./FilesAdapter'),
S3Adapter = require('./S3Adapter'),
middlewares = require('./middlewares'),
multer = require('multer'),
Parse = require('parse/node').Parse,
PromiseRouter = require('./PromiseRouter'),
BaseProvider = require('./classes/BaseProvider'),
DatabaseProvider = require('./classes/DatabaseProvider'),
FilesProvider = require('./classes/FilesProvider'),
httpRequest = require('./httpRequest');

// Mutate the Parse object to add the Cloud Code handlers
Expand Down Expand Up @@ -38,20 +39,24 @@ addParseCloud();
// "dotNetKey": optional key from Parse dashboard
// "restAPIKey": optional key from Parse dashboard
// "javascriptKey": optional key from Parse dashboard
//

var DefaultDatabaseAdapter = require('./ExportAdapter');
var DefaultFilesAdapter = require('./GridStoreAdapter');

function ParseServer(args) {
if (!args.appId || !args.masterKey) {
throw 'You must provide an appId and masterKey!';
}

if (args.databaseAdapter) {
DatabaseAdapter.setAdapter(args.databaseAdapter);
}
if (args.filesAdapter) {
FilesAdapter.setAdapter(args.filesAdapter);
}
this.databaseProvider = new DatabaseProvider(args.databaseAdapter || DefaultDatabaseAdapter);
this.filesProvider = new FilesProvider(args.filesAdapter || DefaultFilesAdapter);

// TODO: Move this into the instantiation
if (args.databaseURI) {
DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI);
this.databaseProvider.setAppDatabaseURI(args.appId, args.databaseURI);
}

if (args.cloud) {
addParseCloud();
if (typeof args.cloud === 'function') {
Expand Down
12 changes: 12 additions & 0 deletions interfaces/ServiceProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
function ServiceProviderInterface() {
};

ServiceProviderInterface.prototype.getAdapter = function() {
throw new Error('A service provider must implement getAdapter!');
}

ServiceProviderInterface.prototype.setAdapter = function() {
throw new Error('A service provider must implement setAdapter!');
}

module.exports = ServiceProviderInterface;
5 changes: 3 additions & 2 deletions spec/ParseAPI.spec.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
// A bunch of different tests are in here - it isn't very thematic.
// It would probably be better to refactor them into different files.

var DatabaseAdapter = require('../DatabaseAdapter');
var DatabaseProvider = require('../classes/DatabaseProvider');
var request = require('request');
var dbProvider = new DatabaseProvider();

describe('miscellaneous', function() {
it('create a GameScore object', function(done) {
Expand Down Expand Up @@ -358,7 +359,7 @@ describe('miscellaneous', function() {
obj.set('foo', 'bar');
return obj.save();
}).then(() => {
var db = DatabaseAdapter.getDatabaseConnection(appId);
var db = dbProvider.getDatabaseConnection(appId);
return db.mongoFind('TestObject', {}, {});
}).then((results) => {
expect(results.length).toEqual(1);
Expand Down
4 changes: 2 additions & 2 deletions spec/ParseInstallation.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
var auth = require('../Auth');
var cache = require('../cache');
var Config = require('../Config');
var DatabaseAdapter = require('../DatabaseAdapter');
var DatabaseProvider = require('../classes/DatabaseProvider');
var Parse = require('parse/node').Parse;
var rest = require('../rest');

var config = new Config('test');
var database = DatabaseAdapter.getDatabaseConnection('test');
var database = (new DatabaseProvider()).getDatabaseConnection('test');

describe('Installations', () => {

Expand Down
4 changes: 2 additions & 2 deletions spec/RestCreate.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
var auth = require('../Auth');
var cache = require('../cache');
var Config = require('../Config');
var DatabaseAdapter = require('../DatabaseAdapter');
var DatabaseProvider = require('../classes/DatabaseProvider');
var Parse = require('parse/node').Parse;
var rest = require('../rest');
var request = require('request');

var config = new Config('test');
var database = DatabaseAdapter.getDatabaseConnection('test');
var database = (new DatabaseProvider()).getDatabaseConnection('test');

describe('rest create', () => {
it('handles _id', (done) => {
Expand Down
Loading