diff --git a/docs/common/error-page-template.md b/docs/common/error-page-template.md new file mode 100644 index 0000000..06e915f --- /dev/null +++ b/docs/common/error-page-template.md @@ -0,0 +1,22 @@ +# Error Code: {module}-{code} +**Applies to:** {system} + +--- + +## Message + +> {message} + +## Cause + +{description} + +### Solution + +{solution} + +--- + +If you have not yet connected to Pretendo, please follow the instructions [here](/docs/install) to get started. + +If you are still unable to connect, please request to speak to a moderator in the [Discord server](https://invite.gg/pretendo). diff --git a/package-lock.json b/package-lock.json index bd4447e..8362a4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@aws-sdk/client-ses": "^3.515.0", "@discordjs/rest": "^0.5.0", + "@pretendonetwork/error-codes": "^1.0.1", "browserify": "^17.0.0", "colors": "^1.4.0", "cookie-parser": "^1.4.5", @@ -1418,6 +1419,11 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@pretendonetwork/error-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pretendonetwork/error-codes/-/error-codes-1.0.1.tgz", + "integrity": "sha512-Hops4bCHUW9KFjkw9xP7S7kB/NAsvv2OhVQCLbC3toyJA3KhZ08GJKQJfVB5bDQ2txiA3lvKxw9et/2bNTZcng==" + }, "node_modules/@sapphire/async-queue": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", @@ -7512,6 +7518,11 @@ "sparse-bitfield": "^3.0.3" } }, + "@pretendonetwork/error-codes": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pretendonetwork/error-codes/-/error-codes-1.0.1.tgz", + "integrity": "sha512-Hops4bCHUW9KFjkw9xP7S7kB/NAsvv2OhVQCLbC3toyJA3KhZ08GJKQJfVB5bDQ2txiA3lvKxw9et/2bNTZcng==" + }, "@sapphire/async-queue": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", diff --git a/package.json b/package.json index 6554906..534ee09 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dependencies": { "@aws-sdk/client-ses": "^3.515.0", "@discordjs/rest": "^0.5.0", + "@pretendonetwork/error-codes": "^1.0.1", "browserify": "^17.0.0", "colors": "^1.4.0", "cookie-parser": "^1.4.5", diff --git a/src/routes/docs.js b/src/routes/docs.js index e507436..4fa25cb 100644 --- a/src/routes/docs.js +++ b/src/routes/docs.js @@ -1,8 +1,11 @@ +const path = require('node:path'); +const fs = require('node:fs'); const { Router } = require('express'); -const router = new Router(); +const errors = require('@pretendonetwork/error-codes'); const util = require('../util'); -const errorList = require('../../docs/common/errorList.json'); +const errorList = errors.getAllErrors(); +const router = new Router(); router.get('/', async (request, response) => { response.redirect('/docs/welcome'); @@ -24,14 +27,22 @@ router.get('/install', async (request, response) => { response.render('docs/install', renderData); }); -router.get('/search', async (request, response) => { +router.get([ + '/search', // TODO - Deprecate search page + '/errors', +], async (_request, response) => { const renderData = { errorList: JSON.stringify(errorList), currentPage: 'search', }; + response.render('docs/search', renderData); }); +router.get('/error', async (_request, response) => { + response.redirect(301, '/docs/errors'); +}); + router.get('/:page', async (request, response, next) => { const renderData = {}; @@ -50,6 +61,43 @@ router.get('/:page', async (request, response, next) => { response.render('docs/docs', renderData); }); +router.get([ + '/errors/:errorCode', // TODO - Deprecate search errors route + '/error/:errorCode', +], async (request, response, next) => { + const locale = response.locals.localeString; + const error = request.params.errorCode; + + const [ sysmodule, errorCode ] = error.split('-'); + + if (!errorCode) { + return next(); + } + + let template = fs.readFileSync(path.join(__dirname, '../../docs/common/error-page-template.md'), { + encoding: 'utf8' + }); + + const errorInfo = errors.getErrorInfo(sysmodule, errorCode, locale); + + if (!errorInfo) { + return next(); + } + + template = template.replace('{module}', sysmodule); + template = template.replace('{code}', errorCode); + template = template.replace('{system}', errorInfo.module.system); + template = template.replace('{message}', errorInfo.message.replace(/\s\s+/g, ' ')); + template = template.replace('{description}', errorInfo.long_description); + template = template.replace('{solution}', errorInfo.long_solution); + + const renderData = { + content: util.parseDocs(template) + }; + + response.render('docs/docs', renderData); +}); + router.get('/:subpath/:page', async (request, response, next) => { const locale = response.locals.localeString; const pageName = request.params.page; diff --git a/views/docs/search.handlebars b/views/docs/search.handlebars index 9298898..65b8339 100644 --- a/views/docs/search.handlebars +++ b/views/docs/search.handlebars @@ -45,12 +45,11 @@

{{ locale.docs.search.caption }}

- +
- @@ -58,30 +57,14 @@ {{#section 'foot'}} - -