cloudfoundry/stratos

View on GitHub
src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http';

import { getActions } from '../../../store/src/actions/action.helper';
import { PaginatedAction } from '../../../store/src/types/pagination.types';
import { ICFAction } from '../../../store/src/types/request.types';
import { cfEntityFactory } from '../cf-entity-factory';
import {
  applicationEntityType,
  organizationEntityType,
  serviceBindingEntityType,
  serviceBindingNoBindingsEntityType,
  serviceEntityType,
  serviceInstancesEntityType,
  serviceInstancesWithSpaceEntityType,
  servicePlanEntityType,
  spaceEntityType,
} from '../cf-entity-types';
import { createEntityRelationKey, EntityInlineParentAction } from '../entity-relations/entity-relations.types';
import { QParam, QParamJoiners } from '../shared/q-param';
import { CFStartAction } from './cf-action.types';

export const DELETE_SERVICE_INSTANCE_ACTIONS = getActions('Service Instances', 'Delete Service Instance');
export const getServiceInstanceRelations = [
  createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType),
  createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType),
  createEntityRelationKey(serviceInstancesEntityType, spaceEntityType),
  createEntityRelationKey(serviceInstancesEntityType, serviceEntityType),
  createEntityRelationKey(spaceEntityType, organizationEntityType),
  createEntityRelationKey(serviceBindingEntityType, applicationEntityType)
];

export class GetServiceInstances
  extends CFStartAction implements PaginatedAction, EntityInlineParentAction {
  constructor(
    public endpointGuid: string,
    public paginationKey: string,
    public includeRelations: string[] = [
      createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType),
      createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType),
      // Ideally this should just be `createEntityRelationKey(serviceInstancesEntityType, serviceEntityType)`, however even though CF
      // returns `si.service_url` and `si.service_guid` it does not return the actual service. This means the service is not fetched in the
      // initial fetch SI request but in lots of separate ones.
      createEntityRelationKey(servicePlanEntityType, serviceEntityType),
      createEntityRelationKey(serviceInstancesEntityType, spaceEntityType),
    ],
    public populateMissing = true
  ) {
    super();
    this.options = new HttpRequest(
      'GET',
      'service_instances'
    );
  }
  actions = getActions('Service Instances', 'Get all');
  entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)];
  entityType = serviceInstancesEntityType;
  schemaKey = serviceInstancesWithSpaceEntityType;
  options: HttpRequest<any>;
  initialParams = {
    page: 1,
    'results-per-page': 100,
    'order-direction': 'asc',
    'order-direction-field': 'creation',
    q: []
  };
  flattenPagination = true;
  flattenPaginationMax = true;
}

export class GetServiceInstance
  extends CFStartAction implements EntityInlineParentAction {
  constructor(
    public guid: string,
    public endpointGuid: string,
    public includeRelations: string[] = getServiceInstanceRelations,
    public populateMissing = true
  ) {
    super();
    this.options = new HttpRequest(
      'GET',
      `service_instances/${guid}`
    );
  }
  actions = getActions('Service Instances', 'Get particular instance');
  entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)];
  schemaKey = serviceInstancesWithSpaceEntityType;
  entityType = serviceInstancesEntityType;
  options: HttpRequest<any>;
}

export class DeleteServiceInstance extends CFStartAction implements ICFAction {
  constructor(public endpointGuid: string, public guid: string) {
    super();
    const headers = new HttpHeaders({
      'x-cap-long-running': 'true'
    });
    this.options = new HttpRequest(
      'DELETE',
      `service_instances/${guid}`,
      {
        headers,
        params: new HttpParams({
          fromObject: {
            accepts_incomplete: 'true',
            async: 'false',
            recursive: 'true'
          }
        })
      }
    );
  }
  actions = DELETE_SERVICE_INSTANCE_ACTIONS;
  entity = [cfEntityFactory(serviceInstancesEntityType)];
  entityType = serviceInstancesEntityType;
  options: HttpRequest<any>;
  clearPaginationEntityKeys = [serviceBindingEntityType];
  removeEntityOnDelete = true;
}
export class CreateServiceInstance extends CFStartAction implements ICFAction {
  constructor(
    public guid: string,
    public endpointGuid: string,
    public name: string,
    public servicePlanGuid: string,
    public spaceGuid: string,
    public params: object,
    public tags: string[],
    httpMethod = 'POST',
    url = 'service_instances'
  ) {
    super();
    const headers = new HttpHeaders({
      'x-cap-long-running': 'true'
    });
    this.options = new HttpRequest(
      httpMethod,
      url,
      {
        name,
        space_guid: spaceGuid,
        service_plan_guid: servicePlanGuid,
        parameters: params,
        tags
      },
      {
        headers,
        params: new HttpParams(
          {
            fromObject: {
              accepts_incomplete: 'true'
            }
          }
        )
      }
    );
  }
  actions = getActions('Service Instances', 'Create Service Instance');
  entity = [cfEntityFactory(serviceInstancesEntityType)];
  entityType = serviceInstancesEntityType;
  options: HttpRequest<any>;
}

export class UpdateServiceInstance extends CreateServiceInstance {
  static updateServiceInstance = 'Updating-Service-Instance';
  constructor(
    public guid: string,
    public endpointGuid: string,
    public name: string,
    public servicePlanGuid: string,
    public spaceGuid: string,
    public params: object,
    public tags: string[],
  ) {
    super(guid, endpointGuid, name, servicePlanGuid, spaceGuid, params, tags, 'PUT', `service_instances/${guid}`);
    this.actions = getActions('Service Instances', 'Update Service Instance');
  }
  updatingKey = UpdateServiceInstance.updateServiceInstance;
}

export class ListServiceBindingsForInstance
  extends CFStartAction implements PaginatedAction, EntityInlineParentAction {
  constructor(
    public endpointGuid: string,
    public serviceInstanceGuid: string,
    public paginationKey: string,
    public includeRelations: string[] = [
      createEntityRelationKey(serviceBindingEntityType, serviceInstancesEntityType),
      createEntityRelationKey(serviceBindingEntityType, applicationEntityType)
    ],
    public populateMissing = true
  ) {
    super();
    this.options = new HttpRequest(
      'GET',
      `service_bindings`
    );
    this.initialParams.q = [
      new QParam('service_instance_guid', serviceInstanceGuid, QParamJoiners.in).toString(),
    ];
  }
  actions = getActions('Service Instances', 'Get all service bindings for instance');
  entity = [cfEntityFactory(serviceBindingNoBindingsEntityType)];
  entityType = serviceBindingEntityType;
  options: HttpRequest<any>;
  initialParams = {
    page: 1,
    'results-per-page': 100,
    'order-direction': 'desc',
    'order-direction-field': 'creation',
    q: []
  };
  flattenPagination = true;
}