1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2025-03-29 21:56:58 +02:00
pigallery2/src/backend/middlewares/RenderingMWs.ts
2023-09-06 14:20:35 +02:00

162 lines
4.2 KiB
TypeScript

import {NextFunction, Request, Response} from 'express';
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
import {Message} from '../../common/entities/Message';
import {Config, PrivateConfigClass} from '../../common/config/private/Config';
import {UserDTO, UserRoles} from '../../common/entities/UserDTO';
import {NotificationManager} from '../model/NotifocationManager';
import {Logger} from '../Logger';
import {SharingDTO} from '../../common/entities/SharingDTO';
import {Utils} from '../../common/Utils';
import {LoggerRouter} from '../routes/LoggerRouter';
import {TAGS} from '../../common/config/public/ClientConfig';
const forcedDebug = process.env['NODE_ENV'] === 'debug';
export class RenderingMWs {
public static renderResult(
req: Request,
res: Response,
next: NextFunction
): void {
if (typeof req.resultPipe === 'undefined') {
return next();
}
return RenderingMWs.renderMessage(res, req.resultPipe);
}
public static renderSessionUser(
req: Request,
res: Response,
next: NextFunction
): void {
if (!req.session['user']) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'User not exists'));
}
const user = {
id: req.session['user'].id,
name: req.session['user'].name,
csrfToken: req.session['user'].csrfToken || req.csrfToken(),
role: req.session['user'].role,
usedSharingKey: req.session['user'].usedSharingKey,
permissions: req.session['user'].permissions,
} as UserDTO;
if (!user.csrfToken && req.csrfToken) {
user.csrfToken = req.csrfToken();
}
RenderingMWs.renderMessage(res, user);
}
public static renderSharing(
req: Request,
res: Response,
next: NextFunction
): void {
if (!req.resultPipe) {
return next();
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const {password, creator, ...sharing} = req.resultPipe as SharingDTO;
RenderingMWs.renderMessage(res, sharing);
}
public static renderSharingList(
req: Request,
res: Response,
next: NextFunction
): void {
if (!req.resultPipe) {
return next();
}
const shares = Utils.clone(req.resultPipe as SharingDTO[]);
shares.forEach((s): void => {
delete s.password;
delete s.creator.password;
});
return RenderingMWs.renderMessage(res, shares);
}
public static renderFile(
req: Request,
res: Response,
next: NextFunction
): void {
if (!req.resultPipe) {
return next();
}
return res.sendFile(req.resultPipe as string, {
maxAge: 31536000,
dotfiles: 'allow',
});
}
public static renderOK(
req: Request,
res: Response
): void {
const message = new Message<string>(null, 'ok');
res.json(message);
}
public static async renderConfig(
req: Request,
res: Response
): Promise<void> {
const originalConf = await Config.original();
// These are sensitive information, do not send to the client side
originalConf.Server.sessionSecret = null;
const message = new Message<PrivateConfigClass>(
null,
originalConf.toJSON({
attachState: true,
attachVolatile: true,
skipTags: {secret: true} as TAGS
}) as PrivateConfigClass
);
res.json(message);
}
public static renderError(
err: Error,
req: Request,
res: Response,
next: NextFunction
): void {
if (err instanceof ErrorDTO) {
if (err.details) {
Logger.warn('Handled error:');
LoggerRouter.log(Logger.warn, req, res);
console.log(err);
delete err.details; // do not send back error object to the client side
// hide error details for non developers
if (
!(
forcedDebug ||
(req.session &&
req.session['user'] &&
req.session['user'].role >= UserRoles.Developer)
)
) {
delete err.detailsStr;
}
}
const message = new Message<null>(err, null);
res.json(message);
return;
}
NotificationManager.error('Unknown server error', err, req);
return next(err);
}
protected static renderMessage<T>(res: Response, content: T): void {
const message = new Message<T>(null, content);
res.json(message);
}
}