1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00

implementing share management backend features #145

This commit is contained in:
Patrik J. Braun 2020-09-06 14:44:25 +02:00
parent b9f5aed01c
commit ae447878d0
7 changed files with 94 additions and 6 deletions

View File

@ -5,6 +5,7 @@ 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';
export class RenderingMWs {
@ -47,6 +48,16 @@ export class RenderingMWs {
RenderingMWs.renderMessage(res, sharing);
}
public static renderSharingList(req: Request, res: Response, next: NextFunction) {
if (!req.resultPipe) {
return next();
}
req.resultPipe.forEach((s: SharingDTO) => delete s.password);
return RenderingMWs.renderMessage(res, req.resultPipe);
}
public static renderFile(req: Request, res: Response, next: NextFunction) {
if (!req.resultPipe) {
return next();

View File

@ -5,6 +5,7 @@ import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
import {Config} from '../../common/config/private/Config';
import {QueryParams} from '../../common/QueryParams';
import * as path from 'path';
import {UserRoles} from '../../common/entities/UserDTO';
export class SharingMWs {
@ -91,7 +92,8 @@ export class SharingMWs {
};
try {
req.resultPipe = await ObjectManagers.getInstance().SharingManager.updateSharing(sharing);
const forceUpdate = req.session.user.role >= UserRoles.Admin;
req.resultPipe = await ObjectManagers.getInstance().SharingManager.updateSharing(sharing, forceUpdate);
return next();
} catch (err) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during updating sharing link', err));
@ -99,6 +101,37 @@ export class SharingMWs {
}
public static async deleteSharing(req: Request, res: Response, next: NextFunction) {
if (Config.Client.Sharing.enabled === false) {
return next();
}
if ((typeof req.params === 'undefined') || (typeof req.params.sharingKey === 'undefined')) {
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'sharingKey is missing'));
}
const sharingKey: string = req.params.sharingKey;
try {
req.resultPipe = await ObjectManagers.getInstance().SharingManager.deleteSharing(sharingKey);
return next();
} catch (err) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during deleting sharing', err));
}
}
public static async listSharing(req: Request, res: Response, next: NextFunction) {
if (Config.Client.Sharing.enabled === false) {
return next();
}
try {
req.resultPipe = await ObjectManagers.getInstance().SharingManager.find({});
return next();
} catch (err) {
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'Error during listing shares', err));
}
}
private static generateKey(): string {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)

View File

@ -5,5 +5,9 @@ export interface ISharingManager {
createSharing(sharing: SharingDTO): Promise<SharingDTO>;
updateSharing(sharing: SharingDTO): Promise<SharingDTO>;
updateSharing(sharing: SharingDTO, forceUpdate: boolean): Promise<SharingDTO>;
find(filter: any): Promise<SharingDTO[]>;
deleteSharing(sharingKey: string): Promise<void>;
}

View File

@ -3,6 +3,13 @@ import {SharingDTO} from '../../../../common/entities/SharingDTO';
export class SharingManager implements ISharingManager {
deleteSharing(sharingKey: string): Promise<void> {
throw new Error('not implemented');
}
find(filter: any): Promise<SharingDTO[]> {
throw new Error('not implemented');
}
findOne(filter: any): Promise<SharingDTO> {
throw new Error('not implemented');
@ -12,7 +19,7 @@ export class SharingManager implements ISharingManager {
throw new Error('not implemented');
}
updateSharing(sharing: SharingDTO): Promise<SharingDTO> {
updateSharing(sharing: SharingDTO, forceUpdate: boolean): Promise<SharingDTO> {
throw new Error('not implemented');
}

View File

@ -5,6 +5,7 @@ import {SharingEntity} from './enitites/SharingEntity';
import {Config} from '../../../../common/config/private/Config';
import {PasswordHelper} from '../../PasswordHelper';
import {DeleteResult} from 'typeorm';
import {UserEntity} from './enitites/UserEntity';
export class SharingManager implements ISharingManager {
@ -18,6 +19,18 @@ export class SharingManager implements ISharingManager {
.execute();
}
async deleteSharing(sharingKey: string): Promise<void> {
const connection = await SQLConnection.getConnection();
const sharing = await connection.getRepository(SharingEntity).findOne({sharingKey: sharingKey});
await connection.getRepository(SharingEntity).remove(sharing);
}
async find(filter: any): Promise<SharingDTO[]> {
await SharingManager.removeExpiredLink();
const connection = await SQLConnection.getConnection();
return await connection.getRepository(SharingEntity).find(filter);
}
async findOne(filter: any): Promise<SharingDTO> {
await SharingManager.removeExpiredLink();
const connection = await SQLConnection.getConnection();
@ -33,7 +46,7 @@ export class SharingManager implements ISharingManager {
return connection.getRepository(SharingEntity).save(sharing);
}
async updateSharing(inSharing: SharingDTO): Promise<SharingDTO> {
async updateSharing(inSharing: SharingDTO, forceUpdate: boolean): Promise<SharingDTO> {
const connection = await SQLConnection.getConnection();
const sharing = await connection.getRepository(SharingEntity).findOne({
@ -42,7 +55,7 @@ export class SharingManager implements ISharingManager {
path: inSharing.path
});
if (sharing.timeStamp < Date.now() - Config.Server.Sharing.updateTimeout) {
if (sharing.timeStamp < Date.now() - Config.Server.Sharing.updateTimeout && forceUpdate !== true) {
throw new Error('Sharing is locked, can\'t update anymore');
}
if (inSharing.password == null) {

View File

@ -12,6 +12,7 @@ export class SharingRouter {
this.addGetSharing(app);
this.addCreateSharing(app);
this.addUpdateSharing(app);
this.addListSharing(app);
}
private static addShareLogin(app: express.Express) {
@ -49,4 +50,23 @@ export class SharingRouter {
);
}
private static addDeleteSharing(app: express.Express) {
app.delete(['/api/share/:sharingKey'],
AuthenticationMWs.authenticate,
AuthenticationMWs.authorise(UserRoles.Admin),
SharingMWs.updateSharing,
RenderingMWs.renderOK
);
}
private static addListSharing(app: express.Express) {
app.get(['/api/share/list'],
AuthenticationMWs.authenticate,
AuthenticationMWs.authorise(UserRoles.User),
SharingMWs.listSharing,
RenderingMWs.renderSharingList
);
}
}

View File

@ -121,7 +121,7 @@ describe('SharingManager', (sqlHelper: SQLTestHelper) => {
includeSubfolders: false,
timeStamp: Date.now()
};
const updated = await sm.updateSharing(update);
const updated = await sm.updateSharing(update, false);
expect(updated.id).to.equals(saved.id);
expect(updated.sharingKey).to.equals(sharing.sharingKey);