import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { ProtocolService, PacketBody, PacketBodyValue, ServerMessage } from '@ucap-webmessenger/protocol'; import { LoginRequest, LoginResponse } from '../models/login'; import { SVC_TYPE_LOGIN, SSVC_TYPE_LOGIN_REQ, SVC_TYPE_LOGOUT, SSVC_TYPE_LOGOUT_REQ, SSVC_TYPE_LOGOUT_REMOTE_REQ } from '../types/service'; import { RoleCode } from '../types/role-code'; import { LogoutRequest, LogoutResponse, LogoutRemoteRequest, LogoutRemoteResponse, LogoutRemoteNotification } from '../models/logout'; @Injectable({ providedIn: 'root' }) export class AuthenticationProtocolService { constructor(private protocolService: ProtocolService) {} public login(req: LoginRequest): Observable { const bodyList: PacketBody[] = []; bodyList.push( { type: PacketBodyValue.String, value: req.loginId }, { type: PacketBodyValue.String, value: req.loginPw }, { type: PacketBodyValue.String, value: req.deviceType }, { type: PacketBodyValue.String, value: req.deviceId }, { type: PacketBodyValue.String, value: req.token }, { type: PacketBodyValue.String, value: req.localeCode }, { type: PacketBodyValue.String, value: req.pushId }, { type: PacketBodyValue.String, value: req.companyCode }, { type: PacketBodyValue.Integer, value: req.passwordEncodingType }, { type: PacketBodyValue.String, value: req.clientVersion }, { type: PacketBodyValue.String, value: req.reconnect ? 'Y' : 'N' }, { type: PacketBodyValue.String, value: req.ip }, { type: PacketBodyValue.String, value: req.hostName }, { type: PacketBodyValue.Integer, value: req.encriptionData ? 2 : 1 }, { type: PacketBodyValue.String, value: req.userSpecificInformation }, { type: PacketBodyValue.String, value: req.productId }, { type: PacketBodyValue.String, value: req.productName } ); if (req.encriptionData) { bodyList.push( { type: PacketBodyValue.String, value: req.encriptionData }, { type: PacketBodyValue.String, value: req.accessToken } ); } return this.protocolService .call(SVC_TYPE_LOGIN, SSVC_TYPE_LOGIN_REQ, ...bodyList) .pipe( map(res => { return this.decodeLoginResponse(res); }) ); } public decodeLoginResponse(message: ServerMessage): LoginResponse { return { loginId: message.bodyList[0], userSeq: message.bodyList[1], userInfo: message.bodyList[2], token: message.bodyList[3], companyCode: message.bodyList[4], departmentCode: message.bodyList[5], userId: message.bodyList[6], passwordEncodingType: message.bodyList[7], encriptionKey: message.bodyList[8], existingPid: message.bodyList[9] === 'Y' ? true : false, roleCode: message.bodyList[10] as RoleCode, statusMessage1: message.bodyList[11], statusMessage2: message.bodyList[12], statusMessage3: message.bodyList[13], fileDownloadAllow: message.bodyList[14] === 'Y' ? true : false, fileRetentionPeriod: message.bodyList[15], passwordValidityPeriod: message.bodyList[16], privateInformationAgree: message.bodyList[17] === 'Y' ? true : false, madn: message.bodyList[18], hardPhoneSadn: message.bodyList[19], fmcSadn: message.bodyList[20], pbxIndex: message.bodyList[21], passwordExpired: message.bodyList[22] === 'Y' ? true : false, validAccount: message.bodyList[23] === 'Y' ? true : false, validDevice: message.bodyList[24] === 'Y' ? true : false, useableDevice: message.bodyList[25] === 'Y' ? true : false, deviceScreenForcedLock: message.bodyList[26] === 'Y' ? true : false, tokenString: message.bodyList[27], havePermissionsForIntegratedMessageBox: message.bodyList[28] === 'Y' ? true : false, talkWithMeBotSeq: message.bodyList[29], pinCode: message.bodyList[30], permissionsForViewSchedule: message.bodyList[31], havePermissionsForDevice: message.bodyList[32] === 'Y' ? true : false } as LoginResponse; } public logout(req: LogoutRequest): Observable { return this.protocolService .call(SVC_TYPE_LOGOUT, SSVC_TYPE_LOGOUT_REQ) .pipe( map(res => { return this.decodeLogoutResponse(res); }) ); } public decodeLogoutResponse(message: ServerMessage): LogoutResponse { return {} as LogoutResponse; } public logoutRemote( req: LogoutRemoteRequest ): Observable { const bodyList: PacketBody[] = []; bodyList.push( { type: PacketBodyValue.String, value: req.targetDeviceType }, { type: PacketBodyValue.String, value: req.requestDeviceType } ); return this.protocolService .call(SVC_TYPE_LOGOUT, SSVC_TYPE_LOGOUT_REMOTE_REQ, ...bodyList) .pipe( map(res => { return this.decodeLogoutRemoteResponse(res); }) ); } public decodeLogoutRemoteResponse( message: ServerMessage ): LogoutRemoteResponse { return { targetDeviceType: message.bodyList[0], resultCode: message.bodyList[1] } as LogoutRemoteResponse; } public decodeLogoutRemoteNotification( message: ServerMessage ): LogoutRemoteNotification { return { requestDeviceType: message.bodyList[0] } as LogoutRemoteNotification; } }