cloudfoundry/stratos

View on GitHub
src/frontend/packages/cf-autoscaler/src/features/edit-autoscaler-policy/edit-autoscaler-policy-service.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Injectable } from '@angular/core';
import moment from 'moment-timezone';
import { BehaviorSubject, Observable } from 'rxjs';
import { filter, first } from 'rxjs/operators';

import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service';
import { EntityInfo } from '../../../../store/src/types/api.types';
import { autoscalerTransformArrayToMap } from '../../core/autoscaler-helpers/autoscaler-transform-policy';
import { GetAppAutoscalerPolicyAction } from '../../store/app-autoscaler.actions';
import { AppAutoscalerPolicyLocal } from '../../store/app-autoscaler.types';

@Injectable()
export class EditAutoscalerPolicyService {

  private initialState: AppAutoscalerPolicyLocal = autoscalerTransformArrayToMap({
    instance_min_count: 1,
    instance_max_count: 10,
    scaling_rules: [],
    schedules: {
      timezone: moment.tz.guess(),
      recurring_schedule: [],
      specific_date: []
    }
  });

  private stateSubject = new BehaviorSubject(this.initialState);


  constructor(private entityServiceFactory: EntityServiceFactory) { }

  updateFromStore(appGuid: string, cfGuid: string) {
    const appAutoscalerPolicyService = this.entityServiceFactory.create<EntityInfo<AppAutoscalerPolicyLocal>>(
      appGuid,
      new GetAppAutoscalerPolicyAction(appGuid, cfGuid)
    );

    appAutoscalerPolicyService.entityObs$.pipe(
      // Stop if we've failed to fetch a policy or we've finished fetching a policy
      filter(({ entity, entityRequestInfo }) =>
        entityRequestInfo &&
        (entityRequestInfo.error || (!entityRequestInfo.fetching && !!entity))),
      first(),
    ).subscribe((({ entity }) => {
      if (entity && entity.entity) {
        this.setState(entity.entity);
      }
    }));
  }

  setState(state: AppAutoscalerPolicyLocal) {
    const newState = JSON.parse(JSON.stringify(state));
    this.stateSubject.next(newState);
  }

  getState(): Observable<AppAutoscalerPolicyLocal> {
    return this.stateSubject.asObservable();
  }

}