Add ability to use : false and : false

This commit is contained in:
Pierre Noël 2021-12-06 14:57:01 +01:00
parent 6b627b436d
commit 7a21beefcd
4 changed files with 50 additions and 19 deletions

View File

@ -3,6 +3,7 @@
const _ = require('lodash/fp');
const dateFns = require('date-fns');
const { InvalidTimeError, InvalidDateError, InvalidDateTimeError } = require('./errors');
const { parseBoolean } = require('./utils/boolean');
class Field {
constructor(config) {
@ -41,17 +42,7 @@ class JSONField extends Field {
class BooleanField extends Field {
toDB(value) {
if (typeof value === 'boolean') return value;
if (['true', 't', '1', 1].includes(value)) {
return true;
}
if (['false', 'f', '0', 0].includes(value)) {
return false;
}
return Boolean(value);
return parseBoolean(value);
}
fromDB(value) {

View File

@ -3,6 +3,7 @@
const _ = require('lodash/fp');
const types = require('../../types');
const { parseBoolean } = require('../../utils/boolean');
const { createField } = require('../../fields');
const { createJoin } = require('./join');
const { toColumnName } = require('./transform');
@ -247,14 +248,18 @@ const applyOperator = (qb, column, operator, value) => {
break;
}
case '$null': {
if (value) {
if (parseBoolean(value)) {
qb.whereNull(column);
} else {
qb.whereNotNull(column);
}
break;
}
case '$notNull': {
if (value) {
if (parseBoolean(value)) {
qb.whereNotNull(column);
} else {
qb.whereNull(column);
}
break;
}

View File

@ -0,0 +1,19 @@
'use strict';
const parseBoolean = value => {
if (typeof value === 'boolean') return value;
if (['true', 't', '1', 1].includes(value)) {
return true;
}
if (['false', 'f', '0', 0].includes(value)) {
return false;
}
return Boolean(value);
};
module.exports = {
parseBoolean,
};

View File

@ -202,13 +202,22 @@ describe('Filtering API', () => {
});
describe('Filter null', () => {
test('Should return only matching items', async () => {
test.each([
[{ $null: true }],
[{ $null: 'true' }],
[{ $null: '1' }],
[{ $null: 't' }],
[{ $notNull: false }],
[{ $notNull: 'false' }],
[{ $notNull: '0' }],
[{ $notNull: 'f' }],
])('Should return only matching items (%s)', async priceFilter => {
const res = await rq({
method: 'GET',
url: '/products',
qs: {
filters: {
price: { $null: true },
price: priceFilter,
},
},
});
@ -220,15 +229,22 @@ describe('Filtering API', () => {
expect(res.body.data).toEqual(expect.arrayContaining(matching));
});
test('Should return three matches', async () => {
test.each([
{ $notNull: true },
{ $notNull: 'true' },
{ $notNull: '1' },
{ $notNull: 't' },
{ $null: false },
{ $null: 'false' },
{ $null: '0' },
{ $null: 'f' },
])('Should return three matches (%s)', async priceFilter => {
const res = await rq({
method: 'GET',
url: '/products',
qs: {
filters: {
price: {
$notNull: true,
},
price: priceFilter,
},
},
});