From 41554be6e373c6621a1b07d4cbd126cadf1d0694 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 1 Jul 2020 11:42:36 +0530 Subject: [PATCH 01/11] pg dependency prompt #5109 --- .../components/Services/Data/DataActions.js | 10 ++++--- console/src/components/Services/Data/utils.js | 28 +++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/console/src/components/Services/Data/DataActions.js b/console/src/components/Services/Data/DataActions.js index 1f923b9a9e672..e3c08da42ba77 100644 --- a/console/src/components/Services/Data/DataActions.js +++ b/console/src/components/Services/Data/DataActions.js @@ -582,7 +582,7 @@ const makeMigrationCall = ( } customOnSuccess(data, globals.consoleMode, currMigrationMode); }; - const retryMigration = (err = {}, errMsg = '') => { + const retryMigration = (err = {}, errMsg = '', isPgCascade = false) => { dispatch( showNotification( { @@ -603,7 +603,7 @@ const makeMigrationCall = ( makeMigrationCall( dispatch, getState, - cascadeUpQueries(upQueries), // cascaded new up queries + cascadeUpQueries(upQueries, isPgCascade), // cascaded new up queries downQueries, migrationName, customOnSuccess, @@ -623,8 +623,10 @@ const makeMigrationCall = ( const onError = err => { if (!isRetry) { - const dependecyError = getDependencyError(err); - if (dependecyError) return retryMigration(dependecyError, errorMsg); + const { dependencyError, pgDependencyError } = getDependencyError(err); + if (dependencyError) return retryMigration(dependencyError, errorMsg); + if (pgDependencyError) + return retryMigration(pgDependencyError, errorMsg, true); } dispatch(handleMigrationErrors(errorMsg, err)); diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index e6e5e601cc2e4..34c9720a913f4 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -790,13 +790,21 @@ WHERE export const isColTypeString = colType => ['text', 'varchar', 'char', 'bpchar', 'name'].includes(colType); -export const cascadeUpQueries = (upQueries = []) => +const cascadePGSqlQuery = sql => { + let prefix; + if (sql[sql.length - 1] === ';') prefix = sql.substr(0, sql.length - 1); + // SQL might have a " at the end + else if (sql[sql.length - 2] === ';') prefix = sql.substr(0, sql.length - 2); + return prefix + ' CASCADE;'; +}; +export const cascadeUpQueries = (upQueries = [], isPgCascade = false) => upQueries.map((i = {}) => { if (i.type === 'run_sql' || i.type === 'untrack_table') { return { ...i, args: { ...i.args, + ...(isPgCascade && { sql: cascadePGSqlQuery(i.args.sql) }), cascade: true, }, }; @@ -805,16 +813,26 @@ export const cascadeUpQueries = (upQueries = []) => }); export const getDependencyError = (err = {}) => { + const dflt = {}; if (err.code == ERROR_CODES.dependencyError.code) { // direct dependency error - return err; + return { dependencyError: err }; } else if (err.code == ERROR_CODES.dataApiError.code) { // message is coming as error, further parssing willbe based on message key const actualError = isJsonString(err.message) ? JSON.parse(err.message) : {}; - if (actualError.code == ERROR_CODES.dependencyError.code) { - return { ...actualError, message: actualError.error }; - } + if (actualError.code == ERROR_CODES.dependencyError.code) + return { + dependencyError: { ...actualError, message: actualError.error }, + }; + else if ( + actualError.code === ERROR_CODES.postgresError.code && + actualError?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/12/errcodes-appendix.html + ) + return { + pgDependencyError: { ...actualError, message: actualError.error }, + }; } + return dflt; }; From 28279312175ef520ff4f058894d8376e25880aef Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 1 Jul 2020 14:08:07 +0530 Subject: [PATCH 02/11] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9bdfd96c8728..5674b3396ca32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ - console: respect read-only mode in actions pages (fix #4656) (#4764) - console: allow configuring session_argument for custom functions (close #4499) (#4922) - console: fix listen update column config selection for event trigger (close #5042) (#5043) +- console: added user prompt to cascade delete on Postgres dependency errors (close #5109) (#5248) - cli: add new flags up-sql and down-sql to generate sql based migrations from the CLI (#5026) - docs: add page on setting up v2 migrations (close #4746) (#4898) From fb65a04b4479cbd71b598b9859943c229c641dd7 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Mon, 13 Jul 2020 19:24:08 +0530 Subject: [PATCH 03/11] Update console/src/components/Services/Data/utils.js Co-authored-by: Aleksandra Sikora --- console/src/components/Services/Data/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 34c9720a913f4..f329233754c5e 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -828,7 +828,7 @@ export const getDependencyError = (err = {}) => { }; else if ( actualError.code === ERROR_CODES.postgresError.code && - actualError?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/12/errcodes-appendix.html + actualError?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/current/errcodes-appendix.html ) return { pgDependencyError: { ...actualError, message: actualError.error }, From 0e16ab34db6d3516ef68afad6aea97e346c70a71 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 15 Jul 2020 12:53:40 +0530 Subject: [PATCH 04/11] review comments --- console/src/components/Services/Data/utils.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 34c9720a913f4..9493e47a5abe6 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -791,11 +791,12 @@ export const isColTypeString = colType => ['text', 'varchar', 'char', 'bpchar', 'name'].includes(colType); const cascadePGSqlQuery = sql => { - let prefix; - if (sql[sql.length - 1] === ';') prefix = sql.substr(0, sql.length - 1); + if (sql[sql.length - 1] === ';') + return sql.substr(0, sql.length - 1) + ' CASCADE;'; // SQL might have a " at the end - else if (sql[sql.length - 2] === ';') prefix = sql.substr(0, sql.length - 2); - return prefix + ' CASCADE;'; + else if (sql[sql.length - 2] === ';') + return sql.substr(0, sql.length - 2) + ' CASCADE;'; + return sql + ' CASCADE;'; }; export const cascadeUpQueries = (upQueries = [], isPgCascade = false) => upQueries.map((i = {}) => { @@ -813,7 +814,6 @@ export const cascadeUpQueries = (upQueries = [], isPgCascade = false) => }); export const getDependencyError = (err = {}) => { - const dflt = {}; if (err.code == ERROR_CODES.dependencyError.code) { // direct dependency error return { dependencyError: err }; @@ -834,5 +834,5 @@ export const getDependencyError = (err = {}) => { pgDependencyError: { ...actualError, message: actualError.error }, }; } - return dflt; + return {}; }; From 30ded79747889a712931697d35dc8d046f473c58 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 15 Jul 2020 12:56:33 +0530 Subject: [PATCH 05/11] cleanup --- console/src/components/Services/Data/utils.js | 1 + 1 file changed, 1 insertion(+) diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 5617dfb3630d1..20287bb12efed 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -799,6 +799,7 @@ const cascadePGSqlQuery = sql => { return sql.substr(0, sql.length - 2) + ' CASCADE;'; return sql + ' CASCADE;'; }; + export const cascadeUpQueries = (upQueries = [], isPgCascade = false) => upQueries.map((i = {}) => { if (i.type === 'run_sql' || i.type === 'untrack_table') { From 26c5671b3189b06ff565eb8125069db37331fcb6 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Tue, 11 Aug 2020 14:05:53 +0530 Subject: [PATCH 06/11] parse pg error without CLI mode --- console/src/components/Services/Data/utils.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 20287bb12efed..e14ba6b5e8778 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -819,22 +819,22 @@ export const getDependencyError = (err = {}) => { if (err.code == ERROR_CODES.dependencyError.code) { // direct dependency error return { dependencyError: err }; - } else if (err.code == ERROR_CODES.dataApiError.code) { - // message is coming as error, further parssing willbe based on message key - const actualError = isJsonString(err.message) - ? JSON.parse(err.message) - : {}; - if (actualError.code == ERROR_CODES.dependencyError.code) - return { - dependencyError: { ...actualError, message: actualError.error }, - }; - else if ( - actualError.code === ERROR_CODES.postgresError.code && - actualError?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/current/errcodes-appendix.html - ) - return { - pgDependencyError: { ...actualError, message: actualError.error }, - }; } + if (err.code == ERROR_CODES.dataApiError.code) { + // with CLI mode, error is getting as a string with the key `message` + err = isJsonString(err.message) ? JSON.parse(err.message) : {}; + } + + if (err.code == ERROR_CODES.dependencyError.code) + return { + dependencyError: { ...err, message: err.error }, + }; + if ( + err.code === ERROR_CODES.postgresError.code && + err?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/current/errcodes-appendix.html + ) + return { + pgDependencyError: { ...err, message: err.error }, + }; return {}; }; From 6c2c0b96465a155c9bd78c4aa57f5eeb54e090f0 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 12 Aug 2020 14:03:54 +0530 Subject: [PATCH 07/11] pg cascade error messaging --- console/src/components/Services/Common/Notification.tsx | 3 ++- console/src/components/Services/Data/DataActions.js | 1 + console/src/components/Services/Data/utils.js | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/console/src/components/Services/Common/Notification.tsx b/console/src/components/Services/Common/Notification.tsx index 18750a85e538f..00a35d5e4e77f 100644 --- a/console/src/components/Services/Common/Notification.tsx +++ b/console/src/components/Services/Common/Notification.tsx @@ -110,7 +110,8 @@ export const getErrorMessage = ( notificationMessage = error.code; } } else if ('internal' in error && 'error' in error.internal) { - notificationMessage = `${error.code} : ${error.internal.error.message}`; + notificationMessage = `${error.internal.error.message} + ${error.internal.error.description}`; } else if ('custom' in error) { notificationMessage = error.custom; } else if ('code' in error && 'error' in error && 'path' in error) { diff --git a/console/src/components/Services/Data/DataActions.js b/console/src/components/Services/Data/DataActions.js index 519147267001b..1327aaccc338f 100644 --- a/console/src/components/Services/Data/DataActions.js +++ b/console/src/components/Services/Data/DataActions.js @@ -689,6 +689,7 @@ const makeMigrationCall = ( successMsg, errorMsg, shouldSkipSchemaReload, + false, true // prevent further retry ), }, diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index e14ba6b5e8778..7d5c102c11cd4 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -834,7 +834,11 @@ export const getDependencyError = (err = {}) => { err?.internal?.error?.status_code === '2BP01' // pg dependent error > https://www.postgresql.org/docs/current/errcodes-appendix.html ) return { - pgDependencyError: { ...err, message: err.error }, + pgDependencyError: { + ...err, + message: `${err?.internal?.error?.message} + ${err?.internal?.error?.description || ''}`, + }, }; return {}; }; From be9264eb9d8dc16610f738cdda46fd474f072f39 Mon Sep 17 00:00:00 2001 From: soorajshankar Date: Wed, 12 Aug 2020 14:15:21 +0530 Subject: [PATCH 08/11] formating --- console/src/components/Services/Common/Notification.tsx | 2 +- console/src/components/Services/Data/utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/console/src/components/Services/Common/Notification.tsx b/console/src/components/Services/Common/Notification.tsx index 00a35d5e4e77f..fbbfb4db15602 100644 --- a/console/src/components/Services/Common/Notification.tsx +++ b/console/src/components/Services/Common/Notification.tsx @@ -110,7 +110,7 @@ export const getErrorMessage = ( notificationMessage = error.code; } } else if ('internal' in error && 'error' in error.internal) { - notificationMessage = `${error.internal.error.message} + notificationMessage = `${error.internal.error.message}. ${error.internal.error.description}`; } else if ('custom' in error) { notificationMessage = error.custom; diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index 7d5c102c11cd4..ce35b61cba2ae 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -836,7 +836,7 @@ export const getDependencyError = (err = {}) => { return { pgDependencyError: { ...err, - message: `${err?.internal?.error?.message} + message: `${err?.internal?.error?.message}. ${err?.internal?.error?.description || ''}`, }, }; From 3ed8d1e6db5103fc2888ad25c5b93e86eb997ab6 Mon Sep 17 00:00:00 2001 From: rikinsk Date: Fri, 21 Aug 2020 18:19:10 +0530 Subject: [PATCH 09/11] split error message across lines --- console/src/components/Services/Data/DataActions.js | 8 ++++++-- console/src/components/Services/Data/utils.js | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/console/src/components/Services/Data/DataActions.js b/console/src/components/Services/Data/DataActions.js index 1327aaccc338f..63334b8283241 100644 --- a/console/src/components/Services/Data/DataActions.js +++ b/console/src/components/Services/Data/DataActions.js @@ -660,6 +660,9 @@ const makeMigrationCall = ( customOnSuccess(data, globals.consoleMode, currMigrationMode); }; const retryMigration = (err = {}, errMsg = '', isPgCascade = false) => { + const errorDetails = getErrorMessage('', err); + const errorDetailsLines = errorDetails.split('\n'); + dispatch( showNotification( { @@ -667,8 +670,9 @@ const makeMigrationCall = ( level: 'error', message: (

