diff --git a/package-lock.json b/package-lock.json index 479a970a..44aaff5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bfx-report", - "version": "4.12.5", + "version": "4.12.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bfx-report", - "version": "4.12.5", + "version": "4.12.6", "license": "Apache-2.0", "dependencies": { "ajv": "8.17.1", diff --git a/package.json b/package.json index c8913826..695d3e47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bfx-report", - "version": "4.12.5", + "version": "4.12.6", "description": "Reporting tool", "main": "worker.js", "license": "Apache-2.0", diff --git a/workers/loc.api/data-validator/filter-schemas/getCandlesReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getCandlesReqFilter.js new file mode 100644 index 00000000..d79415e3 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getCandlesReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_CANDLES_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getChangeLogsReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getChangeLogsReqFilter.js new file mode 100644 index 00000000..44bf215c --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getChangeLogsReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_CHANGE_LOGS_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getFundingCreditHistoryReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getFundingCreditHistoryReqFilter.js new file mode 100644 index 00000000..83c23235 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getFundingCreditHistoryReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_FUNDING_CREDIT_HISTORY_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getFundingLoanHistoryReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getFundingLoanHistoryReqFilter.js new file mode 100644 index 00000000..89706043 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getFundingLoanHistoryReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_FUNDING_LOAN_HISTORY_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getFundingOfferHistoryReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getFundingOfferHistoryReqFilter.js new file mode 100644 index 00000000..48a386a5 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getFundingOfferHistoryReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_FUNDING_OFFER_HISTORY_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getFundingTradesReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getFundingTradesReqFilter.js new file mode 100644 index 00000000..46ad9ce8 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getFundingTradesReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_FUNDING_TRADES_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getLedgersReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getLedgersReqFilter.js new file mode 100644 index 00000000..4d2672b1 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getLedgersReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_LEDGERS_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getLoginsReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getLoginsReqFilter.js new file mode 100644 index 00000000..08620cef --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getLoginsReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_LOGINS_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getMovementsReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getMovementsReqFilter.js new file mode 100644 index 00000000..babcc835 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getMovementsReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_MOVEMENTS_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getOrdersReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getOrdersReqFilter.js new file mode 100644 index 00000000..53b550e9 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getOrdersReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_ORDERS_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getPayInvoiceListReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getPayInvoiceListReqFilter.js new file mode 100644 index 00000000..e1c39b40 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getPayInvoiceListReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_PAY_INVOICE_LIST_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getPositionsHistoryReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getPositionsHistoryReqFilter.js new file mode 100644 index 00000000..76dba1db --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getPositionsHistoryReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_POSITIONS_HISTORY_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getPublicTradesReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getPublicTradesReqFilter.js new file mode 100644 index 00000000..1616c607 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getPublicTradesReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_PUBLIC_TRADES_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getStatusMessagesReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getStatusMessagesReqFilter.js new file mode 100644 index 00000000..23a670f5 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getStatusMessagesReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_STATUS_MESSAGES_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getTickersHistoryReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getTickersHistoryReqFilter.js new file mode 100644 index 00000000..eb6bdbb7 --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getTickersHistoryReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_TICKERS_HISTORY_REQ_FILTER +) diff --git a/workers/loc.api/data-validator/filter-schemas/getTradesReqFilter.js b/workers/loc.api/data-validator/filter-schemas/getTradesReqFilter.js new file mode 100644 index 00000000..673da4bc --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/getTradesReqFilter.js @@ -0,0 +1,8 @@ +'use strict' + +const FILTER_SCHEMA_IDS = require('../filter.schema.ids') +const { getFilterSchema } = require('./helpers') + +module.exports = getFilterSchema( + FILTER_SCHEMA_IDS.GET_TRADES_REQ_FILTER +) diff --git a/workers/loc.api/helpers/filter-models.js b/workers/loc.api/data-validator/filter-schemas/helpers/filter-models.js similarity index 87% rename from workers/loc.api/helpers/filter-models.js rename to workers/loc.api/data-validator/filter-schemas/helpers/filter-models.js index 18033822..ca03c41d 100644 --- a/workers/loc.api/helpers/filter-models.js +++ b/workers/loc.api/data-validator/filter-schemas/helpers/filter-models.js @@ -1,20 +1,10 @@ 'use strict' -const FILTER_MODELS_NAMES = require('./filter.models.names') +const FILTER_SCHEMA_IDS = require('../../filter.schema.ids') module.exports = new Map([ [ - FILTER_MODELS_NAMES.TICKERS_HISTORY, - { - symbol: { type: 'string' }, - bid: { type: 'number' }, - bidPeriod: { type: 'integer' }, - ask: { type: 'number' }, - mtsUpdate: { type: 'integer' } - } - ], - [ - FILTER_MODELS_NAMES.POSITIONS_HISTORY, + FILTER_SCHEMA_IDS.GET_POSITIONS_HISTORY_REQ_FILTER, { id: { type: 'integer' }, symbol: { type: 'string' }, @@ -34,7 +24,23 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.LEDGERS, + FILTER_SCHEMA_IDS.GET_TRADES_REQ_FILTER, + { + id: { type: 'integer' }, + symbol: { type: 'string' }, + mtsCreate: { type: 'integer' }, + orderID: { type: 'integer' }, + execAmount: { type: 'number' }, + execPrice: { type: 'number' }, + orderType: { type: 'string' }, + orderPrice: { type: 'number' }, + maker: { type: 'integer' }, + fee: { type: 'number' }, + feeCurrency: { type: 'string' } + } + ], + [ + FILTER_SCHEMA_IDS.GET_LEDGERS_REQ_FILTER, { id: { type: 'integer' }, currency: { type: 'string' }, @@ -48,23 +54,17 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.TRADES, + FILTER_SCHEMA_IDS.GET_TICKERS_HISTORY_REQ_FILTER, { - id: { type: 'integer' }, symbol: { type: 'string' }, - mtsCreate: { type: 'integer' }, - orderID: { type: 'integer' }, - execAmount: { type: 'number' }, - execPrice: { type: 'number' }, - orderType: { type: 'string' }, - orderPrice: { type: 'number' }, - maker: { type: 'integer' }, - fee: { type: 'number' }, - feeCurrency: { type: 'string' } + bid: { type: 'number' }, + bidPeriod: { type: 'integer' }, + ask: { type: 'number' }, + mtsUpdate: { type: 'integer' } } ], [ - FILTER_MODELS_NAMES.FUNDING_TRADES, + FILTER_SCHEMA_IDS.GET_FUNDING_TRADES_REQ_FILTER, { id: { type: 'integer' }, symbol: { type: 'string' }, @@ -77,7 +77,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.PUBLIC_TRADES, + FILTER_SCHEMA_IDS.GET_PUBLIC_TRADES_REQ_FILTER, { id: { type: 'integer' }, mts: { type: 'integer' }, @@ -88,7 +88,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.ORDERS, + FILTER_SCHEMA_IDS.GET_ORDERS_REQ_FILTER, { id: { type: 'integer' }, gid: { type: 'integer' }, @@ -112,7 +112,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.MOVEMENTS, + FILTER_SCHEMA_IDS.GET_MOVEMENTS_REQ_FILTER, { id: { type: 'integer' }, currency: { type: 'string' }, @@ -129,7 +129,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.FUNDING_OFFER_HISTORY, + FILTER_SCHEMA_IDS.GET_FUNDING_OFFER_HISTORY_REQ_FILTER, { id: { type: 'integer' }, symbol: { type: 'string' }, @@ -150,7 +150,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.FUNDING_LOAN_HISTORY, + FILTER_SCHEMA_IDS.GET_FUNDING_LOAN_HISTORY_REQ_FILTER, { id: { type: 'integer' }, symbol: { type: 'string' }, @@ -172,7 +172,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.FUNDING_CREDIT_HISTORY, + FILTER_SCHEMA_IDS.GET_FUNDING_CREDIT_HISTORY_REQ_FILTER, { id: { type: 'integer' }, symbol: { type: 'string' }, @@ -195,7 +195,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.STATUS_MESSAGES, + FILTER_SCHEMA_IDS.GET_STATUS_MESSAGES_REQ_FILTER, { key: { type: 'string' }, timestamp: { type: 'integer' }, @@ -209,7 +209,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.LOGINS, + FILTER_SCHEMA_IDS.GET_LOGINS_REQ_FILTER, { id: { type: 'integer' }, time: { type: 'integer' }, @@ -217,7 +217,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.CHANGE_LOGS, + FILTER_SCHEMA_IDS.GET_CHANGE_LOGS_REQ_FILTER, { mtsCreate: { type: 'integer' }, log: { type: 'string' }, @@ -226,7 +226,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.CANDLES, + FILTER_SCHEMA_IDS.GET_CANDLES_REQ_FILTER, { mts: { type: 'integer' }, open: { type: 'number' }, @@ -237,7 +237,7 @@ module.exports = new Map([ } ], [ - FILTER_MODELS_NAMES.PAY_INVOICE_LIST, + FILTER_SCHEMA_IDS.GET_PAY_INVOICE_LIST_REQ_FILTER, { id: { type: 'string' }, t: { type: 'integer' }, diff --git a/workers/loc.api/helpers/check-filter-params.js b/workers/loc.api/data-validator/filter-schemas/helpers/get-filter-schema.js similarity index 59% rename from workers/loc.api/helpers/check-filter-params.js rename to workers/loc.api/data-validator/filter-schemas/helpers/get-filter-schema.js index ee82e58b..b5359581 100644 --- a/workers/loc.api/helpers/check-filter-params.js +++ b/workers/loc.api/data-validator/filter-schemas/helpers/get-filter-schema.js @@ -1,31 +1,32 @@ 'use strict' -const Ajv = require('ajv') - const { - FilterParamsValidSchemaFindingError, - ArgsParamsFilterError -} = require('../errors') + FilterParamsValidSchemaFindingError +} = require('../../../errors') +const FILTER_CONDITIONS = require('../../../helpers/filter.conditions') const _filterModels = require('./filter-models') -const FILTER_MODELS_NAMES = require('./filter.models.names') -const FILTER_CONDITIONS = require('./filter.conditions') -const _getModel = ( - name, +const getFilterModel = ( + filterSchemaId, filterModels = _filterModels ) => { if ( - !name || - typeof name !== 'string' || - !filterModels.has(name) + !filterSchemaId || + typeof filterSchemaId !== 'string' || + !filterModels.has(filterSchemaId) ) { throw new FilterParamsValidSchemaFindingError() } - return { ...filterModels.get(name) } + return filterModels.get(filterSchemaId) } -const _getFilterSchema = (model = {}) => { +module.exports = ( + filterSchemaId, + filterModels = _filterModels +) => { + const model = getFilterModel(filterSchemaId, filterModels) + if ( !model || typeof model !== 'object' || @@ -78,6 +79,7 @@ const _getFilterSchema = (model = {}) => { [FILTER_CONDITIONS.IS_NOT_NULL]: fieldsArrSchema } const filterSchema = { + $id: filterSchemaId, oneOf: [ { type: 'object', @@ -100,45 +102,3 @@ const _getFilterSchema = (model = {}) => { return filterSchema } - -const _getMethodApiName = (methodApi) => { - if ( - methodApi === FILTER_MODELS_NAMES.POSITIONS_AUDIT || - methodApi === FILTER_MODELS_NAMES.POSITIONS_SNAPSHOT - ) { - return FILTER_MODELS_NAMES.POSITIONS_HISTORY - } - if (methodApi === FILTER_MODELS_NAMES.ORDER_TRADES) { - return FILTER_MODELS_NAMES.TRADES - } - - return methodApi -} - -module.exports = ( - methodApi, - args = {}, - filterModels -) => { - const { params } = { ...args } - const { filter } = { ...params } - - if ( - !filter || - typeof filter !== 'object' || - Object.keys(filter).length === 0 - ) { - return - } - - const ajv = new Ajv({ allowUnionTypes: true }) - const methodName = _getMethodApiName(methodApi) - const model = _getModel(methodName, filterModels) - const filterSchema = _getFilterSchema(model) - - if (ajv.validate(filterSchema, filter)) { - return - } - - throw new ArgsParamsFilterError({ data: ajv.errors }) -} diff --git a/workers/loc.api/data-validator/filter-schemas/helpers/index.js b/workers/loc.api/data-validator/filter-schemas/helpers/index.js new file mode 100644 index 00000000..d0ebd35f --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/helpers/index.js @@ -0,0 +1,9 @@ +'use strict' + +const filterModels = require('./filter-models') +const getFilterSchema = require('./get-filter-schema') + +module.exports = { + filterModels, + getFilterSchema +} diff --git a/workers/loc.api/data-validator/filter-schemas/index.js b/workers/loc.api/data-validator/filter-schemas/index.js new file mode 100644 index 00000000..bd3c352f --- /dev/null +++ b/workers/loc.api/data-validator/filter-schemas/index.js @@ -0,0 +1,9 @@ +'use strict' + +const FILTER_SCHEMA_NAMES = require('../filter.schema.names') +const { requireSchemas } = require('../helpers') + +module.exports = requireSchemas( + FILTER_SCHEMA_NAMES, + __dirname +) diff --git a/workers/loc.api/data-validator/filter.schema.ids.js b/workers/loc.api/data-validator/filter.schema.ids.js new file mode 100644 index 00000000..646ef8c3 --- /dev/null +++ b/workers/loc.api/data-validator/filter.schema.ids.js @@ -0,0 +1,6 @@ +'use strict' + +const FILTER_SCHEMA_NAMES = require('./filter.schema.names') +const { getSchemaIds } = require('./helpers') + +module.exports = getSchemaIds(FILTER_SCHEMA_NAMES) diff --git a/workers/loc.api/data-validator/filter.schema.names.js b/workers/loc.api/data-validator/filter.schema.names.js new file mode 100644 index 00000000..46bb8756 --- /dev/null +++ b/workers/loc.api/data-validator/filter.schema.names.js @@ -0,0 +1,20 @@ +'use strict' + +module.exports = { + GET_POSITIONS_HISTORY_REQ_FILTER: 'getPositionsHistoryReqFilter', + GET_TRADES_REQ_FILTER: 'getTradesReqFilter', + GET_LEDGERS_REQ_FILTER: 'getLedgersReqFilter', + GET_TICKERS_HISTORY_REQ_FILTER: 'getTickersHistoryReqFilter', + GET_FUNDING_TRADES_REQ_FILTER: 'getFundingTradesReqFilter', + GET_PUBLIC_TRADES_REQ_FILTER: 'getPublicTradesReqFilter', + GET_ORDERS_REQ_FILTER: 'getOrdersReqFilter', + GET_MOVEMENTS_REQ_FILTER: 'getMovementsReqFilter', + GET_FUNDING_OFFER_HISTORY_REQ_FILTER: 'getFundingOfferHistoryReqFilter', + GET_FUNDING_LOAN_HISTORY_REQ_FILTER: 'getFundingLoanHistoryReqFilter', + GET_FUNDING_CREDIT_HISTORY_REQ_FILTER: 'getFundingCreditHistoryReqFilter', + GET_STATUS_MESSAGES_REQ_FILTER: 'getStatusMessagesReqFilter', + GET_LOGINS_REQ_FILTER: 'getLoginsReqFilter', + GET_CHANGE_LOGS_REQ_FILTER: 'getChangeLogsReqFilter', + GET_CANDLES_REQ_FILTER: 'getCandlesReqFilter', + GET_PAY_INVOICE_LIST_REQ_FILTER: 'getPayInvoiceListReqFilter' +} diff --git a/workers/loc.api/data-validator/index.js b/workers/loc.api/data-validator/index.js index 0793445c..2fc61b5a 100644 --- a/workers/loc.api/data-validator/index.js +++ b/workers/loc.api/data-validator/index.js @@ -17,26 +17,38 @@ const { const SCHEMA_DOMAIN = require('./schema.domain') const SCHEMA_NAMES = require('./schema.names') const SCHEMA_IDS = require('./schema.ids') +const FILTER_SCHEMA_NAMES = require('./filter.schema.names') +const FILTER_SCHEMA_IDS = require('./filter.schema.ids') const schemas = require('./schemas') - -const ajv = new Ajv({ - // Compile schema on initialization - schemas: Object.values(schemas), - - // Strict mode - strict: true, - strictRequired: true, - allowMatchingProperties: true, - allowUnionTypes: true, - - $data: true, - ownProperties: true, - allErrors: true, - messages: true, - formats: { reserved: true }, - verbose: isDevEnv -}) -addFormats(ajv) +const filterSchemas = require('./filter-schemas') + +let ajv + +const init = () => { + ajv = new Ajv({ + // Compile schema on initialization + schemas: [ + ...Object.values(schemas), + ...Object.values(filterSchemas) + ], + + // Strict mode + strict: true, + strictRequired: true, + allowMatchingProperties: true, + allowUnionTypes: true, + + $data: true, + ownProperties: true, + allErrors: true, + messages: true, + formats: { reserved: true }, + verbose: isDevEnv + }) + addFormats(ajv) + + return module.exports +} const addSchemas = (schemas = []) => { const _schemas = Array.isArray(schemas) @@ -92,11 +104,37 @@ const validate = (args, schemaId, opts) => { throw new ArgsParamsError({ data: validate.errors }) } +const reinit = (args) => { + const { + schemaNames, + schemaIds, + filterSchemaNames, + filterSchemaIds, + schemas = {} + } = args ?? {} + + Object.assign(SCHEMA_NAMES, schemaNames) + Object.assign(SCHEMA_IDS, schemaIds) + Object.assign(FILTER_SCHEMA_NAMES, filterSchemaNames) + Object.assign(FILTER_SCHEMA_IDS, filterSchemaIds) + + addSchemas(Object.values(schemas)) + + return module.exports +} + module.exports = { SCHEMA_DOMAIN, SCHEMA_NAMES, SCHEMA_IDS, + FILTER_SCHEMA_NAMES, + FILTER_SCHEMA_IDS, + + schemas, + filterSchemas, + init, + reinit, addSchemas, validate } diff --git a/workers/loc.api/data-validator/schemas/defs.js b/workers/loc.api/data-validator/schemas/defs.js index 4d9b4539..d23518ed 100644 --- a/workers/loc.api/data-validator/schemas/defs.js +++ b/workers/loc.api/data-validator/schemas/defs.js @@ -151,6 +151,10 @@ module.exports = { }, method: { type: 'string' + }, + candleTimeframe: { + type: 'string', + minLength: 2 } } } diff --git a/workers/loc.api/data-validator/schemas/getCandlesFileReq.js b/workers/loc.api/data-validator/schemas/getCandlesFileReq.js index c1552202..1f7f7a78 100644 --- a/workers/loc.api/data-validator/schemas/getCandlesFileReq.js +++ b/workers/loc.api/data-validator/schemas/getCandlesFileReq.js @@ -24,8 +24,7 @@ module.exports = { $ref: 'defs#/definitions/sort' }, timeframe: { - type: 'string', - minLength: 2 + $ref: 'defs#/definitions/candleTimeframe' }, section: { type: 'string', diff --git a/workers/loc.api/data-validator/schemas/getCandlesReq.js b/workers/loc.api/data-validator/schemas/getCandlesReq.js index c79ccf8f..18d7b80e 100644 --- a/workers/loc.api/data-validator/schemas/getCandlesReq.js +++ b/workers/loc.api/data-validator/schemas/getCandlesReq.js @@ -24,8 +24,7 @@ module.exports = { $ref: 'defs#/definitions/sort' }, timeframe: { - type: 'string', - minLength: 2 + $ref: 'defs#/definitions/candleTimeframe' }, section: { type: 'string', diff --git a/workers/loc.api/di/app.deps.js b/workers/loc.api/di/app.deps.js index eed0ba6d..91c69ec6 100644 --- a/workers/loc.api/di/app.deps.js +++ b/workers/loc.api/di/app.deps.js @@ -144,7 +144,8 @@ module.exports = ({ TYPES.ReportFileJobData, TYPES.RService, TYPES.RootPath, - TYPES.CONF + TYPES.CONF, + TYPES.DataValidator ] )) bind(TYPES.WriteDataToStream).toConstantValue( diff --git a/workers/loc.api/di/core.deps.js b/workers/loc.api/di/core.deps.js index db01e483..eaa52ffb 100644 --- a/workers/loc.api/di/core.deps.js +++ b/workers/loc.api/di/core.deps.js @@ -17,6 +17,6 @@ module.exports = () => { [TYPES.CONF] ) }).inSingletonScope() - bind(TYPES.DataValidator).toConstantValue(dataValidator) + bind(TYPES.DataValidator).toConstantValue(dataValidator.init()) }) } diff --git a/workers/loc.api/generate-report-file/index.js b/workers/loc.api/generate-report-file/index.js index a6f11819..3fdda07b 100644 --- a/workers/loc.api/generate-report-file/index.js +++ b/workers/loc.api/generate-report-file/index.js @@ -1,10 +1,12 @@ 'use strict' const { - checkFilterParams, - FILTER_MODELS_NAMES, + FILTER_API_METHOD_NAMES, normalizeFilterParams } = require('../helpers') +const { + getFilterValidationSchemaId +} = require('../helpers/prepare-response/helpers') const { EmailSendingError, GrcPDFAvailabilityError @@ -62,7 +64,7 @@ const _getReportFileStoreStatus = async ({ return { isSendEmail: true } } -const _filterModelNameMap = Object.values(FILTER_MODELS_NAMES) +const _filterApiMethodNameMap = Object.values(FILTER_API_METHOD_NAMES) .reduce((map, name) => { const baseName = `${name[0].toUpperCase()}${name.slice(1)}` const key = `get${baseName}FileJobData` @@ -84,17 +86,17 @@ const _truncateFileNameEnding = (name) => { return `${cleanedName[0].toLowerCase()}${cleanedName.slice(1)}` } -const _getFilterModelNamesAndArgs = ( +const _getFilterApiMethodNamesAndArgs = ( name, reqArgs ) => { if (name !== 'getMultipleFileJobData') { - const filterModelName = _filterModelNameMap.get(name) + const filterApiMethodName = _filterApiMethodNameMap.get(name) const truncatedName = _truncateFileNameEnding(name) const args = normalizeFilterParams(truncatedName, reqArgs) return [{ - filterModelName, + filterApiMethodName, args }] } @@ -110,10 +112,10 @@ const _getFilterModelNamesAndArgs = ( const name = `${method}JobData` const truncatedName = _truncateFileNameEnding(method) const args = normalizeFilterParams(truncatedName, { params }) - const filterModelName = _filterModelNameMap.get(name) + const filterApiMethodName = _filterApiMethodNameMap.get(name) return { - filterModelName, + filterApiMethodName, args } }) @@ -125,7 +127,8 @@ module.exports = ( reportFileJobData, rService, rootPath, - conf + conf, + dataValidator ) => async ( name, args @@ -138,13 +141,17 @@ module.exports = ( rootPath, conf }) - const checkingDataArr = _getFilterModelNamesAndArgs( + const checkingDataArr = _getFilterApiMethodNamesAndArgs( name, args ) - for (const { filterModelName, args } of checkingDataArr) { - checkFilterParams(filterModelName, args) + for (const { filterApiMethodName, args } of checkingDataArr) { + const filterSchemaId = getFilterValidationSchemaId(filterApiMethodName) + await dataValidator.validate( + { params: args?.params?.filter }, + filterSchemaId + ) } const getter = reportFileJobData[name].bind(reportFileJobData) diff --git a/workers/loc.api/generate-report-file/report.file.job.data.js b/workers/loc.api/generate-report-file/report.file.job.data.js index 466cfd5f..5616d156 100644 --- a/workers/loc.api/generate-report-file/report.file.job.data.js +++ b/workers/loc.api/generate-report-file/report.file.job.data.js @@ -50,7 +50,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'trades') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'trades', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -97,7 +103,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'fundingTrades') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'fundingTrades', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -143,7 +155,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'tickersHistory') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'tickersHistory', + extraParams: { notThrowError: true } + } + ) const symb = Array.isArray(args.params.symbol) ? args.params.symbol : [args.params.symbol] @@ -248,7 +266,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'positionsHistory') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'positionsHistory', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -302,7 +326,13 @@ class ReportFileJobData { userInfo, userId, name: 'getActivePositions', - args, + args: { + ...args, + params: { + ...args?.params, + notThrowError: true + } + }, propNameForPagination: 'mtsUpdate', columnsCsv: { id: '#', @@ -352,7 +382,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(_args, 'positionsAudit') + const reportFileArgs = getReportFileArgs( + _args, + { + method: 'positionsAudit', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -409,7 +445,13 @@ class ReportFileJobData { const isTradingPair = Array.isArray(params.symbol) ? params.symbol[0].startsWith('t') : params.symbol.startsWith('t') - const reportFileArgs = getReportFileArgs(args, 'publicTrades', { isTradingPair }) + const reportFileArgs = getReportFileArgs( + args, + { + method: 'publicTrades', + extraParams: { isTradingPair, notThrowError: true } + } + ) const columnsCsv = (isTradingPair) ? { id: '#', @@ -510,7 +552,13 @@ class ReportFileJobData { userInfo, userId, name: 'getCandles', - args, + args: { + ...args, + params: { + ...args?.params, + notThrowError: true + } + }, propNameForPagination: 'mts', columnsCsv: { mts: 'TIME', @@ -549,7 +597,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'ledgers') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'ledgers', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -597,7 +651,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'payInvoiceList') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'payInvoiceList', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -643,7 +703,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'orderTrades') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'orderTrades', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -689,7 +755,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'orders') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'orders', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -745,7 +817,13 @@ class ReportFileJobData { userInfo, userId, name: 'getActiveOrders', - args, + args: { + ...args, + params: { + ...args?.params, + notThrowError: true + } + }, propNameForPagination: null, columnsCsv: { id: '#', @@ -790,7 +868,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'movements') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'movements', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -836,7 +920,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'fundingOfferHistory') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'fundingOfferHistory', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -885,7 +975,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'fundingLoanHistory') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'fundingLoanHistory', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -936,7 +1032,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'fundingCreditHistory') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'fundingCreditHistory', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -988,7 +1090,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'logins') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'logins', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -1028,7 +1136,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'changeLogs') + const reportFileArgs = getReportFileArgs( + args, + { + method: 'changeLogs', + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, @@ -1138,7 +1252,13 @@ class ReportFileJobData { uInfo ) - const reportFileArgs = getReportFileArgs(args, 'getWeightedAverages') + const reportFileArgs = getReportFileArgs( + args, + { + isLimitUnused: true, + extraParams: { notThrowError: true } + } + ) const jobData = { userInfo, diff --git a/workers/loc.api/helpers/check-params.js b/workers/loc.api/helpers/check-params.js deleted file mode 100644 index 22de7e8d..00000000 --- a/workers/loc.api/helpers/check-params.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict' - -const { cloneDeep } = require('lib-js-util-base') -const Ajv = require('ajv') - -const schema = require('./schema') -const { - UnprocessableEntityError, - ArgsParamsError, - ParamsValidSchemaFindingError -} = require('../errors') - -module.exports = ( - args, - schemaName = 'paramsSchemaForFile', - requireFields = [], - checkParamsField = false, - additionalSchema = {} -) => { - const ajv = new Ajv({ allowUnionTypes: true }) - const extendedSchema = { ...schema, ...additionalSchema } - - if (!extendedSchema[schemaName]) { - throw new ParamsValidSchemaFindingError() - } - - const _schema = cloneDeep(extendedSchema[schemaName]) - - if ( - Array.isArray(requireFields) && - requireFields.length > 0 - ) { - if (!args.params) { - throw new ArgsParamsError() - } - - if (!Array.isArray(_schema.required)) { - _schema.required = [] - } - - requireFields.forEach(field => { - _schema.required.push(field) - }) - } - - if ( - (checkParamsField || args.params) && - !ajv.validate(_schema, args.params) - ) { - throw new ArgsParamsError({ data: ajv.errors }) - } - if ( - args.params && - typeof args.params === 'object' && - Number.isFinite(args.params.start) && - Number.isFinite(args.params.end) && - args.params.start >= args.params.end - ) { - // Use same error format like Ajv for consistency - throw new UnprocessableEntityError({ - data: [{ - instancePath: '/end', - schemaPath: '#/properties/end/type', - keyword: 'type', - params: { type: 'integer' }, - message: 'must be start < end' - }] - }) - } -} diff --git a/workers/loc.api/helpers/filter.models.names.js b/workers/loc.api/helpers/filter.api.method.names.js similarity index 100% rename from workers/loc.api/helpers/filter.models.names.js rename to workers/loc.api/helpers/filter.api.method.names.js diff --git a/workers/loc.api/helpers/index.js b/workers/loc.api/helpers/index.js index 5da352d6..499cdaf9 100644 --- a/workers/loc.api/helpers/index.js +++ b/workers/loc.api/helpers/index.js @@ -6,7 +6,6 @@ const { prepareApiResponse, prepareSymbolResponse } = require('./prepare-response') -const checkParams = require('./check-params') const { getMethodLimit, getReportFileArgs, @@ -59,10 +58,8 @@ const checkJobAndGetUserData = require( ) const grcBfxReq = require('./grc-bfx-req') const filterResponse = require('./filter-response') -const filterModels = require('./filter-models') -const checkFilterParams = require('./check-filter-params') const normalizeFilterParams = require('./normalize-filter-params') -const FILTER_MODELS_NAMES = require('./filter.models.names') +const FILTER_API_METHOD_NAMES = require('./filter.api.method.names') const FILTER_CONDITIONS = require('./filter.conditions') const getDataFromApi = require('./get-data-from-api') const splitSymbolPairs = require('./split-symbol-pairs') @@ -75,7 +72,6 @@ module.exports = { MIN_START_MTS, getDateNotMoreNow, getDateNotLessMinStart, - checkParams, hasJobInQueueWithStatusBy, isAuthError, isRateLimitError, @@ -114,10 +110,8 @@ module.exports = { checkJobAndGetUserData, grcBfxReq, filterResponse, - filterModels, - checkFilterParams, normalizeFilterParams, - FILTER_MODELS_NAMES, + FILTER_API_METHOD_NAMES, FILTER_CONDITIONS, getDataFromApi, parsePositionsAuditId, diff --git a/workers/loc.api/helpers/limit-param.helpers.js b/workers/loc.api/helpers/limit-param.helpers.js index a540b9b5..e1f4b5fd 100644 --- a/workers/loc.api/helpers/limit-param.helpers.js +++ b/workers/loc.api/helpers/limit-param.helpers.js @@ -60,20 +60,29 @@ const getMethodLimit = (sendLimit, method, methodsLimits = {}) => { return getLimitNotMoreThan(base, max) } -const getReportFileArgs = (args, method, extraParams = {}) => { +const getReportFileArgs = (args, opts) => { + const { + method, + extraParams = {}, + isLimitUnused + } = opts ?? {} + const reportFileArgs = { ...args, params: { - ...args.params, + ...args?.params, ...extraParams } } - if (method === 'getWeightedAverages') { + if (isLimitUnused) { return reportFileArgs } - reportFileArgs.params.limit = getMethodLimit({ isMax: true }, method) + reportFileArgs.params.limit = getMethodLimit( + { isMax: true }, + method + ) return reportFileArgs } diff --git a/workers/loc.api/helpers/normalize-filter-params.js b/workers/loc.api/helpers/normalize-filter-params.js index 1a7fb9f1..451275e8 100644 --- a/workers/loc.api/helpers/normalize-filter-params.js +++ b/workers/loc.api/helpers/normalize-filter-params.js @@ -2,7 +2,7 @@ const { cloneDeep } = require('lib-js-util-base') -const FILTER_MODELS_NAMES = require('./filter.models.names') +const FILTER_API_METHOD_NAMES = require('./filter.api.method.names') const FILTER_CONDITIONS = require('./filter.conditions') const _filterConditionsNames = Object @@ -58,7 +58,7 @@ const _normalizeProp = ( } const _normalizers = { - [FILTER_MODELS_NAMES.PUBLIC_TRADES] (filter) { + [FILTER_API_METHOD_NAMES.PUBLIC_TRADES] (filter) { return _normalizeProp(filter, 'rate', (val) => { return typeof val === 'string' ? Number.parseFloat(val) diff --git a/workers/loc.api/helpers/prepare-response/helpers/get-filter-validation-schema-id.js b/workers/loc.api/helpers/prepare-response/helpers/get-filter-validation-schema-id.js new file mode 100644 index 00000000..c87d0ac3 --- /dev/null +++ b/workers/loc.api/helpers/prepare-response/helpers/get-filter-validation-schema-id.js @@ -0,0 +1,54 @@ +'use strict' + +const FILTER_API_METHOD_NAMES = require('../../filter.api.method.names') +const { FILTER_SCHEMA_IDS } = require('../../../data-validator') + +const PARAMS_SCHEMAS_MAP = { + [FILTER_API_METHOD_NAMES.POSITIONS_HISTORY]: FILTER_SCHEMA_IDS + .GET_POSITIONS_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.POSITIONS_SNAPSHOT]: FILTER_SCHEMA_IDS + .GET_POSITIONS_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.POSITIONS_AUDIT]: FILTER_SCHEMA_IDS + .GET_POSITIONS_HISTORY_REQ_FILTER, + + [FILTER_API_METHOD_NAMES.TRADES]: FILTER_SCHEMA_IDS + .GET_TRADES_REQ_FILTER, + [FILTER_API_METHOD_NAMES.ORDER_TRADES]: FILTER_SCHEMA_IDS + .GET_TRADES_REQ_FILTER, + + [FILTER_API_METHOD_NAMES.LEDGERS]: FILTER_SCHEMA_IDS + .GET_LEDGERS_REQ_FILTER, + [FILTER_API_METHOD_NAMES.TICKERS_HISTORY]: FILTER_SCHEMA_IDS + .GET_TICKERS_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.FUNDING_TRADES]: FILTER_SCHEMA_IDS + .GET_FUNDING_TRADES_REQ_FILTER, + [FILTER_API_METHOD_NAMES.PUBLIC_TRADES]: FILTER_SCHEMA_IDS + .GET_PUBLIC_TRADES_REQ_FILTER, + [FILTER_API_METHOD_NAMES.ORDERS]: FILTER_SCHEMA_IDS + .GET_ORDERS_REQ_FILTER, + [FILTER_API_METHOD_NAMES.MOVEMENTS]: FILTER_SCHEMA_IDS + .GET_MOVEMENTS_REQ_FILTER, + [FILTER_API_METHOD_NAMES.FUNDING_OFFER_HISTORY]: FILTER_SCHEMA_IDS + .GET_FUNDING_OFFER_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.FUNDING_LOAN_HISTORY]: FILTER_SCHEMA_IDS + .GET_FUNDING_LOAN_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.FUNDING_CREDIT_HISTORY]: FILTER_SCHEMA_IDS + .GET_FUNDING_CREDIT_HISTORY_REQ_FILTER, + [FILTER_API_METHOD_NAMES.STATUS_MESSAGES]: FILTER_SCHEMA_IDS + .GET_STATUS_MESSAGES_REQ_FILTER, + [FILTER_API_METHOD_NAMES.LOGINS]: FILTER_SCHEMA_IDS + .GET_LOGINS_REQ_FILTER, + [FILTER_API_METHOD_NAMES.CHANGE_LOGS]: FILTER_SCHEMA_IDS + .GET_CHANGE_LOGS_REQ_FILTER, + [FILTER_API_METHOD_NAMES.CANDLES]: FILTER_SCHEMA_IDS + .GET_CANDLES_REQ_FILTER, + [FILTER_API_METHOD_NAMES.PAY_INVOICE_LIST]: FILTER_SCHEMA_IDS + .GET_PAY_INVOICE_LIST_REQ_FILTER +} + +module.exports = ( + method, + map = PARAMS_SCHEMAS_MAP +) => { + return map?.[method] +} diff --git a/workers/loc.api/helpers/prepare-response/helpers/index.js b/workers/loc.api/helpers/prepare-response/helpers/index.js index 0b2b812a..d63190d3 100644 --- a/workers/loc.api/helpers/prepare-response/helpers/index.js +++ b/workers/loc.api/helpers/prepare-response/helpers/index.js @@ -3,6 +3,7 @@ const getParamsMap = require('./get-params-map') const getParamsSchemaName = require('./get-params-schema-name') const getValidationSchemaId = require('./get-validation-schema-id') +const getFilterValidationSchemaId = require('./get-filter-validation-schema-id') const omitPrivateModelFields = require('./omit-private-model-fields') const getBfxApiMethodName = require('./get-bfx-api-method-name') const getSymbolsForFiltering = require('./get-symbols-for-filtering') @@ -14,6 +15,7 @@ module.exports = { getParamsMap, getParamsSchemaName, getValidationSchemaId, + getFilterValidationSchemaId, omitPrivateModelFields, getBfxApiMethodName, getSymbolsForFiltering, diff --git a/workers/loc.api/helpers/prepare-response/index.js b/workers/loc.api/helpers/prepare-response/index.js index d2dae441..2c6e6573 100644 --- a/workers/loc.api/helpers/prepare-response/index.js +++ b/workers/loc.api/helpers/prepare-response/index.js @@ -3,13 +3,13 @@ const { MinLimitParamError } = require('../../errors') const filterResponse = require('../filter-response') -const checkFilterParams = require('../check-filter-params') const normalizeFilterParams = require('../normalize-filter-params') const prepareSymbolResponse = require('./prepare-symbol-response') const { getValidationSchemaId, + getFilterValidationSchemaId, omitPrivateModelFields, getBfxApiMethodName, getSymbolsForFiltering, @@ -141,10 +141,14 @@ const prepareApiResponse = ( isNotMoreThanInnerMax: _isNotMoreThanInnerMax } = params ?? {} const schemaId = getValidationSchemaId(apiMethodName) + const filterSchemaId = getFilterValidationSchemaId(apiMethodName) await dataValidator.validate(reqArgs, schemaId) const args = normalizeFilterParams(apiMethodName, reqArgs) - checkFilterParams(apiMethodName, args) + await dataValidator.validate( + { params: args?.params?.filter }, + filterSchemaId + ) const symbols = getSymbolsForFiltering({ apiMethodName, symbPropName, args }) const isSyncRequest = args?.params?.isSyncRequest diff --git a/workers/loc.api/helpers/schema.js b/workers/loc.api/helpers/schema.js deleted file mode 100644 index 93ea76a9..00000000 --- a/workers/loc.api/helpers/schema.js +++ /dev/null @@ -1,378 +0,0 @@ -'use strict' - -const { cloneDeep } = require('lib-js-util-base') - -const _publicTradesSymbol = { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - maxItems: 1, - items: { - type: 'string' - } - } -} - -const paramsSchemaForApi = { - type: 'object', - properties: { - limit: { - type: 'integer' - }, - start: { - type: 'integer' - }, - end: { - type: 'integer' - }, - symbol: { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - minItems: 1, - items: { - type: 'string' - } - } - } - } -} - -const timezone = { - type: ['number', 'string'] -} -const dateFormat = { - type: 'string', - enum: [ - 'DD-MM-YY', - 'DD-MM-YYYY', - 'MM-DD-YY', - 'MM-DD-YYYY', - 'YY-MM-DD', - 'YYYY-MM-DD' - ] -} -const language = { type: 'string' } - -const paramsSchemaForPayInvoiceList = { - ...paramsSchemaForApi, - properties: { - ...paramsSchemaForApi.properties, - id: { - type: 'string' - } - } -} - -const paramsSchemaForPayInvoiceListFile = { - type: 'object', - properties: { - ...paramsSchemaForPayInvoiceList.properties, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForCandlesApi = { - type: 'object', - required: ['symbol'], - properties: { - timeframe: { - type: 'string' - }, - symbol: { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - maxItems: 1, - items: { - type: 'string' - } - } - }, - section: { - type: 'string' - }, - limit: { - type: 'integer' - }, - start: { - type: 'integer' - }, - end: { - type: 'integer' - }, - sort: { - type: 'integer' - } - } -} - -const paramsSchemaForWeightedAveragesReportApi = { - type: 'object', - properties: { - start: { - type: 'integer' - }, - end: { - type: 'integer' - }, - symbol: { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - maxItems: 1, - items: { - type: 'string' - } - } - } - } -} - -const paramsSchemaForMovementInfo = { - type: 'object', - properties: { - id: { - type: 'integer' - } - } -} - -const paramsSchemaForCandlesFile = { - type: 'object', - properties: { - ...paramsSchemaForCandlesApi.properties, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForStatusMessagesApi = { - type: 'object', - properties: { - type: { - type: 'string' - }, - symbol: { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - minItems: 1, - items: { - type: 'string' - } - } - } - } -} - -const paramsSchemaForStatusMessagesFile = { - type: 'object', - properties: { - ...paramsSchemaForStatusMessagesApi.properties, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForFile = { - ...paramsSchemaForApi, - properties: { - ...paramsSchemaForApi.properties, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForPublicTradesFile = { - ...paramsSchemaForFile, - properties: { - ...paramsSchemaForFile.properties, - symbol: _publicTradesSymbol - } -} - -const paramsSchemaForPublicTrades = { - ...paramsSchemaForApi, - properties: { - ...paramsSchemaForApi.properties, - symbol: _publicTradesSymbol - } -} - -const paramsSchemaForPositionsAudit = { - ...paramsSchemaForApi, - required: [ - ...(Array.isArray(paramsSchemaForApi.required) - ? paramsSchemaForApi.required - : [] - ), - 'id' - ], - properties: { - ...paramsSchemaForApi.properties, - id: { - type: 'array', - minItems: 1, - items: { - type: 'integer' - } - } - } -} - -const paramsSchemaForPositionsAuditFile = { - ...paramsSchemaForFile, - properties: { - ...paramsSchemaForFile.properties, - ...paramsSchemaForPositionsAudit.properties - } -} - -const paramsSchemaForWallets = { - type: 'object', - properties: { - end: { - type: 'integer' - } - } -} - -const paramsSchemaForWalletsFile = { - type: 'object', - properties: { - end: { - type: 'integer' - }, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForActivePositionsFile = { - type: 'object', - properties: { - timezone, - dateFormat, - language - } -} - -const paramsSchemaForMultipleFile = { - type: 'object', - required: ['multiExport'], - properties: { - isPDFRequired: { - type: 'boolean' - }, - email: { - type: 'string' - }, - language, - multiExport: { - type: 'array', - minItems: 1, - items: { - type: 'object', - required: ['method'], - properties: { - method: { - type: 'string' - } - } - } - } - } -} - -const paramsSchemaForOrderTradesApi = { - type: 'object', - required: ['id', 'symbol'], - properties: { - id: { - type: 'integer' - }, - limit: { - type: 'integer' - }, - start: { - type: 'integer' - }, - end: { - type: 'integer' - }, - symbol: { - type: ['string', 'array'], - if: { - type: 'array' - }, - then: { - minItems: 1, - maxItems: 1, - items: { - type: 'string' - } - } - } - } -} - -const paramsSchemaForOrderTradesFile = { - ...paramsSchemaForOrderTradesApi, - properties: { - ...paramsSchemaForOrderTradesApi.properties, - timezone, - dateFormat, - language - } -} - -const paramsSchemaForWeightedAveragesReportFile = { - type: 'object', - properties: { - ...cloneDeep(paramsSchemaForWeightedAveragesReportApi.properties), - timezone, - dateFormat, - language - } -} - -module.exports = { - paramsSchemaForApi, - paramsSchemaForFile, - paramsSchemaForPayInvoiceList, - paramsSchemaForPayInvoiceListFile, - paramsSchemaForPublicTradesFile, - paramsSchemaForPublicTrades, - paramsSchemaForPositionsAudit, - paramsSchemaForPositionsAuditFile, - paramsSchemaForWallets, - paramsSchemaForWalletsFile, - paramsSchemaForMultipleFile, - paramsSchemaForActivePositionsFile, - paramsSchemaForOrderTradesApi, - paramsSchemaForOrderTradesFile, - paramsSchemaForStatusMessagesApi, - paramsSchemaForStatusMessagesFile, - paramsSchemaForCandlesApi, - paramsSchemaForCandlesFile, - paramsSchemaForWeightedAveragesReportApi, - paramsSchemaForWeightedAveragesReportFile, - paramsSchemaForMovementInfo -} diff --git a/workers/loc.api/queue/write-data-to-stream/helpers.js b/workers/loc.api/queue/write-data-to-stream/helpers.js index 218e1527..80db494e 100644 --- a/workers/loc.api/queue/write-data-to-stream/helpers.js +++ b/workers/loc.api/queue/write-data-to-stream/helpers.js @@ -170,16 +170,6 @@ const writeMessageToStream = ( } const setDefaultParams = (args, method) => { - if (method === 'getWallets') { - args.params.end = args.params.end - ? Math.min(args.params.end, Date.now()) - : Date.now() - - return - } - - args.params.notThrowError = true - if (method === 'getStatusMessages') { return } @@ -187,6 +177,15 @@ const setDefaultParams = (args, method) => { args.params.end = args.params.end ? Math.min(args.params.end, Date.now()) : Date.now() + + if ( + method === 'getWallets' || + method === 'getPositionsSnapshot' || + method === 'getFullSnapshotReport' + ) { + return + } + args.params.start = args.params.start ? args.params.start : 0 diff --git a/workers/loc.api/service.report.js b/workers/loc.api/service.report.js index 5ac9aae9..99a4b154 100644 --- a/workers/loc.api/service.report.js +++ b/workers/loc.api/service.report.js @@ -7,10 +7,12 @@ const { parseLoginsExtraDataFields, accountCache, getTimezoneConf, - filterModels, parsePositionsAuditId, prepareSymbolResponse } = require('./helpers') +const { + filterModels +} = require('./data-validator/filter-schemas/helpers') const { omitPrivateModelFields } = require('./helpers/prepare-response/helpers') @@ -71,8 +73,10 @@ class ReportService extends Api { return rest.futures() } - _getCurrencies () { - const rest = this._getREST({}) + _getCurrencies (args) { + const rest = this._getREST({}, { + interrupter: args?.interrupter + }) return rest.currencies() }