Browse Source

feat(api): rewrite HtmlTemplateMiddleware

pull/4889/head
KenTandrian 3 weeks ago
committed by Thomas Kaul
parent
commit
25a37927ef
  1. 88
      apps/api/src/middlewares/html-template.middleware.ts

88
apps/api/src/middlewares/html-template.middleware.ts

@ -7,30 +7,14 @@ import {
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, interpolate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, interpolate } from '@ghostfolio/common/helper';
import { Injectable, NestMiddleware } from '@nestjs/common';
import { format } from 'date-fns'; import { format } from 'date-fns';
import { NextFunction, Request, Response } from 'express'; import { NextFunction, Request, Response } from 'express';
import * as fs from 'fs'; import * as fs from 'fs';
import { join } from 'path'; import { join } from 'path';
const i18nService = new I18nService();
let indexHtmlMap: { [languageCode: string]: string } = {};
const title = 'Ghostfolio'; const title = 'Ghostfolio';
try {
indexHtmlMap = SUPPORTED_LANGUAGE_CODES.reduce(
(map, languageCode) => ({
...map,
[languageCode]: fs.readFileSync(
join(__dirname, '..', 'client', languageCode, 'index.html'),
'utf8'
)
}),
{}
);
} catch {}
const locales = { const locales = {
'/de/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt': { '/de/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt': {
featureGraphicPath: 'assets/images/blog/ghostfolio-x-sackgeld.png', featureGraphicPath: 'assets/images/blog/ghostfolio-x-sackgeld.png',
@ -94,29 +78,28 @@ const locales = {
} }
}; };
const isFileRequest = (filename: string) => { @Injectable()
if (filename === '/assets/LICENSE') { export class HtmlTemplateMiddleware implements NestMiddleware {
return true; private indexHtmlMap: { [languageCode: string]: string } = {};
} else if (
filename.includes('auth/ey') || constructor(private readonly i18nService: I18nService) {
filename.includes( try {
'personal-finance-tools/open-source-alternative-to-de.fi' this.indexHtmlMap = SUPPORTED_LANGUAGE_CODES.reduce(
) || (map, languageCode) => ({
filename.includes( ...map,
'personal-finance-tools/open-source-alternative-to-markets.sh' [languageCode]: fs.readFileSync(
join(__dirname, '..', 'client', languageCode, 'index.html'),
'utf8'
) )
) { }),
return false; {}
);
} catch (error) {
console.error('Failed to load index.html files:', error);
}
} }
return filename.split('.').pop() !== filename; use(request: Request, response: Response, next: NextFunction) {
};
export const HtmlTemplateMiddleware = async (
request: Request,
response: Response,
next: NextFunction
) => {
const path = request.originalUrl.replace(/\/$/, ''); const path = request.originalUrl.replace(/\/$/, '');
let languageCode = path.substr(1, 2); let languageCode = path.substr(1, 2);
@ -130,30 +113,30 @@ export const HtmlTemplateMiddleware = async (
if ( if (
path.startsWith('/api/') || path.startsWith('/api/') ||
path.startsWith(STORYBOOK_PATH) || path.startsWith(STORYBOOK_PATH) ||
isFileRequest(path) || this.isFileRequest(path) ||
!environment.production !environment.production
) { ) {
// Skip // Skip
next(); next();
} else { } else {
const indexHtml = interpolate(indexHtmlMap[languageCode], { const indexHtml = interpolate(this.indexHtmlMap[languageCode], {
currentDate, currentDate,
languageCode, languageCode,
path, path,
rootUrl, rootUrl,
description: i18nService.getTranslation({ description: this.i18nService.getTranslation({
languageCode, languageCode,
id: 'metaDescription' id: 'metaDescription'
}), }),
featureGraphicPath: featureGraphicPath:
locales[path]?.featureGraphicPath ?? 'assets/cover.png', locales[path]?.featureGraphicPath ?? 'assets/cover.png',
keywords: i18nService.getTranslation({ keywords: this.i18nService.getTranslation({
languageCode, languageCode,
id: 'metaKeywords' id: 'metaKeywords'
}), }),
title: title:
locales[path]?.title ?? locales[path]?.title ??
`${title}${i18nService.getTranslation({ `${title}${this.i18nService.getTranslation({
languageCode, languageCode,
id: 'slogan' id: 'slogan'
})}` })}`
@ -161,4 +144,23 @@ export const HtmlTemplateMiddleware = async (
return response.send(indexHtml); return response.send(indexHtml);
} }
}; }
private isFileRequest(filename: string) {
if (filename === '/assets/LICENSE') {
return true;
} else if (
filename.includes('auth/ey') ||
filename.includes(
'personal-finance-tools/open-source-alternative-to-de.fi'
) ||
filename.includes(
'personal-finance-tools/open-source-alternative-to-markets.sh'
)
) {
return false;
}
return filename.split('.').pop() !== filename;
}
}

Loading…
Cancel
Save