import { Injectable } from '@angular/core'; import { ProtocolService } from '@ucap-webmessenger/protocol'; import { Observable } from 'rxjs'; import { take, map, takeWhile } from 'rxjs/operators'; import { AuthRequest, AuthResponse, encodeAuth, decodeAuth } from '../models/auth'; import { SVC_TYPE_QUERY_DATA, SSVC_TYPE_QUERY_AUTH_REQ, SSVC_TYPE_QUERY_DEPT_REQ, SSVC_TYPE_QUERY_DEPT_RES, SSVC_TYPE_QUERY_DEPT_DATA, SSVC_TYPE_QUERY_DEPT_USER_RES, SSVC_TYPE_QUERY_DEPT_USER_DATA, SSVC_TYPE_QUERY_DEPT_USER_REQ } from '../types/service'; import { DeptRequest, DeptResponse, encodeDept, decodeDept, decodeDeptData, DeptData } from '../models/dept'; import { encodeDeptUser, decodeDeptUser, decodeDeptUserData, DeptUserRequest, DeptUserData, DeptUserResponse } from '../models/dept-user'; @Injectable({ providedIn: 'root' }) export class QueryProtocolService { constructor(private protocolService: ProtocolService) {} public auth(req: AuthRequest): Observable { return this.protocolService .call(SVC_TYPE_QUERY_DATA, SSVC_TYPE_QUERY_AUTH_REQ, ...encodeAuth(req)) .pipe( take(1), map(res => decodeAuth(res)) ); } public dept(req: DeptRequest): Observable { return this.protocolService .call(SVC_TYPE_QUERY_DATA, SSVC_TYPE_QUERY_DEPT_REQ, ...encodeDept(req)) .pipe( takeWhile(res => SSVC_TYPE_QUERY_DEPT_RES !== res.subServiceType, true), map(res => { if (SSVC_TYPE_QUERY_DEPT_DATA === res.subServiceType) { return { ...decodeDeptData(res), Type: SSVC_TYPE_QUERY_DEPT_DATA }; } return { ...decodeDept(res), Type: SSVC_TYPE_QUERY_DEPT_RES }; }) ); } public deptUser( req: DeptUserRequest ): Observable { return this.protocolService .call( SVC_TYPE_QUERY_DATA, SSVC_TYPE_QUERY_DEPT_USER_REQ, ...encodeDeptUser(req) ) .pipe( takeWhile( res => SSVC_TYPE_QUERY_DEPT_USER_RES !== res.subServiceType, true ), map(res => { if (SSVC_TYPE_QUERY_DEPT_USER_DATA === res.subServiceType) { return { ...decodeDeptUserData(res), Type: SSVC_TYPE_QUERY_DEPT_USER_DATA }; } return { ...decodeDeptUser(res), Type: SSVC_TYPE_QUERY_DEPT_USER_RES }; }) ); } }