Skip to content
Open
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
2 changes: 1 addition & 1 deletion src/controllers/issueDetailsController.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { fetchOne } from '../middleware/middleware.builders.js'

const validateParams = validateQueryParams({
schema: v.object({
pageNumber: v.optional(v.pipe(v.string(), v.transform(parseInt), v.minValue(1)), '1')
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.number(), v.integer(), v.minValue(1)), '1')
Comment thread
pooleycodes marked this conversation as resolved.
})
})

Expand Down
2 changes: 1 addition & 1 deletion src/controllers/resultsController.js
Original file line number Diff line number Diff line change
Expand Up @@ -555,7 +555,7 @@ export function getFileNameOrUrlAndCheckedTime (req, res, next) {

const validateParams = validateQueryParams({
schema: v.object({
pageNumber: v.optional(v.pipe(v.string(), v.transform(parseInt), v.minValue(1)), '1')
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.number(), v.integer(), v.minValue(1)), '1')
})
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const subPath = (organisation, dataset) => {
export const validateExpectationParams = validateQueryParams({
schema: v.object({
expectation: ExpectationPathParams,
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.minValue(1)), '1')
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.number(), v.integer(), v.minValue(1)), '1')
})
})

Expand Down
2 changes: 1 addition & 1 deletion src/middleware/dataview.middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import { splitByLeading } from '../utils/table.js'
export const dataviewQueryParams = v.object({
lpa: v.string(),
dataset: v.string(),
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.minValue(1)), '1'),
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.number(), v.integer(), v.minValue(1)), '1'),
resourceId: v.optional(v.string())
})

Expand Down
2 changes: 1 addition & 1 deletion src/middleware/entryIssueDetails.middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const IssueDetailsQueryParams = v.object({
dataset: v.string(),
issue_type: v.string(),
issue_field: v.string(),
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.minValue(1)), '1'),
pageNumber: v.optional(v.pipe(v.string(), v.transform(s => parseInt(s, 10)), v.number(), v.integer(), v.minValue(1)), '1'),
resourceId: v.optional(v.string())
})

Expand Down
24 changes: 24 additions & 0 deletions test/unit/middleware/dataviewQueryParams.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { describe, it, expect } from 'vitest'
import * as v from 'valibot'
import { dataviewQueryParams } from '../../../src/middleware/dataview.middleware.js'

// Regression: a non-numeric :pageNumber segment (e.g. /data/abc) used to parse
// to NaN, slip past v.minValue(1), and crash later in getSetDataRange. The
// schema now includes v.integer(), so invalid page numbers are rejected here.
describe('dataviewQueryParams pageNumber', () => {
const base = { lpa: 'x', dataset: 'y' }

it('defaults to 1 when absent', () => {
expect(v.parse(dataviewQueryParams, base).pageNumber).toBe(1)
})

it('coerces a valid numeric string to a number', () => {
expect(v.parse(dataviewQueryParams, { ...base, pageNumber: '3' }).pageNumber).toBe(3)
})

// 'abc'/'' -> NaN; '0'/'-1' -> below the minimum. All must be rejected here
// rather than crashing downstream. (Note '2.5' parses to 2 and is valid.)
it.each(['abc', '', '0', '-1'])('rejects invalid pageNumber %j', (pageNumber) => {
expect(() => v.parse(dataviewQueryParams, { ...base, pageNumber })).toThrow()
})
})
Loading