diff --git a/src/backend/middlewares/admin/SettingsMWs.ts b/src/backend/middlewares/admin/SettingsMWs.ts index f25578fe..a1422c8f 100644 --- a/src/backend/middlewares/admin/SettingsMWs.ts +++ b/src/backend/middlewares/admin/SettingsMWs.ts @@ -18,6 +18,7 @@ import { ServerVideoConfig } from '../../../common/config/private/PrivateConfig'; import { + ClientAlbumConfig, ClientFacesConfig, ClientMapConfig, ClientMetaFileConfig, @@ -159,6 +160,33 @@ export class SettingsMWs { } } + + public static async updateAlbumsSettings(req: Request, res: Response, next: NextFunction): Promise { + if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) { + return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed')); + } + + try { + const original = await Config.original(); + await ConfigDiagnostics.testAlbumsConfig(req.body.settings as ClientAlbumConfig, original); + + Config.Client.Album = (req.body.settings as ClientAlbumConfig); + // only updating explicitly set config (not saving config set by the diagnostics) + + original.Client.Album = (req.body.settings as ClientAlbumConfig); + original.save(); + await ConfigDiagnostics.runDiagnostics(); + Logger.info(LOG_TAG, 'new config:'); + 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)); + } + } + public static async updateShareSettings(req: Request, res: Response, next: NextFunction): Promise { if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) { return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed')); diff --git a/src/backend/model/diagnostics/ConfigDiagnostics.ts b/src/backend/model/diagnostics/ConfigDiagnostics.ts index 3620e820..5a2bb863 100644 --- a/src/backend/model/diagnostics/ConfigDiagnostics.ts +++ b/src/backend/model/diagnostics/ConfigDiagnostics.ts @@ -5,6 +5,7 @@ import {SQLConnection} from '../database/sql/SQLConnection'; import * as fs from 'fs'; import {FFmpegFactory} from '../FFmpegFactory'; import { + ClientAlbumConfig, ClientFacesConfig, ClientMapConfig, ClientMetaFileConfig, @@ -30,6 +31,12 @@ const LOG_TAG = '[ConfigDiagnostics]'; export class ConfigDiagnostics { + static testAlbumsConfig(albumConfig: ClientAlbumConfig, original: IPrivateConfig): void { + if (albumConfig.enabled === true && + original.Server.Database.type === DatabaseType.memory) { + throw new Error('Memory Database does not support albums'); + } + } static checkReadWritePermission(path: string): Promise { return new Promise((resolve, reject) => { @@ -273,6 +280,15 @@ export class ConfigDiagnostics { Config.Client.MetaFile.enabled = false; } + try { + await ConfigDiagnostics.testAlbumsConfig(Config.Client.Album, Config); + } catch (ex) { + const err: Error = ex; + NotificationManager.warning('Albums support error, switching off..', err.toString()); + Logger.warn(LOG_TAG, 'Meta file support error, switching off..', err.toString()); + Config.Client.Album.enabled = false; + } + try { await ConfigDiagnostics.testImageFolder(Config.Server.Media.folder); diff --git a/src/backend/routes/admin/SettingsRouter.ts b/src/backend/routes/admin/SettingsRouter.ts index 76eb50fb..6b41977d 100644 --- a/src/backend/routes/admin/SettingsRouter.ts +++ b/src/backend/routes/admin/SettingsRouter.ts @@ -74,6 +74,12 @@ export class SettingsRouter { SettingsMWs.updateFacesSettings, RenderingMWs.renderOK ); + app.put('/api/settings/albums', + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + SettingsMWs.updateAlbumsSettings, + RenderingMWs.renderOK + ); app.put('/api/settings/share', AuthenticationMWs.authenticate, AuthenticationMWs.authorise(UserRoles.Admin), diff --git a/src/common/config/public/ClientConfig.ts b/src/common/config/public/ClientConfig.ts index f959c9ac..57bf3f0d 100644 --- a/src/common/config/public/ClientConfig.ts +++ b/src/common/config/public/ClientConfig.ts @@ -39,7 +39,7 @@ export class ClientSearchConfig { @SubConfigClass() export class ClientAlbumConfig { @ConfigProperty() - enabled: boolean = false; + enabled: boolean = true; } @SubConfigClass() diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index 8f9657ad..fdb4820d 100644 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -105,6 +105,7 @@ import {AlbumComponent} from './ui/albums/album/album.component'; import {AlbumsService} from './ui/albums/albums.service'; import {GallerySearchQueryBuilderComponent} from './ui/gallery/search/query-builder/query-bulder.gallery.component'; import {SavedSearchPopupComponent} from './ui/albums/saved-search-popup/saved-search-popup.component'; +import {AlbumsSettingsComponent} from './ui/settings/albums/albums.settings.component'; @Injectable() @@ -227,6 +228,7 @@ Marker.prototype.options.icon = iconDefault; RandomPhotoSettingsComponent, BasicSettingsComponent, FacesSettingsComponent, + AlbumsSettingsComponent, OtherSettingsComponent, IndexingSettingsComponent, JobProgressComponent, diff --git a/src/frontend/app/ui/admin/admin.component.html b/src/frontend/app/ui/admin/admin.component.html index eeafc388..28ce1e92 100644 --- a/src/frontend/app/ui/admin/admin.component.html +++ b/src/frontend/app/ui/admin/admin.component.html @@ -125,6 +125,9 @@ + diff --git a/src/frontend/app/ui/albums/albums.component.html b/src/frontend/app/ui/albums/albums.component.html index b7a2fb3f..e6acce76 100644 --- a/src/frontend/app/ui/albums/albums.component.html +++ b/src/frontend/app/ui/albums/albums.component.html @@ -31,7 +31,7 @@