import { Injectable, Inject } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { Observable, throwError, forkJoin, of } from 'rxjs'; import { map, tap, catchError, take, switchMap, withLatestFrom } from 'rxjs/operators'; import { Store, select } from '@ngrx/store'; import { ProtocolService, ServerErrorCode } from '@ucap-webmessenger/protocol'; import { SessionStorageService, LocalStorageService } from '@ucap-webmessenger/web-storage'; import { PublicApiService, VersionInfo2Response } from '@ucap-webmessenger/api-public'; import { LoginInfo, KEY_LOGIN_INFO, EnvironmentsInfo, KEY_ENVIRONMENTS_INFO, KEY_URL_INFO, KEY_AUTH_INFO } from '@app/types'; import { InnerProtocolService } from '@ucap-webmessenger/protocol-inner'; import { AuthenticationProtocolService, SSOMode, LoginResponse } from '@ucap-webmessenger/protocol-authentication'; import * as AuthenticationStore from '@app/store/account/authentication'; import { NGXLogger } from 'ngx-logger'; import { QueryProtocolService, AuthResponse } from '@ucap-webmessenger/protocol-query'; import { OptionProtocolService } from '@ucap-webmessenger/protocol-option'; import { TranslateService as UCapTranslateService } from '@ucap-webmessenger/ui'; import * as AppStore from '@app/store'; import * as CompanyStore from '@app/store/setting/company'; import * as VersionInfoStore from '@app/store/setting/version-info'; import * as OptionStore from '@app/store/messenger/option'; import * as QueryStore from '@app/store/messenger/query'; import * as SyncStore from '@app/store/messenger/sync'; import * as StatusStore from '@app/store/messenger/status'; import { KEY_LOGIN_RES_INFO, KEY_VER_INFO } from '@app/types'; import { environment } from '../../environments/environment'; import { SnackBarService } from '@ucap-webmessenger/ui'; import { AppNativeService } from '@app/services/native.service'; import { ExternalApiService, UrlInfoResponse, DaesangUrlInfoResponse } from '@ucap-webmessenger/api-external'; import { StatusCode } from '@ucap-webmessenger/api'; import { UCAP_NATIVE_SERVICE, NativeService } from '@ucap-webmessenger/native'; import { AppUserInfo, KEY_APP_USER_INFO } from '@app/types/app-user-info.type'; @Injectable() export class AppMessengerResolver implements Resolve { constructor( @Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService, private store: Store, private sessionStorageService: SessionStorageService, private localStorageService: LocalStorageService, private publicApiService: PublicApiService, private externalApiService: ExternalApiService, private protocolService: ProtocolService, private queryProtocolService: QueryProtocolService, private optionProtocolService: OptionProtocolService, private authenticationProtocolService: AuthenticationProtocolService, private innerProtocolService: InnerProtocolService, private appNativeService: AppNativeService, private snackBarService: SnackBarService, private logger: NGXLogger ) {} resolve( activatedRouteSnapshot: ActivatedRouteSnapshot, routerStateSnapshot: RouterStateSnapshot ): void | Observable | Promise { return new Promise(async (resolve, reject) => { let loginRes: LoginResponse; const loginInfo = this.sessionStorageService.get( KEY_LOGIN_INFO ); const environmentsInfo = this.sessionStorageService.get( KEY_ENVIRONMENTS_INFO ); let localIp = ''; let localMac = ''; // get network info await this.nativeService .getNetworkInfo() .then(result => { if (!!result && result.length > 0) { if (!!result[0].ip) { localIp = result[0].ip; } if (!!result[0].mac) { localMac = result[0].mac; } } }) .catch(reason => {}); this.publicApiService .versionInfo2({ deviceType: environmentsInfo.deviceType, companyGroupType: loginInfo.companyGroupType, companyCode: loginInfo.companyCode, loginId: loginInfo.loginId }) .pipe( take(1), tap(res => { this.sessionStorageService.set( KEY_VER_INFO, res ); this.store.dispatch(VersionInfoStore.versionInfo2Success({ res })); }), switchMap(res => { return this.protocolService.connect(res.serverIp); }), switchMap(() => { return this.externalApiService .urlInfoDaesang({ deviceType: environmentsInfo.deviceType, loginId: loginInfo.loginId }) .pipe( map(response => { if (response.statusCode === StatusCode.Success) { this.sessionStorageService.set< UrlInfoResponse | DaesangUrlInfoResponse >(KEY_URL_INFO, response); } else { } }), catchError(error => of(this.logger.error({ error }))) ); }), switchMap(() => this.innerProtocolService.conn({})), switchMap(res => { return this.authenticationProtocolService .login({ loginId: loginInfo.loginId, loginPw: loginInfo.loginPw, deviceType: environmentsInfo.deviceType, deviceId: ' ', token: '', localeCode: loginInfo.localeCode, pushId: ' ', companyCode: loginInfo.companyCode, passwordEncodingType: 1, clientVersion: '', reconnect: false, ip: localIp, hostName: localMac, ssoMode: SSOMode.AUTH, userSpecificInformation: 'PRO_000482', andId: '', andPushRefreshYn: '' }) .pipe( catchError(err => { switch (err as ServerErrorCode) { case ServerErrorCode.ERRCD_IDPW: break; default: break; } return throwError(err); }) ); }), switchMap(res => { loginRes = res; this.sessionStorageService.set(KEY_LOGIN_RES_INFO, { ...loginRes }); return forkJoin([ this.queryProtocolService.auth({ deviceType: environmentsInfo.deviceType }), this.optionProtocolService.regView({}) ]); }), map(([authRes, regViewRes]) => { this.store.dispatch( OptionStore.regViewSuccess({ res: regViewRes }) ); this.sessionStorageService.set(KEY_AUTH_INFO, { ...authRes }); this.store.dispatch(QueryStore.authSuccess({ res: authRes })); this.store.dispatch( CompanyStore.companyList({ companyGroupCode: environment.companyConfig.companyGroupCode }) ); }), withLatestFrom( this.store.pipe( select( AppStore.MessengerSelector.SyncSelector.selectBuddy2SyncDate ) ), this.store.pipe( select( AppStore.MessengerSelector.SyncSelector.selectGroup2SyncDate ) ), this.store.pipe( select(AppStore.MessengerSelector.SyncSelector.selectRoomSyncDate) ) ), map(([_, buddy2SyncDate, group2SyncDate, roomSyncDate]) => { this.store.dispatch(SyncStore.buddy2({ syncDate: buddy2SyncDate })); this.store.dispatch(SyncStore.group2({ syncDate: group2SyncDate })); this.store.dispatch( SyncStore.room({ syncDate: roomSyncDate, localeCode: loginInfo.localeCode }) ); this.store.dispatch( QueryStore.dept({ divCd: 'ORG', companyCode: loginInfo.companyCode }) ); }), catchError(err => { return throwError(err); }) ) .subscribe( () => { this.store.dispatch( AuthenticationStore.loginSuccess({ loginRes }) ); this.store.dispatch(AuthenticationStore.postLogin({ loginRes })); this.appNativeService.subscribeAfterLogin(); const appUserInfo = this.localStorageService.encGet( KEY_APP_USER_INFO, environment.customConfig.appKey ); this.store.dispatch( StatusStore.changeMyIdleCheckTime({ checkTime: appUserInfo.idleCheckTime }) ); resolve(); }, err => { reject(err); } ); }); } }