diff --git a/lib/blockchainmonitor.js b/lib/blockchainmonitor.js index 60aede1..0300b3c 100644 --- a/lib/blockchainmonitor.js +++ b/lib/blockchainmonitor.js @@ -28,7 +28,10 @@ BlockchainMonitor.prototype.start = function(opts, cb) { if (opts.blockchainExplorers) { explorer = opts.blockchainExplorers[network]; } else { - var config = opts.blockchainExplorerOpts[network] || {}; + var config = {} + if (opts.blockchainExplorerOpts && opts.blockchainExplorerOpts[network]) { + config = opts.blockchainExplorerOpts[network]; + } var explorer = new BlockchainExplorer({ provider: config.provider, network: network, diff --git a/lib/emailservice.js b/lib/emailservice.js index 5ffe93d..7252efe 100644 --- a/lib/emailservice.js +++ b/lib/emailservice.js @@ -14,6 +14,7 @@ var WalletUtils = require('bitcore-wallet-utils'); var Storage = require('./storage'); var MessageBroker = require('./messagebroker'); var Lock = require('./lock'); +var BlockchainExplorer = require('./blockchainexplorer'); var Model = require('./model'); @@ -95,6 +96,27 @@ EmailService.prototype.start = function(opts, cb) { self.lock = opts.lock || new Lock(opts.lockOpts); done(); }, + function(done) { + self.explorers = _.indexBy(_.map(['livenet', 'testnet'], function(network) { + var explorer; + if (opts.blockchainExplorers) { + explorer = opts.blockchainExplorers[network]; + } else { + var config = {} + if (opts.blockchainExplorerOpts && opts.blockchainExplorerOpts[network]) { + config = opts.blockchainExplorerOpts[network]; + } + var explorer = new BlockchainExplorer({ + provider: config.provider, + network: network, + url: config.url, + }); + } + $.checkState(explorer); + return explorer; + }), 'network'); + done(); + }, function(done) { self.mailer = opts.mailer || nodemailer.createTransport(opts.emailOpts); self.subjectPrefix = opts.emailOpts.subjectPrefix || '[Wallet service]'; @@ -231,6 +253,10 @@ EmailService.prototype._getDataForTemplate = function(notification, recipient, c }); data.rejectorsNames = rejectors.join(', '); } + + if (_.contains(['NewIncomingTx', 'NewOutgoingTx'], notification.type) && data.txid) { + data.urlForTx = self.explorers[wallet.network].getPublicUrlForTx(data.txid); + } return cb(null, data); }); }; diff --git a/test/integration/server.js b/test/integration/server.js index bbff4c1..dafb158 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -260,7 +260,7 @@ helpers.createAddresses = function(server, wallet, main, change, cb) { var storage, blockchainExplorer; -var useMongo = false; +var useMongo = true; function initStorage(cb) { function getDb(cb) { @@ -412,6 +412,14 @@ describe('Wallet service', function() { }); it('should notify copayers a new outgoing tx has been created', function(done) { + var _readTemplateFile_old = emailService._readTemplateFile; + emailService._readTemplateFile = function(language, filename, cb) { + if (_.endsWith(filename, '.html')) { + return cb(null, '{{&urlForTx}}'); + } else { + _readTemplateFile_old.call(emailService, language, filename, cb); + } + }; helpers.stubUtxos(server, wallet, [1, 1], function() { var txOpts = helpers.createSimpleProposalOpts('18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', 0.8, 'some message', TestData.copayers[0].privKey_1H_0); @@ -454,9 +462,12 @@ describe('Wallet service', function() { one.subject.should.contain('Payment sent'); one.text.should.contain(wallet.name); one.text.should.contain('800,000'); + should.exist(one.html); + one.html.should.contain('https://insight.bitpay.com:443/tx/999'); server.storage.fetchUnsentEmails(function(err, unsent) { should.not.exist(err); unsent.should.be.empty; + emailService._readTemplateFile = _readTemplateFile_old; done(); }); }, 100);