Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/CoreManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,8 @@ type UserController = {
logIn: (user: ParseUser, options: RequestOptions) => Promise;
become: (options: RequestOptions) => Promise;
hydrate: (userJSON: AttributeMap) => Promise;
logOut: () => Promise;
logOut: (options: RequestOptions) => Promise;
me: (options: RequestOptions) => Promise;
requestPasswordReset: (email: string, options: RequestOptions) => Promise;
updateUserOnDisk: (user: ParseUser) => Promise;
upgradeToRevocableSession: (user: ParseUser, options: RequestOptions) => Promise;
Expand Down Expand Up @@ -378,6 +379,7 @@ module.exports = {
'logIn',
'become',
'logOut',
'me',
'requestPasswordReset',
'upgradeToRevocableSession',
'linkWith',
Expand Down
53 changes: 42 additions & 11 deletions src/ParseUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,25 @@ class ParseUser extends ParseObject {
return controller.become(becomeOptions);
}

/**
* Retrieves a user with a session token.
*
* @param {String} sessionToken The sessionToken to get user with.
* @param {Object} options
* @static
* @return {Promise} A promise that is fulfilled with the user is fetched.
*/
static me(sessionToken: string, options?: RequestOptions = {}) {
const controller = CoreManager.getUserController();
const meOptions: RequestOptions = {
sessionToken: sessionToken
};
if (options.useMasterKey) {
meOptions.useMasterKey = options.useMasterKey;
}
return controller.me(meOptions);
}

/**
* Logs in a user with a session token. On success, this saves the session
* to disk, so you can retrieve the currently logged in user using
Expand All @@ -674,20 +693,15 @@ class ParseUser extends ParseObject {
* Logs out the currently logged in user session. This will remove the
* session from disk, log out of linked services, and future calls to
* <code>current</code> will return <code>null</code>.

*
* @param {Object} options
* @static
* @return {Promise} A promise that is resolved when the session is
* destroyed on the server.
*/
static logOut() {
if (!canUseCurrentUser) {
throw new Error(
'There is no current user on a node.js server environment.'
);
}

static logOut(options: RequestOptions = {}) {
const controller = CoreManager.getUserController();
return controller.logOut();
return controller.logOut(options);
}

/**
Expand Down Expand Up @@ -998,11 +1012,28 @@ const DefaultController = {
}
},

logOut(): Promise<ParseUser> {
me(options: RequestOptions): Promise<ParseUser> {
const RESTController = CoreManager.getRESTController();
return RESTController.request(
'GET', 'users/me', {}, options
).then((response) => {
const user = new ParseUser();
user._finishFetch(response);
user._setExisted(true);
return user;
});
},

logOut(options: RequestOptions): Promise<ParseUser> {
const RESTController = CoreManager.getRESTController();
if (options.sessionToken) {
return RESTController.request(
'POST', 'logout', {}, options
);
}
return DefaultController.currentUserAsync().then((currentUser) => {
const path = Storage.generatePath(CURRENT_USER_KEY);
let promise = Storage.removeItemAsync(path);
const RESTController = CoreManager.getRESTController();
if (currentUser !== null) {
const isAnonymous = AnonymousUtils.isLinked(currentUser);
const currentSession = currentUser.getSessionToken();
Expand Down
68 changes: 65 additions & 3 deletions src/__tests__/ParseUser-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,6 @@ describe('ParseUser', () => {
expect(ParseUser.become.bind(null, 'token')).toThrow(
'It is not memory-safe to become a user in a server environment'
);
expect(ParseUser.logOut).toThrow(
'There is no current user on a node.js server environment.'
);
});

it('can sign up a new user', (done) => {
Expand Down Expand Up @@ -675,6 +672,71 @@ describe('ParseUser', () => {
});
});

it('can retreive a user with sessionToken (me)', async () => {
ParseUser.disableUnsafeCurrentUser();
ParseUser._clearCache();
CoreManager.setRESTController({
request(method, path, body, options) {
expect(method).toBe('GET');
expect(path).toBe('users/me');
expect(options.sessionToken).toBe('123abc');
return Promise.resolve({
objectId: 'uid3',
username: 'username',
sessionToken: '123abc'
}, 200);
},
ajax() {}
});

const user = await ParseUser.me('123abc');
expect(user.id).toBe('uid3');
expect(user.isCurrent()).toBe(false);
expect(user.existed()).toBe(true);
});

it('can retreive a user with sessionToken and masterKey(me)', async () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a use case for this? In other words, how would this request differ from the above? The master key is included, but does it behave it any differently? I looked at the router code, but not sure...

ParseUser.disableUnsafeCurrentUser();
ParseUser._clearCache();
CoreManager.setRESTController({
request(method, path, body, options) {
expect(method).toBe('GET');
expect(path).toBe('users/me');
expect(options.sessionToken).toBe('123abc');
expect(options.useMasterKey).toBe(true);
return Promise.resolve({
objectId: 'uid3',
username: 'username',
sessionToken: '123abc'
}, 200);
},
ajax() {}
});

const user = await ParseUser.me('123abc', { useMasterKey: true });
expect(user.id).toBe('uid3');
expect(user.isCurrent()).toBe(false);
expect(user.existed()).toBe(true);
});

it('can logout user with sessionToken', async () => {
ParseUser.disableUnsafeCurrentUser();
ParseUser._clearCache();
Storage._clear();
const RESTController = {
request() {
return Promise.resolve({}, 200);
},
ajax() {}
};
jest.spyOn(RESTController, 'request');
CoreManager.setRESTController(RESTController);

await ParseUser.logOut({ sessionToken: '1234' });

expect(RESTController.request).toHaveBeenCalledWith('POST', 'logout', {}, { sessionToken: '1234' });
});

it('can get error when recursive _linkWith call fails', (done) => {
CoreManager.setRESTController({
request(method, path, body) {
Expand Down
2 changes: 2 additions & 0 deletions src/__tests__/RESTController-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ describe('RESTController', () => {
logIn() {},
become() {},
logOut() {},
me() {},
requestPasswordReset() {},
upgradeToRevocableSession() {},
linkWith() {},
Expand Down Expand Up @@ -298,6 +299,7 @@ describe('RESTController', () => {
logIn() {},
become() {},
logOut() {},
me() {},
requestPasswordReset() {},
upgradeToRevocableSession() {},
linkWith() {},
Expand Down