43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import ApplicationComponent from "../ApplicationComponent";
|
|
import {Express, Router} from "express";
|
|
import onFinished from "on-finished";
|
|
import Logger from "../Logger";
|
|
import {ServerError} from "../HttpError";
|
|
|
|
export default class RedirectBackComponent extends ApplicationComponent<void> {
|
|
public async start(app: Express, router: Router): Promise<void> {
|
|
router.use((req, res, next) => {
|
|
if (!req.session) {
|
|
throw new Error('Session is unavailable.');
|
|
}
|
|
|
|
onFinished(res, (err) => {
|
|
if (!err && res.statusCode === 200) {
|
|
req.session!.previousUrl = req.originalUrl;
|
|
Logger.debug('Prev url set to', req.session!.previousUrl);
|
|
req.session!.save((err) => {
|
|
if (err) {
|
|
Logger.error(err, 'Error while saving session');
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
res.redirectBack = (defaultUrl?: string) => {
|
|
if (req.session && typeof req.session.previousUrl === 'string') {
|
|
res.redirect(req.session.previousUrl);
|
|
} else if (typeof defaultUrl === 'string') {
|
|
res.redirect(defaultUrl);
|
|
} else {
|
|
throw new ServerError('There is no previous url and no default redirection url was provided.');
|
|
}
|
|
};
|
|
|
|
next();
|
|
});
|
|
}
|
|
|
|
public async stop(): Promise<void> {
|
|
}
|
|
|
|
} |