From a5f64efb2252ea8e77be039cb3c042204c75255d Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Tue, 28 Dec 2021 18:32:27 -0500 Subject: [PATCH] Fix data type inconsistencies in directus_shares table (#10740) * Fix date resolution in share info endpoint * Add note on leaving fields blank * Tweak example to use proper db client * Treat mysql 0000-00-00 00:00:00 as null * Fix migration for mysql 5 * Add missing defaults to system fields --- api/example.env | 2 +- api/src/controllers/shares.ts | 4 ++-- api/src/database/migrations/20211211A-add-shares.ts | 7 +++++-- api/src/database/system-data/fields/_defaults.yaml | 2 ++ api/src/database/system-data/fields/shares.yaml | 4 ++++ api/src/utils/get-default-value.ts | 4 +++- app/src/lang/translations/en-US.yaml | 1 + 7 files changed, 18 insertions(+), 6 deletions(-) diff --git a/api/example.env b/api/example.env index ca7780ca08..34209a767f 100644 --- a/api/example.env +++ b/api/example.env @@ -44,7 +44,7 @@ DB_PASSWORD="secret" # DB_PASSWORD="Test@123" ## OracleDB -# DB_CLIENT="oracle" +# DB_CLIENT="oracledb" # DB_CONNECT_STRING="localhost:5104/XE" # DB_USER="secretsysuser" # DB_PASSWORD="secretpassword" diff --git a/api/src/controllers/shares.ts b/api/src/controllers/shares.ts index 3dfe1b42bd..1164e34ff7 100644 --- a/api/src/controllers/shares.ts +++ b/api/src/controllers/shares.ts @@ -139,7 +139,7 @@ router.get( _or: [ { date_start: { - _lte: '$NOW', + _lte: new Date().toISOString(), }, }, { @@ -153,7 +153,7 @@ router.get( _or: [ { date_end: { - _gte: '$NOW', + _gte: new Date().toISOString(), }, }, { diff --git a/api/src/database/migrations/20211211A-add-shares.ts b/api/src/database/migrations/20211211A-add-shares.ts index 0673d4816a..31bcdd431a 100644 --- a/api/src/database/migrations/20211211A-add-shares.ts +++ b/api/src/database/migrations/20211211A-add-shares.ts @@ -10,8 +10,11 @@ export async function up(knex: Knex): Promise { table.string('password'); table.uuid('user_created').references('id').inTable('directus_users').onDelete('SET NULL'); table.timestamp('date_created').defaultTo(knex.fn.now()); - table.timestamp('date_start'); - table.timestamp('date_end'); + + // This was changed after the migration went live to retroactively fix mysql5, see #10693 + table.timestamp('date_start').nullable().defaultTo(null); + table.timestamp('date_end').nullable().defaultTo(null); + table.integer('times_used').defaultTo(0); table.integer('max_uses'); }); diff --git a/api/src/database/system-data/fields/_defaults.yaml b/api/src/database/system-data/fields/_defaults.yaml index cc4587dd3f..f2b4fd7c19 100644 --- a/api/src/database/system-data/fields/_defaults.yaml +++ b/api/src/database/system-data/fields/_defaults.yaml @@ -12,3 +12,5 @@ width: full group: null translations: null note: null +conditions: null +required: false diff --git a/api/src/database/system-data/fields/shares.yaml b/api/src/database/system-data/fields/shares.yaml index 30bf2dcf55..74935c4b50 100644 --- a/api/src/database/system-data/fields/shares.yaml +++ b/api/src/database/system-data/fields/shares.yaml @@ -32,15 +32,19 @@ fields: iconRight: lock masked: true width: half + note: $t:shared_leave_blank_for_unlimited - field: date_start width: half + note: $t:shared_leave_blank_for_unlimited - field: date_end width: half + note: $t:shared_leave_blank_for_unlimited - field: max_uses width: half + note: $t:shared_leave_blank_for_unlimited - field: times_used width: half diff --git a/api/src/utils/get-default-value.ts b/api/src/utils/get-default-value.ts index cf9adfc5e0..1649f367f1 100644 --- a/api/src/utils/get-default-value.ts +++ b/api/src/utils/get-default-value.ts @@ -14,7 +14,7 @@ export default function getDefaultValue( if (defaultValue === 'null') return null; if (defaultValue === 'NULL') return null; - // Check if the default is wrapped in an extra pair of quotes, this happens in SQLite + // Check if the default is wrapped in an extra pair of quotes, this happens in SQLite / MariaDB if ( typeof defaultValue === 'string' && ((defaultValue.startsWith(`'`) && defaultValue.endsWith(`'`)) || @@ -23,6 +23,8 @@ export default function getDefaultValue( defaultValue = defaultValue.slice(1, -1); } + if (defaultValue === '0000-00-00 00:00:00') return null; + switch (type) { case 'bigInteger': case 'integer': diff --git a/app/src/lang/translations/en-US.yaml b/app/src/lang/translations/en-US.yaml index fe45f62023..cf486ffccd 100644 --- a/app/src/lang/translations/en-US.yaml +++ b/app/src/lang/translations/en-US.yaml @@ -1151,6 +1151,7 @@ share: Share share_item: Share Item shared_with_you: An item has been shared with you shared_enter_passcode: Enter your passcode to continue... +shared_leave_blank_for_unlimited: Leave blank for unlimited shared_times_remaining: This link can only be used {n} times shared_last_remaining: This link can only be used once shared_uses_left: For added security, this shared page has been configured with a limited number of views. There are currently {n} views remaining, after which, the page will no longer be accessible.