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
1 change: 1 addition & 0 deletions src/CoreManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ type UserController = {
signUp: (user: ParseUser, attrs: AttributeMap, options: RequestOptions) => Promise;
logIn: (user: ParseUser, options: RequestOptions) => Promise;
become: (options: RequestOptions) => Promise;
hydrate: (userJSON: AttributeMap) => Promise;
logOut: () => Promise;
requestPasswordReset: (email: string, options: RequestOptions) => Promise;
updateUserOnDisk: (user: ParseUser) => Promise;
Expand Down
26 changes: 26 additions & 0 deletions src/ParseUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,21 @@ class ParseUser extends ParseObject {
return controller.become(becomeOptions);
}

/**
* 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
* <code>current</code>. If there is no session token the user will not logged in.
*
* @param {Object} userJSON The JSON map of the User's data
* @static
* @return {Promise} A promise that is fulfilled with the user when
* the login completes.
*/
static hydrate(userJSON: AttributeMap) {
const controller = CoreManager.getUserController();
return controller.hydrate(userJSON);
}

static logInWith(provider, options) {
return ParseUser._logInWith(provider, options);
}
Expand Down Expand Up @@ -954,6 +969,17 @@ const DefaultController = {
});
},

hydrate(userJSON: AttributeMap) {
const user = new ParseUser();
user._finishFetch(userJSON);
user._setExisted(true);
if (userJSON.sessionToken && canUseCurrentUser) {
return DefaultController.setCurrentUser(user);
} else {
return Promise.resolve(user);
}
},

logOut(): Promise {
return DefaultController.currentUserAsync().then((currentUser) => {
const path = Storage.generatePath(CURRENT_USER_KEY);
Expand Down
39 changes: 39 additions & 0 deletions src/__tests__/ParseUser-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,45 @@ describe('ParseUser', () => {
});
});

it('can hydrate a user with sessionToken in server environment', async () => {
ParseUser.enableUnsafeCurrentUser();
ParseUser._clearCache();
const user = await ParseUser.hydrate({
objectId: 'uid3',
username: 'username',
sessionToken: '123abc',
});
expect(user.id).toBe('uid3');
expect(user.isCurrent()).toBe(true);
expect(user.existed()).toBe(true);
});

it('can hydrate a user with sessionToken in non server environment', async () => {
ParseUser.disableUnsafeCurrentUser();
ParseUser._clearCache();
const user = await ParseUser.hydrate({
objectId: 'uid3',
username: 'username',
sessionToken: '123abc',
});
expect(user.id).toBe('uid3');
expect(user.isCurrent()).toBe(false);
expect(user.existed()).toBe(true);
});

it('can hydrate a user without sessionToken', async () => {
ParseUser.enableUnsafeCurrentUser();
ParseUser._clearCache();
await ParseUser.logOut();
const user = await ParseUser.hydrate({
objectId: 'uid3',
username: 'username',
});
expect(user.id).toBe('uid3');
expect(user.isCurrent()).toBe(false);
expect(user.existed()).toBe(true);
});

it('can send a password reset request', () => {
CoreManager.setRESTController({
request(method, path, body) {
Expand Down