From 504a74d5129374e6745e58d70241111200f991f6 Mon Sep 17 00:00:00 2001 From: forehalo Date: Thu, 27 Mar 2025 12:32:29 +0000 Subject: [PATCH] chore(server): add import config script (#11242) --- packages/backend/server/src/data/app.ts | 13 ++++- .../server/src/data/commands/import.ts | 58 +++++++++++++++++++ 2 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 packages/backend/server/src/data/commands/import.ts diff --git a/packages/backend/server/src/data/app.ts b/packages/backend/server/src/data/app.ts index 552599137c..9e9783e650 100644 --- a/packages/backend/server/src/data/app.ts +++ b/packages/backend/server/src/data/app.ts @@ -1,11 +1,18 @@ import { Module } from '@nestjs/common'; -import { AppModule as BusinessAppModule } from '../app.module'; +import { FunctionalityModules } from '../app.module'; import { CreateCommand, NameQuestion } from './commands/create'; +import { ImportConfigCommand } from './commands/import'; import { RevertCommand, RunCommand } from './commands/run'; @Module({ - imports: [BusinessAppModule], - providers: [NameQuestion, CreateCommand, RunCommand, RevertCommand], + imports: FunctionalityModules, + providers: [ + NameQuestion, + CreateCommand, + RunCommand, + RevertCommand, + ImportConfigCommand, + ], }) export class CliAppModule {} diff --git a/packages/backend/server/src/data/commands/import.ts b/packages/backend/server/src/data/commands/import.ts new file mode 100644 index 0000000000..a3f1fc855c --- /dev/null +++ b/packages/backend/server/src/data/commands/import.ts @@ -0,0 +1,58 @@ +import { readFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +import { Logger } from '@nestjs/common'; +import { Command, CommandRunner } from 'nest-commander'; + +import { ConfigFactory } from '../../base'; +import { Models } from '../../models'; + +@Command({ + name: 'import-config', + arguments: '[name]', + description: 'import config from a file', +}) +export class ImportConfigCommand extends CommandRunner { + logger = new Logger(ImportConfigCommand.name); + + constructor( + private readonly models: Models, + private readonly configFactory: ConfigFactory + ) { + super(); + } + + override async run(inputs: string[]): Promise { + let path = inputs[0]; + path = resolve(process.cwd(), path); + + const overrides: Record> = JSON.parse( + readFileSync(path, 'utf-8') + ); + + const forValidation: { module: string; key: string; value: any }[] = []; + const forSaving: { key: string; value: any }[] = []; + Object.entries(overrides).forEach(([module, config]) => { + if (module === '$schema') { + return; + } + + Object.entries(config).forEach(([key, value]) => { + forValidation.push({ + module, + key, + value, + }); + forSaving.push({ + key: `${module}.${key}`, + value, + }); + }); + }); + + this.configFactory.validate(forValidation); + + // @ts-expect-error null as user id + await this.models.appConfig.save(null, forSaving); + } +}