Typescript migration

* app.js
* main.js
* router.js
This commit is contained in:
baldo 2020-04-08 03:19:55 +02:00
parent 94d01310b9
commit 9652519267
12 changed files with 256 additions and 157 deletions

15
server/@types/http-auth/index.d.ts vendored Normal file
View file

@ -0,0 +1,15 @@
declare module "http-auth" {
import {RequestHandler} from "express"
class Auth {}
class BasicAuth extends Auth {}
class BasicAuthOptions {}
type BasicAuthChecker =
(username: string, password: string, callback: BasicAuthCheckerCallback) => void
type BasicAuthCheckerCallback = (result: boolean | Error, customUser?: string) => void
function basic(options: BasicAuthOptions, checker: BasicAuthChecker): BasicAuth
function connect(auth: Auth): RequestHandler
}

View file

@ -1,71 +0,0 @@
'use strict';
const _ = require('lodash')
const auth = require('http-auth');
const bodyParser = require('body-parser');
const compress = require('compression');
const express = require('express');
const fs = require('graceful-fs')
const config = require('./config').config
const app = express();
module.exports = (() => {
const router = express.Router();
// urls beneath /internal are protected
const internalAuth = auth.basic(
{
realm: 'Knotenformular - Intern'
},
function (username, password, callback) {
callback(
config.server.internal.active &&
username === config.server.internal.user &&
password === config.server.internal.password
);
}
);
router.use('/internal', auth.connect(internalAuth));
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
const adminDir = __dirname + '/../admin';
const clientDir = __dirname + '/../client';
const templateDir = __dirname + '/templates';
const jsTemplateFiles = [
'/config.js'
];
router.use(compress());
function serveTemplate (mimeType, req, res, next) {
return fs.readFile(templateDir + '/' + req.path + '.template', 'utf8', function (err, body) {
if (err) {
return next(err);
}
res.writeHead(200, { 'Content-Type': mimeType });
res.end(_.template(body)({ config: config.client }));
return null; // to suppress warning
});
}
router.use(function (req, res, next) {
if (jsTemplateFiles.indexOf(req.path) >= 0) {
return serveTemplate('application/javascript', req, res, next);
}
return next();
});
router.use('/internal/admin', express.static(adminDir + '/'));
router.use('/', express.static(clientDir + '/'));
app.use(config.server.rootPath, router);
return app;
})()

67
server/app.ts Normal file
View file

@ -0,0 +1,67 @@
import _ from "lodash"
import auth, {BasicAuthCheckerCallback} from "http-auth"
import bodyParser from "body-parser"
import compress from "compression"
import express, {Express, NextFunction, Request, Response} from "express"
import fs from "graceful-fs"
const config = require('./config').config
const app: Express = express();
const router = express.Router();
// urls beneath /internal are protected
const internalAuth = auth.basic(
{
realm: 'Knotenformular - Intern'
},
function (username: string, password: string, callback: BasicAuthCheckerCallback): void {
callback(
config.server.internal.active &&
username === config.server.internal.user &&
password === config.server.internal.password
);
}
);
router.use('/internal', auth.connect(internalAuth));
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
const adminDir = __dirname + '/../admin';
const clientDir = __dirname + '/../client';
const templateDir = __dirname + '/templates';
const jsTemplateFiles = [
'/config.js'
];
router.use(compress());
function serveTemplate (mimeType: string, req: Request, res: Response, next: NextFunction): void {
return fs.readFile(templateDir + '/' + req.path + '.template', 'utf8', function (err, body) {
if (err) {
return next(err);
}
res.writeHead(200, { 'Content-Type': mimeType });
res.end(_.template(body)({ config: config.client }));
return null; // to suppress warning
});
}
router.use(function (req: Request, res: Response, next: NextFunction): void {
if (jsTemplateFiles.indexOf(req.path) >= 0) {
return serveTemplate('application/javascript', req, res, next);
}
return next();
});
router.use('/internal/admin', express.static(adminDir + '/'));
router.use('/', express.static(clientDir + '/'));
app.use(config.server.rootPath, router);
export default app;

8
server/init.js Normal file
View file

@ -0,0 +1,8 @@
'use strict';
(function () {
// Use graceful-fs instead of fs also in all libraries to have more robust fs handling.
const realFs = require('fs');
const gracefulFs = require('graceful-fs');
gracefulFs.gracefulify(realFs);
})();

View file

@ -1,6 +1,6 @@
'use strict';
const app = require('./app');
const app = require('./app').default;
const config = require('./config').config;
// Hack to allow proper logging of Error.

View file

@ -1,32 +0,0 @@
#!/usr/bin/env node
/*jslint node: true */
'use strict';
(function () {
// Use graceful-fs instead of fs also in all libraries to have more robust fs handling.
const realFs = require('fs');
const gracefulFs = require('graceful-fs');
gracefulFs.gracefulify(realFs);
})();
const config = require('./config').config;
const Logger = require('./logger')
Logger.tag('main', 'startup').info('Server starting up...');
require('./db/database').init()
.then(() => {
Logger.tag('main').info('Initializing...');
const app = require('./app');
require('./jobs/scheduler').init();
require('./router').init();
app.listen(config.server.port, '::');
module.exports = app;
})
.catch(error => {
console.error('Could not init database: ', error);
process.exit(1);
});

