Skip to content

Commit ffeeb4f

Browse files
author
Alexander Mays
committed
Merged in the changes to DatabaseProvider and FilesProvider. Updated implementation of the said providers and added a ParseApp class. Needs to be documented.
Signed-off-by: Alexander Mays <maysale01@gmail.com>
1 parent df63ba1 commit ffeeb4f

13 files changed

+206
-121
lines changed

Config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// mount is the URL for the root of the API; includes http, domain, etc.
44
function Config(applicationId, mount) {
55
var cache = require('./classes/CacheProvider').getAdapter();
6-
var DatabaseAdapter = require('./DatabaseAdapter');
6+
var DatabaseProvider = require('./classes/DatabaseProvider');
77

88
var cacheInfo = cache.get(applicationId);
99
this.valid = !!cacheInfo;
@@ -13,7 +13,7 @@ function Config(applicationId, mount) {
1313

1414
this.applicationId = applicationId;
1515
this.collectionPrefix = cacheInfo.collectionPrefix || '';
16-
this.database = DatabaseAdapter.getDatabaseConnection(applicationId);
16+
this.database = DatabaseProvider.getDatabaseConnection(applicationId);
1717
this.masterKey = cacheInfo.masterKey;
1818
this.clientKey = cacheInfo.clientKey;
1919
this.javascriptKey = cacheInfo.javascriptKey;

DatabaseAdapter.js

Lines changed: 0 additions & 56 deletions
This file was deleted.

classes/BaseProvider.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,18 @@ function resolveAdapter(adapter, options) {
5555
return adapter;
5656
}
5757

58+
function setup (config) {
59+
config = config || {};
60+
config.adapter = config.adapter || DefaultFilesAdapter;
61+
62+
var adapter = this.resolveAdapter(config.adapter, config.options);
63+
this.setAdapter(adapter);
64+
}
65+
66+
5867
BaseProvider.prototype.getAdapter = getAdapter;
5968
BaseProvider.prototype.setAdapter = setAdapter;
6069
BaseProvider.prototype.resolveAdapter = resolveAdapter;
70+
BaseProvider.prototype.setup = setup;
6171

6272
exports = module.exports = BaseProvider;

classes/DatabaseProvider.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
var BaseProvider = require('./BaseProvider');
2+
var CacheProvider = require('./CacheProvider');
3+
var util = require('util');
4+
5+
var DefaultDatabaseAdapter = require('../ExportAdapter');
6+
var defaultURI = "mongodb://localhost:27017/parse";
7+
8+
function DatabaseProvider(adapter) {
9+
DatabaseProvider.super_.call(this)
10+
};
11+
12+
function setup(config) {
13+
config = config || {};
14+
config.adapter = config.adapter || DefaultDatabaseAdapter;
15+
this.dbConnections = config.dbConnections || this.dbConnections || {};
16+
this.databaseURI = config.defaultURI || defaultURI;
17+
this.appDatabaseURIs = config.appDatabaseURIs || {};
18+
19+
var adapter = this.resolveAdapter(config.adapter, config.options);
20+
this.setAdapter(adapter);
21+
}
22+
23+
// TODO: Reimplement this whenever @Flovilmart finishes running CloudCode in subprocesses
24+
function registerAppDatabaseURI(appId, uri) {
25+
this.appDatabaseURIs[appId] = uri;
26+
}
27+
28+
function getDatabaseConnections() {
29+
return this.dbConnections;
30+
}
31+
32+
function getDatabaseConnection(appId) {
33+
if (this.dbConnections[appId]) {
34+
return this.dbConnections[appId];
35+
}
36+
37+
var cache = CacheProvider.getAdapter();
38+
var app = cache.get(appId);
39+
40+
if (!app) {
41+
throw new Error('Application ID provided is not a registered application.');
42+
}
43+
44+
var adapterFn = this.getAdapter();
45+
var dbURI = this.appDatabaseURIs[appId] || this.databaseURI;
46+
var options = { collectionPrefix: app.collectionPrefix };
47+
48+
this.dbConnections[appId] = new adapterFn(dbURI, options);
49+
this.dbConnections[appId].connect();
50+
return this.dbConnections[appId];
51+
}
52+
53+
// Overriding resolveAdapter to return the class, rather than an instance
54+
function resolveAdapter(adapter, options) {
55+
// Support passing in adapter paths
56+
if (typeof adapter === 'string') {
57+
adapter = require(adapter);
58+
}
59+
60+
return adapter;
61+
}
62+
63+
util.inherits(DatabaseProvider, BaseProvider);
64+
65+
DatabaseProvider.prototype.setup = setup;
66+
DatabaseProvider.prototype.registerAppDatabaseURI = registerAppDatabaseURI;
67+
DatabaseProvider.prototype.getDatabaseConnections = getDatabaseConnections;
68+
DatabaseProvider.prototype.getDatabaseConnection = getDatabaseConnection;
69+
DatabaseProvider.prototype.resolveAdapter = resolveAdapter;
70+
DatabaseProvider.prototype.DatabaseProvider = DatabaseProvider;
71+
72+
exports = module.exports = new DatabaseProvider();

classes/FilesProvider.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var BaseProvider = require('./BaseProvider');
2+
var util = require('util');
3+
4+
var DefaultFilesAdapter = require('../GridStoreAdapter');
5+
6+
function FilesProvider(adapter) {
7+
FilesProvider.super_.call(this)
8+
};
9+
10+
function setup (config) {
11+
config = config || {};
12+
config.adapter = config.adapter || DefaultFilesAdapter;
13+
14+
var adapter = this.resolveAdapter(config.adapter, config.options);
15+
this.setAdapter(adapter);
16+
}
17+
18+
util.inherits(FilesProvider, BaseProvider);
19+
20+
FilesProvider.prototype.setup = setup;
21+
FilesProvider.prototype.FilesProvider = FilesProvider;
22+
23+
exports = module.exports = new FilesProvider();

classes/ParseApp.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
var DatabaseProvider = require('./DatabaseProvider');
2+
3+
function ParseApp(args) {
4+
if (!args.appId || !args.masterKey) {
5+
throw 'You must provide an appId and masterKey!';
6+
}
7+
8+
this.appId = args.appId;
9+
this.masterKey = args.masterKey;
10+
this.collectionPrefix = args.collectionPrefix || '';
11+
this.clientKey = args.clientKey || '';
12+
this.javascriptKey = args.javascriptKey || '';
13+
this.dotNetKey = args.dotNetKey || '';
14+
this.restAPIKey = args.restAPIKey || '';
15+
this.fileKey = args.fileKey || 'invalid-file-key';
16+
this.facebookAppIds = args.facebookAppIds || [];
17+
this.databaseURI = args.databaseURI;
18+
19+
// To maintain compatibility. TODO: Remove in v2.1
20+
if (process.env.FACEBOOK_APP_ID) {
21+
this['facebookAppIds'].push(process.env.FACEBOOK_APP_ID);
22+
}
23+
24+
// Register with the database provider if we have an app specific database URI
25+
if (this.databaseURI) {
26+
DatabaseProvider.registerAppDatabaseURI(this.appId, this.databaseURI);
27+
}
28+
}
29+
30+
exports = module.exports = ParseApp;

files.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@
33
var bodyParser = require('body-parser'),
44
Config = require('./Config'),
55
express = require('express'),
6-
FilesAdapter = require('./FilesAdapter'),
76
middlewares = require('./middlewares.js'),
87
mime = require('mime'),
98
Parse = require('parse/node').Parse,
109
rack = require('hat').rack();
1110

11+
var FilesProvider = require('./classes/FilesProvider');
1212
var router = express.Router();
1313

1414
var processCreate = function(req, res, next) {
15+
var FilesAdapter = FilesProvider.getAdapter();
16+
17+
if (!FilesAdapter) {
18+
throw new Error('Unable to get an instance of the FilesAdapter');
19+
}
20+
1521
if (!req.body || !req.body.length) {
1622
next(new Parse.Error(Parse.Error.FILE_SAVE_ERROR,
1723
'Invalid file upload.'));
@@ -40,10 +46,10 @@ var processCreate = function(req, res, next) {
4046
}
4147

4248
var filename = rack() + '_' + req.params.filename + extension;
43-
FilesAdapter.getAdapter().create(req.config, filename, req.body)
49+
FilesAdapter.create(req.config, filename, req.body)
4450
.then(() => {
4551
res.status(201);
46-
var location = FilesAdapter.getAdapter().location(req.config, req, filename);
52+
var location = FilesAdapter.location(req.config, req, filename);
4753
res.set('Location', location);
4854
res.json({ url: location, name: filename });
4955
}).catch((error) => {
@@ -53,8 +59,10 @@ var processCreate = function(req, res, next) {
5359
};
5460

5561
var processGet = function(req, res) {
62+
var FilesAdapter = FilesProvider.getAdapter();
5663
var config = new Config(req.params.appId);
57-
FilesAdapter.getAdapter().get(config, req.params.filename)
64+
65+
FilesAdapter.get(config, req.params.filename)
5866
.then((data) => {
5967
res.status(200);
6068
var contentType = mime.lookup(req.params.filename);

index.js

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
var batch = require('./batch'),
44
bodyParser = require('body-parser'),
5-
CacheProvider = require('./classes/CacheProvider'),
6-
DatabaseAdapter = require('./DatabaseAdapter'),
75
express = require('express'),
8-
FilesAdapter = require('./FilesAdapter'),
96
S3Adapter = require('./S3Adapter'),
107
middlewares = require('./middlewares'),
118
multer = require('multer'),
129
Parse = require('parse/node').Parse,
1310
PromiseRouter = require('./PromiseRouter'),
1411
httpRequest = require('./httpRequest');
1512

13+
var ParseApp = require('./classes/ParseApp');
14+
var CacheProvider = require('./classes/CacheProvider');
15+
var FilesProvider = require('./classes/FilesProvider');
16+
var DatabaseProvider = require('./classes/DatabaseProvider');
17+
1618
// Mutate the Parse object to add the Cloud Code handlers
1719
addParseCloud();
1820

@@ -40,53 +42,31 @@ addParseCloud();
4042
// "javascriptKey": optional key from Parse dashboard
4143

4244
function ParseServer(args) {
43-
if (!args.appId || !args.masterKey) {
44-
throw 'You must provide an appId and masterKey!';
45-
}
46-
4745
// Setup providers
4846
CacheProvider.setup(args.cache);
47+
FilesProvider.setup(args.files);
48+
DatabaseProvider.setup(args.database);
49+
50+
// Instantiate the app
51+
var app = new ParseApp(args.app);
4952

50-
if (args.databaseAdapter) {
51-
DatabaseAdapter.setAdapter(args.databaseAdapter);
52-
}
53-
if (args.filesAdapter) {
54-
FilesAdapter.setAdapter(args.filesAdapter);
55-
}
56-
if (args.databaseURI) {
57-
DatabaseAdapter.setAppDatabaseURI(args.appId, args.databaseURI);
58-
}
5953
if (args.cloud) {
54+
// Add the Parse.Cloud global function definitions
6055
addParseCloud();
61-
if (typeof args.cloud === 'function') {
62-
args.cloud(Parse)
63-
} else if (typeof args.cloud === 'string') {
64-
require(args.cloud);
56+
57+
// Load the cloud code entry point
58+
if (typeof args.cloud.entry === 'function') {
59+
args.cloud.entry(Parse)
60+
} else if (typeof args.cloud.entry === 'string') {
61+
require(args.cloud.entry);
6562
} else {
6663
throw new Error("argument 'cloud' must either be a string or a function");
6764
}
68-
69-
}
70-
71-
var appInfo = {
72-
masterKey: args.masterKey,
73-
collectionPrefix: args.collectionPrefix || '',
74-
clientKey: args.clientKey || '',
75-
javascriptKey: args.javascriptKey || '',
76-
dotNetKey: args.dotNetKey || '',
77-
restAPIKey: args.restAPIKey || '',
78-
fileKey: args.fileKey || 'invalid-file-key',
79-
facebookAppIds: args.facebookAppIds || []
80-
};
81-
82-
// To maintain compatibility. TODO: Remove in v2.1
83-
if (process.env.FACEBOOK_APP_ID) {
84-
appInfo['facebookAppIds'].push(process.env.FACEBOOK_APP_ID);
8565
}
8666

8767
// Cache the application information indefinitely
8868
var cache = CacheProvider.getAdapter();
89-
cache.put(args.appId, appInfo, Infinity);
69+
cache.put(app.appId, app, Infinity);
9070

9171
// Initialize the node client SDK automatically
9272
Parse.initialize(args.appId, args.javascriptKey || '', args.masterKey);

interfaces/ServiceProvider.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ ServiceProvider.prototype.resolveAdapter = function() {
3333
throw new Error('A service provider must implement resolveAdapter!');
3434
}
3535

36+
ServiceProvider.prototype.setup = function() {
37+
throw new Error('A service provider must implement setup!');
38+
}
39+
3640
exports = module.exports = ServiceProvider;

spec/ParseAPI.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// A bunch of different tests are in here - it isn't very thematic.
22
// It would probably be better to refactor them into different files.
33

4-
var DatabaseAdapter = require('../DatabaseAdapter');
4+
var DatabaseProvider = require('../classes/DatabaseProvider');
55
var request = require('request');
66

77
describe('miscellaneous', function() {
@@ -358,7 +358,7 @@ describe('miscellaneous', function() {
358358
obj.set('foo', 'bar');
359359
return obj.save();
360360
}).then(() => {
361-
var db = DatabaseAdapter.getDatabaseConnection(appId);
361+
var db = DatabaseProvider.getDatabaseConnection(appId);
362362
return db.mongoFind('TestObject', {}, {});
363363
}).then((results) => {
364364
expect(results.length).toEqual(1);

0 commit comments

Comments
 (0)