ucap-lg-web/src/app/resolvers/app-session.resolver.ts
Park Byung Eun 4f42fc5c2d sync 0428
2020-04-28 22:25:53 +09:00

143 lines
4.3 KiB
TypeScript

import { Observable, forkJoin, Subject } from 'rxjs';
import { take, takeUntil } from 'rxjs/operators';
import { Injectable } from '@angular/core';
import {
Resolve,
ActivatedRouteSnapshot,
RouterStateSnapshot
} from '@angular/router';
import { Store } from '@ngrx/store';
import { StatusCode } from '@ucap/api';
import { LogService } from '@ucap/ng-logger';
import { PublicApiService } from '@ucap/ng-api-public';
import { ExternalApiService } from '@ucap/ng-api-external';
import { ProtocolService } from '@ucap/ng-protocol';
import { CompanyActions } from '@ucap/ng-store-organization';
import { ConfigurationActions } from '@ucap/ng-store-authentication';
import { AppAuthenticationService } from '@app/services/app-authentication.service';
import { LoginSession } from '@app/models/login-session';
@Injectable()
export class AppSessionResolver implements Resolve<void> {
constructor(
private publicApiService: PublicApiService,
private externalApiService: ExternalApiService,
private protocolService: ProtocolService,
private store: Store<any>,
private appAuthenticationService: AppAuthenticationService,
private logService: LogService
) {}
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): void | Observable<void> | Promise<void> {
return new Promise<void>(async (resolve, reject) => {
try {
const loginSession = this.appAuthenticationService.getLoginSession();
if (loginSession.alive) {
resolve();
return;
}
this.store.dispatch(
CompanyActions.companies({
req: { companyGroupCode: loginSession.companyGroupCode }
})
);
forkJoin([
this.publicApiService
.versionInfo2({
deviceType: loginSession.deviceType,
desktopType: loginSession.desktopType,
companyGroupType: loginSession.companyGroupType,
companyCode: loginSession.companyCode,
loginId: loginSession.loginId
})
.pipe(take(1)),
this.externalApiService
.urlInfo({
deviceType: loginSession.deviceType,
loginId: loginSession.loginId
})
.pipe(take(1))
])
.pipe(take(1))
.subscribe(
([versionInfo2Res, urlInfoRes]) => {
if (
StatusCode.Fail === versionInfo2Res.statusCode ||
StatusCode.Fail === urlInfoRes.statusCode
) {
if (StatusCode.Fail === versionInfo2Res.statusCode) {
this.store.dispatch(
ConfigurationActions.versionInfo2Failure({
error: versionInfo2Res.errorMessage
})
);
reject(versionInfo2Res.errorMessage);
}
if (StatusCode.Fail === urlInfoRes.statusCode) {
this.store.dispatch(
ConfigurationActions.urlInfoFailure({
error: urlInfoRes.errorMessage
})
);
reject(urlInfoRes.errorMessage);
}
return;
}
this.store.dispatch(
ConfigurationActions.versionInfo2Success({
res: versionInfo2Res
})
);
this.store.dispatch(
ConfigurationActions.urlInfoSuccess({
res: urlInfoRes
})
);
const destroySubject = new Subject<boolean>();
this.appAuthenticationService
.getLoginSession$()
.pipe(takeUntil(destroySubject))
.subscribe(
(v) => {
if ((v as LoginSession).alive) {
destroySubject.next(true);
destroySubject.complete();
resolve();
}
},
(error) => {
reject(error);
}
);
this.protocolService.connect(versionInfo2Res.serverIp);
},
(error) => {
reject(error);
}
);
} catch (error) {
reject(error);
}
});
}
}