1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/backend/middlewares/SharingMWs.ts
2018-11-30 15:36:42 +01:00

114 lines
3.6 KiB
TypeScript

import {NextFunction, Request, Response} from 'express';
import {CreateSharingDTO, SharingDTO} from '../../common/entities/SharingDTO';
import {ObjectManagerRepository} from '../model/ObjectManagerRepository';
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
import {Config} from '../../common/config/private/Config';
import {QueryParams} from '../../common/QueryParams';
const LOG_TAG = '[SharingMWs]';
export class SharingMWs {
private static generateKey(): string {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4();
}
public static async getSharing(req: Request, res: Response, next: NextFunction) {
if (Config.Client.Sharing.enabled === false) {
return next();
}
const sharingKey = req.params[QueryParams.gallery.sharingKey_long];
try {
req.resultPipe = await ObjectManagerRepository.getInstance().SharingManager.findOne({sharingKey: sharingKey});
return next();
} catch (err) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during retrieving sharing link', err));
}
}
public static async createSharing(req: Request, res: Response, next: NextFunction) {
if (Config.Client.Sharing.enabled === false) {
return next();
}
if ((typeof req.body === 'undefined') || (typeof req.body.createSharing === 'undefined')) {
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'createSharing filed is missing'));
}
const createSharing: CreateSharingDTO = req.body.createSharing;
let sharingKey = SharingMWs.generateKey();
// create one not yet used
while (true) {
try {
await ObjectManagerRepository.getInstance().SharingManager.findOne({sharingKey: sharingKey});
sharingKey = this.generateKey();
} catch (err) {
break;
}
}
const directoryName = req.params.directory || '/';
const sharing: SharingDTO = {
id: null,
sharingKey: sharingKey,
path: directoryName,
password: createSharing.password,
creator: req.session.user,
expires: Date.now() + createSharing.valid,
includeSubfolders: createSharing.includeSubfolders,
timeStamp: Date.now()
};
try {
req.resultPipe = await ObjectManagerRepository.getInstance().SharingManager.createSharing(sharing);
return next();
} catch (err) {
console.warn(err);
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during creating sharing link', err));
}
}
public static async updateSharing(req: Request, res: Response, next: NextFunction) {
if (Config.Client.Sharing.enabled === false) {
return next();
}
if ((typeof req.body === 'undefined') || (typeof req.body.updateSharing === 'undefined')) {
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'updateSharing filed is missing'));
}
const updateSharing: CreateSharingDTO = req.body.updateSharing;
const directoryName = req.params.directory || '/';
const sharing: SharingDTO = {
id: updateSharing.id,
path: directoryName,
sharingKey: '',
password: (updateSharing.password && updateSharing.password !== '') ? updateSharing.password : null,
creator: req.session.user,
expires: Date.now() + updateSharing.valid,
includeSubfolders: updateSharing.includeSubfolders,
timeStamp: Date.now()
};
try {
req.resultPipe = await ObjectManagerRepository.getInstance().SharingManager.updateSharing(sharing);
return next();
} catch (err) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during updating sharing link', err));
}
}
}