From e58e221047a7a666f034ba78b0022562e666da8b Mon Sep 17 00:00:00 2001 From: Pranav C Date: Thu, 4 Jan 2024 13:19:20 +0000 Subject: [PATCH] feat: add upgrader for migrating existing --- .../nocodb/src/version-upgrader/NcUpgrader.ts | 2 + .../ncXcdbCreatedAndUpdatedTimeUpgrader.ts | 66 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 packages/nocodb/src/version-upgrader/ncXcdbCreatedAndUpdatedTimeUpgrader.ts diff --git a/packages/nocodb/src/version-upgrader/NcUpgrader.ts b/packages/nocodb/src/version-upgrader/NcUpgrader.ts index 804dc427f7..9c8c19976d 100644 --- a/packages/nocodb/src/version-upgrader/NcUpgrader.ts +++ b/packages/nocodb/src/version-upgrader/NcUpgrader.ts @@ -16,6 +16,7 @@ import ncHookUpgrader from './ncHookUpgrader'; import ncProjectConfigUpgrader from './ncProjectConfigUpgrader'; import ncXcdbLTARUpgrader from './ncXcdbLTARUpgrader'; import ncXcdbLTARIndexUpgrader from './ncXcdbLTARIndexUpgrader'; +import ncXcdbCreatedAndUpdatedTimeUpgrader from './ncXcdbCreatedAndUpdatedTimeUpgrader'; import type { MetaService } from '~/meta/meta.service'; import type { NcConfig } from '~/interface/config'; @@ -144,6 +145,7 @@ export default class NcUpgrader { { name: '0107004', handler: ncProjectConfigUpgrader }, { name: '0108002', handler: ncXcdbLTARUpgrader }, { name: '0111002', handler: ncXcdbLTARIndexUpgrader }, + { name: '0111004', handler: ncXcdbCreatedAndUpdatedTimeUpgrader }, ]; } } diff --git a/packages/nocodb/src/version-upgrader/ncXcdbCreatedAndUpdatedTimeUpgrader.ts b/packages/nocodb/src/version-upgrader/ncXcdbCreatedAndUpdatedTimeUpgrader.ts new file mode 100644 index 0000000000..912554418b --- /dev/null +++ b/packages/nocodb/src/version-upgrader/ncXcdbCreatedAndUpdatedTimeUpgrader.ts @@ -0,0 +1,66 @@ +import { UITypes } from 'nocodb-sdk'; +import { Logger } from '@nestjs/common'; +import type { NcUpgraderCtx } from './NcUpgrader'; +import type { MetaService } from '~/meta/meta.service'; +import { MetaTable } from '~/utils/globals'; +import { Column, Model } from '~/models'; + +// An upgrader for upgrading created_at and updated_at columns +// to system column and convert to new uidt CreateTime and LastModifiedTime + +const logger = new Logger('XcdbCreatedAndUpdatedTimeUpgrader'); + +async function upgradeModels({ + ncMeta, + source, +}: { + ncMeta: MetaService; + source: any; +}) { + const models = await Model.list( + { + base_id: source.base_id, + source_id: source.id, + }, + ncMeta, + ); + + await Promise.all( + models.map(async (model: any) => { + const columns = await model.getColumns(ncMeta); + for (const column of columns) { + if (column.column_name === 'created_at') { + await Column.update(column.id, { + uidt: UITypes.CreateTime, + system: true, + }); + } + if (column.uidt === 'updated_at') { + await Column.update(column.id, { + uidt: UITypes.LastModifiedTime, + system: true, + }); + } + } + logger.log(`Upgraded model ${model.name} from source ${source.name}`); + }), + ); +} + +// database to virtual relation and create an index for it +export default async function ({ ncMeta }: NcUpgraderCtx) { + // get all xcdb sources + const sources = await ncMeta.metaList2(null, null, MetaTable.BASES, { + condition: { + is_meta: 1, + }, + orderBy: {}, + }); + + // iterate and upgrade each base + for (const source of sources) { + logger.log(`Upgrading source ${source.name}`); + // update the meta props + await upgradeModels({ ncMeta, source }); + } +}