Skip to content

Commit ee8a3c9

Browse files
committed
No need to transform post-transform keys in mongo adapter
1 parent e2a3213 commit ee8a3c9

File tree

6 files changed

+51
-69
lines changed

6 files changed

+51
-69
lines changed

spec/ParseHooks.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ describe('Hooks', () => {
7676
})
7777
});
7878

79-
it("should CRUD a trigger registration", (done) => {
79+
it("should CRUD a trigger registration", (done) => {
8080
// Create
8181
Parse.Hooks.createTrigger("MyClass","beforeDelete", "http://someurl").then((res) => {
8282
expect(res.className).toBe("MyClass");

src/Adapters/Storage/Mongo/MongoTransform.js

Lines changed: 42 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -130,67 +130,60 @@ function transformKeyValue(schema, className, restKey, restValue, {
130130
return {key: key, value: value};
131131
}
132132

133-
function transformQueryKeyValue(schema, className, restKey, restValue, { validate } = {}) {
133+
const valueAsDate = value => {
134+
if (typeof value === 'string') {
135+
return new Date(value);
136+
} else if (value instanceof Date) {
137+
return value;
138+
}
139+
return false;
140+
}
141+
142+
function transformQueryKeyValue(schema, className, key, value, { validate } = {}) {
134143
// Check if the schema is known since it's a built-in field.
135-
var key = restKey;
136-
var timeField = false;
137144
switch(key) {
138-
case 'objectId':
139-
case '_id':
140-
key = '_id';
141-
break;
142145
case 'createdAt':
143-
case '_created_at':
146+
if (valueAsDate(value)) {
147+
return {key: '_created_at', value: valueAsDate(value)}
148+
}
144149
key = '_created_at';
145-
timeField = true;
146150
break;
147151
case 'updatedAt':
148-
case '_updated_at':
152+
if (valueAsDate(value)) {
153+
return {key: '_updated_at', value: valueAsDate(value)}
154+
}
149155
key = '_updated_at';
150-
timeField = true;
151-
break;
152-
case '_email_verify_token':
153-
key = "_email_verify_token";
154-
break;
155-
case '_perishable_token':
156-
key = "_perishable_token";
157-
break;
158-
case 'sessionToken':
159-
case '_session_token':
160-
key = '_session_token';
161156
break;
162157
case 'expiresAt':
163-
case '_expiresAt':
164-
key = 'expiresAt';
165-
timeField = true;
158+
if (valueAsDate(value)) {
159+
return {key: 'expiresAt', value: valueAsDate(value)}
160+
}
166161
break;
162+
case 'objectId': return {key: '_id', value}
163+
case 'sessionToken': return {key: '_session_token', value}
167164
case '_rperm':
168165
case '_wperm':
169-
return {key: key, value: restValue};
170-
break;
166+
case '_perishable_token':
167+
case '_email_verify_token': return {key, value}
171168
case '$or':
172-
if (!(restValue instanceof Array)) {
169+
if (!(value instanceof Array)) {
173170
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $or format - use an array value');
174171
}
175-
var mongoSubqueries = restValue.map((s) => {
176-
return transformWhere(schema, className, s);
177-
});
172+
var mongoSubqueries = value.map(subQuery => transformWhere(schema, className, subQuery));
178173
return {key: '$or', value: mongoSubqueries};
179174
case '$and':
180-
if (!(restValue instanceof Array)) {
175+
if (!(value instanceof Array)) {
181176
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad $and format - use an array value');
182177
}
183-
var mongoSubqueries = restValue.map((s) => {
184-
return transformWhere(schema, className, s);
185-
});
178+
var mongoSubqueries = value.map(subQuery => transformWhere(schema, className, subQuery));
186179
return {key: '$and', value: mongoSubqueries};
187180
default:
188181
// Other auth data
189182
var authDataMatch = key.match(/^authData\.([a-zA-Z0-9_]+)\.id$/);
190183
if (authDataMatch ) {
191184
var provider = authDataMatch[1];
192185
// Special-case auth data.
193-
return {key: '_auth_data_'+provider+'.id', value: restValue};
186+
return {key: `_auth_data_${provider}.id`, value};
194187
}
195188
if (validate && !key.match(/^[a-zA-Z][a-zA-Z0-9_\.]*$/)) {
196189
throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, 'invalid key name: ' + key);
@@ -205,46 +198,39 @@ function transformQueryKeyValue(schema, className, restKey, restValue, { validat
205198
expected = schema.getExpectedType(className, key);
206199
}
207200
if ((expected && expected.type == 'Pointer') ||
208-
(!expected && restValue && restValue.__type == 'Pointer')) {
201+
(!expected && value && value.__type == 'Pointer')) {
209202
key = '_p_' + key;
210203
}
211204
var expectedTypeIsArray = (expected && expected.type === 'Array');
212205

213206
// Handle query constraints
214-
value = transformConstraint(restValue, expectedTypeIsArray);
215-
if (value !== CannotTransform) {
216-
return {key: key, value: value};
207+
if (transformConstraint(value, expectedTypeIsArray) !== CannotTransform) {
208+
return {key, value: transformConstraint(value, expectedTypeIsArray)};
217209
}
218210

219-
if (expectedTypeIsArray && !(restValue instanceof Array)) {
220-
return {
221-
key: key, value: { '$all' : [restValue] }
222-
};
211+
if (expectedTypeIsArray && !(value instanceof Array)) {
212+
return {key, value: { '$all' : [value] }};
223213
}
224214

225215
// Handle atomic values
226-
var value = transformAtom(restValue, false);
227-
if (value !== CannotTransform) {
228-
if (timeField && (typeof value === 'string')) {
229-
value = new Date(value);
230-
}
231-
return {key: key, value: value};
216+
if (transformAtom(value, false) !== CannotTransform) {
217+
return {key, value: transformAtom(value, false)};
232218
}
233219

234220
// Handle arrays
235-
if (restValue instanceof Array) {
236-
throw new Parse.Error(Parse.Error.INVALID_JSON,'cannot use array as query param');
221+
if (value instanceof Array) {
222+
throw new Parse.Error(Parse.Error.INVALID_JSON, 'cannot use array as query param');
237223
}
238224

239225
// Handle normal objects by recursing
240-
value = {};
241-
for (var subRestKey in restValue) {
242-
var subRestValue = restValue[subRestKey];
226+
let result = {};
227+
for (var subRestKey in value) {
228+
var subRestValue = value[subRestKey];
243229
var out = transformKeyValue(schema, className, subRestKey, subRestValue, { inObject: true });
244230
// For recursed objects, keep the keys in rest format
245-
value[subRestKey] = out.value;
231+
result[subRestKey] = out.value;
246232
}
247-
return {key: key, value: value};
233+
return {key, result};
248234
}
249235

250236
// Main exposed method to help run queries.

src/Auth.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,7 @@ var getAuthForSessionToken = function({ config, sessionToken, installationId } =
5252
limit: 1,
5353
include: 'user'
5454
};
55-
var restWhere = {
56-
_session_token: sessionToken
57-
};
58-
var query = new RestQuery(config, master(config), '_Session',
59-
restWhere, restOptions);
55+
var query = new RestQuery(config, master(config), '_Session', { sessionToken }, restOptions);
6056
return query.execute().then((response) => {
6157
var results = response.results;
6258
if (results.length !== 1 || !results[0]['user']) {

src/Routers/GlobalConfigRouter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// global_config.js
22

3-
import PromiseRouter from '../PromiseRouter';
3+
import PromiseRouter from '../PromiseRouter';
44
import * as middleware from "../middlewares";
55

66
export class GlobalConfigRouter extends PromiseRouter {
77
getGlobalConfig(req) {
88
let database = req.config.database.WithoutValidation();
9-
return database.find('_GlobalConfig', { '_id': 1 }, { limit: 1 }).then((results) => {
9+
return database.find('_GlobalConfig', { objectId: 1 }, { limit: 1 }).then((results) => {
1010
if (results.length != 1) {
1111
// If there is no config in the database - return empty config.
1212
return { response: { params: {} } };

src/Routers/SessionsRouter.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11

22
import ClassesRouter from './ClassesRouter';
33
import PromiseRouter from '../PromiseRouter';
4-
import rest from '../rest';
5-
import Auth from '../Auth';
4+
import rest from '../rest';
5+
import Auth from '../Auth';
66

77
export class SessionsRouter extends ClassesRouter {
88
handleFind(req) {
@@ -36,7 +36,7 @@ export class SessionsRouter extends ClassesRouter {
3636
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,
3737
'Session token required.');
3838
}
39-
return rest.find(req.config, Auth.master(req.config), '_Session', { _session_token: req.info.sessionToken })
39+
return rest.find(req.config, Auth.master(req.config), '_Session', { sessionToken: req.info.sessionToken })
4040
.then((response) => {
4141
if (!response.results || response.results.length == 0) {
4242
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,

src/Routers/UsersRouter.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export class UsersRouter extends ClassesRouter {
4646
}
4747
let sessionToken = req.info.sessionToken;
4848
return rest.find(req.config, Auth.master(req.config), '_Session',
49-
{ _session_token: sessionToken },
49+
{ sessionToken },
5050
{ include: 'user' })
5151
.then((response) => {
5252
if (!response.results ||
@@ -139,7 +139,7 @@ export class UsersRouter extends ClassesRouter {
139139
let success = {response: {}};
140140
if (req.info && req.info.sessionToken) {
141141
return rest.find(req.config, Auth.master(req.config), '_Session',
142-
{ _session_token: req.info.sessionToken }
142+
{ sessionToken: req.info.sessionToken }
143143
).then((records) => {
144144
if (records.results && records.results.length) {
145145
return rest.del(req.config, Auth.master(req.config), '_Session',

0 commit comments

Comments
 (0)