2018-03-31 03:30:30 +08:00
|
|
|
import {NextFunction, Request, Response} from 'express';
|
|
|
|
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
|
|
|
|
import {ObjectManagerRepository} from '../model/ObjectManagerRepository';
|
|
|
|
import {Logger} from '../Logger';
|
|
|
|
import {SQLConnection} from '../model/sql/SQLConnection';
|
|
|
|
import {DataBaseConfig, DatabaseType, IndexingConfig, ThumbnailConfig} from '../../common/config/private/IPrivateConfig';
|
|
|
|
import {Config} from '../../common/config/private/Config';
|
|
|
|
import {ConfigDiagnostics} from '../model/ConfigDiagnostics';
|
|
|
|
import {ClientConfig} from '../../common/config/public/ConfigClass';
|
|
|
|
import {BasicConfigDTO} from '../../common/entities/settings/BasicConfigDTO';
|
|
|
|
import {OtherConfigDTO} from '../../common/entities/settings/OtherConfigDTO';
|
|
|
|
import {ProjectPath} from '../ProjectPath';
|
|
|
|
|
|
|
|
|
|
|
|
const LOG_TAG = '[AdminMWs]';
|
2017-07-26 03:09:37 +08:00
|
|
|
|
2017-07-08 18:43:42 +08:00
|
|
|
export class AdminMWs {
|
|
|
|
|
|
|
|
|
|
|
|
public static async updateDatabaseSettings(req: Request, res: Response, next: NextFunction) {
|
|
|
|
|
2017-07-14 05:39:09 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|
|
|
|
|
2017-07-14 05:39:09 +08:00
|
|
|
const databaseSettings = <DataBaseConfig>req.body.settings;
|
2017-07-08 18:43:42 +08:00
|
|
|
|
|
|
|
try {
|
2018-03-31 03:30:30 +08:00
|
|
|
if (databaseSettings.type !== DatabaseType.memory) {
|
2017-07-21 05:37:10 +08:00
|
|
|
await SQLConnection.tryConnection(databaseSettings);
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|
|
|
|
Config.Server.database = databaseSettings;
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-14 05:39:09 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Server.database = databaseSettings;
|
2018-03-31 03:30:30 +08:00
|
|
|
if (databaseSettings.type === DatabaseType.memory) {
|
2017-07-15 23:29:40 +08:00
|
|
|
original.Client.Sharing.enabled = false;
|
|
|
|
original.Client.Search.enabled = false;
|
|
|
|
}
|
2017-07-14 05:39:09 +08:00
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-08 18:43:42 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
|
|
|
|
ObjectManagerRepository.reset();
|
2018-03-31 03:30:30 +08:00
|
|
|
if (Config.Server.database.type !== DatabaseType.memory) {
|
2017-07-21 05:37:10 +08:00
|
|
|
await ObjectManagerRepository.InitSQLManagers();
|
2017-07-08 18:43:42 +08:00
|
|
|
} else {
|
|
|
|
await ObjectManagerRepository.InitMemoryManagers();
|
|
|
|
}
|
|
|
|
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2017-07-15 23:29:40 +08:00
|
|
|
if (err instanceof Error) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Error while saving database settings: ' + err.toString(), err));
|
2017-07-15 23:29:40 +08:00
|
|
|
}
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Error while saving database settings', err));
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-15 18:47:11 +08:00
|
|
|
public static async updateMapSettings(req: Request, res: Response, next: NextFunction) {
|
2017-07-14 05:39:09 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2017-07-15 18:47:11 +08:00
|
|
|
await ConfigDiagnostics.testMapConfig(<ClientConfig.MapConfig>req.body.settings);
|
|
|
|
|
|
|
|
Config.Client.Map = <ClientConfig.MapConfig>req.body.settings;
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 18:47:11 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Client.Map = <ClientConfig.MapConfig>req.body.settings;
|
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 18:47:11 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
2017-07-08 18:43:42 +08:00
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|
|
|
|
}
|
2017-07-14 05:39:09 +08:00
|
|
|
|
2017-07-15 21:29:04 +08:00
|
|
|
public static async updateShareSettings(req: Request, res: Response, next: NextFunction) {
|
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-15 21:29:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 21:29:04 +08:00
|
|
|
const original = Config.original();
|
|
|
|
await ConfigDiagnostics.testSharingConfig(<ClientConfig.SharingConfig>req.body.settings, original);
|
|
|
|
|
|
|
|
Config.Client.Sharing = <ClientConfig.SharingConfig>req.body.settings;
|
|
|
|
original.Client.Sharing = <ClientConfig.SharingConfig>req.body.settings;
|
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 21:29:04 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-15 21:29:04 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-07-15 20:27:12 +08:00
|
|
|
public static async updateSearchSettings(req: Request, res: Response, next: NextFunction) {
|
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-15 20:27:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 20:27:12 +08:00
|
|
|
const original = Config.original();
|
|
|
|
await ConfigDiagnostics.testSearchConfig(<ClientConfig.SearchConfig>req.body.settings, original);
|
|
|
|
|
|
|
|
Config.Client.Search = <ClientConfig.SearchConfig>req.body.settings;
|
|
|
|
original.Client.Search = <ClientConfig.SearchConfig>req.body.settings;
|
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 20:27:12 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-15 20:27:12 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-07-26 03:09:37 +08:00
|
|
|
public static async updateAuthenticationSettings(req: Request, res: Response, next: NextFunction) {
|
2017-07-14 05:39:09 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-14 05:39:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2017-07-15 18:47:11 +08:00
|
|
|
Config.Client.authenticationRequired = <boolean>req.body.settings;
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-14 05:39:09 +08:00
|
|
|
const original = Config.original();
|
2017-07-15 18:47:11 +08:00
|
|
|
original.Client.authenticationRequired = <boolean>req.body.settings;
|
2017-07-14 05:39:09 +08:00
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-14 05:39:09 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-14 05:39:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-26 03:09:37 +08:00
|
|
|
public static async updateThumbnailSettings(req: Request, res: Response, next: NextFunction) {
|
2017-07-14 05:39:09 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-14 05:39:09 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2017-07-15 18:47:11 +08:00
|
|
|
const settings: {
|
|
|
|
server: ThumbnailConfig,
|
|
|
|
client: ClientConfig.ThumbnailConfig
|
|
|
|
} = req.body.settings;
|
|
|
|
|
|
|
|
await ConfigDiagnostics.testServerThumbnailConfig(settings.server);
|
|
|
|
await ConfigDiagnostics.testClientThumbnailConfig(settings.client);
|
|
|
|
Config.Server.thumbnail = settings.server;
|
|
|
|
Config.Client.Thumbnail = settings.client;
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 18:47:11 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Server.thumbnail = settings.server;
|
|
|
|
original.Client.Thumbnail = settings.client;
|
|
|
|
original.save();
|
2017-07-19 16:21:52 +08:00
|
|
|
ProjectPath.reset();
|
2017-07-15 18:47:11 +08:00
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 18:47:11 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
2017-07-14 05:39:09 +08:00
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2017-07-15 18:47:11 +08:00
|
|
|
if (err instanceof Error) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + err.toString(), err));
|
2017-07-15 18:47:11 +08:00
|
|
|
}
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-14 05:39:09 +08:00
|
|
|
}
|
|
|
|
}
|
2017-07-15 18:47:11 +08:00
|
|
|
|
|
|
|
|
2017-07-26 03:09:37 +08:00
|
|
|
public static async updateBasicSettings(req: Request, res: Response, next: NextFunction) {
|
2017-07-15 22:09:48 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-15 22:09:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const settings: BasicConfigDTO = req.body.settings;
|
2017-07-15 23:44:33 +08:00
|
|
|
await ConfigDiagnostics.testImageFolder(settings.imagesFolder);
|
2017-07-15 22:09:48 +08:00
|
|
|
Config.Server.port = settings.port;
|
|
|
|
Config.Server.imagesFolder = settings.imagesFolder;
|
|
|
|
Config.Client.publicUrl = settings.publicUrl;
|
|
|
|
Config.Client.applicationTitle = settings.applicationTitle;
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 22:09:48 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Server.port = settings.port;
|
|
|
|
original.Server.imagesFolder = settings.imagesFolder;
|
|
|
|
original.Client.publicUrl = settings.publicUrl;
|
|
|
|
original.Client.applicationTitle = settings.applicationTitle;
|
|
|
|
original.save();
|
2017-07-19 16:21:52 +08:00
|
|
|
ProjectPath.reset();
|
2017-07-15 22:09:48 +08:00
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 22:09:48 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-15 22:09:48 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-07-26 03:09:37 +08:00
|
|
|
public static async updateOtherSettings(req: Request, res: Response, next: NextFunction) {
|
2017-07-15 22:31:43 +08:00
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-15 22:31:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const settings: OtherConfigDTO = req.body.settings;
|
|
|
|
Config.Client.enableCache = settings.enableCache;
|
|
|
|
Config.Client.enableOnScrollRendering = settings.enableOnScrollRendering;
|
|
|
|
Config.Client.enableOnScrollThumbnailPrioritising = settings.enableOnScrollThumbnailPrioritising;
|
|
|
|
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-15 22:31:43 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Client.enableCache = settings.enableCache;
|
|
|
|
original.Client.enableOnScrollRendering = settings.enableOnScrollRendering;
|
|
|
|
original.Client.enableOnScrollThumbnailPrioritising = settings.enableOnScrollThumbnailPrioritising;
|
|
|
|
original.Server.enableThreading = settings.enableThreading;
|
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-15 22:31:43 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-15 22:31:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-28 05:10:16 +08:00
|
|
|
public static async updateIndexingSettings(req: Request, res: Response, next: NextFunction) {
|
|
|
|
if ((typeof req.body === 'undefined') || (typeof req.body.settings === 'undefined')) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.INPUT_ERROR, 'settings is needed'));
|
2017-07-28 05:10:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const settings: IndexingConfig = req.body.settings;
|
|
|
|
Config.Server.indexing = settings;
|
|
|
|
|
2018-03-31 03:30:30 +08:00
|
|
|
// only updating explicitly set config (not saving config set by the diagnostics)
|
2017-07-28 05:10:16 +08:00
|
|
|
const original = Config.original();
|
|
|
|
original.Server.indexing = settings;
|
|
|
|
original.save();
|
|
|
|
await ConfigDiagnostics.runDiagnostics();
|
2018-03-31 03:30:30 +08:00
|
|
|
Logger.info(LOG_TAG, 'new config:');
|
2017-07-28 05:10:16 +08:00
|
|
|
Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t'));
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Settings error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-28 05:10:16 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-15 22:31:43 +08:00
|
|
|
|
2017-07-26 03:09:37 +08:00
|
|
|
public static startIndexing(req: Request, res: Response, next: NextFunction) {
|
|
|
|
try {
|
|
|
|
ObjectManagerRepository.getInstance().IndexingManager.startIndexing();
|
2018-03-31 03:30:30 +08:00
|
|
|
req.resultPipe = 'ok';
|
2017-07-26 03:09:37 +08:00
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-26 03:09:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static getIndexingProgress(req: Request, res: Response, next: NextFunction) {
|
|
|
|
try {
|
|
|
|
req.resultPipe = ObjectManagerRepository.getInstance().IndexingManager.getProgress();
|
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-26 03:09:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static cancelIndexing(req: Request, res: Response, next: NextFunction) {
|
|
|
|
try {
|
|
|
|
ObjectManagerRepository.getInstance().IndexingManager.cancelIndexing();
|
2018-03-31 03:30:30 +08:00
|
|
|
req.resultPipe = 'ok';
|
2017-07-26 03:09:37 +08:00
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-26 03:09:37 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static async resetIndexes(req: Request, res: Response, next: NextFunction) {
|
|
|
|
try {
|
|
|
|
await ObjectManagerRepository.getInstance().IndexingManager.reset();
|
2018-03-31 03:30:30 +08:00
|
|
|
req.resultPipe = 'ok';
|
2017-07-26 03:09:37 +08:00
|
|
|
return next();
|
|
|
|
} catch (err) {
|
2018-03-31 03:30:30 +08:00
|
|
|
return next(new ErrorDTO(ErrorCodes.SETTINGS_ERROR, 'Indexing error: ' + JSON.stringify(err, null, ' '), err));
|
2017-07-26 03:09:37 +08:00
|
|
|
}
|
|
|
|
}
|
2017-07-08 18:43:42 +08:00
|
|
|
}
|