From a27b79eae37da87bf89a395af097881a132a8bc2 Mon Sep 17 00:00:00 2001 From: Innei Date: Mon, 22 Aug 2022 23:22:45 +0800 Subject: [PATCH] refactor: app module Signed-off-by: Innei --- src/app.config.ts | 14 +- src/app.controller.ts | 4 +- src/app.module.ts | 175 ++++++++++--------- src/bootstrap.ts | 9 +- src/common/decorator/cron-once.decorator.ts | 2 +- src/global/consola.global.ts | 8 + src/global/env.global.ts | 11 +- src/global/index.global.ts | 8 +- src/migration/migrate.ts | 16 +- src/modules/configs/configs.default.ts | 4 +- src/modules/init/init.controller.ts | 6 +- src/modules/init/init.service.ts | 3 +- src/modules/pageproxy/pageproxy.module.ts | 2 - src/modules/pageproxy/pageproxy.service.ts | 7 +- src/modules/pty/pty.gateway.ts | 4 +- src/processors/database/database.provider.ts | 49 +----- src/processors/helper/helper.cron.service.ts | 4 +- src/utils/biz.util.ts | 4 +- src/utils/check-init.util.ts | 9 + src/utils/database.util.ts | 55 ++++++ src/utils/redis.util.ts | 4 +- 21 files changed, 210 insertions(+), 188 deletions(-) create mode 100644 src/utils/check-init.util.ts create mode 100644 src/utils/database.util.ts diff --git a/src/app.config.ts b/src/app.config.ts index de600101..c62cd325 100644 --- a/src/app.config.ts +++ b/src/app.config.ts @@ -2,15 +2,12 @@ import { AxiosRequestConfig } from 'axios' import cluster from 'cluster' import { argv } from 'zx-cjs' -export const isDev = process.env.NODE_ENV == 'development' - -export const isTest = !!process.env.TEST -export const cwd = process.cwd() +import { cwd, isDev, isMainCluster, isTest } from './global/env.global' export const PORT = argv.port || process.env.PORT || 2333 export const API_VERSION = 2 -export const isInDemoMode = argv.demo || false +export const DEMO_MODE = argv.demo || false export const CROSS_DOMAIN = { allowedOrigins: argv.allowed_origins @@ -32,7 +29,7 @@ export const CROSS_DOMAIN = { } export const MONGO_DB = { - dbName: argv.collection_name || (isInDemoMode ? 'mx-space_demo' : 'mx-space'), + dbName: argv.collection_name || (DEMO_MODE ? 'mx-space_demo' : 'mx-space'), host: argv.db_host || '127.0.0.1', port: argv.db_port || 27017, get uri() { @@ -69,11 +66,6 @@ export const CLUSTER = { workers: argv.cluster_workers, } -/** Is main cluster in PM2 */ -export const isMainCluster = - process.env.NODE_APP_INSTANCE && parseInt(process.env.NODE_APP_INSTANCE) === 0 -export const isMainProcess = cluster.isPrimary || isMainCluster - export const DEBUG_MODE = { httpRequestVerbose: argv.httpRequestVerbose ?? argv.http_request_verbose ?? true, diff --git a/src/app.controller.ts b/src/app.controller.ts index de48d8b3..bfd76c0a 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -11,7 +11,7 @@ import { ApiController } from '~/common/decorator/api-controller.decorator' import { InjectModel } from '~/transformers/model.transformer' import PKG from '../package.json' -import { isInDemoMode } from './app.config' +import { DEMO_MODE } from './app.config' import { Auth } from './common/decorator/auth.decorator' import { HttpCache } from './common/decorator/cache.decorator' import { IpLocation, IpRecord } from './common/decorator/ip.decorator' @@ -36,7 +36,7 @@ export class AppController { return { name: PKG.name, author: PKG.author, - version: isDev ? 'dev' : `${isInDemoMode ? 'demo/' : ''}${PKG.version}`, + version: isDev ? 'dev' : `${DEMO_MODE ? 'demo/' : ''}${PKG.version}`, homepage: PKG.homepage, issues: PKG.issues, } diff --git a/src/app.module.ts b/src/app.module.ts index 35dcffa4..a35105a7 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,7 +1,7 @@ -import { Module, NestModule, Type } from '@nestjs/common' +import { DynamicModule, Module, NestModule, Type } from '@nestjs/common' import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core' -import { isInDemoMode } from './app.config' +import { DEMO_MODE } from './app.config' import { AppController } from './app.controller' import { AllExceptionsFilter } from './common/filters/any-exception.filter' import { RolesGuard } from './common/guard/roles.guard' @@ -52,92 +52,97 @@ import { HelperModule } from './processors/helper/helper.module' import { LoggerModule } from './processors/logger/logger.module' import { RedisModule } from './processors/redis/redis.module' -@Module({ - imports: [ - LoggerModule, - DatabaseModule, - RedisModule, +@Module({}) +export class AppModule { + static register(isInit: boolean): DynamicModule { + return { + module: AppModule, + imports: [ + LoggerModule, + DatabaseModule, + RedisModule, - AggregateModule, - AnalyzeModule, - AuthModule, - BackupModule, - CategoryModule, - CommentModule, - ConfigsModule, - isInDemoMode && DemoModule, - DependencyModule, - FeedModule, - FileModule, - HealthModule, - InitModule, - LinkModule, - MarkdownModule, - NoteModule, - OptionModule, - PageModule, - PostModule, - ProjectModule, - PTYModule, - RecentlyModule, - UpdateModule, - TopicModule, - SayModule, - SearchModule, - ServerlessModule, - SitemapModule, - SnippetModule, - ToolModule, - UserModule, + AggregateModule, + AnalyzeModule, + AuthModule, + BackupModule, + CategoryModule, + CommentModule, + ConfigsModule, + DEMO_MODE && DemoModule, + DependencyModule, + FeedModule, + FileModule, + HealthModule, + !isInit && InitModule, + LinkModule, + MarkdownModule, + NoteModule, + OptionModule, + PageModule, + PostModule, + ProjectModule, + PTYModule, + RecentlyModule, + UpdateModule, + TopicModule, + SayModule, + SearchModule, + ServerlessModule, + SitemapModule, + SnippetModule, + ToolModule, + UserModule, - PageProxyModule, - RenderEjsModule, + PageProxyModule, + RenderEjsModule, - GatewayModule, - HelperModule, + GatewayModule, + HelperModule, - isDev ? DebugModule : undefined, - ].filter(Boolean) as Type[], - controllers: [AppController], - providers: [ - { - provide: APP_INTERCEPTOR, - useClass: QueryInterceptor, - }, + isDev ? DebugModule : undefined, + ].filter(Boolean) as Type[], + controllers: [AppController], + providers: [ + { + provide: APP_INTERCEPTOR, + useClass: QueryInterceptor, + }, - { - provide: APP_INTERCEPTOR, - useClass: HttpCacheInterceptor, // 4 - }, - { - provide: APP_INTERCEPTOR, - useClass: AnalyzeInterceptor, - }, - { - provide: APP_INTERCEPTOR, - useClass: CountingInterceptor, // 3 - }, - { - provide: APP_INTERCEPTOR, - useClass: JSONTransformInterceptor, // 2 - }, - { - provide: APP_INTERCEPTOR, - useClass: ResponseInterceptor, // 1 - }, - { - provide: APP_INTERCEPTOR, - useClass: IdempotenceInterceptor, // 0 - }, + { + provide: APP_INTERCEPTOR, + useClass: HttpCacheInterceptor, // 4 + }, + { + provide: APP_INTERCEPTOR, + useClass: AnalyzeInterceptor, + }, + { + provide: APP_INTERCEPTOR, + useClass: CountingInterceptor, // 3 + }, + { + provide: APP_INTERCEPTOR, + useClass: JSONTransformInterceptor, // 2 + }, + { + provide: APP_INTERCEPTOR, + useClass: ResponseInterceptor, // 1 + }, + { + provide: APP_INTERCEPTOR, + useClass: IdempotenceInterceptor, // 0 + }, - { - provide: APP_FILTER, - useClass: AllExceptionsFilter, - }, - { - provide: APP_GUARD, - useClass: RolesGuard, - }, - ], -}) -export class AppModule {} + { + provide: APP_FILTER, + useClass: AllExceptionsFilter, + }, + { + provide: APP_GUARD, + useClass: RolesGuard, + }, + ], + } + } +} diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 179d38d8..cb9ad3ea 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -6,16 +6,17 @@ import { LogLevel, Logger, ValidationPipe } from '@nestjs/common' import { ContextIdFactory, NestFactory } from '@nestjs/core' import { NestFastifyApplication } from '@nestjs/platform-fastify' -import { API_VERSION, CROSS_DOMAIN, PORT, isMainProcess } from './app.config' +import { API_VERSION, CROSS_DOMAIN, PORT } from './app.config' import { AppModule } from './app.module' import { fastifyApp } from './common/adapters/fastify.adapter' import { RedisIoAdapter } from './common/adapters/socket.adapter' import { SpiderGuard } from './common/guard/spider.guard' import { LoggingInterceptor } from './common/interceptors/logging.interceptor' import { AggregateByTenantContextIdStrategy } from './common/strategies/context.strategy' -import { isTest } from './global/env.global' +import { isMainProcess, isTest } from './global/env.global' import { migrateDatabase } from './migration/migrate' import { MyLogger } from './processors/logger/logger.service' +import { checkInit } from './utils/check-init.util' const Origin: false | string[] = Array.isArray(CROSS_DOMAIN.allowedOrigins) ? [...CROSS_DOMAIN.allowedOrigins, '*.shizuri.net', '22333322.xyz'] @@ -26,8 +27,10 @@ declare const module: any export async function bootstrap() { process.title = `Mix Space (${cluster.isPrimary ? 'master' : 'worker'})` await migrateDatabase() + const isInit = await checkInit() + const app = await NestFactory.create( - AppModule, + AppModule.register(isInit), fastifyApp, { logger: ['error'].concat( diff --git a/src/common/decorator/cron-once.decorator.ts b/src/common/decorator/cron-once.decorator.ts index 9d16d1b7..d2642955 100644 --- a/src/common/decorator/cron-once.decorator.ts +++ b/src/common/decorator/cron-once.decorator.ts @@ -2,7 +2,7 @@ import cluster from 'cluster' import { Cron } from '@nestjs/schedule' -import { isMainProcess } from '~/app.config' +import { isMainProcess } from '~/global/env.global' export const CronOnce = (...rest: Parameters): MethodDecorator => { // If not in cluster mode, and PM2 main worker diff --git a/src/global/consola.global.ts b/src/global/consola.global.ts index a63d3c87..ed970d69 100644 --- a/src/global/consola.global.ts +++ b/src/global/consola.global.ts @@ -14,7 +14,15 @@ import { isDev, isTest } from './env.global' class Reporter extends FancyReporter { isInVirtualTerminal = typeof process.stdout.columns === 'undefined' // HACK: if got `undefined` that means in PM2 pty + private latestLogTime: number = performance.now() protected formatDate(date: Date): string { + if (isDev) { + const now = performance.now() + const delta = now - this.latestLogTime + this.latestLogTime = now + return `+${delta | 0}ms ${super.formatDate(date)}` + } + return this.isInVirtualTerminal ? '' : super.formatDate(date) } diff --git a/src/global/env.global.ts b/src/global/env.global.ts index 36f8b35d..782c9cef 100644 --- a/src/global/env.global.ts +++ b/src/global/env.global.ts @@ -1 +1,10 @@ -export { isDev, cwd, isTest } from '~/app.config' +import cluster from 'cluster' + +export const isMainCluster = + process.env.NODE_APP_INSTANCE && parseInt(process.env.NODE_APP_INSTANCE) === 0 +export const isMainProcess = cluster.isPrimary || isMainCluster + +export const isDev = process.env.NODE_ENV == 'development' + +export const isTest = !!process.env.TEST +export const cwd = process.cwd() diff --git a/src/global/index.global.ts b/src/global/index.global.ts index 248341dc..6d9d22b7 100644 --- a/src/global/index.global.ts +++ b/src/global/index.global.ts @@ -6,7 +6,6 @@ import 'zx-cjs/globals' import { Logger } from '@nestjs/common' -import { CLUSTER } from '~/app.config' import { DATA_DIR, LOG_DIR, @@ -20,6 +19,8 @@ import { consola, registerStdLogger } from './consola.global' import './dayjs.global' +import { CLUSTER } from '~/app.config' + import { cwd, isDev } from './env.global' import { registerJSONGlobal } from './json.global' @@ -56,8 +57,9 @@ function registerGlobal() { } export function register() { - registerStdLogger() - mkdirs() registerGlobal() + registerStdLogger() registerJSONGlobal() + + mkdirs() } diff --git a/src/migration/migrate.ts b/src/migration/migrate.ts index 02dc138b..3f3fb056 100644 --- a/src/migration/migrate.ts +++ b/src/migration/migrate.ts @@ -1,14 +1,13 @@ import { existsSync } from 'fs-extra' -import { MongoClient } from 'mongodb' -import * as APP_CONFIG from '../app.config' +import { isMainProcess } from '~/global/env.global' +import { getDatabaseConnection } from '~/utils/database.util' + import { DATA_DIR } from '../constants/path.constant' import VersionList from './history' -const { MONGO_DB } = APP_CONFIG - export async function migrateDatabase() { - if (!APP_CONFIG.isMainProcess) { + if (!isMainProcess) { return } @@ -19,9 +18,8 @@ export async function migrateDatabase() { const migratedSet = new Set(migrateRecord.split('\n')) - const client = new MongoClient(`mongodb://${MONGO_DB.host}:${MONGO_DB.port}`) - await client.connect() - const db = client.db(MONGO_DB.dbName) + const connection = await getDatabaseConnection() + const db = connection.db for (const migrate of VersionList) { if (migratedSet.has(migrate.name)) { @@ -39,6 +37,4 @@ export async function migrateDatabase() { await fs.writeFile(migrateFilePath, [...migratedSet].join('\n'), { flag: 'w+', }) - - await client.close() } diff --git a/src/modules/configs/configs.default.ts b/src/modules/configs/configs.default.ts index 83fa9448..739e309f 100644 --- a/src/modules/configs/configs.default.ts +++ b/src/modules/configs/configs.default.ts @@ -1,4 +1,4 @@ -import { isInDemoMode } from '~/app.config' +import { DEMO_MODE } from '~/app.config' import { IConfig } from './configs.interface' @@ -41,7 +41,7 @@ export const generateDefaultConfig: () => IConfig = () => ({ }, friendLinkOptions: { allowApply: true }, backupOptions: { - enable: isInDemoMode ? false : true, + enable: DEMO_MODE ? false : true, region: null!, bucket: null!, secretId: null!, diff --git a/src/modules/init/init.controller.ts b/src/modules/init/init.controller.ts index e3c89eb5..bc8addfb 100644 --- a/src/modules/init/init.controller.ts +++ b/src/modules/init/init.controller.ts @@ -5,7 +5,6 @@ import { Get, Param, Patch, - Scope, UnprocessableEntityException, } from '@nestjs/common' @@ -16,10 +15,7 @@ import { ConfigsService } from '../configs/configs.service' import { ConfigKeyDto } from '../option/dtos/config.dto' import { InitService } from './init.service' -@ApiController({ - path: '/init', - scope: Scope.REQUEST, -}) +@ApiController('/init') @ApiName export class InitController { constructor( diff --git a/src/modules/init/init.service.ts b/src/modules/init/init.service.ts index 77f0f540..cc2d906e 100644 --- a/src/modules/init/init.service.ts +++ b/src/modules/init/init.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Logger } from '@nestjs/common' +import { Injectable } from '@nestjs/common' import { DATA_DIR, TEMP_DIR } from '~/constants/path.constant' @@ -6,7 +6,6 @@ import { UserService } from '../user/user.service' @Injectable() export class InitService { - private logger = new Logger(InitService.name) constructor(private readonly userService: UserService) {} getTempdir() { diff --git a/src/modules/pageproxy/pageproxy.module.ts b/src/modules/pageproxy/pageproxy.module.ts index 8da03e5f..404a7c4f 100644 --- a/src/modules/pageproxy/pageproxy.module.ts +++ b/src/modules/pageproxy/pageproxy.module.ts @@ -1,12 +1,10 @@ import { Module } from '@nestjs/common' -import { InitModule } from '../init/init.module' import { PageProxyController } from './pageproxy.controller' import { PageProxyService } from './pageproxy.service' @Module({ controllers: [PageProxyController], providers: [PageProxyService], - imports: [InitModule], }) export class PageProxyModule {} diff --git a/src/modules/pageproxy/pageproxy.service.ts b/src/modules/pageproxy/pageproxy.service.ts index 424d51c8..ba1406d8 100644 --- a/src/modules/pageproxy/pageproxy.service.ts +++ b/src/modules/pageproxy/pageproxy.service.ts @@ -7,14 +7,10 @@ import PKG from '~/../package.json' import { API_VERSION } from '~/app.config' import { ConfigsService } from '../configs/configs.service' -import { InitService } from '../init/init.service' @Injectable() export class PageProxyService { - constructor( - private readonly configs: ConfigsService, - private readonly initService: InitService, - ) {} + constructor(private readonly configs: ConfigsService) {} async checkCanAccessAdminProxy() { const { adminExtra } = await this.configs.waitForConfigReady() @@ -61,7 +57,6 @@ export class PageProxyService { LOGIN_BG: adminExtra.background, TITLE: adminExtra.title, WEB_URL: webUrl, - INIT: await this.initService.isInit(), } as IInjectableData)}`} ${ BASE_API diff --git a/src/modules/pty/pty.gateway.ts b/src/modules/pty/pty.gateway.ts index 2ac476fd..5549d60a 100644 --- a/src/modules/pty/pty.gateway.ts +++ b/src/modules/pty/pty.gateway.ts @@ -11,7 +11,7 @@ import { WebSocketGateway, } from '@nestjs/websockets' -import { isInDemoMode } from '~/app.config' +import { DEMO_MODE } from '~/app.config' import { BusinessEvents } from '~/constants/business-event.constant' import { RedisKeys } from '~/constants/cache.constant' import { DATA_DIR } from '~/constants/path.constant' @@ -43,7 +43,7 @@ export class PTYGateway client: Socket, data?: { password?: string; cols: number; rows: number }, ) { - if (isInDemoMode) { + if (DEMO_MODE) { client.send( this.gatewayMessageFormat( BusinessEvents.PTY_MESSAGE, diff --git a/src/processors/database/database.provider.ts b/src/processors/database/database.provider.ts index de123216..6cd4ab8a 100644 --- a/src/processors/database/database.provider.ts +++ b/src/processors/database/database.provider.ts @@ -1,52 +1,7 @@ -/** - * @copy https://github.com/surmon-china/nodepress/blob/main/src/processors/database/database.provider.ts - */ -import { mongoose } from '@typegoose/typegoose' - -import { MONGO_DB } from '~/app.config' import { DB_CONNECTION_TOKEN } from '~/constants/system.constant' +import { getDatabaseConnection } from '~/utils/database.util' export const databaseProvider = { provide: DB_CONNECTION_TOKEN, - useFactory: async () => { - let reconnectionTask: NodeJS.Timeout | null = null - const RECONNECT_INTERVAL = 6000 - - const connection = () => { - return mongoose.connect(MONGO_DB.uri, {}) - } - const Badge = `[${chalk.yellow('MongoDB')}]` - - const color = (str: TemplateStringsArray, ...args: any[]) => { - return str.map((s) => chalk.green(s)).join('') - } - mongoose.connection.on('connecting', () => { - consola.info(Badge, color`connecting...`) - }) - - mongoose.connection.on('open', () => { - consola.info(Badge, color`readied!`) - if (reconnectionTask) { - clearTimeout(reconnectionTask) - reconnectionTask = null - } - }) - - mongoose.connection.on('disconnected', () => { - consola.error( - Badge, - chalk.red( - `disconnected! retry when after ${RECONNECT_INTERVAL / 1000}s`, - ), - ) - reconnectionTask = setTimeout(connection, RECONNECT_INTERVAL) - }) - - mongoose.connection.on('error', (error) => { - consola.error(Badge, 'error!', error) - mongoose.disconnect() - }) - - return await connection().then((mongoose) => mongoose.connection) - }, + useFactory: getDatabaseConnection, } diff --git a/src/processors/helper/helper.cron.service.ts b/src/processors/helper/helper.cron.service.ts index 9d25ecaf..27b12eb3 100644 --- a/src/processors/helper/helper.cron.service.ts +++ b/src/processors/helper/helper.cron.service.ts @@ -9,7 +9,7 @@ import { Inject, Injectable, Logger, forwardRef } from '@nestjs/common' import { OnEvent } from '@nestjs/event-emitter' import { CronExpression } from '@nestjs/schedule' -import { isInDemoMode } from '~/app.config' +import { DEMO_MODE } from '~/app.config' import { CronDescription } from '~/common/decorator/cron-description.decorator' import { CronOnce } from '~/common/decorator/cron-once.decorator' import { RedisKeys } from '~/constants/cache.constant' @@ -64,7 +64,7 @@ export class CronService { @CronOnce(CronExpression.EVERY_DAY_AT_1AM, { name: 'backupDB' }) @CronDescription('备份 DB 并上传 COS') async backupDB({ uploadCOS = true }: { uploadCOS?: boolean } = {}) { - if (isInDemoMode) { + if (DEMO_MODE) { return } const backup = await this.backupService.backup() diff --git a/src/utils/biz.util.ts b/src/utils/biz.util.ts index 4c70e22c..88090461 100644 --- a/src/utils/biz.util.ts +++ b/src/utils/biz.util.ts @@ -1,11 +1,11 @@ -import { isInDemoMode } from '~/app.config' +import { DEMO_MODE } from '~/app.config' import { BanInDemoExcpetion } from '~/common/exceptions/ban-in-demo.exception' /** * 检查是否在 demo 模式下,禁用此功能 */ export const banInDemo = () => { - if (isInDemoMode) { + if (DEMO_MODE) { throw new BanInDemoExcpetion() } } diff --git a/src/utils/check-init.util.ts b/src/utils/check-init.util.ts new file mode 100644 index 00000000..18d8c026 --- /dev/null +++ b/src/utils/check-init.util.ts @@ -0,0 +1,9 @@ +import { getDatabaseConnection } from './database.util' + +export const checkInit = async () => { + const connection = await getDatabaseConnection() + const db = connection.db + const isUserExist = (await db.collection('users').countDocuments()) > 0 + + return isUserExist +} diff --git a/src/utils/database.util.ts b/src/utils/database.util.ts new file mode 100644 index 00000000..dd2290da --- /dev/null +++ b/src/utils/database.util.ts @@ -0,0 +1,55 @@ +/** + * @see https://github.com/surmon-china/nodepress/blob/main/src/processors/database/database.provider.ts + */ +import mongoose from 'mongoose' + +import { MONGO_DB } from '~/app.config' + +let databaseConnection: mongoose.Connection | null = null +export const getDatabaseConnection = async () => { + if (databaseConnection) { + return databaseConnection + } + let reconnectionTask: NodeJS.Timeout | null = null + const RECONNECT_INTERVAL = 6000 + + const connection = () => { + return mongoose.connect(MONGO_DB.uri, {}) + } + const Badge = `[${chalk.yellow('MongoDB')}]` + + const color = (str: TemplateStringsArray) => { + return str.map((s) => chalk.green(s)).join('') + } + mongoose.connection.on('connecting', () => { + consola.info(Badge, color`connecting...`) + }) + + mongoose.connection.on('open', () => { + consola.info(Badge, color`readied!`) + if (reconnectionTask) { + clearTimeout(reconnectionTask) + reconnectionTask = null + } + }) + + mongoose.connection.on('disconnected', () => { + consola.error( + Badge, + chalk.red(`disconnected! retry when after ${RECONNECT_INTERVAL / 1000}s`), + ) + reconnectionTask = setTimeout(connection, RECONNECT_INTERVAL) + }) + + mongoose.connection.on('error', (error) => { + consola.error(Badge, 'error!', error) + mongoose.disconnect() + }) + + databaseConnection = await connection().then( + (mongoose) => mongoose.connection, + ) + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return databaseConnection! +} diff --git a/src/utils/redis.util.ts b/src/utils/redis.util.ts index c5ae0bfd..edaead4f 100644 --- a/src/utils/redis.util.ts +++ b/src/utils/redis.util.ts @@ -1,8 +1,8 @@ -import { isInDemoMode } from '~/app.config' +import { DEMO_MODE } from '~/app.config' import { RedisKeys } from '~/constants/cache.constant' type Prefix = 'mx' | 'mx-demo' -const prefix = isInDemoMode ? 'mx-demo' : 'mx' +const prefix = DEMO_MODE ? 'mx-demo' : 'mx' export const getRedisKey = ( key: T,