diff --git a/redisinsight/api/config/default.ts b/redisinsight/api/config/default.ts index bc3116a813..74eac065c6 100644 --- a/redisinsight/api/config/default.ts +++ b/redisinsight/api/config/default.ts @@ -5,7 +5,6 @@ const homedir = join(__dirname, '..'); const buildInfoFileName = 'build.json'; const dataZipFileName = 'data.zip'; - const staticDir = process.env.BUILD_TYPE === 'ELECTRON' && process['resourcesPath'] ? join(process['resourcesPath'], 'static') : join(__dirname, '..', 'static'); @@ -17,6 +16,7 @@ const defaultsDir = process.env.BUILD_TYPE === 'ELECTRON' && process['resourcesP export default { dir_path: { homedir, + prevHomedir: homedir, staticDir, defaultsDir, logs: join(homedir, 'logs'), diff --git a/redisinsight/api/config/production.ts b/redisinsight/api/config/production.ts index 921550ce45..893a6a877b 100644 --- a/redisinsight/api/config/production.ts +++ b/redisinsight/api/config/production.ts @@ -2,11 +2,14 @@ import { join } from 'path'; import * as os from 'os'; const homedir = process.env.APP_FOLDER_ABSOLUTE_PATH - || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-preview')); + || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-v2')); + +const prevHomedir = join(os.homedir(), '.redisinsight-preview'); export default { dir_path: { homedir, + prevHomedir, logs: join(homedir, 'logs'), customPlugins: join(homedir, 'plugins'), commands: join(homedir, 'commands'), diff --git a/redisinsight/api/config/staging.ts b/redisinsight/api/config/staging.ts index 47e48b0bbd..bb61d57a4d 100644 --- a/redisinsight/api/config/staging.ts +++ b/redisinsight/api/config/staging.ts @@ -2,11 +2,14 @@ import { join } from 'path'; import * as os from 'os'; const homedir = process.env.APP_FOLDER_ABSOLUTE_PATH - || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-v2.0-stage')); + || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-v2-stage')); + +const prevHomedir = join(os.homedir(), '.redisinsight-v2.0-stage'); export default { dir_path: { homedir, + prevHomedir, logs: join(homedir, 'logs'), customPlugins: join(homedir, 'plugins'), commands: join(homedir, 'commands'), diff --git a/redisinsight/api/package.json b/redisinsight/api/package.json index 1c7bb89aaa..d3692c1e9f 100644 --- a/redisinsight/api/package.json +++ b/redisinsight/api/package.json @@ -1,6 +1,6 @@ { "name": "redisinsight-api", - "version": "2.0.0", + "version": "2.0.5", "description": "RedisInsight API", "private": true, "author": { diff --git a/redisinsight/api/src/init-helper.ts b/redisinsight/api/src/init-helper.ts new file mode 100644 index 0000000000..775701f29d --- /dev/null +++ b/redisinsight/api/src/init-helper.ts @@ -0,0 +1,38 @@ +import * as fs from 'fs-extra'; +import config from 'src/utils/config'; +import { join } from 'path'; + +const PATH_CONFIG = config.get('dir_path'); +const DB_CONFIG = config.get('db'); + +/** + * Copy source if exists + * @param source + * @param destination + */ +const copySource = async (source, destination) => { + if (await fs.pathExists(source)) { + await fs.copy(source, destination).catch(); + } +}; + +/** + * Migrate data from previous home folder defined in configs + */ +export const migrateHomeFolder = async () => { + try { + if (!(await fs.pathExists(DB_CONFIG.database)) && await fs.pathExists(PATH_CONFIG.prevHomedir)) { + await fs.ensureDir(PATH_CONFIG.homedir); + + await Promise.all([ + 'redisinsight.db', + 'plugins', + ].map((target) => copySource( + join(PATH_CONFIG.prevHomedir, target), + join(PATH_CONFIG.homedir, target), + ))); + } + } catch (e) { + // continue initialization even without migration + } +}; diff --git a/redisinsight/api/src/main.ts b/redisinsight/api/src/main.ts index 2738f4bec6..8c7b7360d7 100644 --- a/redisinsight/api/src/main.ts +++ b/redisinsight/api/src/main.ts @@ -1,17 +1,20 @@ -import 'dotenv/config' +import 'dotenv/config'; import { NestFactory } from '@nestjs/core'; import { SwaggerModule } from '@nestjs/swagger'; import { NestApplicationOptions } from '@nestjs/common'; import * as bodyParser from 'body-parser'; import { WinstonModule } from 'nest-winston'; import { GlobalExceptionFilter } from 'src/exceptions/global-exception.filter'; +import { get } from 'src/utils'; +import { migrateHomeFolder } from 'src/init-helper'; import { AppModule } from './app.module'; import SWAGGER_CONFIG from '../config/swagger'; import LOGGER_CONFIG from '../config/logger'; -import config from './utils/config'; export default async function bootstrap() { - const serverConfig = config.get('server'); + await migrateHomeFolder(); + + const serverConfig = get('server'); const port = process.env.API_PORT || serverConfig.port; const logger = WinstonModule.createLogger(LOGGER_CONFIG); diff --git a/redisinsight/api/test/test-runs/docker.build.env b/redisinsight/api/test/test-runs/docker.build.env index 5447d87e74..2e1a141141 100644 --- a/redisinsight/api/test/test-runs/docker.build.env +++ b/redisinsight/api/test/test-runs/docker.build.env @@ -1,4 +1,3 @@ -APP_DATA_HOMEDIR=/root/.redisinsight-v2.0 COV_FOLDER=./coverage ID=defaultid RTE=defaultrte diff --git a/redisinsight/api/test/test-runs/local.build.env b/redisinsight/api/test/test-runs/local.build.env index cb8fc05435..942c00b38d 100644 --- a/redisinsight/api/test/test-runs/local.build.env +++ b/redisinsight/api/test/test-runs/local.build.env @@ -1,4 +1,3 @@ -APP_DATA_HOMEDIR=/root/.redisinsight-2.0 COV_FOLDER=./coverage ID=defaultid RTE=defaultrte