diff --git a/.bruno/cards/multiple.bru b/.bruno/cards/multiple.bru new file mode 100644 index 000000000..7aeca13fb --- /dev/null +++ b/.bruno/cards/multiple.bru @@ -0,0 +1,23 @@ +meta { + name: Multiple values + type: http + seq: 1 +} + +get { + url: {{BASE_URL}}/v2/en/cards?name=eq:Pikachu|Pichu&hp=lt:70&localId=not:tg&id=neq:cel25-5 + body: none + auth: none +} + +params:query { + name: eq:Pikachu|Pichu + hp: lt:70 + localId: not:tg + id: neq:cel25-5 +} + +assert { + res.status: eq 200 + res.body: length 85 +} diff --git a/server/src/libs/QueryEngine/parsers.ts b/server/src/libs/QueryEngine/parsers.ts index 200f62fb0..35c42546d 100644 --- a/server/src/libs/QueryEngine/parsers.ts +++ b/server/src/libs/QueryEngine/parsers.ts @@ -163,31 +163,43 @@ function parseParam(_key: string, value: string): QueryValues { } } - if (/^\d+\.?\d*$/g.test(compared)) { - compared = Number.parseFloat(compared) + function process(item: string | number) { + switch (filter) { + case 'not': + case 'notlike': + return { $not: { $inc: item } } + case 'eq': + return item + case 'neq': + return { $not: item } + case 'gte': + return { $gte: item } + case 'gt': + return { $gt: item } + case 'lt': + return { $lt: item } + case 'lte': + return { $lte: item } + case 'null': + return null + case 'notnull': + return { $not: null } + default: + return { $inc: item } + } } - switch (filter) { - case 'not': - case 'notlike': - return { $not: { $inc: compared }} - case 'eq': - return compared - case 'neq': - return { $not: compared } - case 'gte': - return { $gte: compared } - case 'gt': - return { $gt: compared } - case 'lt': - return { $lt: compared } - case 'lte': - return { $lte: compared } - case 'null': - return null - case 'notnull': - return { $not: null } - default: - return { $inc: compared } + if (/^\d+\.?\d*$/g.test(compared)) { + return process(Number.parseFloat(compared)) } + + // @deprecated the `,` separator + // TODO: only use the `|` separator + const items = compared.split(compared.includes('|') ? '|' : ',') + + if (items.length === 1) { + return process(items[0]) + } + + return { $or: items.map((it) => process(it)) } }