Skip to content

Style improvements #2475

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

Merged
merged 10 commits into from
Aug 8, 2016
61 changes: 61 additions & 0 deletions spec/Analytics.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
const analyticsAdapter = {
appOpened: function(parameters, req) {},
trackEvent: function(eventName, parameters, req) {}
}

describe('AnalyticsController', () => {
it('should track a simple event', (done) => {

spyOn(analyticsAdapter, 'trackEvent').and.callThrough();
reconfigureServer({
analyticsAdapter
}).then(() => {
return Parse.Analytics.track('MyEvent', {
key: 'value',
count: '0'
})
}).then(() => {
expect(analyticsAdapter.trackEvent).toHaveBeenCalled();
var lastCall = analyticsAdapter.trackEvent.calls.first();
let args = lastCall.args;
expect(args[0]).toEqual('MyEvent');
expect(args[1]).toEqual({
dimensions: {
key: 'value',
count: '0'
}
});
done();
}, (err) => {
fail(JSON.stringify(err));
done();
})
});

it('should track a app opened event', (done) => {

spyOn(analyticsAdapter, 'appOpened').and.callThrough();
reconfigureServer({
analyticsAdapter
}).then(() => {
return Parse.Analytics.track('AppOpened', {
key: 'value',
count: '0'
})
}).then(() => {
expect(analyticsAdapter.appOpened).toHaveBeenCalled();
var lastCall = analyticsAdapter.appOpened.calls.first();
let args = lastCall.args;
expect(args[0]).toEqual({
dimensions: {
key: 'value',
count: '0'
}
});
done();
}, (err) => {
fail(JSON.stringify(err));
done();
})
})
})
3 changes: 1 addition & 2 deletions spec/ParseAPI.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
// It would probably be better to refactor them into different files.
'use strict';

var DatabaseAdapter = require('../src/DatabaseAdapter');
const MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAdapter');
var request = require('request');
const rp = require('request-promise');
const Parse = require("parse/node");
let Config = require('../src/Config');
const SchemaController = require('../src/Controllers/SchemaController');
var TestUtils = require('../src/index').TestUtils;
var TestUtils = require('../src/TestUtils');
const deepcopy = require('deepcopy');

const userSchema = SchemaController.convertSchemaToAdapterSchema({ className: '_User', fields: Object.assign({}, SchemaController.defaultColumns._Default, SchemaController.defaultColumns._User) });
Expand Down
4 changes: 2 additions & 2 deletions spec/helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
jasmine.DEFAULT_TIMEOUT_INTERVAL = process.env.PARSE_SERVER_TEST_TIMEOUT || 5000;

