flocore-node/api/controllers/transactions.js
2015-03-25 17:56:55 -03:00

151 lines
3.1 KiB
JavaScript

'use strict';
var Promise = require('bluebird');
var bitcore = require('bitcore');
var _ = bitcore.deps._;
var $ = bitcore.util.preconditions;
var Transaction = bitcore.Transaction;
var BitcoreNode = require('../../');
var Transactions = {};
var node;
Transactions.setNode = function(aNode) {
node = aNode;
};
/*
* params
*/
/*
* Finds a transaction by its hash
*/
Transactions.txHashParam = function(req, res, next, txHash) {
node.transactionService.getTransaction(txHash)
.then(function(tx) {
req.tx = tx;
})
.then(next)
.catch(BitcoreNode.errors.Transactions.NotFound, function() {
res.status(404).send('Transaction with id ' + txHash + ' not found');
});
};
/*
* sets an input or output index
*/
Transactions.indexParam = function(req, res, next, index) {
index = parseInt(index);
req.index = index;
next();
};
/*
* controllers
*/
/*
* get transaction by its hash
*/
Transactions.get = function(req, res) {
$.checkState(req.tx instanceof Transaction);
res.send(req.tx.toObject());
};
/**
* send a transaction to the bitcoin network
*/
Transactions.send = function(req, res) {
var raw = req.body.raw;
if (_.isUndefined(raw)) {
Transaction._sendError(res);
return;
}
var tx;
try {
tx = new Transaction(raw);
} catch (e) {
Transaction._sendError(res);
return;
}
node.broadcast(tx)
.then(function() {
res.send('Transaction broadcasted successfully');
})
.catch(BitcoreNode.errors.Transactions.CantBroadcast, function(err) {
res.status(422).send(err.message);
});
};
/*
* Returns a list of transactions given certain request options
*/
Transactions.list = function(req, res) {
var opts = {};
opts.address = req.address;
node.listTransactions(opts)
.then(function(transactions) {
res.send(transactions);
});
};
var buildIOHelper = function(name) {
$.checkArgument(name === 'inputs' || name === 'outputs');
return function(req, res) {
$.checkState(req.tx instanceof Transaction);
if (_.isNumber(req.index)) {
if (req.index >= req.tx[name].length) {
res.status(404).send('Transaction ' + name.substring(0, name.length - 1) + ' ' + req.index +
' for ' + req.tx.id + ' not found, it only has ' + req.tx[name].length + ' ' + name + '.');
return;
}
res.send(req.tx[name][req.index].toJSON());
return;
}
res.send(req.tx[name].map(function(x) {
return x.toJSON();
}));
};
};
/**
* Returns a transaction's outputs
*/
Transactions.getInputs = buildIOHelper('inputs');
/**
* Returns a transaction's outputs
*/
Transactions.getOutputs = buildIOHelper('outputs');
/**
* errors
*/
Transaction._sendError = function(res) {
res.status(422);
res.send('/v1/transactions/send parameter must be a raw transaction hex');
};
Transactions.getTxError = function(req, res) {
res.status(422);
res.send('/v1/transactions/ parameter must be a 64 digit hex');
};
Transactions.indexError = function(req, res) {
res.status(422);
res.send('index parameter must be a positive integer');
};
module.exports = Transactions;