parse-server
Advanced tools
Comparing version 1.0.16 to 2.0.0
181
index.js
@@ -1,10 +0,173 @@ | ||
var rebuildAndStart = require('./rebuildAndStart') | ||
var rebuild = require('./rebuild') | ||
var start = require('./start') | ||
var getConfig = require('./getConfig') | ||
// ParseServer - open-source compatible API Server for Parse apps | ||
var batch = require('./batch'), | ||
bodyParser = require('body-parser'), | ||
cache = require('./cache'), | ||
DatabaseAdapter = require('./DatabaseAdapter'), | ||
express = require('express'), | ||
FilesAdapter = require('./FilesAdapter'), | ||
middlewares = require('./middlewares'), | ||
multer = require('multer'), | ||
Parse = require('parse/node').Parse, | ||
PromiseRouter = require('./PromiseRouter'), | ||
request = require('request'); | ||
// Mutate the Parse object to add the Cloud Code handlers | ||
addParseCloud(); | ||
// ParseServer works like a constructor of an express app. | ||
// The args that we understand are: | ||
// "databaseAdapter": a class like ExportAdapter providing create, find, | ||
// update, and delete | ||
// "filesAdapter": a class like GridStoreAdapter providing create, get, | ||
// and delete | ||
// "databaseURI": a uri like mongodb://localhost:27017/dbname to tell us | ||
// what database this Parse API connects to. | ||
// "cloud": relative location to cloud code to require | ||
// "appId": the application id to host | ||
// "masterKey": the master key for requests to this app | ||
// "collectionPrefix": optional prefix for database collection names | ||
// "fileKey": optional key from Parse dashboard for supporting older files | ||
// hosted by Parse | ||
// "clientKey": optional key from Parse dashboard | ||
// "dotNetKey": optional key from Parse dashboard | ||
// "restAPIKey": optional key from Parse dashboard | ||
// "javascriptKey": optional key from Parse dashboard | ||
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); | ||
} | ||
if (args.databaseURI) { | ||
DatabaseAdapter.setDatabaseURI(args.databaseURI); | ||
} | ||
if (args.cloud) { | ||
addParseCloud(); | ||
require(args.cloud); | ||
} | ||
cache.apps[args.appId] = { | ||
masterKey: args.masterKey, | ||
collectionPrefix: args.collectionPrefix || '', | ||
clientKey: args.clientKey || '', | ||
javascriptKey: args.javascriptKey || '', | ||
dotNetKey: args.dotNetKey || '', | ||
restAPIKey: args.restAPIKey || '', | ||
fileKey: args.fileKey || 'invalid-file-key' | ||
}; | ||
// Initialize the node client SDK automatically | ||
Parse.initialize(args.appId, args.javascriptKey || '', args.masterKey); | ||
// This app serves the Parse API directly. | ||
// It's the equivalent of https://api.parse.com/1 in the hosted Parse API. | ||
var api = express(); | ||
// File handling needs to be before default middlewares are applied | ||
api.use('/', require('./files').router); | ||
// TODO: separate this from the regular ParseServer object | ||
if (process.env.TESTING == 1) { | ||
console.log('enabling integration testing-routes'); | ||
api.use('/', require('./testing-routes').router); | ||
} | ||
api.use(bodyParser.json({ 'type': '*/*' })); | ||
api.use(middlewares.allowCrossDomain); | ||
api.use(middlewares.allowMethodOverride); | ||
api.use(middlewares.handleParseHeaders); | ||
var router = new PromiseRouter(); | ||
router.merge(require('./classes')); | ||
router.merge(require('./users')); | ||
router.merge(require('./sessions')); | ||
router.merge(require('./roles')); | ||
router.merge(require('./analytics')); | ||
router.merge(require('./push')); | ||
router.merge(require('./installations')); | ||
router.merge(require('./functions')); | ||
batch.mountOnto(router); | ||
router.mountOnto(api); | ||
api.use(middlewares.handleParseErrors); | ||
return api; | ||
} | ||
function addParseCloud() { | ||
Parse.Cloud.Functions = {}; | ||
Parse.Cloud.Triggers = { | ||
beforeSave: {}, | ||
beforeDelete: {}, | ||
afterSave: {}, | ||
afterDelete: {} | ||
}; | ||
Parse.Cloud.define = function(functionName, handler) { | ||
Parse.Cloud.Functions[functionName] = handler; | ||
}; | ||
Parse.Cloud.beforeSave = function(parseClass, handler) { | ||
var className = getClassName(parseClass); | ||
Parse.Cloud.Triggers.beforeSave[className] = handler; | ||
}; | ||
Parse.Cloud.beforeDelete = function(parseClass, handler) { | ||
var className = getClassName(parseClass); | ||
Parse.Cloud.Triggers.beforeDelete[className] = handler; | ||
}; | ||
Parse.Cloud.afterSave = function(parseClass, handler) { | ||
var className = getClassName(parseClass); | ||
Parse.Cloud.Triggers.afterSave[className] = handler; | ||
}; | ||
Parse.Cloud.afterDelete = function(parseClass, handler) { | ||
var className = getClassName(parseClass); | ||
Parse.Cloud.Triggers.afterDelete[className] = handler; | ||
}; | ||
Parse.Cloud.httpRequest = function(options) { | ||
var promise = new Parse.Promise(); | ||
var callbacks = { | ||
success: options.success, | ||
error: options.error | ||
}; | ||
delete options.success; | ||
delete options.error; | ||
if (options.uri && !options.url) { | ||
options.uri = options.url; | ||
delete options.url; | ||
} | ||
request(options, (error, response, body) => { | ||
if (error) { | ||
if (callbacks.error) { | ||
return callbacks.error(error); | ||
} | ||
return promise.reject(error); | ||
} else { | ||
if (callbacks.success) { | ||
return callbacks.success(body); | ||
} | ||
return promise.resolve(body); | ||
} | ||
}); | ||
return promise; | ||
}; | ||
global.Parse = Parse; | ||
} | ||
function getClassName(parseClass) { | ||
if (parseClass && parseClass.className) { | ||
return parseClass.className; | ||
} | ||
return parseClass; | ||
} | ||
module.exports = { | ||
rebuildAndStart: rebuildAndStart, | ||
rebuild: rebuild, | ||
getConfig: getConfig, | ||
start: start | ||
} | ||
ParseServer: ParseServer | ||
}; | ||
{ | ||
"name": "parse-server", | ||
"version": "1.0.16", | ||
"description": "Server boilerplate for supplier specific parsing both scraped and raw", | ||
"version": "2.0.0", | ||
"description": "An express module providing a Parse-compatible API server", | ||
"main": "index.js", | ||
"directories": { | ||
"test": "test" | ||
}, | ||
"scripts": { | ||
"test": "make test" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "''" | ||
"url": "https://github.com/ParsePlatform/parse-server" | ||
}, | ||
"keywords": [ | ||
"docparse" | ||
], | ||
"author": "Noah Isaacson", | ||
"license": "BSD", | ||
"gitHead": "44011080b99310a19c6b40fbf53e9a61411ea0d3", | ||
"dependencies": { | ||
"eyespect": "~0.1.8", | ||
"should": "~1.2.2", | ||
"optimist": "~0.3.5", | ||
"nconf": "~0.6.7", | ||
"winston": "~0.6.2", | ||
"winston-loggly": "~0.6.0", | ||
"cradle": "~0.6.4", | ||
"passport": "~0.1.16", | ||
"required-keys": "~1.0.4", | ||
"api-auth": "~1.0.4", | ||
"api-middleware": "~1.0.6", | ||
"express": "~3.1.0", | ||
"seaport": "~1.4.0" | ||
"bcrypt": "~0.8", | ||
"body-parser": "~1.12.4", | ||
"deepcopy": "^0.5.0", | ||
"express": "~4.2.x", | ||
"hat": "~0.0.3", | ||
"mime": "^1.3.4", | ||
"mongodb": "~2.0.33", | ||
"multer": "~0.1.8", | ||
"parse": "~1.6.12", | ||
"request": "^2.65.0" | ||
}, | ||
"devDependencies": { | ||
"mocha": "git://github.com/nisaacson/mocha.git", | ||
"request": "~2.16.2", | ||
"create-test-users": "~1.0.1" | ||
"jasmine": "^2.3.2" | ||
}, | ||
"scripts": { | ||
"test": "TESTING=1 jasmine" | ||
} | ||
} |
@@ -1,14 +0,84 @@ | ||
Parse Server boilerplate for supplier specific parsing modules both raw and scraped | ||
## parse-server | ||
# Usage | ||
See *example/devRebuildAndStart* for a complete example of spinning up a server. Execute this file with the command | ||
A Parse.com API compatible router package for Express | ||
--- | ||
#### Basic options: | ||
* databaseURI (required) - The connection string for your database, i.e. `mongodb://user:pass@host.com/dbname` | ||
* appId (required) - The application id to host with this server instance | ||
* masterKey (required) - The master key to use for overriding ACL security | ||
* cloud - The absolute path to your cloud code main.js file | ||
* fileKey - For migrated apps, this is necessary to provide access to files already hosted on Parse. | ||
#### Client key options: | ||
The client keys used with Parse are no longer necessary with parse-server. If you wish to still require them, perhaps to be able to refuse access to older clients, you can set the keys at intialization time. Setting any of these keys will require all requests to provide one of the configured keys. | ||
* clientKey | ||
* javascriptKey | ||
* restAPIKey | ||
* dotNetKey | ||
#### Advanced options: | ||
* filesAdapter - The default behavior (GridStore) can be changed by creating an adapter class (see `FilesAdapter.js`) | ||
* databaseAdapter (unfinished) - The backing store can be changed by creating an adapter class (see `DatabaseAdapter.js`) | ||
--- | ||
### Usage | ||
You can create an instance of ParseServer, and mount it on a new or existing Express website: | ||
``` | ||
cd <project root> | ||
node example/devRebuildAndStart.js --config test/config.json --role fooRole | ||
var express = require('express'); | ||
var ParseServer = require('parse-server').ParseServer; | ||
var app = express(); | ||
// Specify the connection string for your mongodb database | ||
// and the location to your Parse cloud code | ||
var api = new ParseServer({ | ||
databaseURI: 'mongodb://localhost:27017/dev', | ||
cloud: '/home/myApp/cloud/main.js', // Provide an absolute path | ||
appId: 'myAppId', | ||
masterKey: 'mySecretMasterKey', | ||
fileKey: 'optionalFileKey' | ||
}); | ||
// Serve the Parse API on the /parse URL prefix | ||
app.use('/parse', api); | ||
// Hello world | ||
app.get('/', function(req, res) { | ||
res.status(200).send('Express is running here.'); | ||
}); | ||
var port = process.env.PORT || 1337; | ||
app.listen(port, function() { | ||
console.log('parse-server-example running on port ' + port + '.'); | ||
}); | ||
``` | ||
# Installation | ||
```bash | ||
npm install parse-server | ||
``` | ||
### Supported | ||
* CRUD operations | ||
* Schema validation | ||
* Pointers | ||
* Users, including Facebook login and anonymous users | ||
* Files | ||
* Installations | ||
* Sessions | ||
* Geopoints | ||
* Roles | ||
* Class-level Permissions (see below) | ||
Parse server does not include a web-based dashboard, which is where class-level permissions have always been configured. If you migrate an app from Parse, you'll see the format for CLPs in the SCHEMA collection. There is also a `setPermissions` method on the `Schema` class, which you can see used in the unit-tests in `Schema.spec.js` | ||
You can also set up an app on Parse, providing the connection string for your mongo database, and continue to use the dashboard on Parse.com. | ||
### Not supported | ||
* Push - We did not rebuild a new push delivery system for parse-server, but we are open to working on one together with the community. |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 4 instances in 1 package
No contributors or author data
MaintenancePackage does not specify a list of contributors or an author in package.json.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
462485
10
1
53
13528
84
2
5
3
+ Addedbcrypt@~0.8
+ Addedbody-parser@~1.12.4
+ Addeddeepcopy@^0.5.0
+ Addedhat@~0.0.3
+ Addedmime@^1.3.4
+ Addedmongodb@~2.0.33
+ Addedmulter@~0.1.8
+ Addedparse@~1.6.12
+ Addedrequest@^2.65.0
+ Addedaccepts@1.0.1(transitive)
+ Addedbabel-runtime@5.8.38(transitive)
+ Addedbcrypt@0.8.7(transitive)
+ Addedbindings@1.2.1(transitive)
+ Addedbody-parser@1.12.4(transitive)
+ Addedbson@0.4.23(transitive)
+ Addedbuffer-crc32@0.2.1(transitive)
+ Addedbusboy@0.2.14(transitive)
+ Addedbytes@1.0.02.1.0(transitive)
+ Addedcontent-type@1.0.5(transitive)
+ Addedcookie@0.1.2(transitive)
+ Addedcookie-signature@1.0.3(transitive)
+ Addedcore-js@1.2.7(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addeddebug@0.8.00.8.12.2.0(transitive)
+ Addeddeepcopy@0.5.0(transitive)
+ Addeddepd@1.0.1(transitive)
+ Addeddicer@0.2.5(transitive)
+ Addedee-first@1.1.0(transitive)
+ Addedes6-promise@2.1.1(transitive)
+ Addedescape-html@1.0.1(transitive)
+ Addedexpress@4.2.0(transitive)
+ Addedfresh@0.2.2(transitive)
+ Addedhat@0.0.3(transitive)
+ Addediconv-lite@0.4.8(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedisarray@0.0.1(transitive)
+ Addedkerberos@0.0.24(transitive)
+ Addedmedia-typer@0.3.0(transitive)
+ Addedmerge-descriptors@0.0.2(transitive)
+ Addedmethods@1.0.0(transitive)
+ Addedmime@1.2.111.6.0(transitive)
+ Addedmime-db@1.12.0(transitive)
+ Addedmime-types@2.0.14(transitive)
+ Addedmongodb@2.0.55(transitive)
+ Addedmongodb-core@1.2.31(transitive)
+ Addedms@0.7.1(transitive)
+ Addedmulter@0.1.8(transitive)
+ Addednan@2.10.02.3.5(transitive)
+ Addednegotiator@0.4.9(transitive)
+ Addedon-finished@2.2.1(transitive)
+ Addedparse@1.6.14(transitive)
+ Addedparseurl@1.0.1(transitive)
+ Addedpath-to-regexp@0.1.2(transitive)
+ Addedqs@0.6.61.2.22.4.2(transitive)
+ Addedrange-parser@1.0.0(transitive)
+ Addedraw-body@2.0.2(transitive)
+ Addedreadable-stream@1.0.311.1.14(transitive)
+ Addedsend@0.3.0(transitive)
+ Addedserve-static@1.1.0(transitive)
+ Addedstreamsearch@0.1.2(transitive)
+ Addedstring_decoder@0.10.31(transitive)
+ Addedtype-is@1.1.01.5.71.6.18(transitive)
+ Addedutils-merge@1.0.0(transitive)
+ Addedxmlhttprequest@1.8.0(transitive)
- Removedapi-auth@~1.0.4
- Removedapi-middleware@~1.0.6
- Removedcradle@~0.6.4
- Removedeyespect@~0.1.8
- Removednconf@~0.6.7
- Removedoptimist@~0.3.5
- Removedpassport@~0.1.16
- Removedrequired-keys@~1.0.4
- Removedseaport@~1.4.0
- Removedshould@~1.2.2
- Removedwinston@~0.6.2
- Removedwinston-loggly@~0.6.0
- Removedapi-auth@1.0.4(transitive)
- Removedapi-middleware@1.0.6(transitive)
- Removedasync@0.1.220.2.9(transitive)
- Removedbetween@0.1.3(transitive)
- Removedbrowser-request@0.3.3(transitive)
- Removedbuffer-crc32@0.1.10.2.13(transitive)
- Removedbytes@0.2.0(transitive)
- Removedcolors@0.6.2(transitive)
- Removedcommander@0.6.1(transitive)
- Removedconnect@2.7.5(transitive)
- Removedcookie@0.0.5(transitive)
- Removedcookie-signature@1.0.0(transitive)
- Removedcouch-profile@1.0.16(transitive)
- Removedcradle@0.6.9(transitive)
- Removedcrdt@3.4.2(transitive)
- Removedcycle@1.0.3(transitive)
- Removeddebug@0.7.44.4.0(transitive)
- Removedduplex@1.0.0(transitive)
- Removedexpress@3.1.2(transitive)
- Removedeyes@0.1.8(transitive)
- Removedeyespect@0.1.10(transitive)
- Removedfollow@0.11.4(transitive)
- Removedformidable@1.0.11(transitive)
- Removedfresh@0.1.0(transitive)
- Removedinherits@1.0.2(transitive)
- Removedini@1.3.8(transitive)
- Removediterate@0.1.0(transitive)
- Removedloggly@0.3.11(transitive)
- Removedmethods@0.0.1(transitive)
- Removedmime@1.2.6(transitive)
- Removedminimist@0.0.10(transitive)
- Removedmonotonic-timestamp@0.0.9(transitive)
- Removedms@2.1.3(transitive)
- Removednconf@0.6.9(transitive)
- Removedoptimist@0.3.70.6.0(transitive)
- Removedpassport@0.1.18(transitive)
- Removedpassport-http@0.2.2(transitive)
- Removedpause@0.0.1(transitive)
- Removedpkginfo@0.2.3(transitive)
- Removedqs@0.5.1(transitive)
- Removedrange-parser@0.0.4(transitive)
- Removedrequest@2.9.203(transitive)
- Removedrequired-keys@1.0.5(transitive)
- Removedscuttlebutt@5.5.20(transitive)
- Removedseaport@1.4.1(transitive)
- Removedsemver@1.1.4(transitive)
- Removedsend@0.1.0(transitive)
- Removedshould@1.2.2(transitive)
- Removedstack-trace@0.0.10(transitive)
- Removedstream-serializer@1.0.0(transitive)
- Removedthrough@1.1.2(transitive)
- Removedtimespan@2.3.0(transitive)
- Removedvargs@0.1.0(transitive)
- Removedwinston@0.6.2(transitive)
- Removedwinston-loggly@0.6.0(transitive)
- Removedwordwrap@0.0.3(transitive)
Updatedexpress@~4.2.x