diff --git a/package.json b/package.json index 64dea8217..48f8ae304 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "fs-extra": "10.1.0", "get-port": "5.1.1", "glob": "8.1.0", + "graphql-request": "6.1.0", "husky": "^8.0.3", "isomorphic-fetch": "3.0.0", "jest": "29.6.4", diff --git a/packages/db-postgres/src/find/findMany.ts b/packages/db-postgres/src/find/findMany.ts index 478b231dd..6ca5a1165 100644 --- a/packages/db-postgres/src/find/findMany.ts +++ b/packages/db-postgres/src/find/findMany.ts @@ -33,7 +33,7 @@ export const findMany = async function find({ const db = adapter.sessions[req.transactionID]?.db || adapter.drizzle const table = adapter.tables[tableName] - let limit = limitArg + let limit = limitArg ?? 10 let totalDocs: number let totalPages: number let hasPrevPage: boolean @@ -119,7 +119,11 @@ export const findMany = async function find({ findManyArgs.where = inArray(adapter.tables[tableName].id, Object.keys(orderedIDMap)) } else { findManyArgs.limit = limitArg === 0 ? undefined : limitArg - findManyArgs.offset = skip || (page - 1) * limitArg + + const offset = skip || (page - 1) * limitArg + + if (!Number.isNaN(offset)) findManyArgs.offset = offset + if (where) { findManyArgs.where = where } diff --git a/packages/db-postgres/src/queries/parseParams.ts b/packages/db-postgres/src/queries/parseParams.ts index ba95dafde..188bbee44 100644 --- a/packages/db-postgres/src/queries/parseParams.ts +++ b/packages/db-postgres/src/queries/parseParams.ts @@ -144,13 +144,19 @@ export async function parseParams({ break } - const { operator: queryOperator, value: queryValue } = sanitizeQueryValue({ + const sanitizedQueryValue = sanitizeQueryValue({ field, operator, relationOrPath, val, }) + if (sanitizedQueryValue === null) { + break + } + + const { operator: queryOperator, value: queryValue } = sanitizedQueryValue + if (queryOperator === 'not_equals' && queryValue !== null) { constraints.push( or( @@ -159,7 +165,10 @@ export async function parseParams({ ne(rawColumn || table[columnName], queryValue), ), ) - } else if ( + break + } + + if ( (field.type === 'relationship' || field.type === 'upload') && Array.isArray(queryValue) && operator === 'not_in' @@ -170,11 +179,13 @@ export async function parseParams({ IS NULL`, ) - } else { - constraints.push( - operatorMap[queryOperator](rawColumn || table[columnName], queryValue), - ) + + break } + + constraints.push( + operatorMap[queryOperator](rawColumn || table[columnName], queryValue), + ) } } } diff --git a/packages/db-postgres/src/queries/sanitizeQueryValue.ts b/packages/db-postgres/src/queries/sanitizeQueryValue.ts index f041f3d0b..bdcb1b640 100644 --- a/packages/db-postgres/src/queries/sanitizeQueryValue.ts +++ b/packages/db-postgres/src/queries/sanitizeQueryValue.ts @@ -42,11 +42,17 @@ export const sanitizeQueryValue = ({ if (val.toLowerCase() === 'false') formattedValue = false } - if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') { - formattedValue = createArrayFromCommaDelineated(formattedValue) + if (['all', 'in', 'not_in'].includes(operator)) { + if (formattedValue === 'string') { + formattedValue = createArrayFromCommaDelineated(formattedValue) - if (field.type === 'number') { - formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal)) + if (field.type === 'number') { + formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal)) + } + } + + if (!Array.isArray(formattedValue) || formattedValue.length === 0) { + return null } } diff --git a/packages/payload/package.json b/packages/payload/package.json index 5313048fc..31f07b427 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -187,7 +187,6 @@ "file-loader": "6.2.0", "form-data": "3.0.1", "get-port": "5.1.1", - "graphql-request": "6.1.0", "mini-css-extract-plugin": "1.6.2", "node-fetch": "2.6.12", "nodemon": "3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a8107b23..576d0e1f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,6 +96,9 @@ importers: glob: specifier: 8.1.0 version: 8.1.0 + graphql-request: + specifier: 6.1.0 + version: 6.1.0(graphql@16.8.1) husky: specifier: ^8.0.3 version: 8.0.3 diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index 4fbb6817f..82dfc111a 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -796,4 +796,19 @@ describe('Fields', () => { expect(uploadElement.value.media.filename).toStrictEqual('payload.png') }) }) + + describe('relationships', () => { + it('should not crash if querying with empty in operator', async () => { + const query = await payload.find({ + collection: 'relationship-fields', + where: { + 'relationship.value': { + in: [], + }, + }, + }) + + expect(query.docs).toBeDefined() + }) + }) })