From 779d5318c3d2e46d0e9daebf4c859b4c92a0dc46 Mon Sep 17 00:00:00 2001 From: Vyacheslav Tumanov Date: Mon, 5 Feb 2024 19:45:20 +0500 Subject: [PATCH] make cli command for changing attribute value via backup mode (#4520) Signed-off-by: Vyacheslav Tumanov --- dev/tool/src/index.ts | 21 ++++++++++++++++++++- dev/tool/src/workspace.ts | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/dev/tool/src/index.ts b/dev/tool/src/index.ts index 5f7c20905b..f806987eaf 100644 --- a/dev/tool/src/index.ts +++ b/dev/tool/src/index.ts @@ -46,7 +46,7 @@ import toolPlugin, { FileModelLogger } from '@hcengineering/server-tool' import { Command, program } from 'commander' import { Db, MongoClient } from 'mongodb' import { clearTelegramHistory } from './telegram' -import { diffWorkspace } from './workspace' +import { diffWorkspace, updateField } from './workspace' import { Data, getWorkspaceId, RateLimitter, Tx, Version } from '@hcengineering/core' import { MinioService } from '@hcengineering/minio' @@ -628,6 +628,25 @@ export function devTool ( await fixSkills(mongodbUri, getWorkspaceId(workspace, productId), transactorUrl, step) }) + program + .command('change-field ') + .description('change field value for the object') + .requiredOption('--objectId ', 'objectId') + .requiredOption('--objectClass ') + .requiredOption('--attribute ') + .requiredOption('--type ', 'number | string') + .requiredOption('--value ') + .requiredOption('--domain ') + .action( + async ( + workspace: string, + cmd: { objectId: string, objectClass: string, type: string, attribute: string, value: string, domain: string } + ) => { + const { mongodbUri } = prepareTools() + await updateField(mongodbUri, getWorkspaceId(workspace, productId), transactorUrl, cmd) + } + ) + extendProgram?.(program) program.parse(process.argv) diff --git a/dev/tool/src/workspace.ts b/dev/tool/src/workspace.ts index ad81664ab9..c06b14b312 100644 --- a/dev/tool/src/workspace.ts +++ b/dev/tool/src/workspace.ts @@ -15,10 +15,19 @@ // import contact from '@hcengineering/contact' -import core, { DOMAIN_TX, Tx, WorkspaceId } from '@hcengineering/core' +import core, { + Client as CoreClient, + BackupClient, + DOMAIN_TX, + Tx, + WorkspaceId, + type Ref, + type Doc +} from '@hcengineering/core' import { getWorkspaceDB } from '@hcengineering/mongo' import { MongoClient } from 'mongodb' import { generateModelDiff, printDiff } from './mdiff' +import { connect } from '@hcengineering/server-tool' export async function diffWorkspace (mongoUrl: string, workspace: WorkspaceId, rawTxes: Tx[]): Promise { const client = new MongoClient(mongoUrl) @@ -61,3 +70,30 @@ export async function diffWorkspace (mongoUrl: string, workspace: WorkspaceId, r await client.close() } } + +export async function updateField ( + mongoUrl: string, + workspaceId: WorkspaceId, + transactorUrl: string, + cmd: { objectId: string, objectClass: string, type: string, attribute: string, value: string, domain: string } +): Promise { + const connection = (await connect(transactorUrl, workspaceId, undefined, { + mode: 'backup' + })) as unknown as CoreClient & BackupClient + const client = new MongoClient(mongoUrl) + let valueToPut: string | number = cmd.value + if (cmd.type === 'number') valueToPut = parseFloat(valueToPut) + try { + try { + await client.connect() + const db = getWorkspaceDB(client, workspaceId) + await db + .collection(cmd.domain) + .updateOne({ _id: cmd.objectId as Ref }, { $set: { [cmd.attribute]: valueToPut } }) + } finally { + await client.close() + } + } finally { + await connection.close() + } +}