diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index bfd0e38a8..5f8d33782 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -22,7 +22,6 @@ import { ServeStaticModule } from '@nestjs/serve-static'; import { StatusCodes } from 'http-status-codes'; import { join } from 'path'; -import { ConfigurationService } from '../services/configuration/configuration.service'; import { AccessModule } from './access/access.module'; import { AccountModule } from './account/account.module'; import { AdminModule } from './admin/admin.module'; @@ -52,10 +51,9 @@ import { SitemapModule } from './sitemap/sitemap.module'; import { SubscriptionModule } from './subscription/subscription.module'; import { SymbolModule } from './symbol/symbol.module'; import { UserModule } from './user/user.module'; -import { WebManifestController } from './webmanifest/webmanifest.controller'; @Module({ - controllers: [AppController, WebManifestController], + controllers: [AppController], imports: [ AdminModule, AccessModule, @@ -130,6 +128,6 @@ import { WebManifestController } from './webmanifest/webmanifest.controller'; TwitterBotModule, UserModule ], - providers: [ConfigurationService, CronService] + providers: [CronService] }) -export class AppModule {} +export class AppModule {} \ No newline at end of file diff --git a/apps/api/src/app/webmanifest/webmanifest.controller.ts b/apps/api/src/app/webmanifest/webmanifest.controller.ts index 0686f5c0a..df04c1e67 100644 --- a/apps/api/src/app/webmanifest/webmanifest.controller.ts +++ b/apps/api/src/app/webmanifest/webmanifest.controller.ts @@ -1,50 +1,31 @@ -import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; - -import { Controller, Get, Param, Res } from '@nestjs/common'; +import { Controller, Get, Param, Res, Version, VERSION_NEUTRAL } from '@nestjs/common'; import { Response } from 'express'; +import { interpolate } from '@ghostfolio/common/helper'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import * as fs from 'fs'; +import * as path from 'path'; -@Controller('site.webmanifest') +@Controller('assets') export class WebManifestController { - constructor(private readonly configService: ConfigurationService) {} + public webManifestTemplate: string; - @Get('/:languageCode') - getWebManifest( - @Param('languageCode') languageCode: string, - @Res() res: Response - ) { - const rootUrl = this.configService.get('ROOT_URL'); + public constructor(public readonly configService: ConfigurationService) { + try { + this.webManifestTemplate = fs.readFileSync( + path.resolve(__dirname, '../../assets/site.webmanifest'), + 'utf8' + ); + } catch (error) { + console.error('Error reading site.webmanifest:', error); + this.webManifestTemplate = ''; + } + } - const webManifest = { - background_color: '#FFFFFF', - categories: ['finance', 'utilities'], - description: 'Open Source Wealth Management Software', - display: 'standalone', - icons: [ - { - sizes: '192x192', - src: '/assets/android-chrome-192x192.png', - type: 'image/png' - }, - { - purpose: 'any', - sizes: '512x512', - src: '/assets/android-chrome-512x512.png', - type: 'image/png' - }, - { - purpose: 'maskable', - sizes: '512x512', - src: '/assets/android-chrome-512x512.png', - type: 'image/png' - } - ], - name: 'Ghostfolio', - orientation: 'portrait', - short_name: 'Ghostfolio', - start_url: `/${languageCode}/`, // Dynamic Language Support - theme_color: '#FFFFFF', - url: rootUrl - }; + @Get('/:languageCode/site.webmanifest') + @Version(VERSION_NEUTRAL) + public getWebManifest(@Param('languageCode') languageCode: string, @Res() res: Response): void { + const rootUrl = this.configService.get('ROOT_URL') || 'https://default.url.com'; + const webManifest = interpolate(this.webManifestTemplate, { languageCode, rootUrl }); res.setHeader('Content-Type', 'application/json'); res.send(webManifest); diff --git a/apps/api/src/app/webmanifest/webmanifest.module.ts b/apps/api/src/app/webmanifest/webmanifest.module.ts new file mode 100644 index 000000000..1324551e1 --- /dev/null +++ b/apps/api/src/app/webmanifest/webmanifest.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { WebManifestController } from './webmanifest.controller'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; + +@Module({ + controllers: [WebManifestController], + providers: [ConfigurationService], +}) +export class WebManifestModule {} diff --git a/apps/api/src/assets/site.webmanifest b/apps/api/src/assets/site.webmanifest new file mode 100644 index 000000000..f58668cbd --- /dev/null +++ b/apps/api/src/assets/site.webmanifest @@ -0,0 +1,32 @@ +{ + "background_color": "#FFFFFF", + "categories": ["finance", "utilities"], + "description": "Open Source Wealth Management Software", + "display": "standalone", + "icons": [ + { + "sizes": "192x192", + "src": "/assets/android-chrome-192x192.png", + "type": "image/png" + }, + { + "purpose": "any", + "sizes": "512x512", + "src": "/assets/android-chrome-512x512.png", + "type": "image/png" + }, + { + "purpose": "maskable", + "sizes": "512x512", + "src": "/assets/android-chrome-512x512.png", + "type": "image/png" + } + ], + "name": "Ghostfolio", + "orientation": "portrait", + "short_name": "Ghostfolio", + "start_url": "/${languageCode}/", + "theme_color": "#FFFFFF", + "url": "${rootUrl}" + } + \ No newline at end of file