diff --git a/server/src/modules/app/module.ts b/server/src/modules/app/module.ts index 24c78aaaa5..cc3ae9fc1b 100644 --- a/server/src/modules/app/module.ts +++ b/server/src/modules/app/module.ts @@ -54,6 +54,7 @@ import { SessionScheduler } from '@modules/session/scheduler'; import { AuditLogsClearScheduler } from '@modules/audit-logs/scheduler'; import { ModulesModule } from '@modules/modules/module'; import { EmailListenerModule } from '@modules/email-listener/module'; +import { InMemoryCacheModule } from '@modules/inMemoryCache/module'; export class AppModule implements OnModuleInit { static async register(configs: { IS_GET_CONTEXT: boolean }): Promise { // Load static and dynamic modules @@ -115,6 +116,7 @@ export class AppModule implements OnModuleInit { await CrmModule.register(configs), await OrganizationPaymentModule.register(configs), await EmailListenerModule.register(configs), + await InMemoryCacheModule.register(configs), ]; return { diff --git a/server/src/modules/data-sources/module.ts b/server/src/modules/data-sources/module.ts index 21cfe48706..38e7ad0ef7 100644 --- a/server/src/modules/data-sources/module.ts +++ b/server/src/modules/data-sources/module.ts @@ -11,8 +11,8 @@ import { AppsRepository } from '@modules/apps/repository'; import { TooljetDbModule } from '@modules/tooljet-db/module'; import { OrganizationRepository } from '@modules/organizations/repository'; import { SessionModule } from '@modules/session/module'; -import { InMemoryCacheService } from '@helpers/in_memory_cache.service'; import { SubModule } from '@modules/app/sub-module'; +import { InMemoryCacheModule } from '@modules/inMemoryCache/module'; export class DataSourcesModule extends SubModule { static async register(configs?: { IS_GET_CONTEXT: boolean }): Promise { @@ -41,6 +41,7 @@ export class DataSourcesModule extends SubModule { await InstanceSettingsModule.register(configs), await TooljetDbModule.register(configs), await SessionModule.register(configs), + await InMemoryCacheModule.register(configs), ], providers: [ DataSourcesService, @@ -54,7 +55,6 @@ export class DataSourcesModule extends SubModule { FeatureAbilityFactory, OrganizationsService, OrganizationRepository, - InMemoryCacheService, ], controllers: [DataSourcesController], exports: [DataSourcesUtilService, SampleDataSourceService, PluginsServiceSelector], diff --git a/server/src/modules/data-sources/util.service.ts b/server/src/modules/data-sources/util.service.ts index d2bb1670ab..bddb72874b 100644 --- a/server/src/modules/data-sources/util.service.ts +++ b/server/src/modules/data-sources/util.service.ts @@ -21,7 +21,7 @@ import { PluginsServiceSelector } from './services/plugin-selector.service'; import { OrganizationConstantsUtilService } from '@modules/organization-constants/util.service'; import { DataSourceOptions } from '@entities/data_source_options.entity'; import { IDataSourcesUtilService } from './interfaces/IUtilService'; -import { InMemoryCacheService } from '@helpers/in_memory_cache.service'; +import { InMemoryCacheService } from '@modules/inMemoryCache/util.service'; @Injectable() export class DataSourcesUtilService implements IDataSourcesUtilService { diff --git a/server/src/modules/inMemoryCache/interfaces/IUtilService.ts b/server/src/modules/inMemoryCache/interfaces/IUtilService.ts new file mode 100644 index 0000000000..ce774ebb82 --- /dev/null +++ b/server/src/modules/inMemoryCache/interfaces/IUtilService.ts @@ -0,0 +1,27 @@ +export interface ICacheService { + /** + * Store a promise value in the cache with the given key + * @param key - The cache key + * @param value - The promise to cache + */ + set(key: string, value: Promise): void; + + /** + * Retrieve a cached promise by key + * @param key - The cache key + * @returns The cached promise or undefined if not found + */ + get(key: string): Promise | undefined; + + /** + * Check if a key exists in the cache + * @param key - The cache key + * @returns True if the key exists, false otherwise + */ + has(key: string): boolean; + + /** + * Clear all cached entries + */ + clear(): void; +} diff --git a/server/src/modules/inMemoryCache/module.ts b/server/src/modules/inMemoryCache/module.ts new file mode 100644 index 0000000000..2aa94170f9 --- /dev/null +++ b/server/src/modules/inMemoryCache/module.ts @@ -0,0 +1,15 @@ +import { SubModule } from '@modules/app/sub-module'; +import { DynamicModule } from '@nestjs/common'; + +export class InMemoryCacheModule extends SubModule { + static async register(configs?: { IS_GET_CONTEXT: boolean }): Promise { + const { InMemoryCacheService } = await this.getProviders(configs, 'inMemoryCache', ['util.service']); + + return { + module: InMemoryCacheService, + controllers: [], + providers: [], + exports: [InMemoryCacheService], + }; + } +} diff --git a/server/src/helpers/in_memory_cache.service.ts b/server/src/modules/inMemoryCache/util.service.ts similarity index 80% rename from server/src/helpers/in_memory_cache.service.ts rename to server/src/modules/inMemoryCache/util.service.ts index b1cfde0184..ab378edb9a 100644 --- a/server/src/helpers/in_memory_cache.service.ts +++ b/server/src/modules/inMemoryCache/util.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@nestjs/common'; +import { ICacheService } from './interfaces/IUtilService'; @Injectable() -export class InMemoryCacheService { +export class InMemoryCacheService implements ICacheService { private static cacheStore: Map> = new Map(); set(key: string, value: Promise): void {