1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-08-10 07:55:24 +02:00

Favicon data saves to app.locals, replaced uploading favicon to app.ts

This commit is contained in:
slaveeks 2022-07-06 12:10:47 +03:00
parent 00b7fc6d41
commit 3cab15e514
9 changed files with 56 additions and 40 deletions

View file

@ -4,8 +4,5 @@
"rcFile": "./.codexdocsrc", "rcFile": "./.codexdocsrc",
"uploads": "/uploads", "uploads": "/uploads",
"secret": "iamasecretstring", "secret": "iamasecretstring",
"favicon": { "faviconURL": ""
"destination": "",
"type": ""
}
} }

View file

@ -8,17 +8,32 @@ import HttpException from './exceptions/httpException';
import * as dotenv from 'dotenv'; import * as dotenv from 'dotenv';
import config from 'config'; import config from 'config';
import os from 'os'; import os from 'os';
import appConfig from 'config';
import { uploadFavicon } from './utils/uploadFavicon';
dotenv.config(); dotenv.config();
const app = express(); const app = express();
const localConfig = rcParser.getConfiguration(); const localConfig = rcParser.getConfiguration();
// Get url to upload favicon from config
const faviconURL: string = appConfig.get('faviconURL');
app.locals.config = localConfig; app.locals.config = localConfig;
// view engine setup // view engine setup
app.set('views', path.join(__dirname, './', 'views')); app.set('views', path.join(__dirname, './', 'views'));
app.set('view engine', 'twig'); app.set('view engine', 'twig');
require('./utils/twig'); require('./utils/twig');
// Upload favicon by url, it's path on server is '/temp/favicon.{format}'
uploadFavicon(faviconURL).then((res) => {
app.locals.favicon = res;
console.log('Favicon successfully uploaded');
})
.catch( (err) => {
console.log(err);
console.log('Favicon has not uploaded');
});
app.use(morgan('dev')); app.use(morgan('dev'));
app.use(express.json()); app.use(express.json());
app.use(express.urlencoded({ extended: true })); app.use(express.urlencoded({ extended: true }));

View file

@ -3,6 +3,7 @@ import Aliases from '../controllers/aliases';
import Pages from '../controllers/pages'; import Pages from '../controllers/pages';
import Alias from '../models/alias'; import Alias from '../models/alias';
import verifyToken from './middlewares/token'; import verifyToken from './middlewares/token';
import app from '../app';
const router = express.Router(); const router = express.Router();
@ -36,6 +37,7 @@ router.get('*', verifyToken, async (req: Request, res: Response) => {
page, page,
pageParent, pageParent,
config: req.app.locals.config, config: req.app.locals.config,
favicon: app.locals.favicon,
}); });
} }
} }

View file

@ -2,6 +2,7 @@ import express, { Request, Response } from 'express';
import jwt from 'jsonwebtoken'; import jwt from 'jsonwebtoken';
import config from 'config'; import config from 'config';
import csrf from 'csurf'; import csrf from 'csurf';
import app from '../app';
const router = express.Router(); const router = express.Router();
const csrfProtection = csrf({ cookie: true }); const csrfProtection = csrf({ cookie: true });
@ -14,6 +15,7 @@ router.get('/auth', csrfProtection, function (req: Request, res: Response) {
res.render('auth', { res.render('auth', {
title: 'Login page', title: 'Login page',
csrfToken: req.csrfToken(), csrfToken: req.csrfToken(),
favicon: app.locals.favicon,
}); });
}); });
@ -27,6 +29,7 @@ router.post('/auth', parseForm, csrfProtection, async (req: Request, res: Respon
title: 'Login page', title: 'Login page',
header: 'Password not set', header: 'Password not set',
csrfToken: req.csrfToken(), csrfToken: req.csrfToken(),
favicon: app.locals.favicon,
}); });
return; return;
@ -37,6 +40,7 @@ router.post('/auth', parseForm, csrfProtection, async (req: Request, res: Respon
title: 'Login page', title: 'Login page',
header: 'Wrong password', header: 'Wrong password',
csrfToken: req.csrfToken(), csrfToken: req.csrfToken(),
favicon: app.locals.favicon,
}); });
return; return;
@ -59,6 +63,7 @@ router.post('/auth', parseForm, csrfProtection, async (req: Request, res: Respon
title: 'Login page', title: 'Login page',
header: 'Password not set', header: 'Password not set',
csrfToken: req.csrfToken(), csrfToken: req.csrfToken(),
favicon: app.locals.favicon
}); });
return; return;

View file

@ -1,25 +1,9 @@
import express, { Request, Response } from 'express'; import express, { Request, Response } from 'express';
import verifyToken from './middlewares/token'; import verifyToken from './middlewares/token';
import appConfig from 'config'; import app from '../app';
import uploadFavicon from '../utils/uploadFavicon';
const router = express.Router(); const router = express.Router();
// Get url to upload favicon from config
const faviconURL: string = appConfig.get('faviconURL');
let fileFormat: string;
// Upload favicon by url, it's path on server is '/temp/favicon.{format}'
uploadFavicon(faviconURL).then((res) => {
fileFormat = res;
console.log('Favicon successfully uploaded');
})
.catch( (err) => {
console.log(err);
console.log('Favicon has not uploaded');
});
/* GET home page. */ /* GET home page. */
router.get('/', verifyToken, async (req: Request, res: Response) => { router.get('/', verifyToken, async (req: Request, res: Response) => {
const config = req.app.locals.config; const config = req.app.locals.config;
@ -28,8 +12,7 @@ router.get('/', verifyToken, async (req: Request, res: Response) => {
return res.redirect(config.startPage); return res.redirect(config.startPage);
} }
res.render('pages/index', { isAuthorized: res.locals.isAuthorized, res.render('pages/index', { isAuthorized: res.locals.isAuthorized,
faviconFormat: `image/${fileFormat}`, favicon: app.locals.favicon });
faviconRoute: `favicon/favicon.${fileFormat}` });
}); });
export default router; export default router;

