From 671f02f440dc55a02431c1ed23e5dbbe03da0ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Andr=C3=A9?= Date: Wed, 3 Feb 2021 10:57:30 +0100 Subject: [PATCH] Update to have a configuration file out of the app bundle. --- Front/skydivelogs-app/angular.json | 1 + Front/skydivelogs-app/package.json | 2 +- .../skydivelogs-app/src/app/app.component.ts | 5 +-- Front/skydivelogs-app/src/app/app.module.ts | 18 ++++++++--- .../src/config/config.dev.json | 4 +++ .../src/config/config.prod.json | 4 +++ .../src/environments/environment.prod.ts | 3 +- .../src/environments/environment.ts | 5 ++- .../src/interceptor/caching.interceptor.ts | 2 +- .../src/interceptor/jwt-auth.interceptor.ts | 1 + Front/skydivelogs-app/src/main.ts | 2 +- .../src/models/app-settings.ts | 4 +++ .../src/services/aircraft.service.ts | 9 +++--- .../src/services/authentication.service.ts | 5 ++- .../src/services/base.service.ts | 30 ++++++++++++----- .../src/services/configuration-helper.ts | 32 +++++++++++++++++++ .../src/services/service-comm.service.ts | 4 +-- .../src/services/stats.service.ts | 2 +- 18 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 Front/skydivelogs-app/src/config/config.dev.json create mode 100644 Front/skydivelogs-app/src/config/config.prod.json create mode 100644 Front/skydivelogs-app/src/models/app-settings.ts create mode 100644 Front/skydivelogs-app/src/services/configuration-helper.ts diff --git a/Front/skydivelogs-app/angular.json b/Front/skydivelogs-app/angular.json index d7e8174..b276b75 100644 --- a/Front/skydivelogs-app/angular.json +++ b/Front/skydivelogs-app/angular.json @@ -19,6 +19,7 @@ "polyfills": "src/polyfills.ts", "assets": [ "src/assets", + "src/config", "src/favicon.ico" ], "styles": [ diff --git a/Front/skydivelogs-app/package.json b/Front/skydivelogs-app/package.json index 892bcde..a93235b 100644 --- a/Front/skydivelogs-app/package.json +++ b/Front/skydivelogs-app/package.json @@ -5,7 +5,7 @@ "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build --prod=true --build-optimizer --aot=true --extractCss=true --optimization=true --progress=true --sourceMap=false", + "build": "ng build --prod=true --build-optimizer --aot=true --optimization=true --progress=true --sourceMap=false", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" diff --git a/Front/skydivelogs-app/src/app/app.component.ts b/Front/skydivelogs-app/src/app/app.component.ts index 06649b8..d50a6b4 100644 --- a/Front/skydivelogs-app/src/app/app.component.ts +++ b/Front/skydivelogs-app/src/app/app.component.ts @@ -2,10 +2,10 @@ import { Component, OnInit } from "@angular/core"; import { Router } from "@angular/router"; import { User } from "../models/user"; -import { environment } from "../environments/environment"; import { AuthenticationService } from "../services/authentication.service"; import { ServiceComm } from "../services/service-comm.service"; +import { ConfigurationHelper } from "../services/configuration-helper"; @Component({ selector: "app-root", @@ -16,7 +16,7 @@ export class AppComponent implements OnInit { public title = "app"; public showMenu = false; public currentUser: User; - public version: string = environment.version; + public version: string; constructor( private router: Router, @@ -26,6 +26,7 @@ export class AppComponent implements OnInit { this.authenticationService.currentUser.subscribe( x => (this.currentUser = x) ); + //this.version = ConfigurationHelper.settings.version; } ngOnInit() { diff --git a/Front/skydivelogs-app/src/app/app.module.ts b/Front/skydivelogs-app/src/app/app.module.ts index 6e390aa..5f9eca0 100644 --- a/Front/skydivelogs-app/src/app/app.module.ts +++ b/Front/skydivelogs-app/src/app/app.module.ts @@ -1,5 +1,5 @@ import { BrowserModule } from "@angular/platform-browser"; -import { NgModule } from "@angular/core"; +import { APP_INITIALIZER, NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http"; @@ -33,6 +33,7 @@ import { ServiceComm } from "../services/service-comm.service"; import { RequestCache } from "../services/request-cache.service"; import { AuthGuardService } from "../services/auth-guard.service"; import { ImageService } from "../services/image.service"; +import { ConfigurationHelper } from "../services/configuration-helper"; import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; @@ -107,9 +108,14 @@ const appRoutes: Routes = [ { path: "login", component: LoginComponent }, - { path: "**", redirectTo: "" }, + //{ path: "**", redirectTo: "" }, ]; +// Déclaration de la fonction d'initialisation de la configuration +export function initConfig(configService: ConfigurationHelper) { + return () => configService.load(environment.env); +} + @NgModule({ declarations: [ AppComponent, @@ -136,7 +142,6 @@ const appRoutes: Routes = [ RouterModule.forRoot( appRoutes, { enableTracing: !environment.production, relativeLinkResolution: 'legacy' } // <-- debugging purposes only - // <-- debugging purposes only ), ReactiveFormsModule, FormsModule, @@ -172,10 +177,13 @@ const appRoutes: Routes = [ ServiceComm, DateService, RequestCache, - // { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, multi: true } + ConfigurationHelper, + { provide: APP_INITIALIZER, useFactory: initConfig, deps: [ConfigurationHelper], multi: true }, { provide: HTTP_INTERCEPTORS, useClass: JwtAuthInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, + // { provide: HTTP_INTERCEPTORS, useClass: CachingInterceptor, multi: true } ], bootstrap: [AppComponent], }) -export class AppModule {} +export class AppModule { +} diff --git a/Front/skydivelogs-app/src/config/config.dev.json b/Front/skydivelogs-app/src/config/config.dev.json new file mode 100644 index 0000000..a7a9f70 --- /dev/null +++ b/Front/skydivelogs-app/src/config/config.dev.json @@ -0,0 +1,4 @@ +{ + "apiUrl": "http://localhost:5000", + "version": "0.28.0" +} \ No newline at end of file diff --git a/Front/skydivelogs-app/src/config/config.prod.json b/Front/skydivelogs-app/src/config/config.prod.json new file mode 100644 index 0000000..8db6d9b --- /dev/null +++ b/Front/skydivelogs-app/src/config/config.prod.json @@ -0,0 +1,4 @@ +{ + "apiUrl": "https://test-divelog.sebastienandre.com", + "version": "0.28.0" +} \ No newline at end of file diff --git a/Front/skydivelogs-app/src/environments/environment.prod.ts b/Front/skydivelogs-app/src/environments/environment.prod.ts index 916c79c..9f5ea23 100644 --- a/Front/skydivelogs-app/src/environments/environment.prod.ts +++ b/Front/skydivelogs-app/src/environments/environment.prod.ts @@ -1,6 +1,5 @@ export const environment = { production: true, - apiUrl: "https://divelog.sebastienandre.com", debugMode: false, - version: "0.7.0", + env: "prod" }; diff --git a/Front/skydivelogs-app/src/environments/environment.ts b/Front/skydivelogs-app/src/environments/environment.ts index 12f147a..8b0b5c0 100644 --- a/Front/skydivelogs-app/src/environments/environment.ts +++ b/Front/skydivelogs-app/src/environments/environment.ts @@ -5,7 +5,6 @@ export const environment = { production: false, - apiUrl: "http://localhost:5000", - debugMode: false, - version: "0.?.0", + debugMode: true, + env: "dev" }; diff --git a/Front/skydivelogs-app/src/interceptor/caching.interceptor.ts b/Front/skydivelogs-app/src/interceptor/caching.interceptor.ts index ec44a40..e8bd3f8 100644 --- a/Front/skydivelogs-app/src/interceptor/caching.interceptor.ts +++ b/Front/skydivelogs-app/src/interceptor/caching.interceptor.ts @@ -8,7 +8,7 @@ import { } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; -import { startWith, tap } from 'rxjs/operators'; +import { tap } from 'rxjs/operators'; import 'rxjs/add/observable/of'; import { RequestCache } from '../services/request-cache.service'; diff --git a/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts b/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts index b56f6cb..81fc114 100644 --- a/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts +++ b/Front/skydivelogs-app/src/interceptor/jwt-auth.interceptor.ts @@ -11,6 +11,7 @@ import { AuthenticationService } from "../services/authentication.service"; @Injectable() export class JwtAuthInterceptor implements HttpInterceptor { + constructor(private authenticationService: AuthenticationService) {} intercept( diff --git a/Front/skydivelogs-app/src/main.ts b/Front/skydivelogs-app/src/main.ts index bfb11c2..3ecea68 100644 --- a/Front/skydivelogs-app/src/main.ts +++ b/Front/skydivelogs-app/src/main.ts @@ -10,4 +10,4 @@ if (environment.production) { } platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.log(err)); + .catch(err => console.log(err)); diff --git a/Front/skydivelogs-app/src/models/app-settings.ts b/Front/skydivelogs-app/src/models/app-settings.ts new file mode 100644 index 0000000..8f49a87 --- /dev/null +++ b/Front/skydivelogs-app/src/models/app-settings.ts @@ -0,0 +1,4 @@ +export interface IAppSettings { + apiUrl: string; + version: string; +} \ No newline at end of file diff --git a/Front/skydivelogs-app/src/services/aircraft.service.ts b/Front/skydivelogs-app/src/services/aircraft.service.ts index 56e9d9c..7cbe43c 100644 --- a/Front/skydivelogs-app/src/services/aircraft.service.ts +++ b/Front/skydivelogs-app/src/services/aircraft.service.ts @@ -25,10 +25,9 @@ export class AircraftService extends BaseService { imageData: dataImg }; - this.http - .post(`${this.apiUrl}/Aircraft`, bodyNewAircraft, { - headers: this.headers - }) - .subscribe(data => console.log(data)); + this.http.post(`${this.apiUrl}/Aircraft`, + bodyNewAircraft, + { headers: this.headers }) + .subscribe(data => console.log(data)); } } diff --git a/Front/skydivelogs-app/src/services/authentication.service.ts b/Front/skydivelogs-app/src/services/authentication.service.ts index 583d040..1268fa6 100644 --- a/Front/skydivelogs-app/src/services/authentication.service.ts +++ b/Front/skydivelogs-app/src/services/authentication.service.ts @@ -7,9 +7,8 @@ import { map } from "rxjs/operators"; import { User } from "../models/user"; import { BaseService } from "./base.service"; -@Injectable({ - providedIn: "root" -}) + +@Injectable({ providedIn: "root" }) export class AuthenticationService extends BaseService { private currentUserSubject: BehaviorSubject; public currentUser: Observable; diff --git a/Front/skydivelogs-app/src/services/base.service.ts b/Front/skydivelogs-app/src/services/base.service.ts index 5f090ea..09ade61 100644 --- a/Front/skydivelogs-app/src/services/base.service.ts +++ b/Front/skydivelogs-app/src/services/base.service.ts @@ -1,18 +1,32 @@ -import { Injectable } from '@angular/core'; +import { Injector } from '@angular/core'; import { HttpHeaders } from '@angular/common/http'; -import { environment } from '../environments/environment'; +import { ConfigurationHelper } from './configuration-helper'; -@Injectable() export class BaseService { - protected readonly headers: HttpHeaders; - protected readonly apiUrl: string; + protected headers: HttpHeaders; + protected apiUrl: string; constructor() { - this.headers = new HttpHeaders({ - 'Access-Control-Allow-Origin': environment.apiUrl + ConfigurationHelper.settings.subscribe(settings => + { + let tmpApiUrl : string = settings.apiUrl; + + this.headers = new HttpHeaders({ + 'Access-Control-Allow-Origin': tmpApiUrl + }); + this.apiUrl = tmpApiUrl + '/api'; }); - this.apiUrl = environment.apiUrl + '/api'; + // const config: ConfigurationHelper = injector.get(ConfigurationHelper); + // config.load(environment.env) + // .then(() => { + // let tmpApiUrl : string = ConfigurationHelper.settings.apiUrl; + + // this.headers = new HttpHeaders({ + // 'Access-Control-Allow-Origin': tmpApiUrl + // }); + // this.apiUrl = tmpApiUrl + '/api'; + // }); } } diff --git a/Front/skydivelogs-app/src/services/configuration-helper.ts b/Front/skydivelogs-app/src/services/configuration-helper.ts new file mode 100644 index 0000000..3a150f7 --- /dev/null +++ b/Front/skydivelogs-app/src/services/configuration-helper.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +import { BehaviorSubject } from 'rxjs'; + +import { IAppSettings } from '../models/app-settings'; + + +@Injectable({ providedIn: "root" }) +export class ConfigurationHelper { + private static settingsSource = new BehaviorSubject(); + public static settings = ConfigurationHelper.settingsSource.asObservable(); + + constructor(private http: HttpClient) {} + + load(env: string) { + const jsonFile = `/config/config.${env}.json`; + + return new Promise((resolve, reject) => { + this.http.get(jsonFile) + .toPromise() + .then((response : IAppSettings) => { + //ConfigurationHelper.settings = response; + ConfigurationHelper.settingsSource.next(response); + resolve(); + }) + .catch((response: any) => { + reject(`Could not load file '${jsonFile}': ${JSON.stringify(response)}`); + }); + }); + } +} \ No newline at end of file diff --git a/Front/skydivelogs-app/src/services/service-comm.service.ts b/Front/skydivelogs-app/src/services/service-comm.service.ts index 0258039..6a565a9 100644 --- a/Front/skydivelogs-app/src/services/service-comm.service.ts +++ b/Front/skydivelogs-app/src/services/service-comm.service.ts @@ -6,10 +6,10 @@ import { AddAction } from '../models/add-action.enum'; @Injectable() export class ServiceComm { private componentTitleSource = new BehaviorSubject(''); - componentTitle = this.componentTitleSource.asObservable(); + public componentTitle = this.componentTitleSource.asObservable(); private refreshRequestSource = new BehaviorSubject(AddAction.None); - refreshRequest = this.refreshRequestSource.asObservable(); + public refreshRequest = this.refreshRequestSource.asObservable(); constructor() { } diff --git a/Front/skydivelogs-app/src/services/stats.service.ts b/Front/skydivelogs-app/src/services/stats.service.ts index 15e1ff4..4661d78 100644 --- a/Front/skydivelogs-app/src/services/stats.service.ts +++ b/Front/skydivelogs-app/src/services/stats.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import { Injectable, Injector } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators';