import {Injectable} from '@angular/core'; import {HttpClient, HttpHeaders} from '@angular/common/http'; import { Constants } from '../../shared/utils/constants'; import { ServiceType } from "../../shared/models/serviceType"; import {GetSubDetailsResponse} from "./responseInterfaces/getSubDetailsResponseInterface"; import {Observable} from "rxjs/Observable"; import * as _ from 'lodash'; import {CategoryParams} from "../../shared/models/categoryParams"; import {GetCategoryParamsResponseInterface} from "./responseInterfaces/getCategoryParamsResponseInterface"; import {Project} from "../../shared/models/project"; import {OwningEntity} from "../../shared/models/owningEntity"; import {GetServicesResponseInterface} from "./responseInterfaces/getServicesResponseInterface"; import {Subscriber} from "../../shared/models/subscriber"; import {GetSubscribersResponse} from "./responseInterfaces/getSubscribersResponseInterface"; import {AicZone} from "../../shared/models/aicZone"; import {GetAicZonesResponse} from "./responseInterfaces/getAicZonesResponseInterface"; import {LcpRegionsAndTenants} from "../../shared/models/lcpRegionsAndTenants"; import {LcpRegion} from "../../shared/models/lcpRegion"; import {Tenant} from "../../shared/models/tenant"; import {ProductFamily} from "../../shared/models/productFamily" import { updateAicZones, updateCategoryParameters, updateLcpRegionsAndTenants, updateModel, updateProductFamilies, updateServiceTypes, updateSubscribers, updateUserId } from '../../service.actions'; import {SelectOption} from '../../shared/models/selectOption'; import {NgRedux} from "@angular-redux/store"; import {AppState} from "../../store/reducers"; import {ResponseContentType, ResponseType} from "@angular/http"; import 'rxjs/add/operator/do'; import 'rxjs/add/observable/of'; import 'rxjs/add/operator/catch'; @Injectable() export class AaiService { constructor (private http: HttpClient, private store: NgRedux) {} public getServiceModelById(serviceModelId: string): Observable { if (_.has(this.store.getState().service.serviceHierarchy,serviceModelId)){ return Observable.of( JSON.parse(JSON.stringify(this.store.getState().service.serviceHierarchy[serviceModelId]))); } let pathQuery: string = Constants.Path.SERVICES_PATH + serviceModelId; return this.http.get(pathQuery).map(res => res ) .do((res) => { this.store.dispatch(updateModel(res)); }); } public getUserId() : Observable{ return this.http.get("../../getuserID",{responseType: 'text'}).do((res)=>this.store.dispatch(updateUserId(res))); } public getCRAccordingToNetworkFunctionId(networkCollectionFunction,cloudOwner,cloudRegionId){ return this.http.get('../../aai_get_instance_groups_by_cloudregion/'+cloudOwner+'/'+cloudRegionId+'/' + networkCollectionFunction) .map(res=>res).do((res)=>console.log(res)); } public getCategoryParameters(familyName): Observable { familyName = familyName || Constants.Path.PARAMETER_STANDARDIZATION_FAMILY; let pathQuery: string = Constants.Path.GET_CATEGORY_PARAMETERS +"?familyName=" + familyName+ "&r=" + Math.random(); return this.http.get(pathQuery) .map(this.categoryParametersResponseToProductAndOwningEntity) .do(res => { this.store.dispatch(updateCategoryParameters(res)) }); } categoryParametersResponseToProductAndOwningEntity(res: GetCategoryParamsResponseInterface): CategoryParams { if (res && res.categoryParameters) { const owningEntityList = res.categoryParameters.owningEntity.map(owningEntity => new OwningEntity(owningEntity)); const projectList = res.categoryParameters.project.map(project => new Project(project)); const lineOfBusinessList = res.categoryParameters.lineOfBusiness.map(owningEntity => new SelectOption(owningEntity)); const platformList = res.categoryParameters.platform.map(platform => new SelectOption(platform)); return new CategoryParams(owningEntityList, projectList, lineOfBusinessList, platformList); } else { return new CategoryParams(); } } public getProductFamilies(): Observable { return this.getServices().map(res => res.service.map(service => new ProductFamily(service))); } public getServices(): Observable { let pathQuery: string = Constants.Path.AAI_GET_SERVICES + Constants.Path.ASSIGN + Math.random(); return this.http.get(pathQuery); } public getSubscribers(): Observable { if (this.store.getState().service.subscribers){ return Observable.of( JSON.parse(JSON.stringify(this.store.getState().service.subscribers))); } let pathQuery: string = Constants.Path.AAI_GET_SUBSCRIBERS + Constants.Path.ASSIGN + Math.random(); return this.http.get(pathQuery).map(res => res.customer.map( subscriber => new Subscriber(subscriber))).do((res) => { this.store.dispatch(updateSubscribers(res)); }); } public getAicZones(): Observable { if (this.store.getState().service.aicZones){ return Observable.of( JSON.parse(JSON.stringify(this.store.getState().service.aicZones))); } let pathQuery: string = Constants.Path.AAI_GET_AIC_ZONES + Constants.Path.ASSIGN + Math.random(); return this.http.get(pathQuery).map(res => res.zone.map(aicZone => new AicZone(aicZone))).do((res) => { this.store.dispatch(updateAicZones(res)); }); } public getLcpRegionsAndTenants(globalCustomerId, serviceType): Observable { if (this.store.getState().service.lcpRegionsAndTenants.lcpRegionList.length !== 0){ return Observable.of( JSON.parse(JSON.stringify(this.store.getState().service.lcpRegionsAndTenants))); } let pathQuery: string = Constants.Path.AAI_GET_TENANTS + globalCustomerId + Constants.Path.FORWARD_SLASH + serviceType + Constants.Path.ASSIGN + Math.random(); console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + globalCustomerId); if (globalCustomerId != null) { return this.http.get(pathQuery) .map(this.tenantResponseToLcpRegionsAndTenants).do((res) => { this.store.dispatch(updateLcpRegionsAndTenants(res)); }); } } tenantResponseToLcpRegionsAndTenants(cloudRegionTenantList): LcpRegionsAndTenants { const lcpRegionsTenantsMap = {}; const lcpRegionList = _.uniqBy(cloudRegionTenantList, 'cloudRegionID').map((cloudRegionTenant) => { return new LcpRegion(cloudRegionTenant) }); lcpRegionList.forEach(region => { lcpRegionsTenantsMap[region.id] = _.filter(cloudRegionTenantList, {'cloudRegionID' : region.id}) .map((cloudRegionTenant) => { return new Tenant(cloudRegionTenant) }); const reducer = (accumulator, currentValue) => { accumulator.isPermitted = accumulator.isPermitted || currentValue.isPermitted; return accumulator; }; region.isPermitted = lcpRegionsTenantsMap[region.id].reduce(reducer).isPermitted; }); return new LcpRegionsAndTenants(lcpRegionList, lcpRegionsTenantsMap); } public getServiceTypes(subscriberId): Observable { console.log("AaiService:getSubscriptionServiceTypeList: globalCustomerId: " + subscriberId); if (_.has(this.store.getState().service.serviceTypes, subscriberId)){ return Observable.of( JSON.parse(JSON.stringify(this.store.getState().service.serviceTypes[subscriberId]))); } return this.getSubscriberDetails(subscriberId) .map(this.subDetailsResponseToServiceTypes) .do((res) => {this.store.dispatch(updateServiceTypes(res, subscriberId));}); } public getSubscriberDetails(subscriberId): Observable { let pathQuery: string = Constants.Path.AAI_SUB_DETAILS_PATH + subscriberId + Constants.Path.ASSIGN + Math.random(); if (subscriberId != null) { return this.http.get(pathQuery); } } subDetailsResponseToServiceTypes(res: GetSubDetailsResponse): ServiceType[] { if (res && res['service-subscriptions']) { const serviceSubscriptions = res['service-subscriptions']['service-subscription']; return serviceSubscriptions.map((subscription, index) => new ServiceType(String(index), subscription)) } else { return []; } } }