diff --git a/.codexdocsrc.sample b/.codexdocsrc.sample index c6d9ca7..43b9f94 100644 --- a/.codexdocsrc.sample +++ b/.codexdocsrc.sample @@ -5,7 +5,6 @@ "Guides", {"title": "CodeX", "uri": "https://codex.so"} ], - "landingFrameSrc": "https://codex.so/editor?frame=1", "startPage": "", "misprintsChatId": "12344564", "yandexMetrikaId": "", diff --git a/nodemon.json b/nodemon.json index 6afb070..8c93bb1 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,5 +1,4 @@ { - "verbose": true, "ignore": [ ".git", "node_modules", diff --git a/package.json b/package.json index 2745b62..517ea2f 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "dependencies": { "@codexteam/shortcuts": "^1.2.0", "@hawk.so/javascript": "^3.0.1", - "@hawk.so/nodejs": "^3.1.2", + "@hawk.so/nodejs": "^3.1.4", "config": "^3.3.6", "cookie-parser": "^1.4.5", "csurf": "^1.11.0", diff --git a/src/backend/app.ts b/src/backend/app.ts index 049ec81..23e184d 100644 --- a/src/backend/app.ts +++ b/src/backend/app.ts @@ -8,7 +8,7 @@ import routes from './routes/index.js'; import HttpException from './exceptions/httpException.js'; import * as dotenv from 'dotenv'; import config from 'config'; -import { default as HawkCatcher } from '@hawk.so/nodejs'; +import HawkCatcher from '@hawk.so/nodejs'; import os from 'os'; import appConfig from 'config'; import { downloadFavicon, FaviconData } from './utils/downloadFavicon.js'; diff --git a/src/backend/controllers/aliases.ts b/src/backend/controllers/aliases.ts index 4416fce..2ee8e7e 100644 --- a/src/backend/controllers/aliases.ts +++ b/src/backend/controllers/aliases.ts @@ -14,10 +14,6 @@ class Aliases { public static async get(aliasName: string): Promise { const alias = await Alias.get(aliasName); - if (!alias.id) { - throw new Error('Entity with given alias does not exist'); - } - return alias; } } diff --git a/src/backend/models/pagesFlatArray.ts b/src/backend/models/pagesFlatArray.ts index c0b5366..e82d4c3 100644 --- a/src/backend/models/pagesFlatArray.ts +++ b/src/backend/models/pagesFlatArray.ts @@ -43,7 +43,7 @@ export interface PagesFlatArrayData { } /** - * @class PagesFlatArray model - flat array of pages, which are ordered like in sidebar + * @class PagesFlatArray model - flat array of pages, which are ordered like in sidebar */ class PagesFlatArray { /** diff --git a/src/backend/routes/aliases.ts b/src/backend/routes/aliases.ts index df467e8..1026597 100644 --- a/src/backend/routes/aliases.ts +++ b/src/backend/routes/aliases.ts @@ -4,6 +4,8 @@ import Pages from '../controllers/pages.js'; import Alias from '../models/alias.js'; import verifyToken from './middlewares/token.js'; import PagesFlatArray from '../models/pagesFlatArray.js'; +import HttpException from '../exceptions/httpException.js'; + const router = express.Router(); @@ -24,7 +26,7 @@ router.get('*', verifyToken, async (req: Request, res: Response) => { const alias = await Aliases.get(url); if (alias.id === undefined) { - throw new Error('Alias not found'); + throw new HttpException(404, 'Alias not found'); } switch (alias.type) { @@ -46,10 +48,17 @@ router.get('*', verifyToken, async (req: Request, res: Response) => { } } } catch (err) { - res.status(400).json({ - success: false, - error: err, - }); + if (err instanceof HttpException && (err as HttpException).status === 404) { + res.status(404).render('error', { + message: 'Page not found', + status: 404, + }); + } else { + res.status(500).json({ + success: false, + error: err, + }); + } } }); diff --git a/src/backend/routes/home.ts b/src/backend/routes/home.ts index 3f82940..74ce2b8 100644 --- a/src/backend/routes/home.ts +++ b/src/backend/routes/home.ts @@ -1,5 +1,8 @@ import express, { Request, Response } from 'express'; import verifyToken from './middlewares/token.js'; +import PagesOrder from '../controllers/pagesOrder.js'; +import Pages from '../controllers/pages.js'; + const router = express.Router(); @@ -7,10 +10,22 @@ const router = express.Router(); router.get('/', verifyToken, async (req: Request, res: Response) => { const config = req.app.locals.config; + // Check if config consists startPage if (config.startPage) { return res.redirect(config.startPage); + } else { + const pageOrder = await PagesOrder.getRootPageOrder(); + + // Check if page order consists + if (pageOrder.order.length > 0) { + // Get the first parent page + const page = await Pages.get(pageOrder.order[0]); + + res.redirect(page.uri!); + } else { + res.render('pages/index', { isAuthorized: res.locals.isAuthorized }); + } } - res.render('pages/index', { isAuthorized: res.locals.isAuthorized }); }); export default router; diff --git a/src/backend/views/error.twig b/src/backend/views/error.twig index caf7ce0..33a552d 100644 --- a/src/backend/views/error.twig +++ b/src/backend/views/error.twig @@ -1,7 +1,10 @@ {% extends 'layout.twig' %} {% block body %} -

{{message}}

-

{{error.status}}

-
{{error.stack}}
+
+

+ ┬┴┬┴┤ {{status}} ├┬┴┬┴ +

+

{{message}}

+
{% endblock %} diff --git a/src/backend/views/pages/blocks/image.twig b/src/backend/views/pages/blocks/image.twig index a648538..870c97e 100644 --- a/src/backend/views/pages/blocks/image.twig +++ b/src/backend/views/pages/blocks/image.twig @@ -4,10 +4,6 @@ {% set classes = classes|merge(['block-image__content--bordered']) %} {% endif %} -{% if stretched %} - {% set classes = classes|merge(['block-image__content--stretched']) %} -{% endif %} - {% if withBackground %} {% set classes = classes|merge(['block-image__content--with-background']) %} {% endif %} diff --git a/src/backend/views/pages/index.twig b/src/backend/views/pages/index.twig index 33d0a17..ca975db 100644 --- a/src/backend/views/pages/index.twig +++ b/src/backend/views/pages/index.twig @@ -3,7 +3,6 @@ {{ config.title }} - @@ -12,13 +11,15 @@ - + {% include "components/header.twig" %} -
- {{ svg('loader') }} +
+ {{ svg('frog') }} +

+ It’s time to create the first page! +

+ {% include 'components/button.twig' with {label: 'Add page', icon: 'plus', size: 'small', url: '/page/new'} %}
- - {% if config.yandexMetrikaId is not empty %}