var cache = require('../src/cache').default;
var DatabaseAdapter = require('../src/DatabaseAdapter');
var express = require('express');
var facebook = require('../src/authDataManager/facebook');
var ParseServer = require('../src/index').ParseServer;
var path = require('path');
var TestUtils = require('../src/index').TestUtils;
var TestUtils = require('../src/TestUtils');
var MongoStorageAdapter = require('../src/Adapters/Storage/Mongo/MongoStorageAdapter');
const GridStoreAdapter = require('../src/Adapters/Files/GridStoreAdapter').GridStoreAdapter;
const PostgresStorageAdapter = require('../src/Adapters/Storage/Postgres/PostgresStorageAdapter');
Expand Down Expand Up @@ -87,6 +86,7 @@ const reconfigureServer = changedConfiguration => {
cache.clear();
app = express();
api = new ParseServer(newConfiguration);
api.use(require('./testing-routes').router);
app.use('/1', api);

server = app.listen(port);
Expand Down
8 changes: 4 additions & 4 deletions src/testing-routes.js → spec/testing-routes.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// testing-routes.js
import AppCache from './cache';
import * as middlewares from './middlewares';
import { ParseServer } from './index';
import AppCache from '../src/cache';
import * as middlewares from '../src/middlewares';
import { ParseServer } from '../src/index';
import { Parse } from 'parse/node';

var express = require('express'),
cryptoUtils = require('./cryptoUtils');
cryptoUtils = require('../src/cryptoUtils');

var router = express.Router();

Expand Down
12 changes: 11 additions & 1 deletion src/Adapters/Analytics/AnalyticsAdapter.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
export class AnalyticsAdapter {

/*
@param parameters: the analytics request body, analytics info will be in the dimensions property
@param req: the original http request
*/
appOpened(parameters, req) {
return Promise.resolve({});
}


/*
@param eventName: the name of the custom eventName
@param parameters: the analytics request body, analytics info will be in the dimensions property
@param req: the original http request
*/
trackEvent(eventName, parameters, req) {
return Promise.resolve({});
}
Expand Down
26 changes: 14 additions & 12 deletions src/Controllers/AnalyticsController.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,23 @@ import { AnalyticsAdapter } from '../Adapters/Analytics/AnalyticsAdapter';

export class AnalyticsController extends AdaptableController {
appOpened(req) {
return this.adapter.appOpened(req.body, req).then(
function(response) {
return { response: response };
}).catch((err) => {
return { response: {} };
});
return Promise.resolve().then(() => {
return this.adapter.appOpened(req.body, req);
}).then((response) => {
return { response: response || {} };
}).catch((err) => {
return { response: {} };
});
}

trackEvent(req) {
return this.adapter.trackEvent(req.params.eventName, req.body, req).then(
function(response) {
return { response: response };
}).catch((err) => {
return { response: {} };
});
return Promise.resolve().then(() => {
return this.adapter.trackEvent(req.params.eventName, req.body, req);
}).then((response) => {
return { response: response || {} };
}).catch((err) => {
return { response: {} };
});
}

expectedAdapterType() {
Expand Down
38 changes: 29 additions & 9 deletions src/Controllers/DatabaseController.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
// A database adapter that works with data exported from the hosted
// Parse database.

import intersect from 'intersect';
import _ from 'lodash';

var mongodb = require('mongodb');
var Parse = require('parse/node').Parse;

var SchemaController = require('./SchemaController');

const deepcopy = require('deepcopy');
import { Parse } from 'parse/node';
import _ from 'lodash';
import mongdb from 'mongodb';
import intersect from 'intersect';
import deepcopy from 'deepcopy';
import logger from '../logger';
import * as SchemaController from './SchemaController';

function addWriteACL(query, acl) {
let newQuery = _.cloneDeep(query);
Expand Down Expand Up @@ -876,6 +874,28 @@ DatabaseController.prototype.addPointerPermissions = function(schema, className,
}
}

DatabaseController.prototype.performInitizalization = function() {
const requiredUserFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._User } };

let userClassPromise = this.loadSchema()
.then(schema => schema.enforceClassExists('_User'))

let usernameUniqueness = userClassPromise
.then(() => this.adapter.ensureUniqueness('_User', requiredUserFields, ['username']))
.catch(error => {
logger.warn('Unable to ensure uniqueness for usernames: ', error);
return Promise.reject(error);
});

let emailUniqueness = userClassPromise
.then(() => this.adapter.ensureUniqueness('_User', requiredUserFields, ['email']))
.catch(error => {
logger.warn('Unable to ensure uniqueness for user email addresses: ', error);
return Promise.reject(error);
});
return Promise.all([usernameUniqueness, emailUniqueness]);
}

function joinTableName(className, key) {
return `_Join:${key}:${className}`;
}
Expand Down
1 change: 0 additions & 1 deletion src/Controllers/HooksController.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
/** @flow weak */

import * as DatabaseAdapter from "../DatabaseAdapter";
import * as triggers from "../triggers";
import * as Parse from "parse/node";
import * as request from "request";
Expand Down
2 changes: 1 addition & 1 deletion src/Controllers/SchemaController.js
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ const dbTypeMatchesObjectType = (dbType, objectType) => {

// Stores the entire schema of the app in a weird hybrid format somewhere between
// the mongo format and the Parse format. Soon, this will all be Parse format.
class SchemaController {
export default class SchemaController {
_dbAdapter;
data;
perms;
Expand Down
1 change: 0 additions & 1 deletion src/Controllers/UserController.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import AdaptableController from './AdaptableController';
import MailAdapter from '../Adapters/Email/MailAdapter';
import rest from '../rest';

var DatabaseAdapter = require('../DatabaseAdapter');
var RestWrite = require('../RestWrite');
var RestQuery = require('../RestQuery');
var hash = require('../password').hash;
Expand Down
21 changes: 0 additions & 21 deletions src/DatabaseAdapter.js

This file was deleted.

47 changes: 9 additions & 38 deletions src/ParseServer.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

var batch = require('./batch'),
bodyParser = require('body-parser'),
DatabaseAdapter = require('./DatabaseAdapter'),
express = require('express'),
middlewares = require('./middlewares'),
multer = require('multer'),
Expand Down Expand Up @@ -56,16 +55,11 @@ import { PurgeRouter } from './Routers/PurgeRouter';

import DatabaseController from './Controllers/DatabaseController';
import SchemaCache from './Controllers/SchemaCache';
const SchemaController = require('./Controllers/SchemaController');
import ParsePushAdapter from 'parse-server-push-adapter';
import MongoStorageAdapter from './Adapters/Storage/Mongo/MongoStorageAdapter';
// Mutate the Parse object to add the Cloud Code handlers
addParseCloud();


const requiredUserFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._User } };


// ParseServer works like a constructor of an express app.
// The args that we understand are:
// "analyticsAdapter": an adapter class for analytics
Expand Down Expand Up @@ -205,22 +199,7 @@ class ParseServer {

// TODO: create indexes on first creation of a _User object. Otherwise it's impossible to
// have a Parse app without it having a _User collection.
let userClassPromise = databaseController.loadSchema()
.then(schema => schema.enforceClassExists('_User'))

let usernameUniqueness = userClassPromise
.then(() => databaseController.adapter.ensureUniqueness('_User', requiredUserFields, ['username']))
.catch(error => {
logger.warn('Unable to ensure uniqueness for usernames: ', error);
return Promise.reject(error);
});

let emailUniqueness = userClassPromise
.then(() => databaseController.adapter.ensureUniqueness('_User', requiredUserFields, ['email']))
.catch(error => {
logger.warn('Unable to ensure uniqueness for user email addresses: ', error);
return Promise.reject(error);
})
const dbInitPromise = databaseController.performInitizalization();

AppCache.put(appId, {
appId,
Expand Down Expand Up @@ -270,7 +249,7 @@ class ParseServer {

// Note: Tests will start to fail if any validation happens after this is called.
if (process.env.TESTING) {
__indexBuildCompletionCallbackForTests(Promise.all([usernameUniqueness, emailUniqueness]));
__indexBuildCompletionCallbackForTests(dbInitPromise);
}
}

Expand All @@ -284,21 +263,14 @@ class ParseServer {
var api = express();
//api.use("/apps", express.static(__dirname + "/public"));
// File handling needs to be before default middlewares are applied
api.use('/', middlewares.allowCrossDomain, new FilesRouter().getExpressRouter({
api.use('/', middlewares.allowCrossDomain, new FilesRouter().expressRouter({
maxUploadSize: maxUploadSize
}));

api.use('/', bodyParser.urlencoded({extended: false}), new PublicAPIRouter().expressApp());

// TODO: separate this from the regular ParseServer object
if (process.env.TESTING == 1) {
api.use('/', require('./testing-routes').router);
}
api.use('/', bodyParser.urlencoded({extended: false}), new PublicAPIRouter().expressRouter());

api.use(bodyParser.json({ 'type': '*/*' , limit: maxUploadSize }));
api.use(middlewares.allowCrossDomain);
api.use(middlewares.allowMethodOverride);
api.use(middlewares.handleParseHeaders);

let routers = [
new ClassesRouter(),
Expand All @@ -315,21 +287,20 @@ class ParseServer {
new FeaturesRouter(),
new GlobalConfigRouter(),
new PurgeRouter(),
new HooksRouter()
];

if (process.env.PARSE_EXPERIMENTAL_HOOKS_ENABLED || process.env.TESTING) {
routers.push(new HooksRouter());
}

let routes = routers.reduce((memo, router) => {
return memo.concat(router.routes);
}, []);

let appRouter = new PromiseRouter(routes, appId);

appRouter.use(middlewares.allowCrossDomain);
appRouter.use(middlewares.handleParseHeaders);

batch.mountOnto(appRouter);

api.use(appRouter.expressApp());
api.use(appRouter.expressRouter());

api.use(middlewares.handleParseErrors);

Expand Down
Loading