From 7e8f1a16685c0f210296dddbd013ed125341dc1c Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Thu, 30 Oct 2014 18:08:50 -0300 Subject: [PATCH] made Identity#create asynchronous --- js/models/Identity.js | 12 ++++-- js/services/identityService.js | 67 +++++++++++++++++++++------------- test/Identity.js | 55 ++++++++++++++-------------- 3 files changed, 79 insertions(+), 55 deletions(-) diff --git a/js/models/Identity.js b/js/models/Identity.js index d89ebe62e..f52125772 100644 --- a/js/models/Identity.js +++ b/js/models/Identity.js @@ -82,10 +82,14 @@ Identity.prototype.getName = function() { * @param cb * @return {undefined} */ -Identity.create = function(opts) { +Identity.create = function(opts, cb) { opts = _.extend({}, opts); - return new Identity(opts); + var iden = new Identity(opts); + iden.store(opts, function(err) { + if (err) return cb(err); + return cb(null, iden); + }); }; @@ -386,7 +390,9 @@ Identity.prototype.bindWallet = function(w) { }); w.on('ready', function() { log.debug(' Wallet' + w.getName()); - self.store({noWallets:true}, function() { + self.store({ + noWallets: true + }, function() { self.storeWallet(w); }); }); diff --git a/js/services/identityService.js b/js/services/identityService.js index 603986ac1..ac1730ab5 100644 --- a/js/services/identityService.js +++ b/js/services/identityService.js @@ -4,8 +4,26 @@ angular.module('copayApp.services') .factory('identityService', function($rootScope, $location, pluginManager, controllerUtils) { var root = {}; + root.check = function(scope) { + copay.Identity.checkIfExistsAny({ + pluginManager: pluginManager, + }, function(anyProfile) { + copay.Wallet.checkIfExistsAny({ + pluginManager: pluginManager, + }, function(anyWallet) { + scope.retreiving = false; + scope.anyProfile = anyProfile ? true : false; + scope.anyWallet = anyWallet ? true : false; + + if (!scope.anyProfile) { + $location.path('/createProfile'); + } + }); + }); + }; + root.create = function(scope, form) { - var iden = copay.Identity.create({ + copay.Identity.create({ email: form.email.$modelValue, password: form.password.$modelValue, pluginManager: pluginManager, @@ -13,31 +31,30 @@ angular.module('copayApp.services') networkName: config.networkName, walletDefaults: config.wallet, passphraseConfig: config.passphraseConfig, + failIfExists: true, + }, function(err, iden) { + if (err || !iden) { + controllerUtils.onErrorDigest(scope, 'User already exists!'); + return; + } + var walletOptions = { + nickname: iden.fullName, + networkName: config.networkName, + requiredCopayers: 1, + totalCopayers: 1, + password: iden.password, + name: 'My wallet', + }; + iden.createWallet(walletOptions, function(err, wallet) { + if (err || !wallet) { + controllerUtils.onErrorDigest(scope, 'Could not create default wallet'); + return; + } + scope.loading = false; + controllerUtils.bindProfile(scope, iden, wallet.id); + }); }); - var walletOptions = { - nickname: iden.fullName, - networkName: config.networkName, - requiredCopayers: 1, - totalCopayers: 1, - password: iden.password, - name: 'My wallet', - }; - iden.createWallet(walletOptions, function(err, wallet) { - if (err) { - controllerUtils.onErrorDigest( - scope, 'Could not create default wallet'); - } else { - iden.store({failIfExists: true}, function(err) { - if (err) { - controllerUtils.onErrorDigest(scope, 'User already exists!'); - } else { - controllerUtils.bindProfile(scope, iden, wallet.id); - } - }); - } - scope.loading = false; - }); }; @@ -60,7 +77,7 @@ angular.module('copayApp.services') } scope.loading = false; }); - }; + }; return root; }); diff --git a/test/Identity.js b/test/Identity.js index 718a68e21..d19d4788a 100644 --- a/test/Identity.js +++ b/test/Identity.js @@ -89,7 +89,6 @@ describe('Identity model', function() { w.netStart = sinon.stub(); w.args = args; return w; - } @@ -126,11 +125,11 @@ describe('Identity model', function() { var args = createIdentity(); args.blockchain.on = sinon.stub(); var old = Identity.prototype.createWallet; - Identity.prototype.createWallet = sinon.stub().yields(null, getNewWallet()); - var iden = Identity.create(args.params); - should.exist(iden); - should.exist(iden.wallets); - Identity.prototype.createWallet = old; + Identity.create(args.params, function(err, iden) { + should.not.exist(err); + should.exist(iden); + should.exist(iden.wallets); + }); }); }); @@ -169,9 +168,9 @@ describe('Identity model', function() { args = createIdentity(); args.params.noWallets = true; var old = Identity.prototype.createWallet; - Identity.prototype.createWallet = sinon.stub().yields(null, getNewWallet()); - iden = Identity.create(args.params); - Identity.prototype.createWallet = old; + Identity.create(args.params, function(err, res) { + iden = res; + }); }); it('should be able to create wallets with given pk', function(done) { var priv = 'tprv8ZgxMBicQKsPdEqHcA7RjJTayxA3gSSqeRTttS1JjVbgmNDZdSk9EHZK5pc52GY5xFmwcakmUeKWUDzGoMLGAhrfr5b3MovMUZUTPqisL2m'; @@ -227,12 +226,13 @@ describe('Identity model', function() { importWallet: sinon.stub().returns(getNewWallet()), }; - var iden = Identity.create(args.params); - iden.retrieveWalletFromStorage('dummy', opts, function(err, wallet) { - should.not.exist(err); - opts.importWallet.calledOnce.should.equal(true); - should.exist(wallet); - done(); + Identity.create(args.params, function(err, iden) { + iden.retrieveWalletFromStorage('dummy', opts, function(err, wallet) { + should.not.exist(err); + opts.importWallet.calledOnce.should.equal(true); + should.exist(wallet); + done(); + }); }); }); }); @@ -255,13 +255,15 @@ describe('Identity model', function() { cryptoUtil: fakeCrypto, }; - var iden = Identity.create(args.params); - iden.importEncryptedWallet(123, 'password', opts, function(err) { - should.not.exist(err); - fakeCrypto.kdf.getCall(0).args[0].should.equal('password'); - fakeCrypto.decrypt.getCall(0).args[0].should.equal('passphrase'); - fakeCrypto.decrypt.getCall(0).args[1].should.equal(123); - done(); + Identity.create(args.params, function(err, iden) { + sinon.stub(iden, 'importWalletFromObj').yields(null); + iden.importEncryptedWallet(123, 'password', opts, function(err) { + should.not.exist(err); + fakeCrypto.kdf.getCall(0).args[0].should.equal('password'); + fakeCrypto.decrypt.getCall(0).args[0].should.equal('passphrase'); + fakeCrypto.decrypt.getCall(0).args[1].should.equal(123); + done(); + }); }); }); }); @@ -312,10 +314,9 @@ describe('Identity model', function() { net.on = sinon.stub(); net.start = sinon.spy(); var old = Identity.prototype.createWallet; - Identity.prototype.createWallet = sinon.stub().yields(null, getNewWallet()); - - iden = Identity.create(args.params); - Identity.prototype.createWallet = old; + Identity.create(args.params, function(err, res) { + iden = res; + }); }); it('should yield bad network error', function(done) { @@ -368,7 +369,7 @@ describe('Identity model', function() { net.start.onFirstCall().callsArg(1); net.greet = sinon.stub(); iden.createWallet = sinon.stub(); - iden.createWallet.onFirstCall().yields(null,null); + iden.createWallet.onFirstCall().yields(null, null); net.on.withArgs('data').yields('senderId', { type: 'walletId', networkName: 'testnet',