From 8b090603b6e27a3f9833070bd5f05efd53752a15 Mon Sep 17 00:00:00 2001 From: Braun Patrik Date: Sat, 8 Jul 2017 12:43:42 +0200 Subject: [PATCH] implementing database settings --- backend/middlewares/AdminMWs.ts | 63 +++++++++ backend/middlewares/RenderingMWs.ts | 9 ++ backend/middlewares/user/UserMWs.ts | 2 +- backend/model/mysql/MySQLConnection.ts | 59 +++++--- backend/routes/AdminRouter.ts | 26 ++++ common/Utils.ts | 33 +++-- common/config/private/Config.ts | 8 +- common/config/private/IPrivateConfig.ts | 5 + common/config/private/PrivateConfigClass.ts | 18 ++- common/config/public/ConfigClass.ts | 2 +- common/entities/Error.ts | 3 +- frontend/app/admin/admin.component.html | 3 +- frontend/app/admin/admin.component.ts | 3 +- frontend/app/app.component.ts | 9 +- frontend/app/app.module.ts | 19 ++- frontend/app/model/notification.service.ts | 40 ++++++ frontend/app/notification.service.ts | 27 ---- .../database/database.settings.component.css | 11 ++ .../database/database.settings.component.html | 40 ++++++ .../database/database.settings.component.ts | 90 ++++++++++++ .../database/database.settings.service.ts | 23 ++++ .../usermanager.settings.component.css | 3 + .../usermanager.settings.component.html | 130 +++++++++--------- .../usermanager.settings.component.ts | 36 +++-- frontend/index.html | 1 + frontend/styles.css | 1 + package.json | 4 +- 27 files changed, 513 insertions(+), 155 deletions(-) create mode 100644 backend/middlewares/AdminMWs.ts create mode 100644 frontend/app/model/notification.service.ts delete mode 100644 frontend/app/notification.service.ts create mode 100644 frontend/app/settings/database/database.settings.component.css create mode 100644 frontend/app/settings/database/database.settings.component.html create mode 100644 frontend/app/settings/database/database.settings.component.ts create mode 100644 frontend/app/settings/database/database.settings.service.ts diff --git a/backend/middlewares/AdminMWs.ts b/backend/middlewares/AdminMWs.ts new file mode 100644 index 00000000..fe134212 --- /dev/null +++ b/backend/middlewares/AdminMWs.ts @@ -0,0 +1,63 @@ +import {NextFunction, Request, Response} from "express"; +import {Error, ErrorCodes} from "../../common/entities/Error"; +import {ObjectManagerRepository} from "../model/ObjectManagerRepository"; +import {Logger} from "../Logger"; +import {MySQLConnection} from "../model/mysql/MySQLConnection"; +import {DataBaseConfig, DatabaseType} from "../../common/config/private/IPrivateConfig"; +import {Config} from "../../common/config/private/Config"; + + +const LOG_TAG = "[AdminMWs]"; +export class AdminMWs { + + + public static async updateDatabaseSettings(req: Request, res: Response, next: NextFunction) { + + if ((typeof req.body === 'undefined') || (typeof req.body.databaseSettings === 'undefined')) { + return next(new Error(ErrorCodes.INPUT_ERROR, "databaseSettings is needed")); + } + + const databaseSettings = req.body.databaseSettings; + + try { + if (Config.Server.database.type == DatabaseType.mysql) { + await MySQLConnection.tryConnection(databaseSettings); + } + Config.Server.database = databaseSettings; + Config.save(); + Logger.info(LOG_TAG, "new config:"); + Logger.info(LOG_TAG, JSON.stringify(Config, null, '\t')); + + ObjectManagerRepository.reset(); + if (Config.Server.database.type == DatabaseType.mysql) { + await ObjectManagerRepository.InitMySQLManagers(); + } else { + await ObjectManagerRepository.InitMemoryManagers(); + } + + return next(); + } catch (err) { + Logger.warn(LOG_TAG, "Error saving database settings", err); + return next(new Error(ErrorCodes.SETTINGS_ERROR, err)); + } + } + + + public static async testDatabaseSettings(req: Request, res: Response, next: NextFunction) { + if ((typeof req.body === 'undefined') || (typeof req.body.databaseSettings === 'undefined')) { + return next(new Error(ErrorCodes.INPUT_ERROR, "databaseSettings is needed")); + } + + const databaseSettings = req.body.databaseSettings; + + try { + if (Config.Server.database.type == DatabaseType.mysql) { + await MySQLConnection.tryConnection(databaseSettings); + } + return next(); + } catch (err) { + Logger.warn(LOG_TAG, "Error saving database settings", err); + return next(new Error(ErrorCodes.SETTINGS_ERROR, err)); + } + } +} diff --git a/backend/middlewares/RenderingMWs.ts b/backend/middlewares/RenderingMWs.ts index 7bfde464..d81b8f82 100644 --- a/backend/middlewares/RenderingMWs.ts +++ b/backend/middlewares/RenderingMWs.ts @@ -3,6 +3,8 @@ import {Error, ErrorCodes} from "../../common/entities/Error"; import {Utils} from "../../common/Utils"; import {Message} from "../../common/entities/Message"; import {SharingDTO} from "../../common/entities/SharingDTO"; +import {Config} from "../../common/config/private/Config"; +import {PrivateConfigClass} from "../../common/config/private/PrivateConfigClass"; export class RenderingMWs { @@ -45,6 +47,13 @@ export class RenderingMWs { res.json(message); } + + public static renderConfig(req: Request, res: Response, next: NextFunction) { + let message = new Message(null, Config); + res.json(message); + } + + public static renderError(err: any, req: Request, res: Response, next: NextFunction): any { if (err instanceof Error) { let message = new Message(err, null); diff --git a/backend/middlewares/user/UserMWs.ts b/backend/middlewares/user/UserMWs.ts index fead79b5..986b7e61 100644 --- a/backend/middlewares/user/UserMWs.ts +++ b/backend/middlewares/user/UserMWs.ts @@ -96,8 +96,8 @@ export class UserMWs { for (let i = 0; i < result.length; i++) { result[i].password = ""; } - req.resultPipe = result; + next(); } catch (err) { return next(new Error(ErrorCodes.GENERAL_ERROR)); } diff --git a/backend/model/mysql/MySQLConnection.ts b/backend/model/mysql/MySQLConnection.ts index a4c405ec..64231aef 100644 --- a/backend/model/mysql/MySQLConnection.ts +++ b/backend/model/mysql/MySQLConnection.ts @@ -6,6 +6,7 @@ import {PhotoEntity, PhotoMetadataEntity} from "./enitites/PhotoEntity"; import {DirectoryEntity} from "./enitites/DirectoryEntity"; import {Config} from "../../../common/config/private/Config"; import {SharingEntity} from "./enitites/SharingEntity"; +import {DataBaseConfig} from "../../../common/config/private/IPrivateConfig"; export class MySQLConnection { @@ -21,6 +22,7 @@ export class MySQLConnection { if (this.connection == null) { this.connection = await createConnection({ + name: "main", driver: { type: "mysql", host: Config.Server.database.mysql.host, @@ -49,23 +51,48 @@ export class MySQLConnection { } - public static init(): Promise { - return new Promise((resolve, reject) => { - this.getConnection().then(async connection => { - - let userRepository = connection.getRepository(UserEntity); - let admins = await userRepository.find({role: UserRoles.Admin}); - if (admins.length == 0) { - let a = new UserEntity(); - a.name = "admin"; - a.password = "admin"; - a.role = UserRoles.Admin; - await userRepository.persist(a); - } - - resolve(); - }).catch(err => reject(err)); + public static async tryConnection(config: DataBaseConfig) { + const conn = await createConnection({ + name: "test", + driver: { + type: "mysql", + host: config.mysql.host, + port: 3306, + username: config.mysql.username, + password: config.mysql.password, + database: config.mysql.database + }, + entities: [ + UserEntity, + DirectoryEntity, + PhotoMetadataEntity, + PhotoEntity, + SharingEntity + ], + autoSchemaSync: true, + logging: { + logQueries: true, + logOnlyFailedQueries: true, + logFailedQueryError: true, + logSchemaCreation: true + } }); + await conn.close(); + return true; + } + + public static async init(): Promise { + const connection = await this.getConnection(); + let userRepository = connection.getRepository(UserEntity); + let admins = await userRepository.find({role: UserRoles.Admin}); + if (admins.length == 0) { + let a = new UserEntity(); + a.name = "admin"; + a.password = "admin"; + a.role = UserRoles.Admin; + await userRepository.persist(a); + } + } diff --git a/backend/routes/AdminRouter.ts b/backend/routes/AdminRouter.ts index 424296b3..05b58ea8 100644 --- a/backend/routes/AdminRouter.ts +++ b/backend/routes/AdminRouter.ts @@ -1,11 +1,14 @@ import {AuthenticationMWs} from "../middlewares/user/AuthenticationMWs"; import {UserRoles} from "../../common/entities/UserDTO"; +import {RenderingMWs} from "../middlewares/RenderingMWs"; +import {AdminMWs} from "../middlewares/AdminMWs"; export class AdminRouter { public static route(app: any) { this.addResetDB(app); this.addIndexGallery(app); + this.addSettings(app); } private static addResetDB(app) { @@ -24,5 +27,28 @@ export class AdminRouter { ); }; + private static addSettings(app) { + app.get("/api/settings", + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + RenderingMWs.renderConfig + ); + + + app.put("/api/settings/database", + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + AdminMWs.updateDatabaseSettings, + RenderingMWs.renderOK + ); + + app.post("/api/settings/test/database", + AuthenticationMWs.authenticate, + AuthenticationMWs.authorise(UserRoles.Admin), + AdminMWs.testDatabaseSettings, + RenderingMWs.renderOK + ); + }; + } diff --git a/common/Utils.ts b/common/Utils.ts index 91d8a6a6..5775d05a 100644 --- a/common/Utils.ts +++ b/common/Utils.ts @@ -6,12 +6,16 @@ export class Utils { } static equalsFilter(object: any, filter: any): boolean { - - let keys = Object.keys(filter); + const keys = Object.keys(filter); for (let i = 0; i < keys.length; i++) { - let key = keys[i]; - if (object[key] !== filter[key]) { + const key = keys[i]; + if (typeof filter[key] === "object") { + if (Utils.equalsFilter(object[key], filter[key]) == false) { + return false; + } + } else if (object[key] !== filter[key]) { return false; + } } @@ -19,7 +23,8 @@ export class Utils { } - static concatUrls(...args: Array) { + static + concatUrls(...args: Array) { let url = ""; for (let i = 0; i < args.length; i++) { if (args[i] === "" || typeof args[i] === "undefined") continue; @@ -34,7 +39,8 @@ export class Utils { return url.substring(0, url.length - 1); } - public static updateKeys(targetObject: any, sourceObject: any) { + public static + updateKeys(targetObject: any, sourceObject: any) { Object.keys(sourceObject).forEach((key) => { if (typeof targetObject[key] === "undefined") { return; @@ -47,7 +53,8 @@ export class Utils { }); } - public static setKeys(targetObject: any, sourceObject: any) { + public static + setKeys(targetObject: any, sourceObject: any) { Object.keys(sourceObject).forEach((key) => { if (typeof targetObject[key] === "object") { Utils.setKeys(targetObject[key], sourceObject[key]); @@ -57,7 +64,8 @@ export class Utils { }); } - public static setKeysForced(targetObject: any, sourceObject: any) { + public static + setKeysForced(targetObject: any, sourceObject: any) { Object.keys(sourceObject).forEach((key) => { if (typeof sourceObject[key] === "object") { if (typeof targetObject[key] === "undefined") { @@ -70,7 +78,11 @@ export class Utils { }); } - public static enumToArray(EnumType: any): Array<{ key: number; value: string; }> { + public static + enumToArray(EnumType: any): Array<{ + key: number; + value: string; + }> { let arr: Array<{ key: number; value: string; }> = []; for (let enumMember in EnumType) { if (!EnumType.hasOwnProperty(enumMember)) { @@ -85,7 +97,8 @@ export class Utils { } - public static findClosest(number: number, arr: Array) { + public static + findClosest(number: number, arr: Array) { let curr = arr[0]; let diff = Math.abs(number - curr); diff --git a/common/config/private/Config.ts b/common/config/private/Config.ts index a8ff87e3..5e3cabe8 100644 --- a/common/config/private/Config.ts +++ b/common/config/private/Config.ts @@ -1,11 +1,5 @@ -import * as path from "path"; import {PrivateConfigClass} from "./PrivateConfigClass"; -import {ConfigLoader} from "typeconfig"; export let Config = new PrivateConfigClass(); - - -ConfigLoader.loadBackendConfig(Config, - path.join(__dirname, './../../../config.json'), - [["PORT", "Server-port"]]); +Config.load(); diff --git a/common/config/private/IPrivateConfig.ts b/common/config/private/IPrivateConfig.ts index 1461306a..186bb526 100644 --- a/common/config/private/IPrivateConfig.ts +++ b/common/config/private/IPrivateConfig.ts @@ -1,3 +1,4 @@ +import {ClientConfig} from "../public/ConfigClass"; export enum DatabaseType{ memory = 0, mysql = 1 } @@ -37,3 +38,7 @@ export interface ServerConfig { enableThreading: boolean; sharing: SharingConfig; } +export interface IPrivateConfig { + Server: ServerConfig; + Client: ClientConfig; +} diff --git a/common/config/private/PrivateConfigClass.ts b/common/config/private/PrivateConfigClass.ts index e196321c..71a832c4 100644 --- a/common/config/private/PrivateConfigClass.ts +++ b/common/config/private/PrivateConfigClass.ts @@ -1,11 +1,12 @@ import {PublicConfigClass} from "../public/ConfigClass"; -import {DatabaseType, ServerConfig, ThumbnailProcessingLib} from "./IPrivateConfig"; - +import {DatabaseType, IPrivateConfig, ServerConfig, ThumbnailProcessingLib} from "./IPrivateConfig"; +import * as path from "path"; +import {ConfigLoader} from "typeconfig"; /** * This configuration will be only at backend */ -export class PrivateConfigClass extends PublicConfigClass { +export class PrivateConfigClass extends PublicConfigClass implements IPrivateConfig { public Server: ServerConfig = { port: 80, @@ -30,6 +31,7 @@ export class PrivateConfigClass extends PublicConfigClass { }, enableThreading: true }; + private ConfigLoader: any; public setDatabaseType(type: DatabaseType) { this.Server.database.type = type; @@ -40,5 +42,15 @@ export class PrivateConfigClass extends PublicConfigClass { } } + public load() { + ConfigLoader.loadBackendConfig(this, + path.join(__dirname, './../../../config.json'), + [["PORT", "Server-port"]]); + + } + + public save() { + ConfigLoader.saveConfigFile(path.join(__dirname, './../../../config.json'), this); + } } diff --git a/common/config/public/ConfigClass.ts b/common/config/public/ConfigClass.ts index 25762271..6ddb6bc9 100644 --- a/common/config/public/ConfigClass.ts +++ b/common/config/public/ConfigClass.ts @@ -9,7 +9,7 @@ interface SharingConfig { passwordProtected: boolean; } -interface ClientConfig { +export interface ClientConfig { applicationTitle: string; iconSize: number; thumbnailSizes: Array; diff --git a/common/entities/Error.ts b/common/entities/Error.ts index ee4b2053..3df5ce3e 100644 --- a/common/entities/Error.ts +++ b/common/entities/Error.ts @@ -15,8 +15,9 @@ export enum ErrorCodes{ USER_MANAGEMENT_DISABLED = 9, - INPUT_ERROR = 10 + INPUT_ERROR = 10, + SETTINGS_ERROR = 11 } export class Error { diff --git a/frontend/app/admin/admin.component.html b/frontend/app/admin/admin.component.html index 2e4ee117..201829bf 100644 --- a/frontend/app/admin/admin.component.html +++ b/frontend/app/admin/admin.component.html @@ -1,5 +1,6 @@
- + +
diff --git a/frontend/app/admin/admin.component.ts b/frontend/app/admin/admin.component.ts index ef688569..b539c7bc 100644 --- a/frontend/app/admin/admin.component.ts +++ b/frontend/app/admin/admin.component.ts @@ -16,7 +16,8 @@ export class AdminComponent implements OnInit { } ngOnInit() { - if (!this._authService.isAuthenticated() || this._authService.user.value.role < UserRoles.Admin) { + if (!this._authService.isAuthenticated() + || this._authService.user.value.role < UserRoles.Admin) { this._router.navigate(['login']); return; } diff --git a/frontend/app/app.component.ts b/frontend/app/app.component.ts index 1b19a799..61b8ce27 100644 --- a/frontend/app/app.component.ts +++ b/frontend/app/app.component.ts @@ -1,9 +1,10 @@ -import {Component, OnInit} from "@angular/core"; +import {Component, OnInit, ViewContainerRef} from "@angular/core"; import {AuthenticationService} from "./model/network/authentication.service"; import {UserDTO} from "../../common/entities/UserDTO"; import {Router} from "@angular/router"; import {Config} from "../../common/config/public/Config"; import {Title} from "@angular/platform-browser"; +import {NotificationService} from "./model/notification.service"; @Component({ @@ -13,7 +14,11 @@ import {Title} from "@angular/platform-browser"; }) export class AppComponent implements OnInit { - constructor(private _router: Router, private _authenticationService: AuthenticationService, private _title: Title) { + constructor(private _router: Router, + private _authenticationService: AuthenticationService, + private _title: Title, vcr: ViewContainerRef, + notificatin: NotificationService) { + notificatin.setRootViewContainerRef(vcr); } ngOnInit() { diff --git a/frontend/app/app.module.ts b/frontend/app/app.module.ts index 99d5908b..fcfed532 100644 --- a/frontend/app/app.module.ts +++ b/frontend/app/app.module.ts @@ -36,7 +36,11 @@ import {SlimLoadingBarModule} from "ng2-slim-loading-bar"; import {GalleryShareComponent} from "./gallery/share/share.gallery.component"; import {ShareLoginComponent} from "./sharelogin/share-login.component"; import {ShareService} from "./gallery/share.service"; -import {TypeaheadModule} from "ngx-bootstrap"; +import {ModalModule} from "ngx-bootstrap/modal"; +import {DatabaseSettingsComponent} from "./settings/database/database.settings.component"; +import {ToastModule} from "ng2-toastr/ng2-toastr"; +import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; +import {NotificationService} from "./model/notification.service"; @Injectable() export class GoogleMapsConfig { @@ -52,18 +56,19 @@ export class GoogleMapsConfig { BrowserModule, FormsModule, HttpModule, + BrowserAnimationsModule, appRoutes, - TypeaheadModule.forRoot(), + ToastModule.forRoot(), + ModalModule.forRoot(), AgmCoreModule.forRoot(), SlimLoadingBarModule.forRoot() ], declarations: [AppComponent, LoginComponent, ShareLoginComponent, - AdminComponent, GalleryComponent, FrameComponent, - UserMangerSettingsComponent, + //Gallery GalleryLightboxPhotoComponent, GalleryPhotoLoadingComponent, GalleryGridComponent, @@ -76,7 +81,10 @@ export class GoogleMapsConfig { GalleryShareComponent, GalleryNavigatorComponent, GalleryPhotoComponent, - FrameComponent, + AdminComponent, + //Settings + UserMangerSettingsComponent, + DatabaseSettingsComponent, StringifyRole], providers: [ {provide: LAZY_MAPS_API_CONFIG, useClass: GoogleMapsConfig}, @@ -88,6 +96,7 @@ export class GoogleMapsConfig { AuthenticationService, ThumbnailLoaderService, ThumbnailManagerService, + NotificationService, FullScreenService, OverlayService], diff --git a/frontend/app/model/notification.service.ts b/frontend/app/model/notification.service.ts new file mode 100644 index 00000000..b02d28a5 --- /dev/null +++ b/frontend/app/model/notification.service.ts @@ -0,0 +1,40 @@ +import {Injectable, ViewContainerRef} from "@angular/core"; +import {ToastsManager} from "ng2-toastr/ng2-toastr"; + +@Injectable() +export class NotificationService { + + options = { + positionClass: "toast-top-center", + animate: "flyLeft" + }; + + constructor(private _toastr: ToastsManager) { + + } + + setRootViewContainerRef(vcr: ViewContainerRef) { + this._toastr.setRootViewContainerRef(vcr); + } + + success(text, title = null) { + this._toastr.success(text, title, this.options); + } + + error(text, title?) { + this._toastr.error(text, title, this.options); + } + + warning(text, title?) { + this._toastr.warning(text, title, this.options); + } + + info(text, title = null) { + this._toastr.info(text, title, this.options); + } + + + get Toastr(): ToastsManager { + return this._toastr; + } +} diff --git a/frontend/app/notification.service.ts b/frontend/app/notification.service.ts deleted file mode 100644 index 37388893..00000000 --- a/frontend/app/notification.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import {Injectable} from "@angular/core"; - -@Injectable() -export class NotificationService { - - - constructor() { - - } - - public showException(message: string) { - - } - - public showError(message: string) { - - } - - public showWarn(message: string) { - - } - - public showInfo(message: string) { - - } - -} diff --git a/frontend/app/settings/database/database.settings.component.css b/frontend/app/settings/database/database.settings.component.css new file mode 100644 index 00000000..86f118d8 --- /dev/null +++ b/frontend/app/settings/database/database.settings.component.css @@ -0,0 +1,11 @@ +.title { + margin-left: -5px; +} + +.btn { + margin-left: 10px; +} + +.form-control { + margin: 5px 0; +} diff --git a/frontend/app/settings/database/database.settings.component.html b/frontend/app/settings/database/database.settings.component.html new file mode 100644 index 00000000..935d083f --- /dev/null +++ b/frontend/app/settings/database/database.settings.component.html @@ -0,0 +1,40 @@ +
+
+

Database settings

+
+
+ +
+

Type:

+ + +

MySQL settings:

+ + + + +
+ +
+ + + +
+
diff --git a/frontend/app/settings/database/database.settings.component.ts b/frontend/app/settings/database/database.settings.component.ts new file mode 100644 index 00000000..2755ef16 --- /dev/null +++ b/frontend/app/settings/database/database.settings.component.ts @@ -0,0 +1,90 @@ +import {Component, OnInit, ViewChild} from "@angular/core"; +import {AuthenticationService} from "../../model/network/authentication.service"; +import {Router} from "@angular/router"; +import {UserRoles} from "../../../../common/entities/UserDTO"; +import {DatabaseSettingsService} from "./database.settings.service"; +import {DataBaseConfig, DatabaseType} from "../../../../common/config/private/IPrivateConfig"; +import {Utils} from "../../../../common/Utils"; +import {Error} from "../../../../common/entities/Error"; +import {NotificationService} from "../../model/notification.service"; + +@Component({ + selector: 'settings-database', + templateUrl: './database.settings.component.html', + styleUrls: ['./database.settings.component.css'], + providers: [DatabaseSettingsService], +}) +export class DatabaseSettingsComponent implements OnInit { + @ViewChild('settingsForm') form; + + public settings: DataBaseConfig = { + type: DatabaseType.memory, + mysql: {} + }; + private original: DataBaseConfig; + public types: Array = []; + public DatabaseType: any; + public tested = false; + public error: string = null; + public changed: boolean = false; + + constructor(private _authService: AuthenticationService, + private _router: Router, + private _dbSettings: DatabaseSettingsService, + private notification: NotificationService) { + this.original = Utils.clone(this.settings); + } + + ngOnInit() { + if (!this._authService.isAuthenticated() || + this._authService.user.value.role < UserRoles.Admin) { + this._router.navigate(['login']); + return; + } + this.types = Utils + .enumToArray(DatabaseType); + this.DatabaseType = DatabaseType; + this.getSettings(); + + this.form.valueChanges.subscribe((data) => { + this.changed = !Utils.equalsFilter(this.settings, this.original); + + this.tested = false; + }); + } + + private async getSettings() { + const s = await this._dbSettings.getSettings(); + this.original = Utils.clone(s); + this.settings = s; + this.tested = false; + this.changed = false; + } + + public reset() { + this.getSettings(); + } + + public async test() { + try { + await this._dbSettings.testSettings(this.settings); + this.tested = true; + } catch (err) { + if (err.message) + this.error = (err).message; + } + } + + public async save() { + if (typeof this.settings.type == "undefined" || !this.tested) { + return; + } + await this._dbSettings.updateSettings(this.settings); + await this.getSettings(); + this.notification.success('Database settings saved', "Success"); + } + +} + + + diff --git a/frontend/app/settings/database/database.settings.service.ts b/frontend/app/settings/database/database.settings.service.ts new file mode 100644 index 00000000..1af38f90 --- /dev/null +++ b/frontend/app/settings/database/database.settings.service.ts @@ -0,0 +1,23 @@ +import {Injectable} from "@angular/core"; +import {NetworkService} from "../../model/network/network.service"; +import {DataBaseConfig, IPrivateConfig} from "../../../../common/config/private/IPrivateConfig"; + +@Injectable() +export class DatabaseSettingsService { + + + constructor(private _networkService: NetworkService) { + } + + public async getSettings(): Promise { + return (await >this._networkService.getJson("/settings")).Server.database; + } + + public updateSettings(settings): Promise { + return this._networkService.putJson("/settings/database", {databaseSettings: settings}); + } + + public testSettings(settings): Promise { + return this._networkService.postJson("/settings/test/database", {databaseSettings: settings}); + } +} diff --git a/frontend/app/settings/usermanager/usermanager.settings.component.css b/frontend/app/settings/usermanager/usermanager.settings.component.css index e69de29b..8e8a5e56 100644 --- a/frontend/app/settings/usermanager/usermanager.settings.component.css +++ b/frontend/app/settings/usermanager/usermanager.settings.component.css @@ -0,0 +1,3 @@ +.form-control { + margin: 5px 0; +} diff --git a/frontend/app/settings/usermanager/usermanager.settings.component.html b/frontend/app/settings/usermanager/usermanager.settings.component.html index b40d44e7..04cb35c6 100644 --- a/frontend/app/settings/usermanager/usermanager.settings.component.html +++ b/frontend/app/settings/usermanager/usermanager.settings.component.html @@ -1,74 +1,76 @@
-
-

User management

-
-
+
+

User management

+
+
- - - - - - - - - - - - - - -
NameRole
{{user.name}} - - - {{user.role | stringifyRole}} - - -
+ + + + + + + + + + + + + + +
NameRole
{{user.name}} + + + {{user.role | stringifyRole}} + + +
- -
+ +
-