From da768806a28bba3cdcfb6b258ff1644882f6411d Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 10 Jan 2023 18:48:02 +0800 Subject: [PATCH 1/8] fix(nocodb): make sure fk_column_id is present for filter insert --- packages/nocodb/src/lib/models/Filter.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/nocodb/src/lib/models/Filter.ts b/packages/nocodb/src/lib/models/Filter.ts index 34ff8a2f50..42838aa22d 100644 --- a/packages/nocodb/src/lib/models/Filter.ts +++ b/packages/nocodb/src/lib/models/Filter.ts @@ -10,6 +10,7 @@ import { import View from './View'; import { FilterType, UITypes } from 'nocodb-sdk'; import NocoCache from '../cache/NocoCache'; +import { NcError } from '../meta/helpers/catchError'; export default class Filter { id: string; @@ -69,6 +70,9 @@ export default class Filter { filter: Partial, ncMeta = Noco.ncMeta ) { + if (!filter.fk_column_id) { + NcError.badRequest('fk_column_id is required'); + } const insertObj = { id: filter.id, fk_view_id: filter.fk_view_id, From 89f3f5ecd072471ad60331c1c1a09470399acd45 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 10 Jan 2023 19:18:57 +0800 Subject: [PATCH 2/8] feat(nc-gui): disable filter value input if the column is not selected --- packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue b/packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue index 9bb1fedc8e..c6a7b1f75d 100644 --- a/packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue +++ b/packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue @@ -236,7 +236,7 @@ defineExpose({ :key="`${i}_7`" v-model:value="filter.value" class="nc-filter-value-select" - :disabled="filter.readOnly" + :disabled="filter.readOnly || !filter.fk_column_id" @click.stop @input="saveOrUpdate(filter, i)" /> From e3783ed106f2525b527c16b950c7aee58d24f189 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 10 Jan 2023 19:19:23 +0800 Subject: [PATCH 3/8] fix(nocodb): retrieve the project id from column --- .../src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts index 3ca2d2a139..86c81231f2 100644 --- a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts +++ b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts @@ -73,7 +73,9 @@ export default async (req, res, next) => { const column = await Column.get({ colId: params.columnId }); req.ncProjectId = column?.project_id; } else if (params.filterId) { - const filter = await Filter.get(params.filterId); + const filter = await Filter.get(params.filterId).then((f) => + f?.getColumn() + ); req.ncProjectId = filter?.project_id; } else if (params.filterParentId) { const filter = await Filter.get(params.filterParentId); From 7f7b73d750d2ca71be0d49ec2f70462eb7c89e44 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 10 Jan 2023 19:20:32 +0800 Subject: [PATCH 4/8] fix(nocodb): retrieve correct model based on view, hook or column --- packages/nocodb/src/lib/models/Filter.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/nocodb/src/lib/models/Filter.ts b/packages/nocodb/src/lib/models/Filter.ts index 42838aa22d..f663a215c5 100644 --- a/packages/nocodb/src/lib/models/Filter.ts +++ b/packages/nocodb/src/lib/models/Filter.ts @@ -1,6 +1,7 @@ import Noco from '../Noco'; import Model from './Model'; import Column from './Column'; +import Hook from './Hook'; import { CacheDelDirection, CacheGetType, @@ -70,9 +71,6 @@ export default class Filter { filter: Partial, ncMeta = Noco.ncMeta ) { - if (!filter.fk_column_id) { - NcError.badRequest('fk_column_id is required'); - } const insertObj = { id: filter.id, fk_view_id: filter.fk_view_id, @@ -94,7 +92,16 @@ export default class Filter { }), }; if (!(filter.project_id && filter.base_id)) { - const model = await Column.get({ colId: filter.fk_column_id }, ncMeta); + let model: { project_id?: string; base_id?: string }; + if (filter.fk_view_id) { + model = await View.get(filter.fk_view_id, ncMeta); + } else if (filter.fk_hook_id) { + model = await Hook.get(filter.fk_hook_id, ncMeta); + } else if (filter.fk_column_id) { + model = await Column.get({ colId: filter.fk_column_id }, ncMeta); + } else { + NcError.badRequest('Invalid filter'); + } insertObj.project_id = model.project_id; insertObj.base_id = model.base_id; } From 554ef9c50d1acb1769da7d41df84b9cd948a8f2a Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Tue, 10 Jan 2023 20:21:48 +0800 Subject: [PATCH 5/8] feat(nocodb): ncFilterUpgrader --- packages/nocodb/src/lib/Noco.ts | 2 +- .../src/lib/version-upgrader/NcUpgrader.ts | 2 ++ .../lib/version-upgrader/ncFilterUpgrader.ts | 34 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts diff --git a/packages/nocodb/src/lib/Noco.ts b/packages/nocodb/src/lib/Noco.ts index cbcfbee986..8a3397053d 100644 --- a/packages/nocodb/src/lib/Noco.ts +++ b/packages/nocodb/src/lib/Noco.ts @@ -104,7 +104,7 @@ export default class Noco { constructor() { process.env.PORT = process.env.PORT || '8080'; // todo: move - process.env.NC_VERSION = '0098005'; + process.env.NC_VERSION = '0100002'; // if env variable NC_MINIMAL_DBS is set, then disable project creation with external sources if (process.env.NC_MINIMAL_DBS) { diff --git a/packages/nocodb/src/lib/version-upgrader/NcUpgrader.ts b/packages/nocodb/src/lib/version-upgrader/NcUpgrader.ts index a51d04910b..9f7ae6d07f 100644 --- a/packages/nocodb/src/lib/version-upgrader/NcUpgrader.ts +++ b/packages/nocodb/src/lib/version-upgrader/NcUpgrader.ts @@ -8,6 +8,7 @@ import ncProjectEnvUpgrader0011045 from './ncProjectEnvUpgrader0011045'; import ncProjectUpgraderV2_0090000 from './ncProjectUpgraderV2_0090000'; import ncDataTypesUpgrader from './ncDataTypesUpgrader'; import ncProjectRolesUpgrader from './ncProjectRolesUpgrader'; +import ncFilterUpgrader from './ncFilterUpgrader'; const log = debug('nc:version-upgrader'); import boxen from 'boxen'; @@ -35,6 +36,7 @@ export default class NcUpgrader { { name: '0090000', handler: ncProjectUpgraderV2_0090000 }, { name: '0098004', handler: ncDataTypesUpgrader }, { name: '0098005', handler: ncProjectRolesUpgrader }, + { name: '0100002', handler: ncFilterUpgrader }, ]; if (!(await ctx.ncMeta.knexConnection?.schema?.hasTable?.('nc_store'))) { return; diff --git a/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts b/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts new file mode 100644 index 0000000000..09eb667432 --- /dev/null +++ b/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts @@ -0,0 +1,34 @@ +import { NcUpgraderCtx } from './NcUpgrader'; +import { MetaTable } from '../utils/globals'; +import View from '../models/View'; +import Hook from '../models/Hook'; +import Column from '../models/Column'; + +// before 0.101.0, an incorrect project_id was inserted when +// a filter is created without specifying the column +// this upgrader is to retrieve the correct project id from either view, hook, or column +// and update the project id +export default async function ({ ncMeta }: NcUpgraderCtx) { + const filters = await ncMeta.metaList2(null, null, MetaTable.FILTER_EXP); + for (const filter of filters) { + let model: { project_id?: string; base_id?: string }; + if (filter.fk_view_id) { + model = await View.get(filter.fk_view_id, ncMeta); + } else if (filter.fk_hook_id) { + model = await Hook.get(filter.fk_hook_id, ncMeta); + } else if (filter.fk_column_id) { + model = await Column.get({ colId: filter.fk_column_id }, ncMeta); + } else { + continue; + } + if (filter.project_id != model.project_id) { + await ncMeta.metaUpdate( + null, + null, + MetaTable.FILTER_EXP, + { project_id: model.project_id }, + filter.id + ); + } + } +} From 257615e3ea8faed4e3e5e3d46de2750c47895d92 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Wed, 11 Jan 2023 12:17:11 +0800 Subject: [PATCH 6/8] fix(nocodb): get the project_id from either view, hook or column for filter --- .../meta/helpers/extractProjectIdAndAuthenticate.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts index 86c81231f2..1071291bec 100644 --- a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts +++ b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts @@ -73,9 +73,14 @@ export default async (req, res, next) => { const column = await Column.get({ colId: params.columnId }); req.ncProjectId = column?.project_id; } else if (params.filterId) { - const filter = await Filter.get(params.filterId).then((f) => - f?.getColumn() - ); + const filter = await Filter.get(params.filterId).then(async (f) => { + if (f.fk_view_id) { + return await View.get(f.fk_view_id); + } else if (f.fk_hook_id) { + return await Hook.get(f.fk_hook_id); + } + return await Column.get({ colId: filter.fk_column_id }); + }); req.ncProjectId = filter?.project_id; } else if (params.filterParentId) { const filter = await Filter.get(params.filterParentId); From dd58f98752cd7bdb4aee36daefdf5c76551d58fa Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Wed, 11 Jan 2023 13:43:35 +0800 Subject: [PATCH 7/8] fix(nocodb): project_id would be correct after the upgrader --- .../lib/meta/helpers/extractProjectIdAndAuthenticate.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts index 1071291bec..3ca2d2a139 100644 --- a/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts +++ b/packages/nocodb/src/lib/meta/helpers/extractProjectIdAndAuthenticate.ts @@ -73,14 +73,7 @@ export default async (req, res, next) => { const column = await Column.get({ colId: params.columnId }); req.ncProjectId = column?.project_id; } else if (params.filterId) { - const filter = await Filter.get(params.filterId).then(async (f) => { - if (f.fk_view_id) { - return await View.get(f.fk_view_id); - } else if (f.fk_hook_id) { - return await Hook.get(f.fk_hook_id); - } - return await Column.get({ colId: filter.fk_column_id }); - }); + const filter = await Filter.get(params.filterId); req.ncProjectId = filter?.project_id; } else if (params.filterParentId) { const filter = await Filter.get(params.filterParentId); From 74d6bb335e898d5d79056737bf4816767ca6805a Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Wed, 11 Jan 2023 13:45:47 +0800 Subject: [PATCH 8/8] feat(nocodb): include base_id in ncFilterUpgrader --- packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts b/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts index 09eb667432..1515f88b8b 100644 --- a/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts +++ b/packages/nocodb/src/lib/version-upgrader/ncFilterUpgrader.ts @@ -26,7 +26,7 @@ export default async function ({ ncMeta }: NcUpgraderCtx) { null, null, MetaTable.FILTER_EXP, - { project_id: model.project_id }, + { base_id: model.base_id, project_id: model.project_id }, filter.id ); }