No need to transform post-transform keys in mongo adapter

This commit is contained in:
Drew Gross
2016-04-25 20:42:19 -07:00
parent e2a3213351
commit ee8a3c94d5
6 changed files with 51 additions and 69 deletions

View File

@@ -76,7 +76,7 @@ describe('Hooks', () => {
}) })
}); });
it("should CRUD a trigger registration", (done) => { it("should CRUD a trigger registration", (done) => {
// Create // Create
Parse.Hooks.createTrigger("MyClass","beforeDelete", "http://someurl").then((res) => { Parse.Hooks.createTrigger("MyClass","beforeDelete", "http://someurl").then((res) => {
expect(res.className).toBe("MyClass"); expect(res.className).toBe("MyClass");

View File

@@ -130,59 +130,52 @@ function transformKeyValue(schema, className, restKey, restValue, {
return {key: key, value: value}; return {key: key, value: value};
} }
function transformQueryKeyValue(schema, className, restKey, restValue, { validate } = {}) { const valueAsDate = value => {
if (typeof value === 'string') {
return new Date(value);
} else if (value instanceof Date) {
return value;
}
return false;
}
function transformQueryKeyValue(schema, className, key, value, { validate } = {}) {
// Check if the schema is known since it's a built-in field. // Check if the schema is known since it's a built-in field.
var key = restKey;
var timeField = false;
switch(key) { switch(key) {
case 'objectId':
case '_id':
key = '_id';
break;
case 'createdAt': case 'createdAt':
case '_created_at': if (valueAsDate(value)) {
return {key: '_created_at', value: valueAsDate(value)}
}
key = '_created_at'; key = '_created_at';
timeField = true;
break; break;
case 'updatedAt': case 'updatedAt':
case '_updated_at': if (valueAsDate(value)) {
return {key: '_updated_at', value: valueAsDate(value)}
}
key = '_updated_at'; key = '_updated_at';
timeField = true;
break;
case '_email_verify_token':
key = "_email_verify_token";
break;
case '_perishable_token':
key = "_perishable_token";
break;
case 'sessionToken':
case '_session_token':
key = '_session_token';
break; break;
case 'expiresAt': case 'expiresAt':
case '_expiresAt': if (valueAsDate(value)) {
key = 'expiresAt'; return {key: 'expiresAt', value: valueAsDate(value)}
timeField = true; }
break; break;
case 'objectId': return {key: '_id', value}
case 'sessionToken': return {key: '_session_token', value}
case '_rperm': case '_rperm':
case '_wperm': case '_wperm':
return {key: key, value: restValue}; case '_perishable_token':
break; case '_email_verify_token': return {key, value}
case '$or': case '$or':
if (!(restValue instanceof Array)) { if (!(value instanceof Array)) {
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $or format - use an array value'); throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $or format - use an array value');
} }
var mongoSubqueries = restValue.map((s) => { var mongoSubqueries = value.map(subQuery => transformWhere(schema, className, subQuery));
return transformWhere(schema, className, s);
});
return {key: '$or', value: mongoSubqueries}; return {key: '$or', value: mongoSubqueries};
case '$and': case '$and':
if (!(restValue instanceof Array)) { if (!(value instanceof Array)) {
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $and format - use an array value'); throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $and format - use an array value');
} }
var mongoSubqueries = restValue.map((s) => { var mongoSubqueries = value.map(subQuery => transformWhere(schema, className, subQuery));
return transformWhere(schema, className, s);
});
return {key: '$and', value: mongoSubqueries}; return {key: '$and', value: mongoSubqueries};
default: default:
// Other auth data // Other auth data
@@ -190,7 +183,7 @@ function transformQueryKeyValue(schema, className, restKey, restValue, { validat
if (authDataMatch ) { if (authDataMatch ) {
var provider = authDataMatch[1]; var provider = authDataMatch[1];
// Special-case auth data. // Special-case auth data.
return {key: '_auth_data_'+provider+'.id', value: restValue}; return {key: `_auth_data_${provider}.id`, value};
} }
if (validate && !key.match(/^[a-zA-Z][a-zA-Z0-9_\.]*$/)) { if (validate && !key.match(/^[a-zA-Z][a-zA-Z0-9_\.]*$/)) {
throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'invalid key name: ' + key); throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'invalid key name: ' + key);
@@ -205,46 +198,39 @@ function transformQueryKeyValue(schema, className, restKey, restValue, { validat
expected = schema.getExpectedType(className, key); expected = schema.getExpectedType(className, key);
} }
if ((expected && expected.type == 'Pointer') || if ((expected && expected.type == 'Pointer') ||
(!expected && restValue && restValue.__type == 'Pointer')) { (!expected && value && value.__type == 'Pointer')) {
key = '_p_' + key; key = '_p_' + key;
} }
var expectedTypeIsArray = (expected && expected.type === 'Array'); var expectedTypeIsArray = (expected && expected.type === 'Array');
// Handle query constraints // Handle query constraints
value = transformConstraint(restValue, expectedTypeIsArray); if (transformConstraint(value, expectedTypeIsArray) !== CannotTransform) {
if (value !== CannotTransform) { return {key, value: transformConstraint(value, expectedTypeIsArray)};
return {key: key, value: value};
} }
if (expectedTypeIsArray && !(restValue instanceof Array)) { if (expectedTypeIsArray && !(value instanceof Array)) {
return { return {key, value: { '$all' : [value] }};
key: key, value: { '$all' : [restValue] }
};
} }
// Handle atomic values // Handle atomic values
var value = transformAtom(restValue, false); if (transformAtom(value, false) !== CannotTransform) {
if (value !== CannotTransform) { return {key, value: transformAtom(value, false)};
if (timeField && (typeof value === 'string')) {
value = new Date(value);
}
return {key: key, value: value};
} }
// Handle arrays // Handle arrays
if (restValue instanceof Array) { if (value instanceof Array) {
throw new Parse.Error(Parse.Error.INVALID_JSON,'cannot use array as query param'); throw new Parse.Error(Parse.Error.INVALID_JSON, 'cannot use array as query param');
} }
// Handle normal objects by recursing // Handle normal objects by recursing
value = {}; let result = {};
for (var subRestKey in restValue) { for (var subRestKey in value) {
var subRestValue = restValue[subRestKey]; var subRestValue = value[subRestKey];
var out = transformKeyValue(schema, className, subRestKey, subRestValue, { inObject: true }); var out = transformKeyValue(schema, className, subRestKey, subRestValue, { inObject: true });
// For recursed objects, keep the keys in rest format // For recursed objects, keep the keys in rest format
value[subRestKey] = out.value; result[subRestKey] = out.value;
} }
return {key: key, value: value}; return {key, result};
} }
// Main exposed method to help run queries. // Main exposed method to help run queries.

View File

@@ -52,11 +52,7 @@ var getAuthForSessionToken = function({ config, sessionToken, installationId } =
limit: 1, limit: 1,
include: 'user' include: 'user'
}; };
var restWhere = { var query = new RestQuery(config, master(config), '_Session', { sessionToken }, restOptions);
_session_token: sessionToken
};
var query = new RestQuery(config, master(config), '_Session',
restWhere, restOptions);
return query.execute().then((response) => { return query.execute().then((response) => {
var results = response.results; var results = response.results;
if (results.length !== 1 || !results[0]['user']) { if (results.length !== 1 || !results[0]['user']) {

View File

@@ -1,12 +1,12 @@
// global_config.js // global_config.js
import PromiseRouter from '../PromiseRouter'; import PromiseRouter from '../PromiseRouter';
import * as middleware from "../middlewares"; import * as middleware from "../middlewares";
export class GlobalConfigRouter extends PromiseRouter { export class GlobalConfigRouter extends PromiseRouter {
getGlobalConfig(req) { getGlobalConfig(req) {
let database = req.config.database.WithoutValidation(); let database = req.config.database.WithoutValidation();
return database.find('_GlobalConfig', { '_id': 1 }, { limit: 1 }).then((results) => { return database.find('_GlobalConfig', { objectId: 1 }, { limit: 1 }).then((results) => {
if (results.length != 1) { if (results.length != 1) {
// If there is no config in the database - return empty config. // If there is no config in the database - return empty config.
return { response: { params: {} } }; return { response: { params: {} } };

View File

@@ -1,8 +1,8 @@
import ClassesRouter from './ClassesRouter'; import ClassesRouter from './ClassesRouter';
import PromiseRouter from '../PromiseRouter'; import PromiseRouter from '../PromiseRouter';
import rest from '../rest'; import rest from '../rest';
import Auth from '../Auth'; import Auth from '../Auth';
export class SessionsRouter extends ClassesRouter { export class SessionsRouter extends ClassesRouter {
handleFind(req) { handleFind(req) {
@@ -36,7 +36,7 @@ export class SessionsRouter extends ClassesRouter {
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,
'Session token required.'); 'Session token required.');
} }
return rest.find(req.config, Auth.master(req.config), '_Session', { _session_token: req.info.sessionToken }) return rest.find(req.config, Auth.master(req.config), '_Session', { sessionToken: req.info.sessionToken })
.then((response) => { .then((response) => {
if (!response.results || response.results.length == 0) { if (!response.results || response.results.length == 0) {
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,

View File

@@ -46,7 +46,7 @@ export class UsersRouter extends ClassesRouter {
} }
let sessionToken = req.info.sessionToken; let sessionToken = req.info.sessionToken;
return rest.find(req.config, Auth.master(req.config), '_Session', return rest.find(req.config, Auth.master(req.config), '_Session',
{ _session_token: sessionToken }, { sessionToken },
{ include: 'user' }) { include: 'user' })
.then((response) => { .then((response) => {
if (!response.results || if (!response.results ||
@@ -139,7 +139,7 @@ export class UsersRouter extends ClassesRouter {
let success = {response: {}}; let success = {response: {}};
if (req.info && req.info.sessionToken) { if (req.info && req.info.sessionToken) {
return rest.find(req.config, Auth.master(req.config), '_Session', return rest.find(req.config, Auth.master(req.config), '_Session',
{ _session_token: req.info.sessionToken } { sessionToken: req.info.sessionToken }
).then((records) => { ).then((records) => {
if (records.results && records.results.length) { if (records.results && records.results.length) {
return rest.del(req.config, Auth.master(req.config), '_Session', return rest.del(req.config, Auth.master(req.config), '_Session',