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')
- : ''
- })
- );
- }
-}