这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions test/1-api.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1719,4 +1719,50 @@ describe('API', () => {
'note'
])
})

it('it should be successfully performed by the getWeightedAveragesReport method', async function () {
this.timeout(120000)

const paramsArr = [
{ end, start },
{
end,
start: end - (10 * 60 * 60 * 1000),
symbol: ['tBTCUSD']
}
]

for (const params of paramsArr) {
const res = await agent
.post(`${basePath}/json-rpc`)
.type('json')
.send({
auth,
method: 'getWeightedAveragesReport',
params,
id: 5
})
.expect('Content-Type', /json/)
.expect(200)

assert.isObject(res.body)
assert.propertyVal(res.body, 'id', 5)
assert.isObject(res.body.result)
assert.isArray(res.body.result.res)
assert.isBoolean(res.body.result.nextPage)

const resItem = res.body.result.res[0]

assert.isObject(resItem)
assert.containsAllKeys(resItem, [
'symbol',
'buyingWeightedPrice',
'buyingAmount',
'sellingWeightedPrice',
'sellingAmount',
'cumulativeWeightedPrice',
'cumulativeAmount'
])
}
})
})
30 changes: 29 additions & 1 deletion test/4-queue-base.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,13 @@ const auth = {
apiKey: 'fake',
apiSecret: 'fake'
}
const mockDataAmount = 10000

