diff --git a/tests/unit/handlers/metrics.handlers.test.js b/tests/unit/handlers/metrics.handlers.test.js index 9a6355b..8b3f1a0 100644 --- a/tests/unit/handlers/metrics.handlers.test.js +++ b/tests/unit/handlers/metrics.handlers.test.js @@ -1127,6 +1127,34 @@ test('getPowerModeTimeline - always uses t-miner tag', async (t) => { t.pass() }) +test('getPowerModeTimeline - returns all results without truncation', async (t) => { + const mockCtx = { + conf: { + orks: [{ rpcPublicKey: 'key1' }] + }, + net_r0: { + jRequest: async () => { + const entries = [] + for (let i = 0; i < 5; i++) { + entries.push({ + ts: 1700000000000 + i * 10800000, + power_mode_group_aggr: { [`cont${i}-miner1`]: 'normal' }, + status_group_aggr: { [`cont${i}-miner1`]: 'mining' } + }) + } + return entries + } + } + } + + const result = await getPowerModeTimeline(mockCtx, { + query: { start: 1700000000000, end: 1700100000000 } + }) + + t.is(result.log.length, 5, 'should return all results') + t.pass() +}) + test('processPowerModeTimelineData - filters by container post-RPC', (t) => { const results = [[ { diff --git a/workers/http.node.wrk.js b/workers/http.node.wrk.js index aa2b95e..a4f80f0 100644 --- a/workers/http.node.wrk.js +++ b/workers/http.node.wrk.js @@ -99,10 +99,17 @@ class WrkServerHttp extends TetherWrkBase { }) httpd.addHook('onError', async (request, reply, error) => { + const isSafe = error.message && error.message.startsWith('ERR_') + const message = isSafe ? error.message : 'Bad Request' + + if (!isSafe) { + debug('onError handler:', error.message) + } + return reply.status(400).send({ statusCode: 400, error: 'Bad Request', - message: error.message + message }) }) diff --git a/workers/lib/constants.js b/workers/lib/constants.js index 3b026dc..bdcbaed 100644 --- a/workers/lib/constants.js +++ b/workers/lib/constants.js @@ -272,7 +272,6 @@ const METRICS_TIME = { } const METRICS_DEFAULTS = { - TIMELINE_LIMIT: 10080, CONTAINER_HISTORY_LIMIT: 10080 } diff --git a/workers/lib/server/routes/metrics.routes.js b/workers/lib/server/routes/metrics.routes.js index f2f27d4..c6a59ac 100644 --- a/workers/lib/server/routes/metrics.routes.js +++ b/workers/lib/server/routes/metrics.routes.js @@ -119,8 +119,7 @@ module.exports = (ctx) => { 'metrics/power-mode/timeline', req.query.start, req.query.end, - req.query.container, - req.query.limit + req.query.container ], ENDPOINTS.METRICS_POWER_MODE_TIMELINE, getPowerModeTimeline diff --git a/workers/lib/server/schemas/alerts.schemas.js b/workers/lib/server/schemas/alerts.schemas.js index 5173c31..47bb212 100644 --- a/workers/lib/server/schemas/alerts.schemas.js +++ b/workers/lib/server/schemas/alerts.schemas.js @@ -16,8 +16,8 @@ const schemas = { alertsHistory: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, filter: { type: 'string' }, search: { type: 'string' }, sort: { type: 'string' }, diff --git a/workers/lib/server/schemas/finance.schemas.js b/workers/lib/server/schemas/finance.schemas.js index bde6d99..b4fee03 100644 --- a/workers/lib/server/schemas/finance.schemas.js +++ b/workers/lib/server/schemas/finance.schemas.js @@ -5,8 +5,8 @@ const schemas = { energyBalance: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'monthly', 'yearly'] }, overwriteCache: { type: 'boolean' } }, @@ -15,8 +15,8 @@ const schemas = { ebitda: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'monthly', 'yearly'] }, overwriteCache: { type: 'boolean' } }, @@ -25,8 +25,8 @@ const schemas = { costSummary: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'monthly', 'yearly'] }, overwriteCache: { type: 'boolean' } }, @@ -35,8 +35,8 @@ const schemas = { subsidyFees: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'weekly', 'monthly'] }, overwriteCache: { type: 'boolean' } }, @@ -45,8 +45,8 @@ const schemas = { revenue: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'weekly', 'monthly', 'yearly'] }, pool: { type: 'string' }, overwriteCache: { type: 'boolean' } @@ -56,8 +56,8 @@ const schemas = { revenueSummary: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, period: { type: 'string', enum: ['daily', 'monthly', 'yearly'] }, overwriteCache: { type: 'boolean' } }, diff --git a/workers/lib/server/schemas/metrics.schemas.js b/workers/lib/server/schemas/metrics.schemas.js index 2a149f8..c21404c 100644 --- a/workers/lib/server/schemas/metrics.schemas.js +++ b/workers/lib/server/schemas/metrics.schemas.js @@ -5,8 +5,8 @@ const schemas = { hashrate: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, overwriteCache: { type: 'boolean' } }, required: ['start', 'end'] @@ -14,8 +14,8 @@ const schemas = { consumption: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, overwriteCache: { type: 'boolean' } }, required: ['start', 'end'] @@ -23,8 +23,8 @@ const schemas = { efficiency: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, overwriteCache: { type: 'boolean' } }, required: ['start', 'end'] @@ -32,8 +32,8 @@ const schemas = { minerStatus: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, overwriteCache: { type: 'boolean' } }, required: ['start', 'end'] @@ -41,8 +41,8 @@ const schemas = { powerMode: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, interval: { type: 'string', enum: ['1h', '1d', '1w'] }, overwriteCache: { type: 'boolean' } }, @@ -51,8 +51,8 @@ const schemas = { powerModeTimeline: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, container: { type: 'string' }, overwriteCache: { type: 'boolean' } } @@ -60,8 +60,8 @@ const schemas = { temperature: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, interval: { type: 'string', enum: ['1h', '1d', '1w'] }, container: { type: 'string' }, overwriteCache: { type: 'boolean' } @@ -77,8 +77,8 @@ const schemas = { containerHistory: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, limit: { type: 'integer' }, overwriteCache: { type: 'boolean' } } diff --git a/workers/lib/server/schemas/pools.schemas.js b/workers/lib/server/schemas/pools.schemas.js index d5dcd6f..ec053cb 100644 --- a/workers/lib/server/schemas/pools.schemas.js +++ b/workers/lib/server/schemas/pools.schemas.js @@ -14,8 +14,8 @@ const schemas = { balanceHistory: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, range: { type: 'string', enum: ['1D', '1W', '1M'] }, overwriteCache: { type: 'boolean' } }, @@ -24,8 +24,8 @@ const schemas = { poolStatsAggregate: { type: 'object', properties: { - start: { type: 'integer' }, - end: { type: 'integer' }, + start: { type: 'integer', minimum: 0 }, + end: { type: 'integer', minimum: 0 }, range: { type: 'string', enum: ['daily', 'weekly', 'monthly'] }, pool: { type: 'string' }, overwriteCache: { type: 'boolean' }