UNPKG

bfx-api-node-models

Version:

Object models for usage with the Bitfinex node API

112 lines (100 loc) 2.75 kB
'use strict' const _flatten = require('lodash/flatten') const _isArray = require('lodash/isArray') const _isObject = require('lodash/isObject') const _isFinite = require('lodash/isFinite') const numberValidator = require('./validators/number') const dateValidator = require('./validators/date') const amountValidator = require('./validators/amount') const priceValidator = require('./validators/price') const Model = require('./model') const TRADING_FIELDS = { id: 0, mts: 1, amount: 2, price: 3 } const FUNDING_FIELDS = { id: 0, mts: 1, amount: 2, rate: 3, period: 4 } /** * Public Trade model, supporting both funding & ordinary trades */ class PublicTrade extends Model { /** * @param {object|Array} data - public trade data */ constructor (data = {}) { if (_isArray(data)) { if (data.length === 5) { super({ data, fields: FUNDING_FIELDS }) } else { super({ data, fields: TRADING_FIELDS }) } } else if (_isObject(data)) { if (data.rate) { super({ data, fields: FUNDING_FIELDS }) } else { super({ data, fields: TRADING_FIELDS }) } } else { throw new Error('unknown data type') } } /** * @param {object[]|object|Array[]|Array} data - data to convert to POJO * @returns {object} pojo */ static unserialize (data) { if ((_isArray(data[0]) && data[0].length === 5) || (_isObject(data[0]) && data[0].rate) || data.length === 5) { return super.unserialize({ data, fields: FUNDING_FIELDS }) } else { return super.unserialize({ data, fields: TRADING_FIELDS }) } } /** * @returns {string} str */ toString () { const { id, mts, amount, price } = this return _flatten([ `(${id})`, new Date(mts).toLocaleString(), [amount, '@', price] ]).join(' ') } /** * Validates a given public trade instance * * @param {object[]|object|PublicTrade[]|PublicTrade|Array} data - instance to validate * @returns {string} error - null if instance is valid */ static validate (data) { const { rate } = data return super.validate({ data, fields: _isFinite(rate) ? FUNDING_FIELDS : TRADING_FIELDS, validators: _isFinite(rate) ? { id: numberValidator, mts: dateValidator, amount: amountValidator, rate: priceValidator, period: numberValidator } : { id: numberValidator, mts: dateValidator, amount: amountValidator, price: priceValidator } }) } } module.exports = PublicTrade module.exports.TRADING_FIELDS = TRADING_FIELDS module.exports.FUNDING_FIELDS = FUNDING_FIELDS