mirror of
https://github.com/strapi/strapi.git
synced 2025-12-27 15:13:21 +00:00
Add ability to use : false and : false
This commit is contained in:
parent
6b627b436d
commit
7a21beefcd
@ -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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
19
packages/core/database/lib/utils/boolean.js
Normal file
19
packages/core/database/lib/utils/boolean.js
Normal 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,
|
||||
};
|
||||
@ -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,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user