From ca910fe92c4bc875007cde6930e8290252155aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20No=C3=ABl?= Date: Tue, 18 Jan 2022 17:12:25 +0100 Subject: [PATCH] Only accept yyyy-MM-dd as Date + don't cast DATE from DB to Date() --- .../core/database/lib/dialects/mysql/index.js | 11 +++++++--- .../database/lib/dialects/postgresql/index.js | 1 + packages/core/database/lib/fields.js | 22 +++++++++---------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/core/database/lib/dialects/mysql/index.js b/packages/core/database/lib/dialects/mysql/index.js index 12e4a0eb6f..81fdb31bf1 100644 --- a/packages/core/database/lib/dialects/mysql/index.js +++ b/packages/core/database/lib/dialects/mysql/index.js @@ -14,15 +14,20 @@ class MysqlDialect extends Dialect { this.db.config.connection.connection.supportBigNumbers = true; this.db.config.connection.connection.bigNumberStrings = true; this.db.config.connection.connection.typeCast = (field, next) => { - if (field.type == 'DECIMAL' || field.type === 'NEWDECIMAL') { + if (field.type === 'DECIMAL' || field.type === 'NEWDECIMAL') { var value = field.string(); return value === null ? null : Number(value); } - if (field.type == 'TINY' && field.length == 1) { + if (field.type === 'TINY' && field.length === 1) { let value = field.string(); - return value ? value == '1' : null; + return value ? value === '1' : null; } + + if (field.type === 'DATE') { + return field.string(); + } + return next(); }; } diff --git a/packages/core/database/lib/dialects/postgresql/index.js b/packages/core/database/lib/dialects/postgresql/index.js index fc5f91dc9d..45c8d64b94 100644 --- a/packages/core/database/lib/dialects/postgresql/index.js +++ b/packages/core/database/lib/dialects/postgresql/index.js @@ -16,6 +16,7 @@ class PostgresDialect extends Dialect { } initialize() { + this.db.connection.client.driver.types.setTypeParser(1082, 'text', v => v); // Don't cast DATE string to Date() this.db.connection.client.driver.types.setTypeParser(1700, 'text', parseFloat); } diff --git a/packages/core/database/lib/fields.js b/packages/core/database/lib/fields.js index 127d4cf957..517207f50f 100644 --- a/packages/core/database/lib/fields.js +++ b/packages/core/database/lib/fields.js @@ -98,6 +98,7 @@ class BigIntegerField extends NumberField { } const timeRegex = new RegExp('^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$'); +const dateRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/; const parseTime = value => { if (dateFns.isDate(value)) return dateFns.format(value, 'HH:mm:ss.SSS'); @@ -118,16 +119,16 @@ const parseTime = value => { }; const parseDate = value => { - if (dateFns.isDate(value)) return dateFns.format(value, 'yyyy-MM-dd'); - try { - let date = dateFns.parseISO(value); - - if (dateFns.isValid(date)) return dateFns.format(date, 'yyyy-MM-dd'); - - throw new InvalidDateError(`Invalid format, expected an ISO compatible date`); - } catch (error) { - throw new InvalidDateError(`Invalid format, expected an ISO compatible date`); + if (!dateRegex.test(value)) { + throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`); } + + let date = dateFns.parseISO(value); + if (!dateFns.isValid(date)) { + throw new InvalidDateError(`Invalid date`); + } + + return value; }; const parseDateTimeOrTimestamp = value => { @@ -151,8 +152,7 @@ class DateField extends Field { } fromDB(value) { - const cast = new Date(value); - return dateFns.isValid(cast) ? dateFns.formatISO(cast, { representation: 'date' }) : null; + return value; } } class DatetimeField extends Field {