diff --git a/config/development.json b/config/development.json index fc7ab53..fbedc51 100644 --- a/config/development.json +++ b/config/development.json @@ -3,5 +3,6 @@ "database": ".db", "rcFile": "./.codexdocsrc", "uploads": "public/uploads", - "secret": "iamasecretstring" + "secret": "iamasecretstring", + "faviconURL": "" } diff --git a/config/production.json b/config/production.json index 4bf24d1..daaa167 100644 --- a/config/production.json +++ b/config/production.json @@ -3,5 +3,6 @@ "database": ".db", "rcFile": "./.codexdocsrc", "uploads": "/uploads", - "secret": "iamasecretstring" + "secret": "iamasecretstring", + "faviconURL": "" } diff --git a/config/testing.json b/config/testing.json index 25371d0..5f122bb 100644 --- a/config/testing.json +++ b/config/testing.json @@ -3,5 +3,6 @@ "database": ".testdb", "rcFile": "./src/test/.codexdocsrc", "uploads": "public/uploads_test", - "secret": "iamasecretstring" + "secret": "iamasecretstring", + "faviconURL": "" } diff --git a/src/backend/routes/favicon.ts b/src/backend/routes/favicon.ts new file mode 100644 index 0000000..3bf11dc --- /dev/null +++ b/src/backend/routes/favicon.ts @@ -0,0 +1,22 @@ +import config from 'config'; +import uploadFavicon from '../utils/uploadFavicon'; +import path from 'path'; +import os from 'os'; +import fs from 'fs'; +import express from 'express'; + +const router = express.Router(); + +router.get('/favicon', (req, res) => { + const faviconURL: string = config.get('faviconURL'); + + uploadFavicon(faviconURL).then((file) => { + const filename = faviconURL.substring(faviconURL.lastIndexOf('/')+1); + const filePath = path.join(os.tmpdir(), filename); + + fs.writeFileSync(filePath, file); + res.sendFile(filePath); + }); +} ); + +export default router; diff --git a/src/backend/routes/index.ts b/src/backend/routes/index.ts index 2057c44..aae57f7 100644 --- a/src/backend/routes/index.ts +++ b/src/backend/routes/index.ts @@ -5,12 +5,14 @@ import auth from './auth'; import aliases from './aliases'; import api from './api'; import pagesMiddleware from './middlewares/pages'; +import favicon from './favicon'; const router = express.Router(); router.use('/', pagesMiddleware, home); router.use('/', pagesMiddleware, pages); router.use('/', pagesMiddleware, auth); +router.use('/', favicon); router.use('/api', api); router.use('/', aliases); diff --git a/src/backend/utils/uploadFavicon.ts b/src/backend/utils/uploadFavicon.ts new file mode 100644 index 0000000..b34d70e --- /dev/null +++ b/src/backend/utils/uploadFavicon.ts @@ -0,0 +1,34 @@ +import { get } from 'https'; + +// Create empty buffer for file +let file: Buffer = Buffer.alloc(0); + +/** + * Upload favicon by url + * + * @param url - url for uploading favicon + * @returns { Promise } - Promise with whole file data + */ +export default function uploadFavicon(url: string): Promise { + return new Promise(function (resolve, reject) { + const req = get(url, function ( res) { + // Reject on bad status + if (res.statusCode && (res.statusCode < 200 || res.statusCode >= 300)) { + return reject(new Error('statusCode=' + res.statusCode)); + } + // Response on incoming data + res.on('data', (chunk) => { + file = Buffer.concat([file, chunk]); + }); + res.on('end', function () { + resolve(file); + }); + }); + + // Reject on request error + req.on('error', function (err) { + reject(err); + }); + req.end(); + }); +} diff --git a/src/backend/views/layout.twig b/src/backend/views/layout.twig index bf9da69..c4df9c0 100644 --- a/src/backend/views/layout.twig +++ b/src/backend/views/layout.twig @@ -7,11 +7,7 @@ - {% if config.favicon is empty %} - - {% else %} - - {% endif %} +