23
server/main.ts Executable file
View file

@ -0,0 +1,23 @@
import "./init"
import { config } from "./config"
import Logger from "./logger"
import db from "./db/database"
import scheduler from "./jobs/scheduler"
import { init as initRouter } from "./router"
import app from "./app"
Logger.tag('main', 'startup').info('Server starting up...');
db.init()
.then(() => {
Logger.tag('main').info('Initializing...');
scheduler.init();
initRouter();
app.listen(config.server.port, '::');
})
.catch(error => {
console.error('Could not init database: ', error);
process.exit(1);
});

View file

@ -1,52 +0,0 @@
'use strict';
const express = require('express');
const app = require('./app')
const config = require('./config').config
const VersionResource = require('./resources/versionResource')
const StatisticsResource = require('./resources/statisticsResource')
const FrontendResource = require('./resources/frontendResource')
const NodeResource = require('./resources/nodeResource')
const MonitoringResource = require('./resources/monitoringResource')
const TaskResource = require('./resources/taskResource')
const MailResource = require('./resources/mailResource')
module.exports = {
init () {
const router = express.Router();
router.post('/', FrontendResource.render);
router.get('/api/version', VersionResource.get);
router.post('/api/node', NodeResource.create);
router.put('/api/node/:token', NodeResource.update);
router.delete('/api/node/:token', NodeResource.delete);
router.get('/api/node/:token', NodeResource.get);
router.put('/api/monitoring/confirm/:token', MonitoringResource.confirm);
router.put('/api/monitoring/disable/:token', MonitoringResource.disable);
router.get('/internal/api/statistics', StatisticsResource.get);
router.get('/internal/api/tasks', TaskResource.getAll);
router.put('/internal/api/tasks/run/:id', TaskResource.run);
router.put('/internal/api/tasks/enable/:id', TaskResource.enable);
router.put('/internal/api/tasks/disable/:id', TaskResource.disable);
router.get('/internal/api/monitoring', MonitoringResource.getAll);
router.get('/internal/api/mails', MailResource.getAll);
router.get('/internal/api/mails/:id', MailResource.get);
router.delete('/internal/api/mails/:id', MailResource.delete);
router.put('/internal/api/mails/reset/:id', MailResource.resetFailures);
router.put('/internal/api/nodes/:token', NodeResource.update);
router.delete('/internal/api/nodes/:token', NodeResource.delete);
router.get('/internal/api/nodes', NodeResource.getAll);
router.get('/internal/api/nodes/:token', NodeResource.get);
app.use(config.server.rootPath, router);
}
}

49
server/router.ts Normal file
View file

@ -0,0 +1,49 @@
import express from "express"
import app from "./app"
import {config} from "./config"
import VersionResource from "./resources/versionResource"
import StatisticsResource from "./resources/statisticsResource"
import FrontendResource from "./resources/frontendResource"
import NodeResource from "./resources/nodeResource"
import MonitoringResource from "./resources/monitoringResource"
import TaskResource from "./resources/taskResource"
import MailResource from "./resources/mailResource"
export function init (): void {
const router = express.Router();
router.post('/', FrontendResource.render);
router.get('/api/version', VersionResource.get);
router.post('/api/node', NodeResource.create);
router.put('/api/node/:token', NodeResource.update);
router.delete('/api/node/:token', NodeResource.delete);
router.get('/api/node/:token', NodeResource.get);
router.put('/api/monitoring/confirm/:token', MonitoringResource.confirm);
router.put('/api/monitoring/disable/:token', MonitoringResource.disable);
router.get('/internal/api/statistics', StatisticsResource.get);
router.get('/internal/api/tasks', TaskResource.getAll);
router.put('/internal/api/tasks/run/:id', TaskResource.run);
router.put('/internal/api/tasks/enable/:id', TaskResource.enable);
router.put('/internal/api/tasks/disable/:id', TaskResource.disable);
router.get('/internal/api/monitoring', MonitoringResource.getAll);
router.get('/internal/api/mails', MailResource.getAll);
router.get('/internal/api/mails/:id', MailResource.get);
router.delete('/internal/api/mails/:id', MailResource.delete);
router.put('/internal/api/mails/reset/:id', MailResource.resetFailures);
router.put('/internal/api/nodes/:token', NodeResource.update);
router.delete('/internal/api/nodes/:token', NodeResource.delete);
router.get('/internal/api/nodes', NodeResource.getAll);
router.get('/internal/api/nodes/:token', NodeResource.get);
app.use(config.server.rootPath, router);
}

View file

@ -43,7 +43,10 @@
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
"typeRoots": [ /* List of folders to include type definitions from. */
"../node_modules/@types",
"@types"
],
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */