From 344a3bb003b30bbcd862365143435b147bd9eea8 Mon Sep 17 00:00:00 2001 From: Avital Oliver Date: Tue, 26 Feb 2013 16:33:38 -0800 Subject: [PATCH] User documents have ids when onCreateUser and validateNewUser hooks run --- packages/accounts-base/accounts_server.js | 16 +++++++++++++--- packages/accounts-base/accounts_tests.js | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/accounts-base/accounts_server.js b/packages/accounts-base/accounts_server.js index 3e621979e0..32548ddd15 100644 --- a/packages/accounts-base/accounts_server.js +++ b/packages/accounts-base/accounts_server.js @@ -122,9 +122,19 @@ return user; }; Accounts.insertUserDoc = function (options, user) { - // add created at timestamp (and protect passed in user object from - // modification) - user = _.extend({createdAt: +(new Date)}, user); + // - clone user document, to protect from modification + // - add createdAt timestamp + // - prepare an _id, so that you can modify other collections (eg + // create a first task for every new user) + // + // XXX If the onCreateUser or validateNewUser hooks fail, we might + // end up having modified some other collection + // inappropriately. The solution is probably to have onCreateUser + // accept two callbacks - one that gets called before inserting + // the user document (in which you can modify its contents), and + // one that gets called after (in which you should change other + // collections) + user = _.extend({createdAt: +(new Date), _id: Random.id()}, user); var result = {}; if (options.generateLoginToken) { diff --git a/packages/accounts-base/accounts_tests.js b/packages/accounts-base/accounts_tests.js index fc0759acf4..d0667b4d47 100644 --- a/packages/accounts-base/accounts_tests.js +++ b/packages/accounts-base/accounts_tests.js @@ -7,6 +7,14 @@ Tinytest.add('accounts - config validates keys', function (test) { }); }); +Tinytest.add('accounts - validateNewUser gets passed user with _id', function (test) { + Accounts.validateNewUser(function (user) { + test.equal(typeof user._id, "string"); + return true; + }); + Accounts.updateOrCreateUserFromExternalService('foobook', {id: Random.id()}); +}); + Tinytest.add('accounts - updateOrCreateUserFromExternalService - Facebook', function (test) { var facebookId = Random.id();