From 97a26a2615664aac29d86e821f6fbeb25ae42d61 Mon Sep 17 00:00:00 2001 From: AkashNegi1 Date: Sat, 4 Jul 2026 22:10:51 +0530 Subject: [PATCH] Improve type safety of key in PropertyService --- apps/api/src/app/admin/admin.service.ts | 12 ++++++-- .../src/services/property/property.service.ts | 9 +++--- libs/common/src/lib/config.ts | 29 +++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index e50c0c77f..c7c5a7222 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -9,7 +9,8 @@ import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/sy import { PROPERTY_CURRENCIES, PROPERTY_IS_READ_ONLY_MODE, - PROPERTY_IS_USER_SIGNUP_ENABLED + PROPERTY_IS_USER_SIGNUP_ENABLED, + PropertyKey } from '@ghostfolio/common/config'; import { getAssetProfileIdentifier, @@ -347,9 +348,14 @@ export class AdminService { let response: Property; if (value) { - response = await this.propertyService.put({ key, value }); + response = await this.propertyService.put({ + key: key as PropertyKey, + value + }); } else { - response = await this.propertyService.delete({ key }); + response = await this.propertyService.delete({ + key: key as PropertyKey + }); } if (key === PROPERTY_IS_READ_ONLY_MODE && value === 'true') { diff --git a/apps/api/src/services/property/property.service.ts b/apps/api/src/services/property/property.service.ts index 212635f49..907ef1ae9 100644 --- a/apps/api/src/services/property/property.service.ts +++ b/apps/api/src/services/property/property.service.ts @@ -1,7 +1,8 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PROPERTY_CURRENCIES, - PROPERTY_IS_USER_SIGNUP_ENABLED + PROPERTY_IS_USER_SIGNUP_ENABLED, + PropertyKey } from '@ghostfolio/common/config'; import { Injectable } from '@nestjs/common'; @@ -12,7 +13,7 @@ import { PropertyValue } from './interfaces/interfaces'; export class PropertyService { public constructor(private readonly prismaService: PrismaService) {} - public async delete({ key }: { key: string }) { + public async delete({ key }: { key: PropertyKey }) { return this.prismaService.property.delete({ where: { key } }); @@ -40,7 +41,7 @@ export class PropertyService { return response; } - public async getByKey(aKey: string) { + public async getByKey(aKey: PropertyKey) { const properties = await this.get(); return properties[aKey] as TValue; } @@ -51,7 +52,7 @@ export class PropertyService { ); } - public async put({ key, value }: { key: string; value: string }) { + public async put({ key, value }: { key: PropertyKey; value: string }) { return this.prismaService.property.upsert({ create: { key, value }, update: { value }, diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 4f3e9dd9d..110e3bb9a 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -267,6 +267,35 @@ export const PROPERTY_SYSTEM_MESSAGE = 'SYSTEM_MESSAGE'; export const PROPERTY_UPTIME = 'UPTIME'; export const PROPERTY_WEB_FETCH_ROUTES = 'WEB_FETCH_ROUTES'; +export type PropertyKey = + | typeof PROPERTY_API_KEY_GHOSTFOLIO + | typeof PROPERTY_API_KEY_OPENROUTER + | typeof PROPERTY_BENCHMARKS + | typeof PROPERTY_BETTER_UPTIME_MONITOR_ID + | typeof PROPERTY_COUNTRIES_OF_SUBSCRIBERS + | typeof PROPERTY_COUPONS + | typeof PROPERTY_CURRENCIES + | typeof PROPERTY_CUSTOM_CRYPTOCURRENCIES + | typeof PROPERTY_DATA_SOURCE_MAPPING + | typeof PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS + | typeof PROPERTY_DEMO_ACCOUNT_ID + | typeof PROPERTY_DEMO_USER_ID + | typeof PROPERTY_DOCKER_HUB_PULLS + | typeof PROPERTY_GITHUB_CONTRIBUTORS + | typeof PROPERTY_GITHUB_STARGAZERS + | typeof PROPERTY_IS_DATA_GATHERING_ENABLED + | typeof PROPERTY_IS_READ_ONLY_MODE + | typeof PROPERTY_IS_USER_SIGNUP_ENABLED + | typeof PROPERTY_OPENROUTER_MODEL + | typeof PROPERTY_OPENROUTER_MODEL_WEB_FETCH + | typeof PROPERTY_PROXY_ROUTES + | typeof PROPERTY_REFERRAL_PARTNERS + | typeof PROPERTY_SLACK_COMMUNITY_USERS + | typeof PROPERTY_STRIPE_CONFIG + | typeof PROPERTY_SYSTEM_MESSAGE + | typeof PROPERTY_UPTIME + | typeof PROPERTY_WEB_FETCH_ROUTES; + export const QUEUE_JOB_STATUS_LIST = [ 'active', 'completed',