* Adding Caching Adapter, allows caching of _Role and _User queries.
This commit is contained in:
131
src/Auth.js
131
src/Auth.js
@@ -2,8 +2,6 @@ var deepcopy = require('deepcopy');
|
||||
var Parse = require('parse/node').Parse;
|
||||
var RestQuery = require('./RestQuery');
|
||||
|
||||
import cache from './cache';
|
||||
|
||||
// An Auth object tells you who is requesting something and whether
|
||||
// the master key was used.
|
||||
// userObject is a Parse.User and can be null if there's no user.
|
||||
@@ -42,36 +40,42 @@ function nobody(config) {
|
||||
return new Auth({ config, isMaster: false });
|
||||
}
|
||||
|
||||
|
||||
// Returns a promise that resolves to an Auth object
|
||||
var getAuthForSessionToken = function({ config, sessionToken, installationId } = {}) {
|
||||
var cachedUser = cache.users.get(sessionToken);
|
||||
if (cachedUser) {
|
||||
return Promise.resolve(new Auth({ config, isMaster: false, installationId, user: cachedUser }));
|
||||
}
|
||||
var restOptions = {
|
||||
limit: 1,
|
||||
include: 'user'
|
||||
};
|
||||
var query = new RestQuery(config, master(config), '_Session', { sessionToken }, restOptions);
|
||||
return query.execute().then((response) => {
|
||||
var results = response.results;
|
||||
if (results.length !== 1 || !results[0]['user']) {
|
||||
return nobody(config);
|
||||
return config.cacheController.user.get(sessionToken).then((userJSON) => {
|
||||
if (userJSON) {
|
||||
let cachedUser = Parse.Object.fromJSON(userJSON);
|
||||
return Promise.resolve(new Auth({config, isMaster: false, installationId, user: cachedUser}));
|
||||
}
|
||||
|
||||
var now = new Date(),
|
||||
var restOptions = {
|
||||
limit: 1,
|
||||
include: 'user'
|
||||
};
|
||||
|
||||
var query = new RestQuery(config, master(config), '_Session', {sessionToken}, restOptions);
|
||||
return query.execute().then((response) => {
|
||||
var results = response.results;
|
||||
if (results.length !== 1 || !results[0]['user']) {
|
||||
return nobody(config);
|
||||
}
|
||||
|
||||
var now = new Date(),
|
||||
expiresAt = results[0].expiresAt ? new Date(results[0].expiresAt.iso) : undefined;
|
||||
if(expiresAt < now) {
|
||||
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,
|
||||
'Session token is expired.');
|
||||
}
|
||||
var obj = results[0]['user'];
|
||||
delete obj.password;
|
||||
obj['className'] = '_User';
|
||||
obj['sessionToken'] = sessionToken;
|
||||
let userObject = Parse.Object.fromJSON(obj);
|
||||
cache.users.set(sessionToken, userObject);
|
||||
return new Auth({ config, isMaster: false, installationId, user: userObject });
|
||||
if (expiresAt < now) {
|
||||
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN,
|
||||
'Session token is expired.');
|
||||
}
|
||||
var obj = results[0]['user'];
|
||||
delete obj.password;
|
||||
obj['className'] = '_User';
|
||||
obj['sessionToken'] = sessionToken;
|
||||
config.cacheController.user.put(sessionToken, obj);
|
||||
|
||||
let userObject = Parse.Object.fromJSON(obj);
|
||||
return new Auth({config, isMaster: false, installationId, user: userObject});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -92,39 +96,50 @@ Auth.prototype.getUserRoles = function() {
|
||||
|
||||
// Iterates through the role tree and compiles a users roles
|
||||
Auth.prototype._loadRoles = function() {
|
||||
var restWhere = {
|
||||
'users': {
|
||||
__type: 'Pointer',
|
||||
className: '_User',
|
||||
objectId: this.user.id
|
||||
var cacheAdapter = this.config.cacheController;
|
||||
return cacheAdapter.role.get(this.user.id).then((cachedRoles) => {
|
||||
if (cachedRoles != null) {
|
||||
this.fetchedroles = true;
|
||||
return Promise.resolve(cachedRoles);
|
||||
}
|
||||
};
|
||||
// First get the role ids this user is directly a member of
|
||||
var query = new RestQuery(this.config, master(this.config), '_Role',
|
||||
restWhere, {});
|
||||
return query.execute().then((response) => {
|
||||
var results = response.results;
|
||||
if (!results.length) {
|
||||
this.userRoles = [];
|
||||
this.fetchedRoles = true;
|
||||
this.rolePromise = null;
|
||||
return Promise.resolve(this.userRoles);
|
||||
}
|
||||
var rolesMap = results.reduce((m, r) => {
|
||||
m.names.push(r.name);
|
||||
m.ids.push(r.objectId);
|
||||
return m;
|
||||
}, {ids: [], names: []});
|
||||
|
||||
// run the recursive finding
|
||||
return this._getAllRolesNamesForRoleIds(rolesMap.ids, rolesMap.names)
|
||||
.then((roleNames) => {
|
||||
this.userRoles = roleNames.map((r) => {
|
||||
return 'role:' + r;
|
||||
});
|
||||
this.fetchedRoles = true;
|
||||
this.rolePromise = null;
|
||||
return Promise.resolve(this.userRoles);
|
||||
var restWhere = {
|
||||
'users': {
|
||||
__type: 'Pointer',
|
||||
className: '_User',
|
||||
objectId: this.user.id
|
||||
}
|
||||
};
|
||||
// First get the role ids this user is directly a member of
|
||||
var query = new RestQuery(this.config, master(this.config), '_Role', restWhere, {});
|
||||
return query.execute().then((response) => {
|
||||
var results = response.results;
|
||||
if (!results.length) {
|
||||
this.userRoles = [];
|
||||
this.fetchedRoles = true;
|
||||
this.rolePromise = null;
|
||||
|
||||
cacheAdapter.role.put(this.user.id, this.userRoles);
|
||||
return Promise.resolve(this.userRoles);
|
||||
}
|
||||
var rolesMap = results.reduce((m, r) => {
|
||||
m.names.push(r.name);
|
||||
m.ids.push(r.objectId);
|
||||
return m;
|
||||
}, {ids: [], names: []});
|
||||
|
||||
// run the recursive finding
|
||||
return this._getAllRolesNamesForRoleIds(rolesMap.ids, rolesMap.names)
|
||||
.then((roleNames) => {
|
||||
this.userRoles = roleNames.map((r) => {
|
||||
return 'role:' + r;
|
||||
});
|
||||
this.fetchedRoles = true;
|
||||
this.rolePromise = null;
|
||||
|
||||
cacheAdapter.role.put(this.user.id, this.userRoles);
|
||||
return Promise.resolve(this.userRoles);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user