diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 2a515bf43..bfd0e38a8 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -22,6 +22,7 @@ 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'; @@ -51,9 +52,10 @@ 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], + controllers: [AppController, WebManifestController], imports: [ AdminModule, AccessModule, @@ -128,6 +130,6 @@ import { UserModule } from './user/user.module'; TwitterBotModule, UserModule ], - providers: [CronService] + providers: [ConfigurationService, CronService] }) export class AppModule {} diff --git a/apps/api/src/app/webmanifest/webmanifest.controller.ts b/apps/api/src/app/webmanifest/webmanifest.controller.ts new file mode 100644 index 000000000..0686f5c0a --- /dev/null +++ b/apps/api/src/app/webmanifest/webmanifest.controller.ts @@ -0,0 +1,52 @@ +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; + +import { Controller, Get, Param, Res } from '@nestjs/common'; +import { Response } from 'express'; + +@Controller('site.webmanifest') +export class WebManifestController { + constructor(private readonly configService: ConfigurationService) {} + + @Get('/:languageCode') + getWebManifest( + @Param('languageCode') languageCode: string, + @Res() res: Response + ) { + const rootUrl = this.configService.get('ROOT_URL'); + + 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 + }; + + res.setHeader('Content-Type', 'application/json'); + res.send(webManifest); + } +}