describe('Queue', () => {
before(async function () {
this.timeout(20000)

mockRESTv2Srv = createMockRESTv2SrvWithDate(start, end, 10000)
mockRESTv2Srv = createMockRESTv2SrvWithDate(start, end, mockDataAmount)

await rmAllFiles(tempDirPath)
await rmDB(dbDirPath)
Expand Down Expand Up @@ -819,6 +820,33 @@ describe('Queue', () => {
await testMethodOfGettingCsv(procPromise, aggrPromise, res)
})

it('it should be successfully performed by the getWeightedAveragesReportCsv method', async function () {
this.timeout(60000)

const procPromise = queueToPromise(processorQueue)
const aggrPromise = queueToPromise(aggregatorQueue)

const _start = end - ((end - start) / (mockDataAmount / 2000))

const res = await agent
.post(`${basePath}/json-rpc`)
.type('json')
.send({
auth,
method: 'getWeightedAveragesReportCsv',
params: {
end,
start: _start,
email
},
id: 5
})
.expect('Content-Type', /json/)
.expect(200)

await testMethodOfGettingCsv(procPromise, aggrPromise, res)
})

it('it should not be successfully auth by the getLedgersCsv method', async function () {
this.timeout(60000)

Expand Down
19 changes: 18 additions & 1 deletion workers/loc.api/di/app.deps.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ const generateCsv = require('../generate-csv')
const CsvJobData = require('../generate-csv/csv.job.data')
const Interrupter = require('../interrupter')
const AbstractWSEventEmitter = require('../abstract.ws.event.emitter')
const {
weightedAveragesReportCsvWriter
} = require('../generate-csv/csv-writer')
const WeightedAveragesReport = require('../weighted.averages.report')

module.exports = ({
rService,
Expand All @@ -45,7 +49,8 @@ module.exports = ({
['_grcBfxReq', TYPES.GrcBfxReq],
['_prepareApiResponse', TYPES.PrepareApiResponse],
['_generateCsv', TYPES.GenerateCsv],
['_hasGrcService', TYPES.HasGrcService]
['_hasGrcService', TYPES.HasGrcService],
['_weightedAveragesReport', TYPES.WeightedAveragesReport]
])
bind(TYPES.RServiceDepsSchemaAliase)
.toDynamicValue((ctx) => {
Expand Down Expand Up @@ -180,5 +185,17 @@ module.exports = ({
.to(Interrupter)
bind(TYPES.AbstractWSEventEmitter)
.to(AbstractWSEventEmitter)
bind(TYPES.WeightedAveragesReportCsvWriter)
.toConstantValue(
bindDepsToFn(
weightedAveragesReportCsvWriter,
[
TYPES.RService,
TYPES.GetDataFromApi
]
)
)
bind(TYPES.WeightedAveragesReport)
.to(WeightedAveragesReport)
})
}
4 changes: 3 additions & 1 deletion workers/loc.api/di/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ module.exports = {
CsvJobData: Symbol.for('CsvJobData'),
Interrupter: Symbol.for('Interrupter'),
AbstractWSEventEmitter: Symbol.for('AbstractWSEventEmitter'),
GetDataFromApi: Symbol.for('GetDataFromApi')
GetDataFromApi: Symbol.for('GetDataFromApi'),
WeightedAveragesReport: Symbol.for('WeightedAveragesReport'),
WeightedAveragesReportCsvWriter: Symbol.for('WeightedAveragesReportCsvWriter')
}
9 changes: 9 additions & 0 deletions workers/loc.api/generate-csv/csv-writer/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
'use strict'

const weightedAveragesReportCsvWriter = require(
'./weighted-averages-report-csv-writer'
)

module.exports = {
weightedAveragesReportCsvWriter
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
'use strict'

const { pipeline } = require('stream')
const { stringify } = require('csv')

const {
write
} = require('../../queue/write-data-to-stream/helpers')

const nope = () => {}

module.exports = (
rService,
getDataFromApi
) => async (
wStream,
jobData
) => {
const queue = rService.ctx.lokue_aggregator.q
const {
args,
columnsCsv,
formatSettings,
name
} = jobData ?? {}
const { params } = args ?? {}

queue.emit('progress', 0)

if (typeof jobData === 'string') {
const stringifier = stringify(
{ columns: ['mess'] }
)

pipeline(stringifier, wStream, nope)
write([{ mess: jobData }], stringifier)
queue.emit('progress', 100)
stringifier.end()

return
}

wStream.setMaxListeners(50)

const headerStringifier = stringify(
{ columns: ['empty', 'buy', 'empty', 'sell', 'empty', 'cumulative', 'empty'] }
)
const resStringifier = stringify({
header: true,
columns: columnsCsv
})

pipeline(headerStringifier, wStream, nope)
pipeline(resStringifier, wStream, nope)

const { res } = await getDataFromApi({
getData: rService[name].bind(rService),
args,
callerName: 'CSV_WRITER'
})

write(
[{ empty: '', buy: 'Buy', sell: 'Sell', cumulative: 'Cumulative' }],
headerStringifier
)
write(
res,
resStringifier,
formatSettings,
params
)

queue.emit('progress', 100)

headerStringifier.end()
resStringifier.end()
}
51 changes: 49 additions & 2 deletions workers/loc.api/generate-csv/csv.job.data.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,16 @@ const {
} = require('../errors')

const depsTypes = (TYPES) => [
TYPES.RService
TYPES.RService,
TYPES.WeightedAveragesReportCsvWriter
]
class CsvJobData {
constructor (rService) {
constructor (
rService,
weightedAveragesReportCsvWriter
) {
this.rService = rService
this.weightedAveragesReportCsvWriter = weightedAveragesReportCsvWriter
}

async getTradesCsvJobData (
Expand Down Expand Up @@ -1027,6 +1032,48 @@ class CsvJobData {
jobsData
}
}

async getWeightedAveragesReportCsvJobData (
args,
uId,
uInfo
) {
checkParams(args, 'paramsSchemaForWeightedAveragesReportApiCsv')

const {
userId,
userInfo
} = await checkJobAndGetUserData(
this.rService,
uId,
uInfo
)

const csvArgs = getCsvArgs(args)

const jobData = {
userInfo,
userId,
name: 'getWeightedAveragesReport',
fileNamesMap: [['getWeightedAveragesReport', 'weighted-averages-report']],
args: csvArgs,
columnsCsv: {
symbol: 'PAIR',
buyingWeightedPrice: 'WEIGHTED PRICE',
buyingAmount: 'AMOUNT',
sellingWeightedPrice: 'WEIGHTED PRICE',
sellingAmount: 'AMOUNT',
cumulativeWeightedPrice: 'WEIGHTED PRICE',
cumulativeAmount: 'AMOUNT'
},
formatSettings: {
symbol: 'symbol'
},
csvCustomWriter: this.weightedAveragesReportCsvWriter
}

return jobData
}
}

decorateInjectable(CsvJobData, depsTypes)
Expand Down
31 changes: 30 additions & 1 deletion workers/loc.api/helpers/schema.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
'use strict'

const { cloneDeep } = require('lodash')

const _publicTradesSymbol = {
type: ['string', 'array'],
if: {
Expand Down Expand Up @@ -129,6 +131,21 @@ const paramsSchemaForCandlesApi = {
}
}

const paramsSchemaForWeightedAveragesReportApi = {
type: 'object',
properties: {
start: {
type: 'integer'
},
end: {
type: 'integer'
},
symbol: {
type: ['string', 'array']
}
}
}

const paramsSchemaForCandlesCsv = {
type: 'object',
properties: {
Expand Down Expand Up @@ -321,6 +338,16 @@ const paramsSchemaForOrderTradesCsv = {
}
}

const paramsSchemaForWeightedAveragesReportApiCsv = {
type: 'object',
properties: {
...cloneDeep(paramsSchemaForWeightedAveragesReportApi.properties),
timezone,
dateFormat,
language
}
}

module.exports = {
paramsSchemaForApi,
paramsSchemaForCsv,
Expand All @@ -339,5 +366,7 @@ module.exports = {
paramsSchemaForStatusMessagesApi,
paramsSchemaForStatusMessagesCsv,
paramsSchemaForCandlesApi,
paramsSchemaForCandlesCsv
paramsSchemaForCandlesCsv,
paramsSchemaForWeightedAveragesReportApi,
paramsSchemaForWeightedAveragesReportApiCsv
}
18 changes: 18 additions & 0 deletions workers/loc.api/service.report.js
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,15 @@ class ReportService extends Api {
}, 'getChangeLogs', args, cb)
}

getWeightedAveragesReport (space, args, cb) {
return this._responder(async () => {
checkParams(args, 'paramsSchemaForWeightedAveragesReportApi')

return this._weightedAveragesReport
.getWeightedAveragesReport(args)
}, 'getWeightedAveragesReport', args, cb)
}

getMultipleCsv (space, args, cb) {
return this._responder(() => {
return this._generateCsv(
Expand Down Expand Up @@ -790,6 +799,15 @@ class ReportService extends Api {
)
}, 'getChangeLogsCsv', args, cb)
}

getWeightedAveragesReportCsv (space, args, cb) {
return this._responder(() => {
return this._generateCsv(
'getWeightedAveragesReportCsvJobData',
args
)
}, 'getWeightedAveragesReportCsv', args, cb)
}
}

module.exports = ReportService
Loading