bfx-api-node-models
Version:
Object models for usage with the Bitfinex node API
110 lines (100 loc) • 3.02 kB
JavaScript
'use strict'
const _isUndefined = require('lodash/isUndefined')
const _isFinite = require('lodash/isFinite')
const _flatten = require('lodash/flatten')
const _compact = require('lodash/compact')
const numberValidator = require('./validators/number')
const dateValidator = require('./validators/date')
const amountValidator = require('./validators/amount')
const currencyValidator = require('./validators/currency')
const stringValidator = require('./validators/string')
const priceValidator = require('./validators/price')
const boolValidator = require('./validators/bool')
const symbolValidator = require('./validators/symbol')
const Order = require('./order')
const Model = require('./model')
const boolFields = ['maker']
const fields = {
id: 0,
symbol: 1,
mtsCreate: 2,
orderID: 3,
execAmount: 4,
execPrice: 5,
orderType: 6,
orderPrice: 7,
maker: 8,
fee: 9,
feeCurrency: 10
}
/**
* Private Trade model
*/
class Trade extends Model {
/**
* @param {object|Array} data - trade data
* @param {number} data.id - id
* @param {string} data.symbol - symbol
* @param {number} data.mtsCreate - creation timestamp
* @param {number} data.orderID - order ID
* @param {string} data.execAmount - executed amount
* @param {string} data.execPrice - execution price
* @param {string} data.orderType - order type
* @param {string} data.orderPrice - order price
* @param {number|boolean} data.maker - maker flag
* @param {string} data.fee - fee amount
* @param {string} data.feeCurrency - fee currency
*/
constructor (data = {}) {
super({ data, fields, boolFields })
}
/**
* @param {object[]|object|Array[]|Array} data - data to convert to POJO
* @returns {object} pojo
*/
static unserialize (data) {
return super.unserialize({ data, fields, boolFields })
}
/**
* @returns {string} str
*/
toString () {
const {
id, symbol, mtsCreate, execAmount, execPrice, maker, fee, feeCurrency
} = this
return _compact(_flatten([
`(${id})`,
symbol,
new Date(mtsCreate).toLocaleString(),
[execAmount, '@', execPrice],
(!_isUndefined(maker)) && maker ? 'maker' : 'taker',
_isFinite(fee) && [fee, feeCurrency]
])).join(' ')
}
/**
* Validates a given trade instance
*
* @param {object[]|object|PublicTrade[]|PublicTrade|Array} data - instance to validate
* @returns {string} error - null if instance is valid
*/
static validate (data) {
return super.validate({
data,
fields,
validators: {
id: numberValidator,
symbol: symbolValidator,
mtsCreate: dateValidator,
orderID: stringValidator,
execAmount: amountValidator,
execPrice: priceValidator,
orderType: v => stringValidator(v, Object.values(Order.type)),
orderPrice: priceValidator,
maker: boolValidator,
fee: numberValidator,
feeCurrency: currencyValidator
}
})
}
}
module.exports = Trade