From 5b2e724f06ce8ac1757d766441f7c29a906f299a Mon Sep 17 00:00:00 2001 From: "Patrik J. Braun" Date: Sun, 2 Dec 2018 12:22:05 +0100 Subject: [PATCH] fixing typeorm and settings bug --- backend/middlewares/AdminMWs.ts | 54 ++++++++++++++++++--- backend/model/sql/GalleryManager.ts | 13 +++-- backend/model/sql/IndexingManager.ts | 4 ++ common/Utils.ts | 7 +++ common/config/private/PrivateConfigClass.ts | 6 ++- package.json | 2 +- 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/backend/middlewares/AdminMWs.ts b/backend/middlewares/AdminMWs.ts index e1a5b8a..00500d1 100644 --- a/backend/middlewares/AdminMWs.ts +++ b/backend/middlewares/AdminMWs.ts @@ -77,6 +77,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -99,7 +102,10 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -122,7 +128,10 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -144,6 +153,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -167,6 +179,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -189,6 +204,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -213,6 +231,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -278,6 +299,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -311,6 +335,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -333,6 +360,9 @@ export class AdminMWs { Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); return next(); } catch (err) { + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -345,7 +375,10 @@ export class AdminMWs { req.resultPipe = 'ok'; return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -355,7 +388,10 @@ export class AdminMWs { req.resultPipe = ObjectManagerRepository.getInstance().IndexingManager.getProgress(); return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -365,7 +401,10 @@ export class AdminMWs { req.resultPipe = 'ok'; return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } @@ -375,7 +414,10 @@ export class AdminMWs { req.resultPipe = 'ok'; return next(); } catch (err) { - return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err)); + if (err instanceof Error) { + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err)); + } + return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err)); } } } diff --git a/backend/model/sql/GalleryManager.ts b/backend/model/sql/GalleryManager.ts index 2485c4f..b4b4c11 100644 --- a/backend/model/sql/GalleryManager.ts +++ b/backend/model/sql/GalleryManager.ts @@ -138,7 +138,7 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { await this.saveToDB(scannedDirectory); } catch (error) { - NotificationManager.warning('Unknown indexing error', error.toString()); + NotificationManager.warning('Unknown indexing error for: ' + relativeDirectoryName, error.toString()); console.error(error); return reject(error); } @@ -336,12 +336,17 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { } } await fileRepository.save(metaFilesToSave); - // await fileRepository.remove(indexedMetaFiles); + await fileRepository.remove(indexedMetaFiles); } protected async saveMedia(connection: Connection, mediaList: MediaDTO[]): Promise { - const list = await connection.getRepository(VideoEntity).save(mediaList.filter(m => MediaDTO.isVideo(m))); - return list.concat(await connection.getRepository(PhotoEntity).save(mediaList.filter(m => MediaDTO.isPhoto(m)))); + const chunked = Utils.chunkArrays(mediaList, 100); + let list: MediaEntity[] = []; + for (let i = 0; i < chunked.length; i++) { + list = list.concat(await connection.getRepository(PhotoEntity).save(chunked[i].filter(m => MediaDTO.isPhoto(m)))); + list = list.concat(await connection.getRepository(VideoEntity).save(chunked[i].filter(m => MediaDTO.isVideo(m)))); + } + return list; } } diff --git a/backend/model/sql/IndexingManager.ts b/backend/model/sql/IndexingManager.ts index 538d23c..8865ca7 100644 --- a/backend/model/sql/IndexingManager.ts +++ b/backend/model/sql/IndexingManager.ts @@ -3,6 +3,7 @@ import {IndexingProgressDTO} from '../../../common/entities/settings/IndexingPro import {ObjectManagerRepository} from '../ObjectManagerRepository'; import {ISQLGalleryManager} from './IGalleryManager'; import * as path from 'path'; +import * as fs from 'fs'; import {SQLConnection} from './SQLConnection'; import {DirectoryEntity} from './enitites/DirectoryEntity'; import {Logger} from '../../Logger'; @@ -43,6 +44,9 @@ export class IndexingManager implements IIndexingManager { const mPath = path.join(ProjectPath.ImageFolder, media.directory.path, media.directory.name, media.name); const thPath = path.join(ProjectPath.ThumbnailFolder, ThumbnailGeneratorMWs.generateThumbnailName(mPath, Config.Client.Thumbnail.thumbnailSizes[0])); + if (fs.existsSync(thPath)) { // skip existing thumbnails + continue; + } await ThumbnailWorker.render({ type: MediaDTO.isVideo(media) ? ThumbnailSourceType.Video : ThumbnailSourceType.Image, mediaPath: mPath, diff --git a/common/Utils.ts b/common/Utils.ts index 60f043d..2f3d6ab 100644 --- a/common/Utils.ts +++ b/common/Utils.ts @@ -1,4 +1,11 @@ export class Utils { + static chunkArrays(arr: T[], chunkSize: number): T[][] { + const R = []; + for (let i = 0; i < arr.length; i += chunkSize) { + R.push(arr.slice(i, i + chunkSize)); + } + return R; + } static clone(object: T): T { diff --git a/common/config/private/PrivateConfigClass.ts b/common/config/private/PrivateConfigClass.ts index f312077..fb1163d 100644 --- a/common/config/private/PrivateConfigClass.ts +++ b/common/config/private/PrivateConfigClass.ts @@ -61,7 +61,11 @@ export class PrivateConfigClass extends PublicConfigClass implements IPrivateCon } public save() { - ConfigLoader.saveConfigFile(path.join(__dirname, './../../../config.json'), this); + try { + ConfigLoader.saveConfigFile(path.join(__dirname, './../../../config.json'), this); + } catch (e) { + throw new Error('Error during saving config: ' + e.toString()); + } } public original(): PrivateConfigClass { diff --git a/package.json b/package.json index da2959a..e5f1e98 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "sqlite3": "4.0.4", "ts-exif-parser": "0.1.4", "ts-node-iptc": "1.0.11", - "typeconfig": "1.0.6", + "typeconfig": "^1.0.7", "typeorm": "0.2.9", "winston": "2.4.2" },