From 9e48cc087fc7fe49470aa7772574932e45baf7e8 Mon Sep 17 00:00:00 2001 From: Ayobami Akingbade Date: Tue, 12 Dec 2023 00:48:32 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=88=20perf(cache):=20rEAD=20ALL=20CONF?= =?UTF-8?q?IG=20THROUGH=20CACHE!!!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/lib/cache/AbstractCacheService.ts | 9 +++--- src/backend/lib/cache/MemoryCacheAdaptor.ts | 2 +- src/backend/lib/cache/RedisCacheAdaptor.ts | 2 +- .../AbstractConfigDataPersistenceService.ts | 29 +++++++++++++++---- .../DatabaseConfigDataPersistenceAdaptor.ts | 6 ++-- .../JsonFileConfigDataPersistenceAdaptor.ts | 6 ++-- .../MemoryConfigDataPersistenceAdaptor.ts | 6 ++-- .../RedisConfigDataPersistenceAdaptor.ts | 6 ++-- src/frontend/lib/storage/app.ts | 2 +- .../views/data/Details/RelationsDetails.tsx | 4 ++- src/frontend/views/data/Details/index.tsx | 2 +- .../views/data/Table/useTableColumns.tsx | 7 +---- 12 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/backend/lib/cache/AbstractCacheService.ts b/src/backend/lib/cache/AbstractCacheService.ts index 8f14eda31..e70b95e11 100644 --- a/src/backend/lib/cache/AbstractCacheService.ts +++ b/src/backend/lib/cache/AbstractCacheService.ts @@ -1,4 +1,3 @@ -import { isNotEmpty } from "class-validator"; import { ConfigApiService } from "../config/config.service"; export abstract class AbstractCacheService { @@ -10,8 +9,8 @@ export abstract class AbstractCacheService { public abstract setup(): Promise; - protected prefixKey(key: string) { - return `__dashpress__:${key}`; + private prefixKey(key: string) { + return `__dp__:${key}`; } abstract pullItem(key: string): Promise; @@ -27,13 +26,13 @@ export abstract class AbstractCacheService { const data = await this.pullItem(key); - if (isNotEmpty(data)) { + if (data !== undefined) { return data; } const fetchedData = await fetcher(); - await this.persistData(key, fetchedData); + await this.persistData(key, fetchedData || null); return fetchedData; } diff --git a/src/backend/lib/cache/MemoryCacheAdaptor.ts b/src/backend/lib/cache/MemoryCacheAdaptor.ts index 45a6252fb..1f9a75cf6 100644 --- a/src/backend/lib/cache/MemoryCacheAdaptor.ts +++ b/src/backend/lib/cache/MemoryCacheAdaptor.ts @@ -27,7 +27,7 @@ export class MemoryCacheAdaptor extends AbstractCacheService { } async clearItem(key: string) { - delete this.getData()[this.prefixKey(key)]; + delete this.getData()[key]; } async purge() { diff --git a/src/backend/lib/cache/RedisCacheAdaptor.ts b/src/backend/lib/cache/RedisCacheAdaptor.ts index 74679c1f0..db5011fde 100644 --- a/src/backend/lib/cache/RedisCacheAdaptor.ts +++ b/src/backend/lib/cache/RedisCacheAdaptor.ts @@ -39,7 +39,7 @@ export class RedisCacheAdaptor extends AbstractCacheService { } async clearItem(key: string) { - await (await this.getRedisInstance()).del(this.prefixKey(key)); + await (await this.getRedisInstance()).del(key); } async purge() { diff --git a/src/backend/lib/config-persistence/AbstractConfigDataPersistenceService.ts b/src/backend/lib/config-persistence/AbstractConfigDataPersistenceService.ts index a364696c8..0b18c003c 100644 --- a/src/backend/lib/config-persistence/AbstractConfigDataPersistenceService.ts +++ b/src/backend/lib/config-persistence/AbstractConfigDataPersistenceService.ts @@ -1,7 +1,10 @@ +import { createCacheService } from "../cache"; import { ConfigApiService } from "../config/config.service"; import { NotFoundError } from "../errors"; import { ConfigDomain } from "./types"; +const cacheService = createCacheService(); + export abstract class AbstractConfigDataPersistenceService { protected readonly _configDomain!: ConfigDomain; @@ -21,7 +24,27 @@ export abstract class AbstractConfigDataPersistenceService { return `${key}__${secondaryKey}`; } - public abstract getItem(key: string): Promise; + public abstract _getItem(key: string): Promise; // + + public abstract _persistItem(key: string, data: T): Promise; // + + public abstract _removeItem(key: string): Promise; // + + public async getItem(key: string) { + return await cacheService.getItem(key, async () => { + return this._getItem(key); + }); + } + + public async persistItem(key: string, data: T) { + await cacheService.clearItem(key); + await this._persistItem(key, data); + } + + public async removeItem(key: string) { + await cacheService.clearItem(key); + await this._removeItem(key); + } public abstract getItemLastUpdated(key: string): Promise; @@ -39,8 +62,6 @@ export abstract class AbstractConfigDataPersistenceService { public abstract getAllItems(): Promise; - public abstract persistItem(key: string, data: T): Promise; - public async upsertItem(key: string, data: T): Promise { await this.persistItem(key, data); } @@ -49,8 +70,6 @@ export abstract class AbstractConfigDataPersistenceService { await this.persistItem(key, data); } - public abstract removeItem(key: string): Promise; // - public async resetState(keyField: keyof T, data: T[]) { await this.resetToEmpty(); await this.saveAllItems(keyField, data); diff --git a/src/backend/lib/config-persistence/DatabaseConfigDataPersistenceAdaptor.ts b/src/backend/lib/config-persistence/DatabaseConfigDataPersistenceAdaptor.ts index 2c40b8b9e..a897f361c 100644 --- a/src/backend/lib/config-persistence/DatabaseConfigDataPersistenceAdaptor.ts +++ b/src/backend/lib/config-persistence/DatabaseConfigDataPersistenceAdaptor.ts @@ -94,7 +94,7 @@ export class DatabaseConfigDataPersistenceAdaptor< ); } - async getItem(key: string) { + async _getItem(key: string) { const connection = await this.getDbInstance(); const queryResponse = await connection .table(CONFIG_TABLE_NAME) @@ -129,7 +129,7 @@ export class DatabaseConfigDataPersistenceAdaptor< } } - async persistItem(key: string, value: T) { + async _persistItem(key: string, value: T) { const affectedRowsCount = await ( await this.getDbInstance() )(CONFIG_TABLE_NAME) @@ -152,7 +152,7 @@ export class DatabaseConfigDataPersistenceAdaptor< } } - async removeItem(key: string): Promise { + async _removeItem(key: string): Promise { await ( await this.getDbInstance() )(CONFIG_TABLE_NAME) diff --git a/src/backend/lib/config-persistence/JsonFileConfigDataPersistenceAdaptor.ts b/src/backend/lib/config-persistence/JsonFileConfigDataPersistenceAdaptor.ts index d7c16f312..a4a2dfd31 100644 --- a/src/backend/lib/config-persistence/JsonFileConfigDataPersistenceAdaptor.ts +++ b/src/backend/lib/config-persistence/JsonFileConfigDataPersistenceAdaptor.ts @@ -71,7 +71,7 @@ export class JsonFileConfigDataPersistenceAdaptor< ); } - async getItem(key: string) { + async _getItem(key: string) { const allIndexedItems = await this.getDomainData(); const currentItem = allIndexedItems[key]; if (currentItem) { @@ -80,13 +80,13 @@ export class JsonFileConfigDataPersistenceAdaptor< return undefined; } - async persistItem(key: string, data: T) { + async _persistItem(key: string, data: T) { const allIndexedItems = await this.getDomainData(); allIndexedItems[key] = data; await this.persist(allIndexedItems); } - async removeItem(key: string): Promise { + async _removeItem(key: string): Promise { const allIndexedItems = await this.getDomainData(); delete allIndexedItems[key]; await this.persist(allIndexedItems); diff --git a/src/backend/lib/config-persistence/MemoryConfigDataPersistenceAdaptor.ts b/src/backend/lib/config-persistence/MemoryConfigDataPersistenceAdaptor.ts index 5c9bca6e4..ce5b2df4a 100644 --- a/src/backend/lib/config-persistence/MemoryConfigDataPersistenceAdaptor.ts +++ b/src/backend/lib/config-persistence/MemoryConfigDataPersistenceAdaptor.ts @@ -56,7 +56,7 @@ export class MemoryConfigDataPersistenceAdaptor< ); } - async getItem(key: string) { + async _getItem(key: string) { const currentItem = MemoryConfigDataPersistenceAdaptor.getDomainData( this._configDomain )[key]; @@ -66,7 +66,7 @@ export class MemoryConfigDataPersistenceAdaptor< return undefined; } - async persistItem(key: string, data: T) { + async _persistItem(key: string, data: T) { const domainData = MemoryConfigDataPersistenceAdaptor.getDomainData( this._configDomain ); @@ -74,7 +74,7 @@ export class MemoryConfigDataPersistenceAdaptor< this.persistDomainData(domainData); } - public async removeItem(key: string): Promise { + async _removeItem(key: string): Promise { const domainData = MemoryConfigDataPersistenceAdaptor.getDomainData( this._configDomain ); diff --git a/src/backend/lib/config-persistence/RedisConfigDataPersistenceAdaptor.ts b/src/backend/lib/config-persistence/RedisConfigDataPersistenceAdaptor.ts index 93762e9c0..65e622758 100644 --- a/src/backend/lib/config-persistence/RedisConfigDataPersistenceAdaptor.ts +++ b/src/backend/lib/config-persistence/RedisConfigDataPersistenceAdaptor.ts @@ -72,7 +72,7 @@ export class RedisConfigDataPersistenceAdaptor< ); } - async getItem(key: string) { + async _getItem(key: string) { return JSON.parse( await ( await this.getRedisInstance() @@ -80,13 +80,13 @@ export class RedisConfigDataPersistenceAdaptor< ); } - async persistItem(key: string, data: T) { + async _persistItem(key: string, data: T) { await ( await this.getRedisInstance() ).hSet(this.wrapWithConfigDomain(), { [key]: JSON.stringify(data) }); } - public async removeItem(key: string): Promise { + async _removeItem(key: string): Promise { await ( await this.getRedisInstance() ).hDel(this.wrapWithConfigDomain(), key); diff --git a/src/frontend/lib/storage/app.ts b/src/frontend/lib/storage/app.ts index c9c324189..e4cdaf627 100644 --- a/src/frontend/lib/storage/app.ts +++ b/src/frontend/lib/storage/app.ts @@ -1,7 +1,7 @@ import { sluggify } from "shared/lib/strings"; import { StorageService } from "."; -const PREFIX = "_app_config__"; +const PREFIX = "__dp__"; const makeKey = (key: string): string => { return sluggify(`${PREFIX}${key}`, "_"); diff --git a/src/frontend/views/data/Details/RelationsDetails.tsx b/src/frontend/views/data/Details/RelationsDetails.tsx index 557075857..6609fcccf 100644 --- a/src/frontend/views/data/Details/RelationsDetails.tsx +++ b/src/frontend/views/data/Details/RelationsDetails.tsx @@ -124,7 +124,9 @@ export function EntityRelationDetails() { { - const { entityType, entityFieldSelections, isIdField, referenceField, lean } = - prop; + const { entityType, entityFieldSelections, isIdField, referenceField } = prop; - if (lean) { - return undefined; - } if (isIdField) { return { _type: "idField",