From 2435cd88c846ff3395e24ff98327f842624d2a1f Mon Sep 17 00:00:00 2001 From: richard-loafle <44828666+richard-loafle@users.noreply.github.com> Date: Thu, 9 Apr 2020 18:21:56 +0900 Subject: [PATCH] bug fixed --- package-lock.json | 53 ++++++----- package.json | 17 ++-- src/app/app-provider.module.ts | 4 +- src/app/app-routing.module.ts | 9 +- src/app/app.module.ts | 2 + .../components/default.layout.component.ts | 52 ++++++++-- src/app/models/login-session.ts | 1 + .../pages/chat/chat-routing.page.module.ts | 15 +-- src/app/pages/chat/chat.page.module.ts | 7 +- src/app/pages/chat/components/index.ts | 4 - .../components/room-list.page.component.html | 4 +- .../components/room-list.page.component.ts | 5 +- ...on.resolver.ts => app-session.resolver.ts} | 95 +++++++------------ .../services/app-authentication.service.ts | 81 +++++++++++++++- src/app/services/app.service.ts | 41 +++++++- src/app/store/authentication/effects.ts | 23 +++++ src/environments/environment.hmr.ts | 11 ++- src/environments/environment.prod.ts | 9 +- src/environments/environment.ts | 9 +- src/environments/environment.type.ts | 3 + 20 files changed, 305 insertions(+), 140 deletions(-) delete mode 100644 src/app/pages/chat/components/index.ts rename src/app/resolvers/{app-authentication.resolver.ts => app-session.resolver.ts} (60%) diff --git a/package-lock.json b/package-lock.json index 88674e8..2ae3171 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1846,9 +1846,9 @@ "integrity": "sha512-bMHXrXFI2+cKjEwUs7GMSZwM2OZoA/PSavlzAx5NhzvN1Cg7Mz4mspjky++/7eRnYeqRUm7UmdOKAhdRdHprPQ==" }, "@ucap/ng-protocol": { - "version": "0.0.2", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-protocol/-/ng-protocol-0.0.2.tgz", - "integrity": "sha512-fNbmiIrXECeKowvjGflx2lOcOCykH42QKSZzciOeoSxHF8HiFT8ORN5BlR6GOknUCXvGwVPDccNwUs0t1QCnjg==" + "version": "0.0.3", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-protocol/-/ng-protocol-0.0.3.tgz", + "integrity": "sha512-9aGv4bDKfOjDXWD56THW/KPDdAp2ytaWZSFnbw3PMy8bKiyfRQH/UXrj9c9jrf2aNhnSVvYjh1ol4oXNL8EYMg==" }, "@ucap/ng-protocol-authentication": { "version": "0.0.3", @@ -1926,24 +1926,24 @@ "integrity": "sha512-cMfKYv56L7KQ8D9LRxFeE/fY2bl6Vw1WwH8FQKjI6ntD+pr7LgVQZzMMDjN0xfMW0rCS+MhmTU+WAcHgkLlqRA==" }, "@ucap/ng-store-authentication": { - "version": "0.0.7", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-authentication/-/ng-store-authentication-0.0.7.tgz", - "integrity": "sha512-6IxxjFYpmN3xC2zIix9BfXbHHKpZeeS09SlT7RujMGt58CPyLnWkCFa/a4NILYQpUaXwQn+CmB1o8nhaZvwMNw==" + "version": "0.0.10", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-authentication/-/ng-store-authentication-0.0.10.tgz", + "integrity": "sha512-eGdxf9VXmwLlhwpMndnAQUaKV/JaMmtxebSN+kiez8czQiqVKFXSjdVyA92/3AscMf5GvdwKMMh553IT7EhpqA==" }, "@ucap/ng-store-chat": { - "version": "0.0.4", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-chat/-/ng-store-chat-0.0.4.tgz", - "integrity": "sha512-rSZirwFUMv9zXllqBWpdSUbUuRz9j1O8BVIfselp9sZHdKl7Xcx9irqNnHHkF2bJpxeWzugGrgG02tdt/xrIuQ==" + "version": "0.0.5", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-chat/-/ng-store-chat-0.0.5.tgz", + "integrity": "sha512-FlvWI52w58jq/ZO8b8sk/MonY+TYKiEYlkyIfZWfFYOxlnKG0MkbpL0R+tiOFO9GLbBGEsXrzYtaDazrLk55ZQ==" }, "@ucap/ng-store-group": { - "version": "0.0.5", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-group/-/ng-store-group-0.0.5.tgz", - "integrity": "sha512-NNqnSiyQWbBIWLjXsBBxkdCHlRkMPRF8+IXq7scUgG7aNlUA0SGuntUbghRPxAJLQNuMe/csQziOlqHn98sJfw==" + "version": "0.0.6", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-group/-/ng-store-group-0.0.6.tgz", + "integrity": "sha512-WShenZp/RP+cgiswvM12HPWOeSFuhNYkCUY6fxEAg58unxUZhBskVhefSq+OgD3dX/OaAPo2eQkwvXVANnyiZw==" }, "@ucap/ng-store-organization": { - "version": "0.0.3", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-organization/-/ng-store-organization-0.0.3.tgz", - "integrity": "sha512-qakDmEzWloikSk/Sczs2i/dL54ZAIEqkjx2x4jcn0dMKkCF2KseCphNXTfaLpAcMuGVR5ZAy2bQjy90NbbHeOg==" + "version": "0.0.4", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-store-organization/-/ng-store-organization-0.0.4.tgz", + "integrity": "sha512-gVGOTfGmp58U0nHEn0UkjMc9AWQEmopNXDbyIrltMwR5XCKweC9AWXAiQzDxCb3sN07cSozEseFBJzJ7XO+dwg==" }, "@ucap/ng-ui": { "version": "0.0.3", @@ -1965,6 +1965,11 @@ "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-ui-skin-default/-/ng-ui-skin-default-0.0.1.tgz", "integrity": "sha512-vtgJBOsJj/S2GjP02PpBz9ebGikNtzdsC7JQc5HKkCZRC6JKkzZmWzcaFGlLPsh9dcWEeZuNhwnAZfmPXgz6Aw==" }, + "@ucap/ng-web-socket": { + "version": "0.0.2", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-web-socket/-/ng-web-socket-0.0.2.tgz", + "integrity": "sha512-hMn8niCiRfR3ZUzE0oqspJGlGl0DKvLizkVMphF+JenqwARQcBYR+G7e+4HPEGyRbu0LtimkhMfExzJFTHky3A==" + }, "@ucap/ng-web-storage": { "version": "0.0.3", "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-web-storage/-/ng-web-storage-0.0.3.tgz", @@ -1976,9 +1981,9 @@ "integrity": "sha512-nWev387pHxeBHtOu0EvRTVQ0/JeJL44Ew0PzQaiqHsC5mghkJ6ok7z22nk9nmuZ7lONxGJmW7CHT8X8lyviZJg==" }, "@ucap/protocol": { - "version": "0.0.8", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol/-/protocol-0.0.8.tgz", - "integrity": "sha512-cLFryVjd3VLAEJScJiZ2Dm+Uuo5uqX0BHE9ZIdu99BSoDMyODOuBxPFBXAWaxiqX0H5jJHAU3m6leGVv1P2alg==" + "version": "0.0.11", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol/-/protocol-0.0.11.tgz", + "integrity": "sha512-nmwejglPVtC7elUn8x05ENFyqFz0z2pFibpblqAUW3m8HQHBSIKLqfctVsHzk5iP9/JyCDCTDuJ2DjMhMVJB8g==" }, "@ucap/protocol-authentication": { "version": "0.0.5", @@ -2026,9 +2031,9 @@ "integrity": "sha512-w6jLCCVew66WrDbN/SkC3ND1Rj7u22wkbDCQxuW87hJt/PdfGPu4fnep6OL8GCo4CtLCgUEt7iOWNAxMv8ipUg==" }, "@ucap/protocol-query": { - "version": "0.0.4", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-query/-/protocol-query-0.0.4.tgz", - "integrity": "sha512-cRMZgrOfKFPJKz+bPTxYOAhTQfgYvAjGvAXgcK8FzQ51R3jwmVTXsHi8FBBfqOeI2bDw1/KkPBfhChHRF2h+kg==" + "version": "0.0.5", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-query/-/protocol-query-0.0.5.tgz", + "integrity": "sha512-z8NGdXxw1C3FplynHbglO3Vk9vEIimu9pYWxXNtT9pEErcei4fyosV9DO+7UMPmBfXa47WlyKjLQlKQuPjcyMg==" }, "@ucap/protocol-room": { "version": "0.0.5", @@ -2056,9 +2061,9 @@ "integrity": "sha512-PVrQJC5g+eywOPQ8BATnlr3UDLXW7HDZpNuBCablvtEcylIIIbP0czsZsEWGuLCJqSQ9pZy/sEQDbGiM7yTpmQ==" }, "@ucap/web-socket": { - "version": "0.0.2", - "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/web-socket/-/web-socket-0.0.2.tgz", - "integrity": "sha512-hKAEsIzMhUuR8u26ENkuIAh4Xp8ltzBlZggxhqtLifP8KbgQdWD3w3+1M1697MPni8q42+Q/ZH/1IHLdi8KB7w==" + "version": "0.0.5", + "resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/web-socket/-/web-socket-0.0.5.tgz", + "integrity": "sha512-BsdH5llLxlFGPjER3rvSLaNKtdQyXhhVyAbPStYJPstBNfcyq0Al8/C97aXFWlpLrmvib+s3AT7o1OmPhv8ZWw==" }, "@ucap/web-storage": { "version": "0.0.5", diff --git a/package.json b/package.json index 723b1fb..11e8ceb 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@ucap/ng-native": "~0.0.1", "@ucap/ng-native-browser": "~0.0.1", "@ucap/ng-pi": "~0.0.1", - "@ucap/ng-protocol": "~0.0.2", + "@ucap/ng-protocol": "~0.0.3", "@ucap/ng-protocol-authentication": "~0.0.3", "@ucap/ng-protocol-buddy": "~0.0.3", "@ucap/ng-protocol-event": "~0.0.3", @@ -68,17 +68,18 @@ "@ucap/ng-protocol-status": "~0.0.3", "@ucap/ng-protocol-sync": "~0.0.3", "@ucap/ng-protocol-umg": "~0.0.3", - "@ucap/ng-store-authentication": "~0.0.7", - "@ucap/ng-store-chat": "~0.0.4", - "@ucap/ng-store-group": "~0.0.5", - "@ucap/ng-store-organization": "~0.0.3", + "@ucap/ng-store-authentication": "~0.0.10", + "@ucap/ng-store-chat": "~0.0.5", + "@ucap/ng-store-group": "~0.0.6", + "@ucap/ng-store-organization": "~0.0.4", + "@ucap/ng-web-socket": "~0.0.2", "@ucap/ng-web-storage": "~0.0.3", "@ucap/ng-ui": "~0.0.3", "@ucap/ng-ui-organization": "~0.0.2", "@ucap/ng-ui-authentication": "~0.0.15", "@ucap/ng-ui-skin-default": "~0.0.1", "@ucap/pi": "~0.0.5", - "@ucap/protocol": "~0.0.8", + "@ucap/protocol": "~0.0.11", "@ucap/protocol-authentication": "~0.0.5", "@ucap/protocol-buddy": "~0.0.5", "@ucap/protocol-event": "~0.0.5", @@ -88,13 +89,13 @@ "@ucap/protocol-inner": "~0.0.4", "@ucap/protocol-option": "~0.0.7", "@ucap/protocol-ping": "~0.0.4", - "@ucap/protocol-query": "~0.0.4", + "@ucap/protocol-query": "~0.0.5", "@ucap/protocol-room": "~0.0.5", "@ucap/protocol-service": "~0.0.4", "@ucap/protocol-status": "~0.0.5", "@ucap/protocol-sync": "~0.0.4", "@ucap/protocol-umg": "~0.0.5", - "@ucap/web-socket": "~0.0.2", + "@ucap/web-socket": "~0.0.5", "@ucap/web-storage": "~0.0.5", "autolinker": "^3.13.0", "axios": "^0.19.2", diff --git a/src/app/app-provider.module.ts b/src/app/app-provider.module.ts index 3bb57fb..4c80ea4 100644 --- a/src/app/app-provider.module.ts +++ b/src/app/app-provider.module.ts @@ -9,14 +9,14 @@ import { environment } from '@environments'; import { AppAuthenticationGuard } from './guards/app-authentication.guard'; -import { AppAuthenticationResolver } from './resolvers/app-authentication.resolver'; +import { AppSessionResolver } from './resolvers/app-session.resolver'; import { AppAuthenticationService } from './services/app-authentication.service'; import { AppNativeService } from './services/app-native.service'; import { AppService } from './services/app.service'; const GUARDS = [AppAuthenticationGuard]; -const RESOLVERS = [AppAuthenticationResolver]; +const RESOLVERS = [AppSessionResolver]; const SERVICES = [AppService, AppAuthenticationService, AppNativeService]; const axiosFactory = () => { diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 52e8597..e665806 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -5,13 +5,13 @@ import { DefaultLayoutComponent } from '@app/layouts/components/default.layout.c import { NoNaviLayoutComponent } from '@app/layouts/components/no-navi.layout.component'; import { AppAuthenticationGuard } from '@app/guards/app-authentication.guard'; -import { AppAuthenticationResolver } from './resolvers/app-authentication.resolver'; +import { AppSessionResolver } from './resolvers/app-session.resolver'; export function appMatcher(url: UrlSegment[]) { if (1 === url.length) { if ( - ['organization', 'group', 'chat', 'message'].some( - (p) => p === url[0].path + ['organization', 'group', 'chat', 'message'].some((p) => + url[0].path.startsWith(p) ) ) { return { consumed: url }; @@ -21,6 +21,7 @@ export function appMatcher(url: UrlSegment[]) { } const routes: Routes = [ + { path: '', redirectTo: '/organization', pathMatch: 'full' }, { path: 'account', component: NoNaviLayoutComponent, @@ -42,7 +43,7 @@ const routes: Routes = [ component: DefaultLayoutComponent, canActivate: [AppAuthenticationGuard], resolve: { - authentication: AppAuthenticationResolver + session: AppSessionResolver } }, // { diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5eb0b50..6475b7e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -35,6 +35,7 @@ import { StatusProtocolModule } from '@ucap/ng-protocol-status'; import { SyncProtocolModule } from '@ucap/ng-protocol-sync'; import { UmgProtocolModule } from '@ucap/ng-protocol-umg'; +import { WebSocketModule } from '@ucap/ng-web-socket'; import { WebStorageModule } from '@ucap/ng-web-storage'; import { I18nModule } from '@ucap/ng-i18n'; @@ -91,6 +92,7 @@ import { environment } from '@environments'; SyncProtocolModule.forRoot({}), UmgProtocolModule.forRoot({}), + WebSocketModule.forRoot(environment.webSocketModuleConfig), WebStorageModule.forRoot({}), I18nModule.forRoot({}), diff --git a/src/app/layouts/components/default.layout.component.ts b/src/app/layouts/components/default.layout.component.ts index 69241e4..9e5e8df 100644 --- a/src/app/layouts/components/default.layout.component.ts +++ b/src/app/layouts/components/default.layout.component.ts @@ -1,13 +1,16 @@ +import { Subscription } from 'rxjs'; + import { Component, ViewChild, OnDestroy, OnInit, Type } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, ActivatedRoute } from '@angular/router'; import { MatTabChangeEvent } from '@angular/material/tabs'; import { MatSidenav } from '@angular/material/sidenav'; import { Store, select } from '@ngrx/store'; +import { LogService } from '@ucap/ng-logger'; + import { AppSelector } from '@app/store/state'; -import { Subscription } from 'rxjs'; @Component({ selector: 'app-layouts-default', @@ -22,8 +25,18 @@ export class DefaultLayoutComponent implements OnInit, OnDestroy { contentSectionComponent: Type; private windowSizeSubscription: Subscription; + private routerEventSubscription: Subscription; - constructor(private router: Router, private store: Store) {} + constructor( + private router: Router, + private activatedRoute: ActivatedRoute, + private store: Store, + private logService: LogService + ) { + this.routerEventSubscription = this.router.events.subscribe((event) => { + this.logService.debug('DefaultLayoutComponent', event); + }); + } ngOnInit(): void { this.windowSizeSubscription = this.store @@ -45,14 +58,32 @@ export class DefaultLayoutComponent implements OnInit, OnDestroy { if (!this.windowSizeSubscription) { this.windowSizeSubscription.unsubscribe(); } + if (!!this.routerEventSubscription) { + this.routerEventSubscription.unsubscribe(); + } } onSelectedTabChange(event: MatTabChangeEvent) { switch (event.index) { case 1: - // this.router.navigate(['/chat']); + this.router.navigate(['/chat']); break; case 2: + this.router.navigate(['/organization']); + break; + case 3: + this.router.navigate(['/message']); + break; + default: + this.router.navigate(['/group']); + break; + } + } + + onRoute(url: string) { + this.logService.debug('onRoute', url); + switch (url) { + case '/organization': import('@app/sections/organization/organization.section.module').then( (m) => { this.leftSectionComponent = m.TreeListSectionComponent; @@ -64,11 +95,18 @@ export class DefaultLayoutComponent implements OnInit, OnDestroy { } ); break; - case 3: - // this.router.navigate(['/message']); + case '/group': break; + case '/chat': + import('@app/pages/chat/chat.page.module').then((m) => { + this.leftSectionComponent = m.RoomListPageComponent; + this.contentSectionComponent = m.IndexPageComponent; + }); + break; + case '/message': + break; + default: - // this.router.navigate(['/group']); break; } } diff --git a/src/app/models/login-session.ts b/src/app/models/login-session.ts index b5f860c..edc64fb 100644 --- a/src/app/models/login-session.ts +++ b/src/app/models/login-session.ts @@ -4,4 +4,5 @@ export interface LoginSession extends UCAPLoginSession { loginPw?: string; initPw?: boolean; encData?: string; + alive?: boolean; } diff --git a/src/app/pages/chat/chat-routing.page.module.ts b/src/app/pages/chat/chat-routing.page.module.ts index 3c1663f..7e66b90 100644 --- a/src/app/pages/chat/chat-routing.page.module.ts +++ b/src/app/pages/chat/chat-routing.page.module.ts @@ -1,20 +1,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; -import { IndexPageComponent } from './components/index.page.component'; -import { RoomListPageComponent } from './components/room-list.page.component'; - -const routes: Routes = [ - { - path: 'index', - component: IndexPageComponent - }, - { - path: 'room-list', - component: RoomListPageComponent, - outlet: 'outlet-content' - } -]; +const routes: Routes = []; @NgModule({ imports: [RouterModule.forChild(routes)], diff --git a/src/app/pages/chat/chat.page.module.ts b/src/app/pages/chat/chat.page.module.ts index 914c1b3..2d53e8f 100644 --- a/src/app/pages/chat/chat.page.module.ts +++ b/src/app/pages/chat/chat.page.module.ts @@ -5,7 +5,12 @@ import { FlexLayoutModule } from '@angular/flex-layout'; import { AppChatRoutingPageModule } from './chat-routing.page.module'; -import { COMPONENTS } from './components'; +import { IndexPageComponent } from './components/index.page.component'; +import { RoomListPageComponent } from './components/room-list.page.component'; + +export const COMPONENTS = [IndexPageComponent, RoomListPageComponent]; + +export { IndexPageComponent, RoomListPageComponent }; @NgModule({ imports: [CommonModule, FlexLayoutModule, AppChatRoutingPageModule], diff --git a/src/app/pages/chat/components/index.ts b/src/app/pages/chat/components/index.ts deleted file mode 100644 index 235ca39..0000000 --- a/src/app/pages/chat/components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { IndexPageComponent } from './index.page.component'; -import { RoomListPageComponent } from './room-list.page.component'; - -export const COMPONENTS = [IndexPageComponent, RoomListPageComponent]; diff --git a/src/app/pages/chat/components/room-list.page.component.html b/src/app/pages/chat/components/room-list.page.component.html index 95f3bf9..438df1d 100644 --- a/src/app/pages/chat/components/room-list.page.component.html +++ b/src/app/pages/chat/components/room-list.page.component.html @@ -1 +1,3 @@ -Room list page of chat is works! +
+ Room list page of chat is works! +
diff --git a/src/app/pages/chat/components/room-list.page.component.ts b/src/app/pages/chat/components/room-list.page.component.ts index 7fc118f..7155de7 100644 --- a/src/app/pages/chat/components/room-list.page.component.ts +++ b/src/app/pages/chat/components/room-list.page.component.ts @@ -1,4 +1,5 @@ import { Component } from '@angular/core'; +import { Router } from '@angular/router'; @Component({ selector: 'app-pages-chat-room-list', @@ -6,5 +7,7 @@ import { Component } from '@angular/core'; styleUrls: ['./room-list.page.component.scss'] }) export class RoomListPageComponent { - constructor() {} + constructor(private router: Router) { + console.log('RoomListPageComponent', this.router.url, this.router); + } } diff --git a/src/app/resolvers/app-authentication.resolver.ts b/src/app/resolvers/app-session.resolver.ts similarity index 60% rename from src/app/resolvers/app-authentication.resolver.ts rename to src/app/resolvers/app-session.resolver.ts index 3e3b15c..2fbcc5d 100644 --- a/src/app/resolvers/app-authentication.resolver.ts +++ b/src/app/resolvers/app-session.resolver.ts @@ -1,5 +1,5 @@ -import { Observable, forkJoin } from 'rxjs'; -import { take, concatMap } from 'rxjs/operators'; +import { Observable, forkJoin, Subject } from 'rxjs'; +import { take, filter, map, takeUntil } from 'rxjs/operators'; import { Injectable, Inject } from '@angular/core'; import { @@ -12,9 +12,9 @@ import { Store } from '@ngrx/store'; import { StatusCode } from '@ucap/api'; import { NativeService } from '@ucap/native'; -import { SSOMode } from '@ucap/protocol-authentication'; import { LogService } from '@ucap/ng-logger'; +import { SessionStorageService } from '@ucap/ng-web-storage'; import { UCAP_NATIVE_SERVICE } from '@ucap/ng-native'; import { PublicApiService } from '@ucap/ng-api-public'; import { ExternalApiService } from '@ucap/ng-api-external'; @@ -23,25 +23,22 @@ import { InnerProtocolService } from '@ucap/ng-protocol-inner'; import { AuthenticationProtocolService } from '@ucap/ng-protocol-authentication'; import { CompanyActions } from '@ucap/ng-store-organization'; -import { - ConfigurationActions, - LoginActions -} from '@ucap/ng-store-authentication'; +import { ConfigurationActions } from '@ucap/ng-store-authentication'; import { AppAuthenticationService } from '@app/services/app-authentication.service'; +import { AppKey } from '@app/types/app-key.type'; +import { LoginSession } from '@app/models/login-session'; @Injectable() -export class AppAuthenticationResolver implements Resolve { +export class AppSessionResolver implements Resolve { constructor( private publicApiService: PublicApiService, private externalApiService: ExternalApiService, private protocolService: ProtocolService, - private innerProtocolService: InnerProtocolService, - private authenticationProtocolService: AuthenticationProtocolService, private store: Store, + private sessionStorageService: SessionStorageService, private appAuthenticationService: AppAuthenticationService, - private logService: LogService, - @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService + private logService: LogService ) {} resolve( @@ -51,15 +48,11 @@ export class AppAuthenticationResolver implements Resolve { return new Promise(async (resolve, reject) => { try { const loginSession = this.appAuthenticationService.getLoginSession(); - const networkInfo = await this.nativeService.getNetworkInfo(); - const localIp = - !!networkInfo && 0 < networkInfo.length && !!networkInfo[0].ip - ? networkInfo[0].ip - : ''; - const localMac = - !!networkInfo && 0 < networkInfo.length && !!networkInfo[0].mac - ? networkInfo[0].mac - : ''; + + if (loginSession.alive) { + resolve(); + return; + } this.store.dispatch( CompanyActions.companies({ @@ -128,46 +121,28 @@ export class AppAuthenticationResolver implements Resolve { this.protocolService .connect(versionInfo2Res.serverIp) - .pipe( - take(1), - concatMap(() => { - return this.innerProtocolService.conn({}).pipe( - take(1), - concatMap((connRes) => { - return this.authenticationProtocolService - .login({ - loginId: loginSession.loginId, - loginPw: loginSession.loginPw, - deviceType: loginSession.deviceType, - deviceId: ' ', - token: '', - localeCode: loginSession.localeCode, - pushId: ' ', - companyCode: loginSession.companyCode, - passwordEncodingType: 1, - clientVersion: '', - reconnect: false, - ip: localIp, - hostName: localMac, - ssoMode: SSOMode.AUTH, - userSpecificInformation: 'PRO_000482', - andId: '', - andPushRefreshYn: '' - }) - .pipe(take(1)); - }) - ); - }) - ) + .pipe(take(1)) .subscribe( - (loginRes) => { - this.store.dispatch( - LoginActions.loginSuccess({ - res: loginRes, - loginSession - }) - ); - resolve(); + () => { + const destroy$ = new Subject(); + this.sessionStorageService.changed$ + .pipe( + takeUntil(destroy$), + filter((param) => AppKey.LoginSession === param.key), + map((param) => param.value) + ) + .subscribe( + (v) => { + if ((v as LoginSession).alive) { + destroy$.next(true); + destroy$.unsubscribe(); + resolve(); + } + }, + (error) => { + reject(error); + } + ); }, (error) => { reject(error); diff --git a/src/app/services/app-authentication.service.ts b/src/app/services/app-authentication.service.ts index 5cf365c..8b97460 100644 --- a/src/app/services/app-authentication.service.ts +++ b/src/app/services/app-authentication.service.ts @@ -1,16 +1,21 @@ +import { Observable } from 'rxjs'; + import { Injectable, Inject } from '@angular/core'; import { LocaleCode } from '@ucap/core'; import { PasswordUtil } from '@ucap/pi'; +import { LoginResponse, SSOMode } from '@ucap/protocol-authentication'; +import { NativeService } from '@ucap/native'; import { SessionStorageService, LocalStorageService } from '@ucap/ng-web-storage'; -import { NativeService } from '@ucap/native'; - import { UCAP_NATIVE_SERVICE } from '@ucap/ng-native'; +import { InnerProtocolService } from '@ucap/ng-protocol-inner'; +import { AuthenticationProtocolService } from '@ucap/ng-protocol-authentication'; +import { LoginActions } from '@ucap/ng-store-authentication'; import { LoginSession } from '@app/models/login-session'; import { UserStore } from '@app/models/user-store'; @@ -18,14 +23,19 @@ import { UserStore } from '@app/models/user-store'; import { AppKey } from '@app/types/app-key.type'; import { environment } from '@environments'; +import { take, concatMap } from 'rxjs/operators'; +import { Store } from '@ngrx/store'; @Injectable({ providedIn: 'root' }) export class AppAuthenticationService { constructor( + private innerProtocolService: InnerProtocolService, + private authenticationProtocolService: AuthenticationProtocolService, private sessionStorageService: SessionStorageService, private localStorageService: LocalStorageService, + private store: Store, @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService ) {} @@ -147,6 +157,73 @@ export class AppAuthenticationService { this.sessionStorageService.remove(AppKey.LogoutSession); } + createSession(): Promise<{ + loginRes: LoginResponse; + loginSession: LoginSession; + }> { + return new Promise<{ + loginRes: LoginResponse; + loginSession: LoginSession; + }>(async (resolve, reject) => { + const loginSession = this.getLoginSession(); + const networkInfo = await this.nativeService.getNetworkInfo(); + const localIp = + !!networkInfo && 0 < networkInfo.length && !!networkInfo[0].ip + ? networkInfo[0].ip + : ''; + const localMac = + !!networkInfo && 0 < networkInfo.length && !!networkInfo[0].mac + ? networkInfo[0].mac + : ''; + + this.innerProtocolService + .conn({}) + .pipe( + take(1), + concatMap((connRes) => { + return this.authenticationProtocolService + .login({ + loginId: loginSession.loginId, + loginPw: loginSession.loginPw, + deviceType: loginSession.deviceType, + deviceId: ' ', + token: '', + localeCode: loginSession.localeCode, + pushId: ' ', + companyCode: loginSession.companyCode, + passwordEncodingType: 1, + clientVersion: '', + reconnect: false, + ip: localIp, + hostName: localMac, + ssoMode: SSOMode.AUTH, + userSpecificInformation: 'PRO_000482', + andId: '', + andPushRefreshYn: '' + }) + .pipe(take(1)); + }) + ) + .subscribe( + (loginRes) => { + this.store.dispatch( + LoginActions.loginSuccess({ + res: loginRes, + loginSession + }) + ); + resolve({ + loginSession, + loginRes + }); + }, + (error) => { + reject(error); + } + ); + }); + } + logout() { this.sessionStorageService.remove(AppKey.LoginResponse); this.sessionStorageService.remove(AppKey.VerInfoResponse); diff --git a/src/app/services/app.service.ts b/src/app/services/app.service.ts index ca4cecc..89f4fd1 100644 --- a/src/app/services/app.service.ts +++ b/src/app/services/app.service.ts @@ -1,5 +1,7 @@ import { Injectable, Inject } from '@angular/core'; +import { Store } from '@ngrx/store'; + import { DeviceType, DesktopType } from '@ucap/core'; import { NativeService, NativeType, OsType } from '@ucap/native'; @@ -10,7 +12,10 @@ import { SessionStorageService } from '@ucap/ng-web-storage'; import { PingProtocolService } from '@ucap/ng-protocol-ping'; import { DateService } from '@ucap/ng-ui'; import { TranslateService } from '@ucap/ng-ui-organization'; +import { ProtocolService } from '@ucap/ng-protocol'; +import { LoginActions } from '@ucap/ng-store-authentication'; +import { AppActions } from '@app/store/actions'; import { environment } from '@environments'; import { AppAuthenticationService } from './app-authentication.service'; @@ -23,9 +28,11 @@ export class AppService { private i18nService: I18nService, private translateService: TranslateService, private dateService: DateService, + private protocolService: ProtocolService, private pingProtocolService: PingProtocolService, private appAuthenticationService: AppAuthenticationService, private logService: LogService, + private store: Store, @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService ) {} @@ -68,7 +75,8 @@ export class AppService { ...loginSession, deviceType, desktopType, - companyGroupCode: this.companyGroupCode + companyGroupCode: this.companyGroupCode, + alive: false }); this.dateService.setDefaultTimezone('Asia/Seoul'); @@ -138,6 +146,35 @@ export class AppService { } }); - return Promise.all([initSession, initI18n, initOrganization]); + const initProtocol = new Promise(async (resolve, reject) => { + try { + this.protocolService.connection$.subscribe((connected) => { + if (connected) { + this.appAuthenticationService + .createSession() + .then((result) => { + this.store.dispatch( + LoginActions.sessionCreated({ + res: result.loginRes, + loginSession: result.loginSession + }) + ); + }) + .catch((reason) => { + this.logService.error('createSession failed', reason); + }); + } else { + this.store.dispatch( + LoginActions.sessionDestroyed({ error: 'disconnected' }) + ); + } + }); + resolve(); + } catch (error) { + reject(error); + } + }); + + return Promise.all([initSession, initI18n, initOrganization, initProtocol]); } } diff --git a/src/app/store/authentication/effects.ts b/src/app/store/authentication/effects.ts index 3adffff..9d1f238 100644 --- a/src/app/store/authentication/effects.ts +++ b/src/app/store/authentication/effects.ts @@ -18,6 +18,7 @@ import { LoginActions } from '@ucap/ng-store-authentication'; import { AppKey } from '@app/types/app-key.type'; import { AppAuthenticationService } from '@app/services/app-authentication.service'; +import { AppActions } from '@app/store/actions'; import { environment } from '@environments'; @@ -119,6 +120,28 @@ export class Effects { { dispatch: false } ); + sessionCreated$ = createEffect( + () => + this.actions$.pipe( + ofType(LoginActions.sessionCreated), + tap((params) => { + this.appAuthenticationService.setLoginSession({ alive: true }); + }) + ), + { dispatch: false } + ); + + sessionDestroyed$ = createEffect( + () => + this.actions$.pipe( + ofType(LoginActions.sessionDestroyed), + tap((params) => { + this.appAuthenticationService.setLoginSession({ alive: false }); + }) + ), + { dispatch: false } + ); + constructor( private actions$: Actions, private sessionStorageService: SessionStorageService, diff --git a/src/environments/environment.hmr.ts b/src/environments/environment.hmr.ts index 3416575..c1591cc 100644 --- a/src/environments/environment.hmr.ts +++ b/src/environments/environment.hmr.ts @@ -154,6 +154,12 @@ export const environment: Environment = { urls: piUrls }, + webSocketModuleConfig: { + reconnect: { + delay: 1000 * 3 + } + }, + protocolModuleConfig: { hostConfig: { protocol: 'ws', @@ -161,9 +167,6 @@ export const environment: Environment = { port: 8080 }, urls: protocolUrls, - reconnect: { - delay: 1000 - }, requestId: { min: 1, max: 59999 @@ -175,6 +178,6 @@ export const environment: Environment = { }, pingProtocolModuleConfig: { statusCode: 'O', - interval: 5 * 60 + interval: 5 } }; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 556016e..2956d7b 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -154,6 +154,12 @@ export const environment: Environment = { urls: piUrls }, + webSocketModuleConfig: { + reconnect: { + delay: 1000 * 3 + } + }, + protocolModuleConfig: { hostConfig: { protocol: 'ws', @@ -161,9 +167,6 @@ export const environment: Environment = { port: 8080 }, urls: protocolUrls, - reconnect: { - delay: 1000 - }, requestId: { min: 1, max: 59999 diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 04e9169..b6b2042 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -157,6 +157,12 @@ export const environment: Environment = { urls: piUrls }, + webSocketModuleConfig: { + reconnect: { + delay: 1000 * 3 + } + }, + protocolModuleConfig: { hostConfig: { protocol: 'ws', @@ -164,9 +170,6 @@ export const environment: Environment = { port: 8080 }, urls: protocolUrls, - reconnect: { - delay: 1000 - }, requestId: { min: 1, max: 59999 diff --git a/src/environments/environment.type.ts b/src/environments/environment.type.ts index 9b5dbac..99393f7 100644 --- a/src/environments/environment.type.ts +++ b/src/environments/environment.type.ts @@ -2,6 +2,8 @@ import { Type } from '@angular/core'; import { DeviceType, DesktopType } from '@ucap/core'; +import { ModuleConfig as WebSocketModuleConfig } from '@ucap/web-socket'; + import { ModuleConfig as CommonApiModuleConfig, Urls as CommonApiUrls @@ -114,6 +116,7 @@ export interface Environment { messageApiModuleConfig: MessageApiModuleConfig; promptApiModuleConfig: PromptApiModuleConfig; piModuleConfig: PiModuleConfig; + webSocketModuleConfig: WebSocketModuleConfig; protocolModuleConfig: ProtocolModuleConfig; pingProtocolModuleConfig: PingProtocolModuleConfig; }