From 029504d843d9fd816424a5b8af32aec592c1cdc2 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 21 Jun 2025 11:56:35 +0200 Subject: [PATCH] Feature/refactor sitemap module (#4983) * Refactor sitemap module --- apps/api/src/app/app.module.ts | 2 +- .../endpoints/sitemap/sitemap.controller.ts | 49 ++++++++++++ .../{ => endpoints}/sitemap/sitemap.module.ts | 4 +- .../app/endpoints/sitemap/sitemap.service.ts | 43 ++++++++++ .../api/src/app/sitemap/sitemap.controller.ts | 80 ------------------- 5 files changed, 96 insertions(+), 82 deletions(-) create mode 100644 apps/api/src/app/endpoints/sitemap/sitemap.controller.ts rename apps/api/src/app/{ => endpoints}/sitemap/sitemap.module.ts (70%) create mode 100644 apps/api/src/app/endpoints/sitemap/sitemap.service.ts delete mode 100644 apps/api/src/app/sitemap/sitemap.controller.ts diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 8f342eb43..7e9704183 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -38,6 +38,7 @@ import { BenchmarksModule } from './endpoints/benchmarks/benchmarks.module'; import { GhostfolioModule } from './endpoints/data-providers/ghostfolio/ghostfolio.module'; import { MarketDataModule } from './endpoints/market-data/market-data.module'; import { PublicModule } from './endpoints/public/public.module'; +import { SitemapModule } from './endpoints/sitemap/sitemap.module'; import { TagsModule } from './endpoints/tags/tags.module'; import { WatchlistModule } from './endpoints/watchlist/watchlist.module'; import { ExchangeRateModule } from './exchange-rate/exchange-rate.module'; @@ -50,7 +51,6 @@ import { OrderModule } from './order/order.module'; import { PlatformModule } from './platform/platform.module'; import { PortfolioModule } from './portfolio/portfolio.module'; import { RedisCacheModule } from './redis-cache/redis-cache.module'; -import { SitemapModule } from './sitemap/sitemap.module'; import { SubscriptionModule } from './subscription/subscription.module'; import { SymbolModule } from './symbol/symbol.module'; import { UserModule } from './user/user.module'; diff --git a/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts b/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts new file mode 100644 index 000000000..4d6dfb5ea --- /dev/null +++ b/apps/api/src/app/endpoints/sitemap/sitemap.controller.ts @@ -0,0 +1,49 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { + DATE_FORMAT, + getYesterday, + interpolate +} from '@ghostfolio/common/helper'; + +import { Controller, Get, Res, VERSION_NEUTRAL, Version } from '@nestjs/common'; +import { format } from 'date-fns'; +import { Response } from 'express'; +import { readFileSync } from 'fs'; +import { join } from 'path'; + +import { SitemapService } from './sitemap.service'; + +@Controller('sitemap.xml') +export class SitemapController { + public sitemapXml = ''; + + public constructor( + private readonly configurationService: ConfigurationService, + private readonly sitemapService: SitemapService + ) { + try { + this.sitemapXml = readFileSync( + join(__dirname, 'assets', 'sitemap.xml'), + 'utf8' + ); + } catch {} + } + + @Get() + @Version(VERSION_NEUTRAL) + public getSitemapXml(@Res() response: Response) { + const currentDate = format(getYesterday(), DATE_FORMAT); + + response.setHeader('content-type', 'application/xml'); + response.send( + interpolate(this.sitemapXml, { + currentDate, + personalFinanceTools: this.configurationService.get( + 'ENABLE_FEATURE_SUBSCRIPTION' + ) + ? this.sitemapService.getPersonalFinanceTools({ currentDate }) + : '' + }) + ); + } +} diff --git a/apps/api/src/app/sitemap/sitemap.module.ts b/apps/api/src/app/endpoints/sitemap/sitemap.module.ts similarity index 70% rename from apps/api/src/app/sitemap/sitemap.module.ts rename to apps/api/src/app/endpoints/sitemap/sitemap.module.ts index d1059d408..abf2e370e 100644 --- a/apps/api/src/app/sitemap/sitemap.module.ts +++ b/apps/api/src/app/endpoints/sitemap/sitemap.module.ts @@ -3,9 +3,11 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/conf import { Module } from '@nestjs/common'; import { SitemapController } from './sitemap.controller'; +import { SitemapService } from './sitemap.service'; @Module({ controllers: [SitemapController], - imports: [ConfigurationModule] + imports: [ConfigurationModule], + providers: [SitemapService] }) export class SitemapModule {} diff --git a/apps/api/src/app/endpoints/sitemap/sitemap.service.ts b/apps/api/src/app/endpoints/sitemap/sitemap.service.ts new file mode 100644 index 000000000..e56dc57a8 --- /dev/null +++ b/apps/api/src/app/endpoints/sitemap/sitemap.service.ts @@ -0,0 +1,43 @@ +import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; + +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class SitemapService { + public getPersonalFinanceTools({ currentDate }: { currentDate: string }) { + return personalFinanceTools + .map(({ alias, key }) => { + return [ + '', + ` https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/es/recursos/personal-finance-tools/alternativa-de-software-libre-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/fr/ressources/personal-finance-tools/alternative-open-source-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '', + '', + ` https://ghostfol.io/pt/recursos/personal-finance-tools/alternativa-de-software-livre-ao-${alias ?? key}`, + ` ${currentDate}T00:00:00+00:00`, + '' + ].join('\n'); + }) + .join('\n'); + } +} diff --git a/apps/api/src/app/sitemap/sitemap.controller.ts b/apps/api/src/app/sitemap/sitemap.controller.ts deleted file mode 100644 index aad5e39a1..000000000 --- a/apps/api/src/app/sitemap/sitemap.controller.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; -import { - DATE_FORMAT, - getYesterday, - interpolate -} from '@ghostfolio/common/helper'; -import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; - -import { Controller, Get, Res, VERSION_NEUTRAL, Version } from '@nestjs/common'; -import { format } from 'date-fns'; -import { Response } from 'express'; -import { readFileSync } from 'fs'; -import { join } from 'path'; - -@Controller('sitemap.xml') -export class SitemapController { - public sitemapXml = ''; - - public constructor( - private readonly configurationService: ConfigurationService - ) { - try { - this.sitemapXml = readFileSync( - join(__dirname, 'assets', 'sitemap.xml'), - 'utf8' - ); - } catch {} - } - - @Get() - @Version(VERSION_NEUTRAL) - public async getSitemapXml(@Res() response: Response): Promise { - const currentDate = format(getYesterday(), DATE_FORMAT); - - response.setHeader('content-type', 'application/xml'); - response.send( - interpolate(this.sitemapXml, { - currentDate, - personalFinanceTools: this.configurationService.get( - 'ENABLE_FEATURE_SUBSCRIPTION' - ) - ? personalFinanceTools - .map(({ alias, key }) => { - return [ - '', - ` https://ghostfol.io/de/ressourcen/personal-finance-tools/open-source-alternative-zu-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/en/resources/personal-finance-tools/open-source-alternative-to-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/es/recursos/personal-finance-tools/alternativa-de-software-libre-a-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/fr/ressources/personal-finance-tools/alternative-open-source-a-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/it/risorse/personal-finance-tools/alternativa-open-source-a-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/nl/bronnen/personal-finance-tools/open-source-alternatief-voor-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '', - '', - ` https://ghostfol.io/pt/recursos/personal-finance-tools/alternativa-de-software-livre-ao-${alias ?? key}`, - ` ${currentDate}T00:00:00+00:00`, - '' - ].join('\n'); - }) - .join('\n') - : '' - }) - ); - } -}