- {getErrorMessage('', err)} -
+ {errorDetailsLines.map((m, i) => ( +

{m}
+ ))}
Do you want to drop the dependent items as well?

diff --git a/console/src/components/Services/Data/utils.js b/console/src/components/Services/Data/utils.js index ce35b61cba2ae..c324e45d66eb2 100644 --- a/console/src/components/Services/Data/utils.js +++ b/console/src/components/Services/Data/utils.js @@ -836,7 +836,7 @@ export const getDependencyError = (err = {}) => { return { pgDependencyError: { ...err, - message: `${err?.internal?.error?.message}. + message: `${err?.internal?.error?.message}:\n ${err?.internal?.error?.description || ''}`, }, }; From 6ec474fdc9d3b37c25a8d7ad4c11798a20159af4 Mon Sep 17 00:00:00 2001 From: Aleksandra Sikora Date: Fri, 21 Aug 2020 15:01:06 +0200 Subject: [PATCH 10/11] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca63bb6366572..fff520ec81f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,9 @@ (Add entries here in the order of: server, console, cli, docs, others) -- docs: add docs page on networking with docker (close #4346) (#4811) +- console: add user prompt to cascade delete on Postgres dependency errors (close #5109) (#5248) - cli: add missing global flags for seeds command (#5565) +- docs: add docs page on networking with docker (close #4346) (#4811) ## `v1.3.1-beta.1` @@ -107,7 +108,6 @@ If you do have such headers configured, then you must update the header configur - console: respect read-only mode in actions pages (fix #4656) (#4764) - console: allow configuring session_argument for custom functions (close #4499) (#4922) - console: fix listen update column config selection for event trigger (close #5042) (#5043) -- console: added user prompt to cascade delete on Postgres dependency errors (close #5109) (#5248) - cli: add new flags up-sql and down-sql to generate sql based migrations from the CLI (#5026) - docs: add instructions on fixing loss of data when using floats (close #5092) - docs: add page on setting up v2 migrations (close #4746) (#4898) From d8f5ad88c06a1e90dde9299bc95f094a1dd8c4d0 Mon Sep 17 00:00:00 2001 From: Aleksandra Sikora Date: Sat, 22 Aug 2020 13:16:28 +0200 Subject: [PATCH 11/11] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eea7f094e1d08..198338168df79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ This release contains the [PDV refactor (#4111)](https://github.com/hasura/graph - server: some mutations that cannot be performed will no longer be in the schema (for instance, `delete_by_pk` mutations won't be shown to users that do not have select permissions on all primary keys) (#4111) - server: miscellaneous description changes (#4111) - server: treat the absence of `backend_only` configuration and `backend_only: false` equally (closing #5059) (#4111) -- console: add user prompt to cascade delete on Postgres dependency errors (close #5109) (#5248) +- console: allow user to cascade Postgres dependencies when dropping Postgres objects (close #5109) (#5248) - cli: add missing global flags for seeds command (#5565) - docs: add docs page on networking with docker (close #4346) (#4811)