View file

@ -3,6 +3,7 @@ import Pages from '../controllers/pages';
import PagesOrder from '../controllers/pagesOrder'; import PagesOrder from '../controllers/pagesOrder';
import verifyToken from './middlewares/token'; import verifyToken from './middlewares/token';
import allowEdit from './middlewares/locals'; import allowEdit from './middlewares/locals';
import app from '../app';
const router = express.Router(); const router = express.Router();
@ -16,6 +17,7 @@ router.get('/page/new', verifyToken, allowEdit, async (req: Request, res: Respon
res.render('pages/form', { res.render('pages/form', {
pagesAvailable, pagesAvailable,
page: null, page: null,
favicon: app.locals.favicon,
}); });
} catch (error) { } catch (error) {
res.status(404); res.status(404);
@ -43,6 +45,7 @@ router.get('/page/edit/:id', verifyToken, allowEdit, async (req: Request, res: R
page, page,
parentsChildrenOrdered, parentsChildrenOrdered,
pagesAvailable, pagesAvailable,
favicon: app.locals.favicon,
}); });
} catch (error) { } catch (error) {
res.status(404); res.status(404);
@ -65,6 +68,7 @@ router.get('/page/:id', verifyToken, async (req: Request, res: Response, next: N
page, page,
pageParent, pageParent,
config: req.app.locals.config, config: req.app.locals.config,
favicon: app.locals.favicon,
}); });
} catch (error) { } catch (error) {
res.status(404); res.status(404);

View file

@ -2,15 +2,18 @@ import path from 'path';
import os from 'os'; import os from 'os';
import fs from 'fs'; import fs from 'fs';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import config from 'config';
/**
* Uploaded favicon data
*/
interface FaviconData { interface FaviconData {
// Uploaded favicon path
destination: string; destination: string;
// File type
type: string; type: string;
} }
const favicon = config.get<FaviconData>('favicon');
/** /**
* Check if string is url * Check if string is url
* *
@ -25,30 +28,37 @@ function checkIsUrl(str: string): boolean {
/** /**
* Upload favicon by url * Upload favicon by url
* *
* @param url - url for uploading favicon * @param destination - url for uploading favicon
* @returns { Promise<string> } - Promise with format of saved file * @returns { Promise<string> } - Promise with format of saved file
*/ */
async function uploadFavicon(url: string): Promise<string> { export async function uploadFavicon(destination: string): Promise<FaviconData> {
// Check if string is url // Check of destination is empty
if (!checkIsUrl(url)) { if (!destination) {
return url; throw Error('Favicon destination is empty');
} }
// Make get request to url
const res = await fetch(url);
// Get buffer data from response
const fileData = await res.buffer();
// Get file name by url // Get file name by destination
const filename = url.substring(url.lastIndexOf('/')+1); const filename = destination.substring(destination.lastIndexOf('/')+1);
// Get file format // Get file format
const format = filename.split('.')[1]; const format = filename.split('.')[1];
// Check if string is url
if (!checkIsUrl(destination)) {
return { destination: destination,
type: `image/${format}` } as FaviconData;
}
// Make get request to url
const res = await fetch(destination);
// Get buffer data from response
const fileData = await res.buffer();
// Get file path in temporary directory // Get file path in temporary directory
const filePath = path.join(os.tmpdir(), `favicon.${format}`); const filePath = path.join(os.tmpdir(), `favicon.${format}`);
// Save file // Save file
fs.writeFileSync(filePath, fileData); fs.writeFileSync(filePath, fileData);
return `/favicon/favicon.${format}`; return { destination: `/favicon/favicon.${format}`,
type: `image/${format}` } as FaviconData;
} }

View file

@ -7,7 +7,7 @@
<meta property="og:title" content="{{ page.title | striptags }}" /> <meta property="og:title" content="{{ page.title | striptags }}" />
<meta property="article:modified_time" content="{{ (page.body.time / 1000) | date("c") }}" /> <meta property="article:modified_time" content="{{ (page.body.time / 1000) | date("c") }}" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<link rel="icon" type="image/png" href="/favicon"> <link rel="icon" type="{{ favicon.type }}" href="{{ favicon.destination }}">
</head> </head>
<script> <script>
window.config = { window.config = {

View file

@ -4,7 +4,7 @@
<title>{{ config.title }}</title> <title>{{ config.title }}</title>
<link rel="stylesheet" href="/dist/main.css" /> <link rel="stylesheet" href="/dist/main.css" />
<link rel="preload" href="{{ config.landingFrameSrc }}" as="document"> <link rel="preload" href="{{ config.landingFrameSrc }}" as="document">
<link rel="icon" type="{{ faviconFormat }}" href="{{ faviconRoute }}"> <link rel="icon" type="{{ favicon.type }}" href="{{ favicon.destination }}">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta property="og:title" content="{{ config.title }}" /> <meta property="og:title" content="{{ config.title }}" />
<meta property="og:site_name" content="{{ config.title }}" /> <meta property="og:site_name" content="{{ config.title }}" />