From 7a82ca7a026d3bc7fe2b117c0c3c2399cf710267 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 30 Apr 2020 15:44:19 +0100 Subject: [PATCH 01/20] Provide typed way to access actions (and dispatch them), entity monitors/services and pagaintion monitors/services via the catalog entity - fixes #4246 --- .../src/cf-autoscaler-testing.module.ts | 2 +- .../autoscaler-tab-extension.component.ts | 2 +- .../src/store/autoscaler-entity-generator.ts | 2 +- .../src/store/autoscaler.effects.ts | 2 +- .../src/actions/application.actions.ts | 3 +- .../src/actions/cloud-foundry.actions.ts | 6 +- .../actions/deploy-applications.actions.ts | 27 +- .../src/actions/feature-flags.actions.ts | 7 +- .../src/actions/github.actions.ts | 13 +- .../src/actions/service-instances.actions.ts | 13 +- .../src/actions/service.actions.ts | 2 +- .../src/actions/space.actions.ts | 1 + .../cloud-foundry/src/actions/stack.action.ts | 9 +- .../cloud-foundry/src/cf-entity-catalog.ts | 247 +++++++++++ .../cloud-foundry/src/cf-entity-factory.ts | 41 +- .../cloud-foundry/src/cf-entity-generator.ts | 392 ++++++++++++------ .../src/cf-entity-relations.getters.ts | 4 +- .../src/cloud-foundry-test.module.ts | 2 +- .../cloud-foundry/src/cloud-foundry.module.ts | 6 +- .../application-env-var.action-builders.ts | 58 ++- .../application-stats.action-builders.ts | 10 +- .../application-summary.action-builders.ts | 8 +- .../application.action-builders.ts | 25 +- .../buildpack.action-builders.ts | 13 +- .../cf-info.action-builders.ts | 4 +- .../cf.action-builder.types.ts | 17 - .../domin.action-builder.ts | 34 +- .../feature-flag.action-builder.ts | 13 +- .../git-action-builder.ts | 38 +- .../organization.action-builders.ts | 4 +- .../quota-definition.action-builders.ts | 38 +- .../security-groups.action-builder.ts | 18 +- .../service-binding.action-builders.ts | 6 +- .../service-broker.entity-builders.ts | 17 +- .../service-instance.action.builders.ts | 4 +- ...service-plan-visibility.action-builders.ts | 12 +- .../service-plan.action-builders.ts | 13 +- .../service.entity-builders.ts | 24 +- .../space-quota.action-builders.ts | 2 +- .../space.action-builders.ts | 26 ++ .../stack-action-builders.ts | 4 +- .../user-provided-service.action-builders.ts | 33 +- .../user.action-builders.ts | 5 +- .../entity-relation-tree.helpers.ts | 19 - .../entity-relations/entity-relation-tree.ts | 2 +- .../entity-relations-from-parent.spec.ts | 2 +- .../entity-relations-validate.spec.ts | 2 +- .../src/entity-relations/entity-relations.ts | 13 +- .../processors/org-space-post-processor.ts | 2 +- .../application-delete.component.ts | 62 +-- ...te-instances-routes-list-config.service.ts | 61 +-- .../applications/application.service.ts | 114 ++--- .../application/application-base.component.ts | 7 - .../application-polling.service.ts | 15 +- .../application-tabs-base.component.ts | 2 +- .../build-tab/application-env-vars.service.ts | 29 +- .../tabs/build-tab/build-tab.component.ts | 19 +- .../tabs/gitscm-tab/gitscm-tab.component.ts | 55 +-- .../create-application-step3.component.html | 4 +- .../create-application-step3.component.ts | 75 ++-- ...ploy-application-options-step.component.ts | 44 +- .../deploy-application-step2.component.ts | 47 +-- .../deploy-application-step3.component.ts | 23 +- .../deploy-application-steps.types.ts | 22 +- .../routes/add-routes/add-routes.component.ts | 75 +--- .../cloud-foundry/add-edit-space-step-base.ts | 62 +-- .../create-organization-step.component.ts | 31 +- .../create-space-step.component.ts | 22 +- .../edit-organization-step.component.ts | 26 +- .../edit-space-step.component.ts | 52 +-- .../quota-definition-base.component.ts | 22 +- .../quota-definition.component.ts | 11 +- .../cloud-foundry-endpoint.service.ts | 79 +--- .../services/cloud-foundry-org-space-quota.ts | 4 +- .../cloud-foundry-organization.service.ts | 22 +- .../services/cloud-foundry-space.service.ts | 17 +- .../space-quota-definition.component.ts | 12 +- .../cloud-foundry-space-summary.component.ts | 4 +- ...-foundry-organization-summary.component.ts | 2 +- .../invite-users-create.component.ts | 36 +- .../users/manage-users/cf-roles.service.ts | 35 +- .../manage-users-confirm.component.ts | 2 +- .../service-base/service-base.component.ts | 19 +- .../service-catalog.helpers.ts | 11 +- .../service-catalog/services-helper.ts | 99 +---- .../service-catalog/services.service.ts | 67 +-- .../detach-service-instance.component.ts | 24 +- .../services/services-wall.service.ts | 49 +-- .../add-service-instance.component.ts | 80 +--- .../bind-apps-step.component.ts | 2 - ...instance-helper-service-factory.service.ts | 5 - .../create-service-instance-helper.service.ts | 140 +------ .../add-service-instance/csi-mode.service.ts | 18 +- .../specify-details-step.component.ts | 62 +-- ...specify-user-provided-details.component.ts | 11 +- .../card-cf-recent-apps.component.ts | 9 +- .../compact-app-card.component.ts | 1 - .../service-broker-card.component.ts | 21 +- .../cf-app-instances-data-source.ts | 8 +- .../cf-app-map-routes-list-config.service.ts | 12 +- .../cf-app-routes-list-config-base.ts | 8 +- .../app-service-binding-card.component.ts | 30 +- .../app-service-binding-data-source.ts | 27 +- .../cf-app-variables-data-source.ts | 21 +- .../cf-app-variables-list-config.service.ts | 25 +- .../list-types/app/card/card-app.component.ts | 1 - .../list-types/app/cf-apps-data-source.ts | 15 +- .../table-cell-app-status.component.ts | 1 - .../cf-buildpacks-data-source.ts | 9 +- .../cf-events/cf-events-data-source.ts | 13 +- .../cf-feature-flags-data-source.helpers.ts | 21 - .../cf-feature-flags-data-source.ts | 4 +- .../cf-feature-flags-list-config.service.ts | 4 +- .../cf-routes/cf-routes-data-source-base.ts | 11 +- .../cf-routes/cf-routes-data-source.ts | 10 +- .../cf-routes/cf-routes-list-config-base.ts | 10 +- .../cf-security-groups-data-source.ts | 8 +- .../cf-select-users-list-config.service.ts | 2 +- .../cf-service-card.component.ts | 4 +- .../cf-services/cf-services-data-source.ts | 9 +- .../cf-space-apps-data-source.service.ts | 15 +- .../cf-space-routes-data-source.ts | 13 +- ...cf-spaces-service-instances-data-source.ts | 10 +- ...aces-user-service-instances-data-source.ts | 13 +- ...ervice-instance-apps-attached.component.ts | 8 - .../cf-spaces-data-source.service.ts | 14 +- .../cf-stacks/cf-stacks-data-source.ts | 9 +- .../cf-org-permission-cell.component.ts | 7 +- .../cf-space-permission-cell.component.ts | 7 +- .../cf-users/cf-user-list-config.service.ts | 2 +- .../detach-apps/detach-apps-data-source.ts | 21 +- .../detach-apps-list-config.service.ts | 2 +- .../service-instances-data-source.ts | 7 +- .../service-plans-data-source.ts | 7 +- .../service-instance-card.component.ts | 3 - .../service-instances-wall-data-source.ts | 13 +- .../running-instances.component.ts | 14 +- .../service-plan-public.component.ts | 6 +- .../cf-org-space-service.service.ts | 14 +- .../shared/data-services/cf-user.service.ts | 34 +- .../service-action-helper.service.ts | 54 +-- .../store/effects/cloud-foundry.effects.ts | 20 +- .../src/store/effects/deploy-app.effects.ts | 38 +- .../src/store/effects/github.effects.ts | 19 +- .../src/store/effects/permissions.effect.ts | 8 +- .../src/store/types/github.types.ts | 4 +- .../cloud-foundry-endpoint-service.helper.ts | 4 +- .../packages/core/endpoints-health-checks.ts | 2 +- ...api-endpoint-type-select-page.component.ts | 2 +- .../api-entity-list-page.component.ts | 7 +- .../api-entity-type-select-page.component.ts | 11 +- src/frontend/packages/core/src/app.module.ts | 9 +- .../packages/core/src/base-entity-types.ts | 25 +- .../packages/core/src/core/cf-api.types.ts | 1 + .../packages/core/src/core/core.module.ts | 12 +- .../core/current-user-permissions.checker.ts | 25 +- .../core/src/core/endpoints.service.ts | 2 +- .../core/src/core/user-favorite-manager.ts | 2 +- .../core/src/core/user-profile.service.ts | 24 +- .../packages/core/src/core/utils.service.ts | 50 ++- .../create-quota-step.component.ts | 17 +- .../create-space-quota-step.component.ts | 20 +- .../edit-quota-step.component.ts | 35 +- .../edit-space-quota-step.component.ts | 38 +- .../quota-definition-form.component.ts | 49 +-- .../space-quota-definition-form.component.ts | 41 +- .../dashboard-base.component.ts | 12 +- .../backup-connection-cell.component.ts | 2 +- .../backup-endpoints.service.ts | 2 +- .../backup-endpoints.component.ts | 2 +- .../connect-endpoint.component.ts | 2 +- .../src/features/endpoints/connect.service.ts | 2 +- .../create-endpoint-base-step.component.ts | 2 +- .../create-endpoint-cf-step-1.component.ts | 6 +- .../create-endpoint.component.ts | 2 +- .../edit-endpoint-step.component.ts | 2 +- .../metrics/metrics/metrics.component.ts | 2 +- .../favorite-config-mapper.ts | 14 +- .../favorites-meta-card.component.ts | 2 +- .../list-data-source.ts | 2 +- .../local-list.helpers.ts | 2 +- .../table-cell-service.component.ts | 68 ++- .../endpoint-card/endpoint-card.component.ts | 6 +- .../endpoint/endpoint-list.helpers.ts | 4 +- .../endpoint/endpoints-list-config.service.ts | 2 +- .../table-cell-endpoint-details.component.ts | 2 +- .../table-cell-endpoint-name.component.ts | 4 +- .../table-cell-endpoint-status.component.ts | 2 +- .../github-commits-data-source.ts | 8 +- ...hub-commits-list-config-app-tab.service.ts | 39 +- .../shared/components/list/list.component.ts | 7 +- .../max-list-message.component.ts | 2 +- .../simple-list/entity-catalog-datasource.ts | 13 +- .../simple-list/simple-list.component.spec.ts | 19 +- .../list/simple-list/simple-list.component.ts | 15 +- .../shared/data-services/scm/github-scm.ts | 8 +- .../shared/data-services/scm/gitlab-scm.ts | 11 + .../core/src/shared/data-services/scm/scm.ts | 1 + .../services/cf-org-space-label.service.ts | 2 +- ...-foundry-user-provided-services.service.ts | 100 ++--- .../packages/core/src/shared/shared.module.ts | 7 +- .../application-service-helper.ts | 8 - .../core/test-framework/core-test.modules.ts | 2 +- .../entity-catalog-test-helpers.ts | 4 +- .../packages/store/src/effects/app.effects.ts | 9 +- .../store/src/effects/endpoint.effects.ts | 65 +-- .../store/src/effects/metrics.effects.ts | 12 +- .../store/src/effects/update-app-effects.ts | 18 +- .../src/effects/user-favorites-effect.ts | 2 +- .../store/src/effects/user-profile.effects.ts | 2 +- .../store/src/effects/users-roles.effects.ts | 11 +- .../store/src/entity-catalog-test.module.ts | 10 +- .../store/src/entity-catalog.actions.ts | 3 +- .../store/src/entity-catalog.module.ts | 4 +- .../action-dispatcher.spec.ts | 231 ++++++----- .../action-dispatcher/action-dispatcher.ts | 79 ---- .../action-orchestrator.ts | 24 +- .../action-builder-config.mapper.ts | 8 +- .../entity-catalog-entity-store-helpers.ts | 222 ++++++++++ .../entity-catalog-entity.ts | 106 +++-- .../entity-catalog-entity.types.ts | 120 ++++++ .../entity-catalog.service.ts | 22 + .../entity-catalog/entity-catalog.helper.ts | 10 + ...service.spec.ts => entity-catalog.spec.ts} | 12 +- .../entity-catalog.store-setup.ts | 15 - ...y-catalog.service.ts => entity-catalog.ts} | 47 ++- .../entity-catalog/entity-catalog.types.ts | 1 - .../base-single-entity-request.pipeline.ts | 10 +- .../entity-pagination-request-pipeline.ts | 7 +- .../endpoint-errors.handler.spec.ts | 2 +- .../endpoint-errors.handler.ts | 2 +- .../fail-entity-request.handler.spec.ts | 2 +- .../fail-entity-request.handler.ts | 2 +- .../forced-action-type.helpers.ts | 2 +- .../jetstream-error.handler.ts | 2 +- .../make-request-entity-request.pipe.ts | 2 +- .../map-multi-endpoint.pipes.ts | 4 +- .../start-entity-request.handler.spec.ts | 2 +- .../success-entity-request.handler.ts | 4 +- .../entity-request-pipeline.ts | 4 +- .../entity-request-pipeline.types.ts | 6 +- .../get-params.pipe.ts | 3 - .../pagination-iterator.pipe.ts | 2 +- .../pipeline-helpers.ts | 4 +- .../pipline-http-client.service.ts | 2 +- .../src/entity-service-factory.service.ts | 2 +- .../packages/store/src/entity-service.spec.ts | 26 +- .../packages/store/src/entity-service.ts | 7 +- .../entity-monitor.factory.service.ts | 18 +- .../monitors/pagination-monitor.factory.ts | 2 +- .../store/src/monitors/pagination-monitor.ts | 24 +- .../request-data-reducer.factory.ts | 4 +- .../api-request-reducer/request-helpers.ts | 7 +- .../api-request-reducer/succeed-request.ts | 2 +- .../api-request-reducers.generator.ts | 2 +- .../recently-visited.reducer.ts | 2 +- ...tion-reducer-clear-pagination-of-entity.ts | 2 +- ...agination-reducer-clear-pagination-type.ts | 2 +- ...gination-reducer-create-pagination.spec.ts | 2 +- .../pagination-reducer-create-pagination.ts | 2 +- .../pagination-reducer-max-reached.ts | 2 +- .../pagination-reducer-reset-pagination.ts | 2 +- .../pagination-reducer.helper.ts | 29 +- .../pagination-reducer.types.ts | 34 ++ .../pagination-reducer/pagination.reducer.ts | 2 +- .../selectors/current-user-role.selectors.ts | 2 - .../selectors/favorite-groups.selectors.ts | 4 +- .../store/testing/src/store-test-helper.ts | 2 +- .../store/testing/src/store-test.module.ts | 2 +- 269 files changed, 2609 insertions(+), 3008 deletions(-) create mode 100644 src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts delete mode 100644 src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts delete mode 100644 src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts rename src/frontend/packages/store/src/entity-catalog/{ => entity-catalog-entity}/action-builder-config.mapper.ts (94%) create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts rename src/frontend/packages/store/src/entity-catalog/{ => entity-catalog-entity}/entity-catalog-entity.ts (80%) create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.types.ts create mode 100644 src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts rename src/frontend/packages/store/src/entity-catalog/{entity-catalog.service.spec.ts => entity-catalog.spec.ts} (95%) rename src/frontend/packages/store/src/entity-catalog/{entity-catalog.service.ts => entity-catalog.ts} (86%) diff --git a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts index 96f92c9ba3..594a5608aa 100644 --- a/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts +++ b/src/frontend/packages/cf-autoscaler/src/cf-autoscaler-testing.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { generateCFEntities } from '../../cloud-foundry/src/cf-entity-generator'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { generateASEntities } from './store/autoscaler-entity-generator'; @NgModule({ diff --git a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts index f3cb8c050a..215b6a3a33 100644 --- a/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts +++ b/src/frontend/packages/cf-autoscaler/src/features/autoscaler-tab-extension/autoscaler-tab-extension.component.ts @@ -16,7 +16,7 @@ import { ConfirmationDialogConfig } from '../../../../core/src/shared/components import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; import { RouterNav } from '../../../../store/src/actions/router.actions'; import { AppState } from '../../../../store/src/app-state'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { EntityService } from '../../../../store/src/entity-service'; import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts index fe10d93c33..ec907724ab 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler-entity-generator.ts @@ -5,7 +5,7 @@ import { IOrganization } from '../../../core/src/core/cf-api.types'; import { StratosBaseCatalogEntity, StratosCatalogEntity, -} from '../../../store/src/entity-catalog/entity-catalog-entity'; +} from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEndpointDefinition } from '../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../store/src/types/api.types'; import { IFavoriteMetadata } from '../../../store/src/types/user-favorites.types'; diff --git a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts index dde4382a87..094fbef14d 100644 --- a/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts +++ b/src/frontend/packages/cf-autoscaler/src/store/autoscaler.effects.ts @@ -6,7 +6,7 @@ import { Observable } from 'rxjs'; import { catchError, mergeMap, withLatestFrom } from 'rxjs/operators'; import { PaginationResponse } from '../../../cloud-foundry/src/store/types/cf-api.types'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { environment } from '../../../core/src/environments/environment'; import { isHttpErrorResponse } from '../../../core/src/jetstream.helpers'; import { AppState } from '../../../store/src/app-state'; diff --git a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts index a7574dedc8..256ff8be9e 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/application.actions.ts @@ -8,7 +8,7 @@ import { ICFAction } from '../../../store/src/types/request.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { applicationEntityType, appStatsEntityType } from '../cf-entity-types'; import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { EntityInlineParentAction } from '../entity-relations/entity-relations.types'; +import { createEntityRelationPaginationKey, EntityInlineParentAction } from '../entity-relations/entity-relations.types'; import { AppMetadataTypes } from './app-metadata.actions'; import { CFStartAction } from './cf-action.types'; @@ -55,6 +55,7 @@ export class GetAllApplications extends CFStartAction implements PaginatedAction 'GET', 'apps' ); + this.paginationKey = this.paginationKey || createEntityRelationPaginationKey('cf', endpointGuid) } actions = [GET_ALL, GET_ALL_SUCCESS, GET_ALL_FAILED]; entity = [applicationEntitySchema]; diff --git a/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts index e99aab4249..4896e94330 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/cloud-foundry.actions.ts @@ -1,11 +1,11 @@ -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { cfInfoEntityType } from '../cf-entity-types'; import { EntityRequestAction } from '../../../store/src/types/request.types'; +import { cfInfoEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; export const GET_CF_INFO = '[CF Endpoint] Get Info'; export class GetCFInfo implements EntityRequestAction { - constructor(public cfGuid: string) { } + constructor(public guid: string) { } type = GET_CF_INFO; endpointType = CF_ENDPOINT_TYPE; entityType = cfInfoEntityType; diff --git a/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts index 41a7be9d28..c4832fe3c9 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/deploy-applications.actions.ts @@ -3,8 +3,8 @@ import { Action } from '@ngrx/store'; import { GitSCM } from '../../../core/src/shared/data-services/scm/scm'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; import { gitBranchesEntityType, gitCommitEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; import { DockerAppDetails, GitAppDetails, OverrideAppDetails, SourceType } from '../store/types/deploy-application.types'; import { GitBranch, GitCommit } from '../store/types/git.types'; @@ -14,6 +14,7 @@ export const PROJECT_DOESNT_EXIST = '[Deploy App] Project Doesn\'t exist'; export const PROJECT_FETCH_FAILED = '[Deploy App] Project Fetch Failed'; export const PROJECT_EXISTS = '[Deploy App] Project exists'; export const FETCH_BRANCHES_FOR_PROJECT = '[Deploy App] Fetch branches'; +export const FETCH_BRANCH_FOR_PROJECT = '[Deploy App] Fetch branch'; export const SAVE_APP_DETAILS = '[Deploy App] Save app details'; export const SAVE_APP_OVERRIDE_DETAILS = '[Deploy App] Save app override details'; export const FETCH_COMMIT = '[Deploy App] Fetch commit'; @@ -29,6 +30,10 @@ export const FETCH_BRANCH_START = '[GitHub] Fetch branch start'; export const FETCH_BRANCH_SUCCESS = '[GitHub] Fetch branch succeeded'; export const FETCH_BRANCH_FAILED = '[GitHub] Fetch branch failed'; +export const FETCH_BRANCHES_START = '[GitHub] Fetch branches start'; +export const FETCH_BRANCHES_SUCCESS = '[GitHub] Fetch branches succeeded'; +export const FETCH_BRANCHES_FAILED = '[GitHub] Fetch branches failed'; + export class SetAppSourceDetails implements Action { constructor(public sourceType: SourceType) { } type = SET_APP_SOURCE_DETAILS; @@ -54,9 +59,9 @@ export class ProjectExists implements Action { type = PROJECT_EXISTS; } -export class FetchBranchesForProject implements PaginatedAction { - constructor(public scm: GitSCM, public projectName: string) { - this.paginationKey = FetchBranchesForProject.createPaginationKey(scm, projectName); +export class FetchBranchForProject implements EntityRequestAction { + constructor(public scm: GitSCM, public projectName: string, public guid: string, public branchName: string) { + this.guid = this.guid || `${scm.getType()}-${this.projectName}-${this.branchName}` } actions = [ FETCH_BRANCH_START, @@ -64,6 +69,20 @@ export class FetchBranchesForProject implements PaginatedAction { FETCH_BRANCH_FAILED ]; public endpointType = CF_ENDPOINT_TYPE; + type = FETCH_BRANCH_FOR_PROJECT; + entityType = gitBranchesEntityType; +} + +export class FetchBranchesForProject implements PaginatedAction { + constructor(public scm: GitSCM, public projectName: string) { + this.paginationKey = FetchBranchesForProject.createPaginationKey(scm, projectName); + } + actions = [ + FETCH_BRANCHES_START, + FETCH_BRANCHES_SUCCESS, + FETCH_BRANCHES_FAILED + ]; + public endpointType = CF_ENDPOINT_TYPE; type = FETCH_BRANCHES_FOR_PROJECT; entityType = gitBranchesEntityType; paginationKey: string; diff --git a/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts index 9464841c32..98a6d9974b 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/feature-flags.actions.ts @@ -1,15 +1,18 @@ import { HttpRequest } from '@angular/common/http'; import { getActions } from '../../../store/src/actions/action.helper'; +import { endpointSchemaKey } from '../../../store/src/helpers/entity-factory'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { RequestEntityLocation } from '../../../store/src/types/request.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { featureFlagEntityType } from '../cf-entity-types'; +import { createEntityRelationPaginationKey } from '../entity-relations/entity-relations.types'; import { CFStartAction } from './cf-action.types'; export class GetAllFeatureFlags extends CFStartAction implements PaginatedAction { - constructor(public endpointGuid: string, public paginationKey: string) { + constructor(public endpointGuid: string, public paginationKey: string = '') { super(); + this.paginationKey = this.paginationKey || createEntityRelationPaginationKey(endpointSchemaKey, this.endpointGuid); this.options = new HttpRequest( 'GET', `config/feature_flags` @@ -21,7 +24,7 @@ export class GetAllFeatureFlags extends CFStartAction implements PaginatedAction entity = [cfEntityFactory(featureFlagEntityType)]; actions = getActions('Feature Flags', 'Fetch all'); options: HttpRequest; - flattenPagination = false; + flattenPagination = true; entityLocation = RequestEntityLocation.ARRAY; initialParams = { page: 1, diff --git a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts index e2a875c49b..c02111909b 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/github.actions.ts @@ -1,15 +1,16 @@ -import { CF_ENDPOINT_TYPE } from '../cf-types'; -import { gitRepoEntityType } from '../cf-entity-types'; -import { - EnvVarStratosProject, -} from '../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; import { EntityRequestAction } from '../../../store/src/types/request.types'; +import { gitRepoEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; +import { GitMeta } from '../entity-action-builders/git-action-builder'; export const FETCH_GITHUB_REPO = '[Github] Fetch Github repo details'; export class FetchGitHubRepoInfo implements EntityRequestAction { - constructor(public stProject: EnvVarStratosProject) { } + constructor(public meta: GitMeta) { + this.guid = this.meta.scm.getType() + '-' + this.meta.projectName; + } type = FETCH_GITHUB_REPO; endpointType = CF_ENDPOINT_TYPE; entityType = gitRepoEntityType; + public guid: string; } diff --git a/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts index a0b111c079..275d550eff 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/service-instances.actions.ts @@ -16,6 +16,7 @@ import { 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'); @@ -114,8 +115,8 @@ export class DeleteServiceInstance extends CFStartAction implements ICFAction { } export class CreateServiceInstance extends CFStartAction implements ICFAction { constructor( - public endpointGuid: string, public guid: string, + public endpointGuid: string, public name: string, public servicePlanGuid: string, public spaceGuid: string, @@ -159,15 +160,15 @@ export class CreateServiceInstance extends CFStartAction implements ICFAction { export class UpdateServiceInstance extends CreateServiceInstance { static updateServiceInstance = 'Updating-Service-Instance'; constructor( - public endpointGuid: string, public guid: string, + public endpointGuid: string, public name: string, public servicePlanGuid: string, public spaceGuid: string, public params: object, public tags: string[], ) { - super(endpointGuid, guid, name, servicePlanGuid, spaceGuid, params, tags, 'PUT', `service_instances/${guid}`); + super(guid, endpointGuid, name, servicePlanGuid, spaceGuid, params, tags, 'PUT', `service_instances/${guid}`); this.actions = getActions('Service Instances', 'Update Service Instance'); } updatingKey = UpdateServiceInstance.updateServiceInstance; @@ -188,8 +189,11 @@ export class ListServiceBindingsForInstance super(); this.options = new HttpRequest( 'GET', - `service_instances/${serviceInstanceGuid}/service_bindings` + `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)]; @@ -200,6 +204,7 @@ export class ListServiceBindingsForInstance 'results-per-page': 100, 'order-direction': 'desc', 'order-direction-field': 'creation', + q: [] }; flattenPagination = true; } diff --git a/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts index fe68c1700c..dddcc56074 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/service.actions.ts @@ -1,7 +1,7 @@ import { HttpRequest } from '@angular/common/http'; import { getActions } from '../../../store/src/actions/action.helper'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { cfEntityFactory } from '../cf-entity-factory'; import { serviceEntityType, servicePlanEntityType } from '../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts b/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts index 87ee30f019..9aef2ed1d3 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/space.actions.ts @@ -62,6 +62,7 @@ export class GetSpace extends CFStartAction implements ICFAction, EntityInlinePa GET_SPACE_FAILED ]; entity = [cfEntityFactory(spaceEntityType)]; + schemaKey = ''; entityType = spaceEntityType; options: HttpRequest; } diff --git a/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts b/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts index 42ef7c42b9..b4a274ee38 100644 --- a/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts +++ b/src/frontend/packages/cloud-foundry/src/actions/stack.action.ts @@ -1,13 +1,14 @@ -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { HttpRequest } from '@angular/common/http'; + import { getActions } from '../../../store/src/actions/action.helper'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../store/src/helpers/entity-factory'; -import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; import { PaginatedAction } from '../../../store/src/types/pagination.types'; import { ICFAction } from '../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../cf-types'; import { stackEntityType } from '../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../cf-types'; +import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; import { CFStartAction } from './cf-action.types'; -import { HttpRequest } from '@angular/common/http'; export const GET = '[Stack] Get one'; export const GET_SUCCESS = '[Stack] Get one success'; diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts new file mode 100644 index 0000000000..ee85433d72 --- /dev/null +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-catalog.ts @@ -0,0 +1,247 @@ +import { + IService, + IServiceBinding, + IServiceBroker, + IServiceInstance, + IServicePlan, + IServicePlanVisibility, + IUserProvidedServiceInstance, +} from '../../core/src/core/cf-api-svc.types'; +import { + CfEvent, + IApp, + IAppSummary, + IBuildpack, + ICfV2Info, + IDomain, + IFeatureFlag, + IOrganization, + IOrgQuotaDefinition, + IPrivateDomain, + IRoute, + ISecurityGroup, + ISpace, + ISpaceQuotaDefinition, + IStack, +} from '../../core/src/core/cf-api.types'; +import { + StratosBaseCatalogEntity, + StratosCatalogEndpointEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { APIResource } from '../../store/src/types/api.types'; +import { IAppFavMetadata, IBasicCFMetaData, IOrgFavMetadata, ISpaceFavMetadata } from './cf-metadata-types'; +import { AppEnvVarActionBuilders } from './entity-action-builders/application-env-var.action-builders'; +import { AppStatsActionBuilders } from './entity-action-builders/application-stats.action-builders'; +import { AppSummaryActionBuilders } from './entity-action-builders/application-summary.action-builders'; +import { ApplicationActionBuilders } from './entity-action-builders/application.action-builders'; +import { BuildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; +import { CfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; +import { CfInfoDefinitionActionBuilders } from './entity-action-builders/cf-info.action-builders'; +import { DomainActionBuilders } from './entity-action-builders/domin.action-builder'; +import { FeatureFlagActionBuilders } from './entity-action-builders/feature-flag.action-builder'; +import { + GitBranchActionBuilders, + GitCommitActionBuilders, + GitCommitActionBuildersConfig, + GitRepoActionBuilders, +} from './entity-action-builders/git-action-builder'; +import { OrganizationActionBuilders } from './entity-action-builders/organization.action-builders'; +import { QuotaDefinitionActionBuilder } from './entity-action-builders/quota-definition.action-builders'; +import { RoutesActionBuilders } from './entity-action-builders/routes.action-builder'; +import { SecurityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; +import { ServiceBindingActionBuilders } from './entity-action-builders/service-binding.action-builders'; +import { ServiceBrokerActionBuilders } from './entity-action-builders/service-broker.entity-builders'; +import { ServiceInstanceActionBuilders } from './entity-action-builders/service-instance.action.builders'; +import { ServicePlanVisibilityActionBuilders } from './entity-action-builders/service-plan-visibility.action-builders'; +import { ServicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; +import { ServiceActionBuilders } from './entity-action-builders/service.entity-builders'; +import { SpaceQuotaDefinitionActionBuilders } from './entity-action-builders/space-quota.action-builders'; +import { SpaceActionBuilders } from './entity-action-builders/space.action-builders'; +import { StackActionBuilders } from './entity-action-builders/stack-action-builders'; +import { UserProvidedServiceActionBuilder } from './entity-action-builders/user-provided-service.action-builders'; +import { UserActionBuilders } from './entity-action-builders/user.action-builders'; +import { AppStat } from './store/types/app-metadata.types'; +import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; +import { CfUser } from './store/types/user.types'; + +/** + * A strongly typed collection of Cloud Foundry Catalog Entities. + * This can be used to access functionality exposed by each specific type, such as get, update, delete, etc + */ +export class CfEntityCatalog { + public cfEndpoint: StratosCatalogEndpointEntity; + + public quotaDefinition: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + QuotaDefinitionActionBuilder + >; + + public appEnvVar: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + AppEnvVarActionBuilders + >; + + public appSummary: StratosBaseCatalogEntity< + IBasicCFMetaData, + IAppSummary, + AppSummaryActionBuilders + >; + + public spaceQuota: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + SpaceQuotaDefinitionActionBuilders + >; + + public privateDomain: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource + >; + + public cfInfo: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + CfInfoDefinitionActionBuilders + >; + + public appStats: StratosBaseCatalogEntity< + IBasicCFMetaData, + AppStat, + AppStatsActionBuilders + >; + + public buildPack: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + BuildpackActionBuilders + >; + + public serviceBroker: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBrokerActionBuilders + >; + + public servicePlanVisibility: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanVisibilityActionBuilders + >; + + public securityGroup: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + SecurityGroupBuilders + >; + + public serviceBinding: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBindingActionBuilders + >; + + public service: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceActionBuilders + >; + + public servicePlan: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanActionBuilders + >; + + public serviceInstance: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceInstanceActionBuilders + >; + + public user: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + UserActionBuilders + >; + + public domain: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + DomainActionBuilders + >; + + public gitCommit: StratosBaseCatalogEntity< + IBasicCFMetaData, + GitCommit, + GitCommitActionBuildersConfig, + GitCommitActionBuilders + >; + + public gitRepo: StratosBaseCatalogEntity< + IBasicCFMetaData, + GitRepo, + GitRepoActionBuilders + >; + + public gitBranch: StratosBaseCatalogEntity< + IBasicCFMetaData, + GitBranch, + GitBranchActionBuilders + >; + + public event: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + CfEventActionBuilders + >; + + public route: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + RoutesActionBuilders + >; + + public stack: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + StackActionBuilders + >; + + public featureFlag: StratosBaseCatalogEntity< + IBasicCFMetaData, + IFeatureFlag, + FeatureFlagActionBuilders + >; + + public application: StratosBaseCatalogEntity< + IAppFavMetadata, + APIResource, + ApplicationActionBuilders + >; + + public space: StratosBaseCatalogEntity< + ISpaceFavMetadata, + APIResource, + SpaceActionBuilders + >; + + public org: StratosBaseCatalogEntity< + IOrgFavMetadata, + APIResource, + OrganizationActionBuilders + >; + + public metric: StratosBaseCatalogEntity< + IBasicCFMetaData + >; + + public userProvidedService: StratosBaseCatalogEntity< + IBasicCFMetaData, + APIResource, + UserProvidedServiceActionBuilder + >; +} + +export const cfEntityCatalog: CfEntityCatalog = new CfEntityCatalog(); diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts index 6515d83753..98cb1f0234 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts @@ -124,9 +124,10 @@ const ServiceBindingsSchema = new CFServiceBindingEntitySchema({ app: new CFApplicationEntitySchema(), service_instance: new CFServiceInstanceEntitySchema({ entity: { - service_bindings: [new CFEntitySchema(serviceBindingEntityType, { - app: new CFApplicationEntitySchema(), - }, { idAttribute: getAPIResourceGuid })], + service_bindings: [ + new CFEntitySchema(serviceBindingEntityType, { + app: new CFApplicationEntitySchema(), + }, { idAttribute: getAPIResourceGuid })], service: new CFEntitySchema(serviceEntityType, {}, { idAttribute: getAPIResourceGuid }), service_plan: ServicePlanSchema, }, @@ -199,24 +200,24 @@ const CFUserSchema = new CFUserEntitySchema({ audited_spaces: [createUserOrgSpaceSchema(spaceEntityType, {}, CfUserRoleParams.AUDITED_SPACES)], } }, { - idAttribute: getAPIResourceGuid, - processStrategy: (user: APIResource) => { - if (user.entity.username) { - return user; - } - const entity = { - ...user.entity, - username: user.metadata.guid - }; - - return user.metadata ? { - entity, - metadata: user.metadata - } : { - entity - }; + idAttribute: getAPIResourceGuid, + processStrategy: (user: APIResource) => { + if (user.entity.username) { + return user; } - }); + const entity = { + ...user.entity, + username: user.metadata.guid + }; + + return user.metadata ? { + entity, + metadata: user.metadata + } : { + entity + }; + } +}); entityCache[cfUserEntityType] = CFUserSchema; const coreSpaceSchemaParams = { diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts index 8bd4634a96..16f0adf123 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts @@ -9,9 +9,11 @@ import { IServiceBroker, IServiceInstance, IServicePlan, + IServicePlanVisibility, IUserProvidedServiceInstance, } from '../../core/src/core/cf-api-svc.types'; import { + CfEvent, IApp, IAppSummary, IBuildpack, @@ -34,8 +36,7 @@ import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from '../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition, StratosEndpointExtensionDefinition, @@ -49,7 +50,7 @@ import { selectSessionData } from '../../store/src/reducers/auth.reducer'; import { endpointDisconnectRemoveEntitiesReducer } from '../../store/src/reducers/endpoint-disconnect-application.reducer'; import { APIResource } from '../../store/src/types/api.types'; import { PaginatedAction } from '../../store/src/types/pagination.types'; -import { IFavoriteMetadata } from '../../store/src/types/user-favorites.types'; +import { cfEntityCatalog } from './cf-entity-catalog'; import { cfEntityFactory } from './cf-entity-factory'; import { addCfQParams, addCfRelationParams } from './cf-entity-relations.getters'; import { @@ -90,41 +91,72 @@ import { import { CfErrorResponse, getCfError } from './cf-error-helpers'; import { IAppFavMetadata, IBasicCFMetaData, IOrgFavMetadata, ISpaceFavMetadata } from './cf-metadata-types'; import { CF_ENDPOINT_TYPE } from './cf-types'; -import { appEnvVarActionBuilders } from './entity-action-builders/application-env-var.action-builders'; -import { appStatsActionBuilders } from './entity-action-builders/application-stats.action-builders'; -import { appSummaryActionBuilders } from './entity-action-builders/application-summary.action-builders'; -import { applicationActionBuilder } from './entity-action-builders/application.action-builders'; -import { buildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; -import { cfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; +import { + AppEnvVarActionBuilders, + appEnvVarActionBuilders, +} from './entity-action-builders/application-env-var.action-builders'; +import { AppStatsActionBuilders, appStatsActionBuilders } from './entity-action-builders/application-stats.action-builders'; +import { + AppSummaryActionBuilders, + appSummaryActionBuilders, +} from './entity-action-builders/application-summary.action-builders'; +import { applicationActionBuilder, ApplicationActionBuilders } from './entity-action-builders/application.action-builders'; +import { BuildpackActionBuilders, buildpackActionBuilders } from './entity-action-builders/buildpack.action-builders'; +import { CfEventActionBuilders, cfEventActionBuilders } from './entity-action-builders/cf-event.action-builders'; import { CfInfoDefinitionActionBuilders, cfInfoDefinitionActionBuilders, } from './entity-action-builders/cf-info.action-builders'; -import { domainActionBuilders } from './entity-action-builders/domin.action-builder'; -import { featureFlagActionBuilders } from './entity-action-builders/feature-flag.action-builder'; +import { DomainActionBuilders, domainActionBuilders } from './entity-action-builders/domin.action-builder'; +import { FeatureFlagActionBuilders, featureFlagActionBuilders } from './entity-action-builders/feature-flag.action-builder'; import { GitBranchActionBuilders, gitBranchActionBuilders, GitCommitActionBuilders, gitCommitActionBuilders, GitCommitActionBuildersConfig, + GitRepoActionBuilders, gitRepoActionBuilders, } from './entity-action-builders/git-action-builder'; -import { organizationActionBuilders } from './entity-action-builders/organization.action-builders'; -import { quotaDefinitionActionBuilder } from './entity-action-builders/quota-definition.action-builders'; -import { routesActionBuilders } from './entity-action-builders/routes.action-builder'; -import { securityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; -import { serviceBindingActionBuilders } from './entity-action-builders/service-binding.action-builders'; -import { serviceBrokerActionBuilders } from './entity-action-builders/service-broker.entity-builders'; -import { serviceInstanceActionBuilders } from './entity-action-builders/service-instance.action.builders'; -import { servicePlanVisibilityActionBuilders } from './entity-action-builders/service-plan-visibility.action-builders'; -import { servicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; -import { serviceActionBuilders } from './entity-action-builders/service.entity-builders'; -import { spaceQuotaDefinitionActionBuilders } from './entity-action-builders/space-quota.action-builders'; -import { spaceActionBuilders } from './entity-action-builders/space.action-builders'; -import { stackActionBuilders } from './entity-action-builders/stack-action-builders'; -import { userProvidedServiceActionBuilder } from './entity-action-builders/user-provided-service.action-builders'; -import { userActionBuilders } from './entity-action-builders/user.action-builders'; +import { + OrganizationActionBuilders, + organizationActionBuilders, +} from './entity-action-builders/organization.action-builders'; +import { + QuotaDefinitionActionBuilder, + quotaDefinitionActionBuilder, +} from './entity-action-builders/quota-definition.action-builders'; +import { RoutesActionBuilders, routesActionBuilders } from './entity-action-builders/routes.action-builder'; +import { SecurityGroupBuilders, securityGroupBuilders } from './entity-action-builders/security-groups.action-builder'; +import { + ServiceBindingActionBuilders, + serviceBindingActionBuilders, +} from './entity-action-builders/service-binding.action-builders'; +import { + ServiceBrokerActionBuilders, + serviceBrokerActionBuilders, +} from './entity-action-builders/service-broker.entity-builders'; +import { + ServiceInstanceActionBuilders, + serviceInstanceActionBuilders, +} from './entity-action-builders/service-instance.action.builders'; +import { + ServicePlanVisibilityActionBuilders, + servicePlanVisibilityActionBuilders, +} from './entity-action-builders/service-plan-visibility.action-builders'; +import { ServicePlanActionBuilders, servicePlanActionBuilders } from './entity-action-builders/service-plan.action-builders'; +import { ServiceActionBuilders, serviceActionBuilders } from './entity-action-builders/service.entity-builders'; +import { + SpaceQuotaDefinitionActionBuilders, + spaceQuotaDefinitionActionBuilders, +} from './entity-action-builders/space-quota.action-builders'; +import { SpaceActionBuilders, spaceActionBuilders } from './entity-action-builders/space.action-builders'; +import { StackActionBuilders, stackActionBuilders } from './entity-action-builders/stack-action-builders'; +import { + UserProvidedServiceActionBuilder, + userProvidedServiceActionBuilder, +} from './entity-action-builders/user-provided-service.action-builders'; +import { UserActionBuilders, userActionBuilders } from './entity-action-builders/user.action-builders'; import { CfEndpointDetailsComponent } from './shared/components/cf-endpoint-details/cf-endpoint-details.component'; import { updateApplicationRoutesReducer } from './store/reducers/application-route.reducer'; import { updateOrganizationQuotaReducer } from './store/reducers/organization-quota.reducer'; @@ -139,15 +171,20 @@ import { GitBranch, GitCommit, GitRepo } from './store/types/git.types'; import { CfUser } from './store/types/user.types'; export interface CFBasePipelineRequestActionMeta { + /** + * Define a set of children that a cf entity should have, for instance organisation --> space, application --> space --> organisation + */ includeRelations?: string[]; + /** + * If relations, as described in `includeRelations` are missing, should they be fetched? + */ populateMissing?: boolean; + /** + * Only applicable to collections + */ flatten?: boolean; } -export function registerCFEntities() { - generateCFEntities().forEach(entity => entityCatalog.register(entity)); -} - export function generateCFEntities(): StratosBaseCatalogEntity[] { const endpointDefinition: StratosEndpointExtensionDefinition = { urlValidationRegexString: urlValidationExpression, @@ -286,12 +323,17 @@ function generateCFQuotaDefinitionEntity(endpointDefinition: StratosEndpointExte schema: cfEntityFactory(quotaDefinitionEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.quotaDefinition = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + QuotaDefinitionActionBuilder + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: quotaDefinitionActionBuilder }); + return cfEntityCatalog.quotaDefinition; } function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -322,7 +364,12 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD }; }, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appEnvVar = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + AppEnvVarActionBuilders, + AppEnvVarActionBuilders + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], @@ -333,8 +380,9 @@ function generateCFAppEnvVarEntity(endpointDefinition: StratosEndpointExtensionD guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, - } + }, }); + return cfEntityCatalog.appEnvVar; } function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -343,7 +391,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension schema: cfEntityFactory(appSummaryEntityType), endpoint: endpointDefinition, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appSummary = new StratosCatalogEntity(definition, { dataReducers: [ updateAppSummaryRoutesReducer, endpointDisconnectRemoveEntitiesReducer() @@ -357,6 +405,7 @@ function generateCFAppSummaryEntity(endpointDefinition: StratosEndpointExtension getGuid: metadata => metadata.guid, } }); + return cfEntityCatalog.appSummary; } function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -365,12 +414,16 @@ function generateCFSpaceQuotaEntity(endpointDefinition: StratosEndpointExtension schema: cfEntityFactory(spaceQuotaEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: spaceQuotaDefinitionActionBuilders - }); + cfEntityCatalog.spaceQuota = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + SpaceQuotaDefinitionActionBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: spaceQuotaDefinitionActionBuilders + }); + return cfEntityCatalog.spaceQuota; } function generateCFPrivateDomainEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -379,11 +432,12 @@ function generateCFPrivateDomainEntity(endpointDefinition: StratosEndpointExtens schema: cfEntityFactory(privateDomainsEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.privateDomain = new StratosCatalogEntity>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], }); + return cfEntityCatalog.privateDomain; } function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -394,7 +448,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Cloud Foundry Infos', endpoint: endpointDefinition }; - return new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( + cfEntityCatalog.cfInfo = new StratosCatalogEntity, CfInfoDefinitionActionBuilders>( cfInfoDefinition, { dataReducers: [ @@ -410,6 +464,7 @@ function generateCFInfoEntity(endpointDefinition: StratosEndpointExtensionDefini } } ); + return cfEntityCatalog.cfInfo; } function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -420,7 +475,11 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos labelPlural: 'User Provided Service Instances', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.userProvidedService = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + UserProvidedServiceActionBuilder + >( definition, { actionBuilders: userProvidedServiceActionBuilder, @@ -430,12 +489,14 @@ function generateCFUserProvidedServiceInstanceEntity(endpointDefinition: Stratos ], entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid, }), getGuid: metadata => metadata.guid, - } + }, } ); + return cfEntityCatalog.userProvidedService; } function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -470,18 +531,20 @@ function generateCFAppStatsEntity(endpointDefinition: StratosEndpointExtensionDe return data; }, }; - return new StratosCatalogEntity(definition, { + cfEntityCatalog.appStats = new StratosCatalogEntity(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: appStatsActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.guid + name: ent.guid, + guid: ent.guid }), getGuid: metadata => metadata.name, } }); + return cfEntityCatalog.appStats; } function generateCFBuildPackEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -490,12 +553,13 @@ function generateCFBuildPackEntity(endpointDefinition: StratosEndpointExtensionD schema: cfEntityFactory(buildpackEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.buildPack = new StratosCatalogEntity, BuildpackActionBuilders>(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: buildpackActionBuilders }); + return cfEntityCatalog.buildPack; } function generateCFServiceBrokerEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -504,12 +568,16 @@ function generateCFServiceBrokerEntity(endpointDefinition: StratosEndpointExtens schema: cfEntityFactory(serviceBrokerEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: serviceBrokerActionBuilders - }); + cfEntityCatalog.serviceBroker = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBrokerActionBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: serviceBrokerActionBuilders + }); + return cfEntityCatalog.serviceBroker; } function generateCFServicePlanVisibilityEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -518,12 +586,17 @@ function generateCFServicePlanVisibilityEntity(endpointDefinition: StratosEndpoi schema: cfEntityFactory(servicePlanVisibilityEntityType), endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { + cfEntityCatalog.servicePlanVisibility = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanVisibilityActionBuilders + >(definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: servicePlanVisibilityActionBuilders }); + return cfEntityCatalog.servicePlanVisibility; } function generateCFSecurityGroupEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -534,12 +607,16 @@ function generateCFSecurityGroupEntity(endpointDefinition: StratosEndpointExtens labelPlural: 'Security Groups', endpoint: endpointDefinition }; - return new StratosCatalogEntity>(definition, { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: securityGroupBuilders - }); + cfEntityCatalog.securityGroup = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + SecurityGroupBuilders>(definition, { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: securityGroupBuilders + }); + return cfEntityCatalog.securityGroup; } function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -553,7 +630,11 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten labelPlural: 'Service Bindings', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.serviceBinding = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceBindingActionBuilders + >( definition, { dataReducers: [ @@ -562,12 +643,14 @@ function generateCFServiceBindingEntity(endpointDefinition: StratosEndpointExten actionBuilders: serviceBindingActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.metadata.guid + name: ent.metadata.guid, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.serviceBinding; } function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -578,7 +661,11 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef labelPlural: 'Services', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.service = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceActionBuilders + >( definition, { dataReducers: [ @@ -587,12 +674,14 @@ function generateCFServiceEntity(endpointDefinition: StratosEndpointExtensionDef actionBuilders: serviceActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.label + name: ent.entity.label, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, - } + }, } ); + return cfEntityCatalog.service; } function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -603,7 +692,11 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio labelPlural: 'Service Plans', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.servicePlan = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServicePlanActionBuilders + >( definition, { dataReducers: [ @@ -612,12 +705,14 @@ function generateCFServicePlanEntity(endpointDefinition: StratosEndpointExtensio actionBuilders: servicePlanActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.servicePlan; } function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -632,7 +727,11 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte labelPlural: 'Marketplace Service Instances', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.serviceInstance = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + ServiceInstanceActionBuilders + >( definition, { dataReducers: [ @@ -642,12 +741,14 @@ function generateCFServiceInstanceEntity(endpointDefinition: StratosEndpointExte actionBuilders: serviceInstanceActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.serviceInstance; } function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -658,19 +759,21 @@ function generateCFUserEntity(endpointDefinition: StratosEndpointExtensionDefini labelPlural: 'Users', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.user = new StratosCatalogEntity, UserActionBuilders>( definition, { actionBuilders: userActionBuilders, dataReducers: [userReducer, endpointDisconnectUserReducer], entityBuilder: { getMetadata: ent => ({ - name: ent.entity.username || ent.entity.guid || ent.metadata.guid + name: ent.entity.username || ent.entity.guid || ent.metadata.guid, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.user; } function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -681,7 +784,11 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi labelPlural: 'Domains', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.domain = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + DomainActionBuilders + >( definition, { dataReducers: [ @@ -690,12 +797,14 @@ function generateCFDomainEntity(endpointDefinition: StratosEndpointExtensionDefi actionBuilders: domainActionBuilders, entityBuilder: { getMetadata: ent => ({ - name: ent.entity.name + name: ent.entity.name, + guid: ent.metadata.guid }), getGuid: metadata => metadata.guid, } } ); + return cfEntityCatalog.domain; } function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -713,7 +822,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef }; }, }; - return new StratosCatalogEntity( + cfEntityCatalog.gitCommit = new StratosCatalogEntity( definition, { dataReducers: [ @@ -729,6 +838,7 @@ function generateGitCommitEntity(endpointDefinition: StratosEndpointExtensionDef } } ); + return cfEntityCatalog.gitCommit; } function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -739,21 +849,20 @@ function generateGitRepoEntity(endpointDefinition: StratosEndpointExtensionDefin labelPlural: 'Git Repositories', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.gitRepo = new StratosCatalogEntity< + IBasicCFMetaData, + GitRepo, + GitRepoActionBuilders + >( definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: gitRepoActionBuilders, - entityBuilder: { - getMetadata: ent => ({ - name: ent.entity.full_name - }), - getGuid: metadata => metadata.guid, - } } ); + return cfEntityCatalog.gitRepo; } function generateGitBranchEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -764,22 +873,16 @@ function generateGitBranchEntity(endpointDefinition: StratosEndpointExtensionDef labelPlural: 'Git Branches', endpoint: endpointDefinition }; - return new StratosCatalogEntity, GitBranchActionBuilders>( + cfEntityCatalog.gitBranch = new StratosCatalogEntity( definition, { dataReducers: [ endpointDisconnectRemoveEntitiesReducer() ], actionBuilders: gitBranchActionBuilders, - entityBuilder: { - getMetadata: ent => ({ - guid: ent.metadata.guid, - name: ent.metadata.guid, - }), - getGuid: metadata => metadata.guid, - } } ); + return cfEntityCatalog.gitBranch; } function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -790,24 +893,28 @@ function generateEventEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Events', endpoint: endpointDefinition }; - return new StratosCatalogEntity( - definition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: cfEventActionBuilders, - entityBuilder: { - getMetadata: event => { - return { - guid: event.metadata.guid, - name: event.metadata.guid, - }; - }, - getGuid: metadata => metadata.guid, + cfEntityCatalog.event = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + CfEventActionBuilders>( + definition, + { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: cfEventActionBuilders, + entityBuilder: { + getMetadata: event => { + return { + guid: event.metadata.guid, + name: event.metadata.guid, + }; + }, + getGuid: metadata => metadata.guid, + } } - } - ); + ); + return cfEntityCatalog.event; } function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -818,7 +925,11 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Application Routes', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.route = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + RoutesActionBuilders + >( definition, { actionBuilders: routesActionBuilders, @@ -835,6 +946,7 @@ function generateRouteEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.route; } function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -845,7 +957,11 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Stacks', endpoint: endpointDefinition }; - return new StratosCatalogEntity>( + cfEntityCatalog.stack = new StratosCatalogEntity< + IBasicCFMetaData, + APIResource, + StackActionBuilders + >( definition, { dataReducers: [ @@ -861,6 +977,7 @@ function generateStackEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.stack; } function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -890,29 +1007,34 @@ function generateFeatureFlagEntity(endpointDefinition: StratosEndpointExtensionD maxedStateStartAt: () => of(null), } }; - return new StratosCatalogEntity( - featureFlagDefinition, - { - dataReducers: [ - endpointDisconnectRemoveEntitiesReducer() - ], - actionBuilders: featureFlagActionBuilders, - entityBuilder: { - getMetadata: ff => ({ - guid: ff.guid, - name: ff.name, - }), - getGuid: metadata => metadata.guid, + cfEntityCatalog.featureFlag = new StratosCatalogEntity< + IBasicCFMetaData, + IFeatureFlag, + FeatureFlagActionBuilders>( + featureFlagDefinition, + { + dataReducers: [ + endpointDisconnectRemoveEntitiesReducer() + ], + actionBuilders: featureFlagActionBuilders, + entityBuilder: { + getMetadata: ff => ({ + guid: ff.guid, + name: ff.name, + }), + getGuid: metadata => metadata.guid, + } } - } - ); + ); + return cfEntityCatalog.featureFlag; } function generateCfEndpointEntity(endpointDefinition: StratosEndpointExtensionDefinition) { - return new StratosCatalogEndpointEntity( + cfEntityCatalog.cfEndpoint = new StratosCatalogEndpointEntity( endpointDefinition, metadata => `/cloud-foundry/${metadata.guid}` ); + return cfEntityCatalog.cfEndpoint; } function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -930,7 +1052,11 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio } }; - return new StratosCatalogEntity>( + cfEntityCatalog.application = new StratosCatalogEntity< + IAppFavMetadata, + APIResource, + ApplicationActionBuilders + >( applicationDefinition, { dataReducers: [ @@ -953,6 +1079,7 @@ function generateCfApplicationEntity(endpointDefinition: StratosEndpointExtensio actionBuilders: applicationActionBuilder }, ); + return cfEntityCatalog.application; } function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -966,7 +1093,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin labelPlural: 'Spaces', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.space = new StratosCatalogEntity, SpaceActionBuilders>( spaceDefinition, { actionBuilders: spaceActionBuilders, @@ -991,6 +1118,7 @@ function generateCfSpaceEntity(endpointDefinition: StratosEndpointExtensionDefin } } ); + return cfEntityCatalog.space; } function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinition) { @@ -1001,7 +1129,11 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit labelPlural: 'Organizations', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.org = new StratosCatalogEntity< + IOrgFavMetadata, + APIResource, + OrganizationActionBuilders + >( orgDefinition, { actionBuilders: organizationActionBuilders, @@ -1027,6 +1159,7 @@ function generateCfOrgEntity(endpointDefinition: StratosEndpointExtensionDefinit } } ); + return cfEntityCatalog.org; } function getOrgStatus(org: APIResource) { @@ -1044,7 +1177,7 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio labelPlural: 'CF Metrics', endpoint: endpointDefinition, }; - return new StratosCatalogEntity>( + cfEntityCatalog.metric = new StratosCatalogEntity( definition, { dataReducers: [ @@ -1052,4 +1185,5 @@ function generateCFMetrics(endpointDefinition: StratosEndpointExtensionDefinitio ], } ); + return cfEntityCatalog.metric; } diff --git a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts b/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts index 8dd4a54f6d..b8cf91950c 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-relations.getters.ts @@ -1,8 +1,8 @@ import { HttpParams, HttpRequest } from '@angular/common/http'; import { InternalAppState } from '../../store/src/app-state'; -import { StratosBaseCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogEntityConfig } from '../../store/src/entity-catalog/entity-catalog.types'; import { getPaginationParams, diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts index a9406f1e60..212a79c207 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry-test.module.ts @@ -5,7 +5,7 @@ import { EffectsModule } from '@ngrx/effects'; import { generateASEntities } from '../../cf-autoscaler/src/store/autoscaler-entity-generator'; import { generateStratosEntities } from '../../core/src/base-entity-types'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; import { getGitHubAPIURL, GITHUB_API_URL } from '../../core/src/core/github.helpers'; import { LoggerService } from '../../core/src/core/logger.service'; import { GitSCMService } from '../../core/src/shared/data-services/scm/scm.service'; diff --git a/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts b/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts index c37a2f10a3..6584848749 100644 --- a/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts +++ b/src/frontend/packages/cloud-foundry/src/cloud-foundry.module.ts @@ -2,6 +2,9 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MDAppModule } from '../../core/src/core/md.module'; +import { + CloudFoundryUserProvidedServicesService, +} from '../../core/src/shared/services/cloud-foundry-user-provided-services.service'; import { SharedModule } from '../../core/src/shared/shared.module'; import { CfValidateEntitiesStart } from '../../store/src/actions/request.actions'; import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; @@ -83,7 +86,8 @@ function infoValidator(action: ICFAction, dispatcher) { CfUserService, CloudFoundryService, ServiceActionHelperService, - LongRunningCfOperationsService + LongRunningCfOperationsService, + CloudFoundryUserProvidedServicesService ] }) export class CloudFoundryPackageModule { } diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts index 79baa612bd..a52a8cc8fc 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-env-var.action-builders.ts @@ -1,28 +1,50 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppEnvVarsAction } from '../actions/app-metadata.actions'; +import { AppVariablesAdd, AppVariablesDelete, AppVariablesEdit } from '../actions/app-variables.actions'; import { ListAppEnvVar } from '../shared/components/list/list-types/app-variables/cf-app-variables-data-source'; -import { AppVariablesDelete, AppVariablesEdit, AppVariablesAdd } from '../actions/app-variables.actions'; -// App variables are a special case where the entities are actually embedded in an application.s -// This means that most actions are not standard api actions. -export const appEnvVarActionBuilders = { - get: (appGuid, endpointGuid) => new GetAppEnvVarsAction(appGuid, endpointGuid), - removeFromApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], selectedItems: ListAppEnvVar[]) => new AppVariablesDelete( +export interface AppEnvVarActionBuilders extends OrchestratedActionBuilders { + getMultiple: (appGuid, endpointGuid) => GetAppEnvVarsAction; + removeFromApplication: ( + appGuid, endpointGuid, + allEnvVars: ListAppEnvVar[], + selectedItems: ListAppEnvVar[] + ) => AppVariablesDelete; + editInApplication: ( appGuid, - allEnvVars, - selectedItems - ), - editInApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], editedEnvVar: ListAppEnvVar) => new AppVariablesEdit( endpointGuid, + allEnvVars: ListAppEnvVar[], + editedEnvVar: ListAppEnvVar + ) => AppVariablesEdit; + addNewToApplication: ( appGuid, - allEnvVars, - editedEnvVar - ), - addNewToApplication: (appGuid, endpointGuid, allEnvVars: ListAppEnvVar[], newEnvVar: ListAppEnvVar) => new AppVariablesAdd( endpointGuid, + allEnvVars: ListAppEnvVar[], + newEnvVar: ListAppEnvVar + ) => AppVariablesAdd; +} + +// App variables are a special case where the entities are actually embedded in an application +// This means that most actions are not standard api actions. +export const appEnvVarActionBuilders: AppEnvVarActionBuilders = { + getMultiple: (appGuid, endpointGuid) => new GetAppEnvVarsAction(appGuid, endpointGuid), + removeFromApplication: ( appGuid, - allEnvVars, - newEnvVar - ) -} as OrchestratedActionBuilders; + endpointGuid, + allEnvVars: ListAppEnvVar[], + selectedItems: ListAppEnvVar[] + ) => new AppVariablesDelete(endpointGuid, appGuid, allEnvVars, selectedItems), + editInApplication: ( + appGuid, + endpointGuid, + allEnvVars: ListAppEnvVar[], + editedEnvVar: ListAppEnvVar + ) => new AppVariablesEdit(endpointGuid, appGuid, allEnvVars, editedEnvVar), + addNewToApplication: ( + appGuid, + endpointGuid, + allEnvVars: ListAppEnvVar[], + newEnvVar: ListAppEnvVar + ) => new AppVariablesAdd(endpointGuid, appGuid, allEnvVars, newEnvVar) +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts index edbfe2b26f..44d485252a 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-stats.action-builders.ts @@ -1,6 +1,10 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppStatsAction } from '../actions/app-metadata.actions'; -export const appStatsActionBuilders = { - get: (appGuid, endpointGuid) => new GetAppStatsAction(appGuid, endpointGuid) -} as OrchestratedActionBuilders; +export interface AppStatsActionBuilders extends OrchestratedActionBuilders { + getMultiple: (appGuid, endpointGuid) => GetAppStatsAction; +}; + +export const appStatsActionBuilders: AppStatsActionBuilders = { + getMultiple: (appGuid, endpointGuid) => new GetAppStatsAction(appGuid, endpointGuid) +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts index ae90916f50..b62bb28c1c 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application-summary.action-builders.ts @@ -1,6 +1,10 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppSummaryAction } from '../actions/app-metadata.actions'; -export const appSummaryActionBuilders = { +export interface AppSummaryActionBuilders extends OrchestratedActionBuilders { + get: (appGuid, endpointGuid) => GetAppSummaryAction; +} + +export const appSummaryActionBuilders: AppSummaryActionBuilders = { get: (appGuid, endpointGuid) => new GetAppSummaryAction(appGuid, endpointGuid) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts index 7cd8457d40..f24837eca3 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/application.action-builders.ts @@ -1,4 +1,5 @@ import { IApp } from '../../../core/src/core/cf-api.types'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { AppMetadataTypes } from '../actions/app-metadata.actions'; import { AssignRouteToApplication } from '../actions/application-service-routes.actions'; import { @@ -12,9 +13,27 @@ import { } from '../actions/application.actions'; import { GetAllAppsInSpace } from '../actions/space.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface ApplicationActionBuilders extends CFOrchestratedActionBuilders { +export interface ApplicationActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetApplication; + remove: (guid: string, endpointGuid: string) => DeleteApplication; + create: (id: string, endpointGuid: string, application: IApp) => CreateNewApplication; + update: ( + guid: string, + endpointGuid: string, + updatedApplication: UpdateApplication, + existingApplication?: IApp, + updateEntities?: AppMetadataTypes[] + ) => UpdateExistingApplication; + getMultiple: ( + endpointGuid: string, + paginationKey?: string, + { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta + ) => GetAllApplications; restage: (guid: string, endpointGuid: string) => RestageApplication; assignRoute: (endpointGuid: string, routeGuid: string, applicationGuid: string) => AssignRouteToApplication; getAllInSpace: ( @@ -44,7 +63,7 @@ export const applicationActionBuilder: ApplicationActionBuilders = { ) => new UpdateExistingApplication(guid, endpointGuid, updatedApplication, existingApplication, updateEntities), getMultiple: ( endpointGuid: string, - paginationKey: string, + paginationKey?: string, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetAllApplications(paginationKey, endpointGuid, includeRelations, populateMissing), restage: (guid: string, endpointGuid: string) => new RestageApplication(guid, endpointGuid), diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts index d75e557608..9c205cbdf8 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/buildpack.action-builders.ts @@ -1,11 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { FetchAllBuildpacks } from '../actions/buildpack.action'; -export const buildpackActionBuilders = { +export interface BuildpackActionBuilders extends OrchestratedActionBuilders { getMultiple: ( endpointGuid, paginationKey, - ) => new FetchAllBuildpacks(endpointGuid, paginationKey) -} as OrchestratedActionBuilders; - + ) => FetchAllBuildpacks; +} +export const buildpackActionBuilders: BuildpackActionBuilders = { + getMultiple: ( + endpointGuid, + paginationKey, + ) => new FetchAllBuildpacks(endpointGuid, paginationKey) +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts index 95f6dede86..86a6efea47 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf-info.action-builders.ts @@ -1,7 +1,7 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetCFInfo } from '../actions/cloud-foundry.actions'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface CfInfoDefinitionActionBuilders extends CFOrchestratedActionBuilders { +export interface CfInfoDefinitionActionBuilders extends OrchestratedActionBuilders { get: (cfGuid: string) => GetCFInfo; } diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts deleted file mode 100644 index 2f3ca87cfa..0000000000 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/cf.action-builder.types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { PaginatedAction } from '../../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../../store/src/types/request.types'; -import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; - -export interface CFOrchestratedActionBuilders extends OrchestratedActionBuilders { - get?( - guid: string, - endpointGuid: string, - meta: CFBasePipelineRequestActionMeta - ): EntityRequestAction; - getMultiple?( - paginationKey: string, - endpointGuid: string, - meta: CFBasePipelineRequestActionMeta - ): PaginatedAction; -} diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts index 6866da3d44..03dc4fcc43 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/domin.action-builder.ts @@ -1,8 +1,27 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { FetchAllDomains, FetchDomain } from '../actions/domains.actions'; +import { GetAllOrganizationDomains } from '../actions/organization.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const domainActionBuilders = { +export interface DomainActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid + ) => FetchDomain; + getMultiple: ( + endpointGuid, + paginationKey, + { flatten }: CFBasePipelineRequestActionMeta + ) => FetchAllDomains; + getOrganizationDomains: ( + orgGuid: string, + endpointGuid: string, + paginationKey?: string, + meta?: CFBasePipelineRequestActionMeta + ) => GetAllOrganizationDomains; +}; + +export const domainActionBuilders: DomainActionBuilders = { get: ( guid, endpointGuid @@ -13,7 +32,16 @@ export const domainActionBuilders = { endpointGuid, paginationKey, { flatten }: CFBasePipelineRequestActionMeta = {} - ) => new FetchAllDomains(endpointGuid, paginationKey, flatten) -} as OrchestratedActionBuilders; + ) => new FetchAllDomains(endpointGuid, paginationKey, flatten), + getOrganizationDomains: ( + orgGuid: string, + endpointGuid: string, + paginationKey: string = null, + meta: CFBasePipelineRequestActionMeta = { + includeRelations: [], + populateMissing: true + } + ) => new GetAllOrganizationDomains(orgGuid, endpointGuid, paginationKey, meta.includeRelations, meta.populateMissing) +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts index d594d9c851..65e4d1030b 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/feature-flag.action-builder.ts @@ -1,9 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllFeatureFlags } from '../actions/feature-flags.actions'; -export const featureFlagActionBuilders = { +export interface FeatureFlagActionBuilders extends OrchestratedActionBuilders { getMultiple: ( endpointGuid, - paginationKey, + paginationKey?, + ) => GetAllFeatureFlags; +}; + +export const featureFlagActionBuilders: FeatureFlagActionBuilders = { + getMultiple: ( + endpointGuid, + paginationKey?, ) => new GetAllFeatureFlags(endpointGuid, paginationKey) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts index a99f04df18..936439cdd8 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/git-action-builder.ts @@ -5,28 +5,26 @@ import { OrchestratedActionBuilderConfig, OrchestratedActionBuilders, } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; -import { FetchBranchesForProject, FetchCommits } from '../actions/deploy-applications.actions'; +import { FetchBranchesForProject, FetchBranchForProject, FetchCommits } from '../actions/deploy-applications.actions'; import { FetchGitHubRepoInfo } from '../actions/github.actions'; -import { - EnvVarStratosProject, -} from '../features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service'; export interface GitRepoActionBuilders extends OrchestratedActionBuilders { getRepoInfo: ( - projectEnvVars: EnvVarStratosProject + meta: GitMeta ) => FetchGitHubRepoInfo; } export const gitRepoActionBuilders: GitRepoActionBuilders = { getRepoInfo: ( - projectEnvVars: EnvVarStratosProject - ) => new FetchGitHubRepoInfo(projectEnvVars) + meta: GitMeta + ) => new FetchGitHubRepoInfo(meta) }; export interface GitMeta { projectName: string; - scm: GitSCM; + scm: GitSCM; // FIXME: Remove from action, see #4245 commitSha?: string; + branchName?: string; } export interface GitCommitActionBuildersConfig extends OrchestratedActionBuilderConfig { @@ -54,13 +52,33 @@ export const gitCommitActionBuilders: GitCommitActionBuildersConfig = { }; export interface GitBranchActionBuilders extends OrchestratedActionBuilders { - get: (projectName: string, endpointGuid: string, meta: GitMeta) => FetchBranchesForProject; + /** + * guid & endpointGuid are optional + */ + get: ( + guid: string, + endpointId: string, + meta: GitMeta + ) => FetchBranchForProject; + /** + * endpointGuid & paginationKey are optional + */ + getMultiple: ( + endpointGuid: string, + paginationKey: string, + meta: GitMeta + ) => FetchBranchesForProject; } export const gitBranchActionBuilders: GitBranchActionBuilders = { get: ( guid: string, - endpointGuid: string, + endpointId: string, meta: GitMeta + ) => new FetchBranchForProject(meta.scm, meta.projectName, guid, meta.branchName), + getMultiple: ( + endpointGuid: string = null, + paginationKey: string = null, + meta?: GitMeta ) => new FetchBranchesForProject(meta.scm, meta.projectName) }; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts index ed7b3c364f..07f8d28d7d 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/organization.action-builders.ts @@ -1,4 +1,5 @@ import { IUpdateOrganization } from '../../../core/src/core/cf-api.types'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { DeleteOrganization, GetAllOrganizations, @@ -6,9 +7,8 @@ import { UpdateOrganization, } from '../actions/organization.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface OrganizationActionBuilders extends CFOrchestratedActionBuilders { +export interface OrganizationActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts index 20f6360368..d8508b1274 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/quota-definition.action-builders.ts @@ -1,16 +1,21 @@ -import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { QuotaFormValues, } from '../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { CreateQuotaDefinition, - GetOrganizationSpaceQuotaDefinitions, + GetQuotaDefinition, GetQuotaDefinitions, UpdateQuotaDefinition, } from '../actions/quota-definitions.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; export interface QuotaDefinitionActionBuilder extends OrchestratedActionBuilders { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetQuotaDefinition; create: ( id: string, endpointGuid: string, @@ -26,16 +31,14 @@ export interface QuotaDefinitionActionBuilder extends OrchestratedActionBuilders endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetQuotaDefinitions; - getOrganizationSpaceQuotaDefinitions: ( - orgGuid: string, - paginationKey: string, - endpointGuid: string, - includeRelations: string[], - populateMissing - ) => GetOrganizationSpaceQuotaDefinitions; } export const quotaDefinitionActionBuilder: QuotaDefinitionActionBuilder = { + get: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => new GetQuotaDefinition(guid, endpointGuid, includeRelations, populateMissing), create: ( id: string, endpointGuid: string, @@ -51,22 +54,5 @@ export const quotaDefinitionActionBuilder: QuotaDefinitionActionBuilder = { endpointGuid: string, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetQuotaDefinitions(paginationKey, endpointGuid, includeRelations, populateMissing), - // associateSpaceQuota: ( - // spaceGuid: string, - // endpointGuid: string, - // spaceQuotaGuid: string - // ) => new AssociateSpaceQuota(spaceGuid, endpointGuid, spaceQuotaGuid), - // disassociateSpaceQuota: ( - // spaceGuid: string, - // endpointGuid: string, - // spaceQuotaGuid: string - // ) => new DisassociateSpaceQuota(spaceGuid, endpointGuid, spaceQuotaGuid), - getOrganizationSpaceQuotaDefinitions: ( - orgGuid: string, - paginationKey: string, - endpointGuid: string, - includeRelations: string[] = [], - populateMissing = true - ) => new GetOrganizationSpaceQuotaDefinitions(paginationKey, orgGuid, endpointGuid, includeRelations, populateMissing) }; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts index 26db5d869d..9b03e09ee8 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/security-groups.action-builder.ts @@ -3,7 +3,19 @@ import { FetchDomain } from '../actions/domains.actions'; import { GetAllSecurityGroups } from '../actions/security-groups-actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const securityGroupBuilders = { +export interface SecurityGroupBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid + ) => FetchDomain; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, flatten }: CFBasePipelineRequestActionMeta + ) => GetAllSecurityGroups; +} + +export const securityGroupBuilders: SecurityGroupBuilders = { get: ( guid, endpointGuid @@ -13,6 +25,4 @@ export const securityGroupBuilders = { paginationKey, { includeRelations, flatten }: CFBasePipelineRequestActionMeta = {} ) => new GetAllSecurityGroups(endpointGuid, paginationKey, includeRelations, flatten) -} as OrchestratedActionBuilders; - - +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts index c99496497d..6315ac9595 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-binding.action-builders.ts @@ -1,10 +1,10 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAppServiceBindings } from '../actions/application-service-routes.actions'; import { CreateServiceBinding, DeleteServiceBinding, FetchAllServiceBindings } from '../actions/service-bindings.actions'; import { ListServiceBindingsForInstance } from '../actions/service-instances.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface ServiceBindingActionBuilders extends CFOrchestratedActionBuilders { +export interface ServiceBindingActionBuilders extends OrchestratedActionBuilders { create: ( id: string, endpointGuid: string, @@ -54,7 +54,7 @@ export const serviceBindingActionBuilders: ServiceBindingActionBuilders = { getMultiple: ( endpointGuid, paginationKey, - { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {}, ) => new FetchAllServiceBindings( endpointGuid, paginationKey, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts index 1be4c4e76e..bce9105cff 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-broker.entity-builders.ts @@ -2,7 +2,20 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/ac import { GetServiceBroker, GetServiceBrokers } from '../actions/service-broker.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const serviceBrokerActionBuilders = { +export interface ServiceBrokerActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServiceBroker; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServiceBrokers; +} + +export const serviceBrokerActionBuilders: ServiceBrokerActionBuilders = { get: ( guid, endpointGuid, @@ -18,4 +31,4 @@ export const serviceBrokerActionBuilders = { paginationKey, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetServiceBrokers(endpointGuid, paginationKey, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts index 11e42a0533..473139f63e 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-instance.action.builders.ts @@ -1,3 +1,4 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { CreateServiceInstance, DeleteServiceInstance, @@ -8,7 +9,6 @@ import { import { GetServicePlanServiceInstances } from '../actions/service-plan.actions'; import { GetServiceInstancesForSpace } from '../actions/space.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; export interface CreateUpdateActionMeta { name: string; @@ -18,7 +18,7 @@ export interface CreateUpdateActionMeta { tags: string[]; } -export interface ServiceInstanceActionBuilders extends CFOrchestratedActionBuilders { +export interface ServiceInstanceActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts index 1bf3f31d27..fec17c28d2 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan-visibility.action-builders.ts @@ -2,10 +2,18 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/ac import { GetServicePlanVisibilities } from '../actions/service-plan-visibility.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const servicePlanVisibilityActionBuilders = { +export interface ServicePlanVisibilityActionBuilders extends OrchestratedActionBuilders { + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetServicePlanVisibilities; +}; + +export const servicePlanVisibilityActionBuilders: ServicePlanVisibilityActionBuilders = { getMultiple: ( endpointGuid, paginationKey, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetServicePlanVisibilities(endpointGuid, paginationKey, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts index fea755bb8a..e4b8391296 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service-plan.action-builders.ts @@ -1,7 +1,16 @@ import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetServicePlansForService } from '../actions/service.actions'; -export const servicePlanActionBuilders = { +export interface ServicePlanActionBuilders extends OrchestratedActionBuilders { + getAllForServiceInstance: ( + serviceGuid: string, + endpointGuid: string, + paginationKey: string, + includeRelations?: string[] + ) => GetServicePlansForService +}; + +export const servicePlanActionBuilders: ServicePlanActionBuilders = { getAllForServiceInstance: ( serviceGuid: string, endpointGuid: string, @@ -13,4 +22,4 @@ export const servicePlanActionBuilders = { paginationKey, includeRelations ) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts index 5f4ada929a..158f6c9c99 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/service.entity-builders.ts @@ -3,7 +3,27 @@ import { GetAllServices, GetService } from '../actions/service.actions'; import { GetAllServicesForSpace } from '../actions/space.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -export const serviceActionBuilders = { +export interface ServiceActionBuilders extends OrchestratedActionBuilders { + get: ( + guid, + endpointGuid, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetService; + getMultiple: ( + endpointGuid, + paginationKey, + { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta + ) => GetAllServices; + getAllInSpace: ( + endpointGuid: string, + paginationKey: string, + spaceGuid: string, + includeRelations?: string[], + populateMissing?: boolean, + ) => GetAllServicesForSpace; +} + +export const serviceActionBuilders: ServiceActionBuilders = { get: ( guid, endpointGuid, @@ -26,4 +46,4 @@ export const serviceActionBuilders = { includeRelations?: string[], populateMissing?: boolean, ) => new GetAllServicesForSpace(paginationKey, endpointGuid, spaceGuid, includeRelations, populateMissing) -} as OrchestratedActionBuilders; +}; diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts index 8566696b38..ffd1b134c7 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space-quota.action-builders.ts @@ -1,7 +1,7 @@ -import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { QuotaFormValues, } from '../../../core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component'; +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { AssociateSpaceQuota, CreateSpaceQuotaDefinition, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts index 6439af8730..e6983ad135 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/space.action-builders.ts @@ -2,7 +2,10 @@ import { IUpdateSpace } from '../../../core/src/core/cf-api.types'; import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllOrganizationSpaces } from '../actions/organization.actions'; import { CreateSpace, DeleteSpace, GetAllSpaces, GetSpace, UpdateSpace } from '../actions/space.actions'; +import { cfEntityFactory } from '../cf-entity-factory'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; +import { organizationEntityType, spaceEntityType, spaceWithOrgEntityType } from '../cf-entity-types'; +import { createEntityRelationKey } from '../entity-relations/entity-relations.types'; export interface SpaceActionBuilders extends OrchestratedActionBuilders { get: ( @@ -10,6 +13,11 @@ export interface SpaceActionBuilders extends OrchestratedActionBuilders { endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetSpace; + getWithOrganization: ( + guid: string, + endpointGuid: string, + { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta + ) => GetSpace; remove: ( guid: string, endpointGuid: string, @@ -49,6 +57,24 @@ export const spaceActionBuilders: SpaceActionBuilders = { includeRelations, populateMissing ), + getWithOrganization: ( + guid: string, + endpointGuid: string, + { + includeRelations = [createEntityRelationKey(spaceEntityType, organizationEntityType)], + populateMissing + }: CFBasePipelineRequestActionMeta = {} + ) => { + const action = new GetSpace( + guid, + endpointGuid, + includeRelations || [], + populateMissing + ) + action.entity = [cfEntityFactory(spaceWithOrgEntityType)]; + action.schemaKey = spaceWithOrgEntityType + return action; + }, remove: ( guid, endpointGuid, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts index 4523c78611..e56dd9de38 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/stack-action-builders.ts @@ -1,7 +1,7 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllStacks, GetStack } from '../actions/stack.action'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface StackActionBuilders extends CFOrchestratedActionBuilders { +export interface StackActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts index 01b911c1ad..3ca122c4ff 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user-provided-service.action-builders.ts @@ -1,21 +1,32 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; -import { DeleteApplication } from '../actions/application.actions'; import { + CreateUserProvidedServiceInstance, + DeleteUserProvidedInstance, GetAllUserProvidedServices, GetUserProvidedService, IUserProvidedServiceInstanceData, UpdateUserProvidedServiceInstance, } from '../actions/user-provided-service.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface UserProvidedServiceActionBuilder extends CFOrchestratedActionBuilders { + +export interface UserProvidedServiceActionBuilder extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string, { includeRelations, populateMissing }?: CFBasePipelineRequestActionMeta ) => GetUserProvidedService; - remove: (guid: string, endpointGuid: string) => DeleteApplication; + create: ( + endpointGuid: string, + guid: string, + data: IUserProvidedServiceInstanceData, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => CreateUserProvidedServiceInstance, + remove: ( + guid: string, + endpointGuid: string, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig + ) => DeleteUserProvidedInstance; update: ( guid: string, endpointGuid: string, @@ -42,7 +53,17 @@ export const userProvidedServiceActionBuilder: UserProvidedServiceActionBuilder endpointGuid, { includeRelations, populateMissing }: CFBasePipelineRequestActionMeta = {} ) => new GetUserProvidedService(guid, endpointGuid, includeRelations, populateMissing), - remove: (guid: string, endpointGuid: string) => new DeleteApplication(guid, endpointGuid), + remove: ( + guid: string, + endpointGuid: string, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig + ) => new DeleteUserProvidedInstance(endpointGuid, guid, proxyPaginationEntityConfig), + create: ( + endpointGuid: string, + guid: string, + data: IUserProvidedServiceInstanceData, + proxyPaginationEntityConfig?: EntityCatalogEntityConfig) => + new CreateUserProvidedServiceInstance(endpointGuid, guid, data, proxyPaginationEntityConfig), update: ( guid: string, endpointGuid: string, @@ -67,5 +88,3 @@ export const userProvidedServiceActionBuilder: UserProvidedServiceActionBuilder populateMissing?: boolean, ) => new GetAllUserProvidedServices(paginationKey, endpointGuid, includeRelations, populateMissing, spaceGuid) }; - - diff --git a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts index a580331699..174a9105a0 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-action-builders/user.action-builders.ts @@ -1,10 +1,10 @@ +import { OrchestratedActionBuilders } from '../../../store/src/entity-catalog/action-orchestrator/action-orchestrator'; import { GetAllOrgUsers } from '../actions/organization.actions'; import { GetAllSpaceUsers } from '../actions/space.actions'; import { GetAllUsersAsAdmin, GetUser } from '../actions/users.actions'; import { CFBasePipelineRequestActionMeta } from '../cf-entity-generator'; -import { CFOrchestratedActionBuilders } from './cf.action-builder.types'; -export interface UserActionBuilders extends CFOrchestratedActionBuilders { +export interface UserActionBuilders extends OrchestratedActionBuilders { get: ( guid: string, endpointGuid: string @@ -56,5 +56,4 @@ export const userActionBuilders: UserActionBuilders = { isAdmin: boolean, includeRelations?: string[] ) => new GetAllSpaceUsers(guid, paginationKey, endpointGuid, isAdmin, includeRelations), - }; diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts deleted file mode 100644 index d45bf6e8ee..0000000000 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.helpers.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { ActionState } from '../../../store/src/reducers/api-request-reducer/types'; -import { selectPaginationState } from '../../../store/src/selectors/pagination.selectors'; -import { PaginatedAction, PaginationEntityState } from '../../../store/src/types/pagination.types'; -import { ValidateResultFetchingState } from './entity-relations.types'; - -export function createValidationPaginationWatcher(store, paramPaginationAction: PaginatedAction): - Observable { - return store.select(selectPaginationState(entityCatalog.getEntityKey(paramPaginationAction), paramPaginationAction.paginationKey)).pipe( - map((paginationState: PaginationEntityState) => { - const pageRequest: ActionState = - paginationState && paginationState.pageRequests && paginationState.pageRequests[paginationState.currentPage]; - return { fetching: pageRequest ? pageRequest.busy : true }; - }) - ); -} diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts index a36a993c30..72077db071 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relation-tree.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; /** diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts index 7ddbb0378b..b17c5d4bfa 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-from-parent.spec.ts @@ -7,7 +7,7 @@ import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES, } from '../../../store/src/entity-catalog-test.module'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { createBasicStoreModule, diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts index dee44881df..7c6d7e0b99 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations-validate.spec.ts @@ -5,7 +5,7 @@ import { EntityCatalogTestModuleManualStore, TEST_CATALOGUE_ENTITIES, } from '../../../store/src/entity-catalog-test.module'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../store/src/entity-catalog/entity-catalog.types'; import { environment } from '../../../core/src/environments/environment'; import { diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts index d24fc0c48f..2bbdf819b2 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/entity-relations.ts @@ -8,7 +8,7 @@ import { environment } from '../../../core/src/environments/environment'; import { SetInitialParams } from '../../../store/src/actions/pagination.actions'; import { APIResponse } from '../../../store/src/actions/request.actions'; import { GeneralEntityAppState } from '../../../store/src/app-state'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { isEntityBlocked } from '../../../store/src/entity-service'; import { EntitySchema } from '../../../store/src/helpers/entity-schema'; import { pick } from '../../../store/src/helpers/reducer.helper'; @@ -24,7 +24,6 @@ import { } from '../../../store/src/types/request.types'; import { FetchRelationAction, FetchRelationPaginatedAction, FetchRelationSingleAction } from '../actions/relation.actions'; import { EntityTreeRelation } from './entity-relation-tree'; -import { createValidationPaginationWatcher } from './entity-relation-tree.helpers'; import { validationPostProcessor } from './entity-relations-post-processor'; import { fetchEntityTree } from './entity-relations.tree'; import { @@ -144,6 +143,16 @@ function createActionsForExistingEntities(config: HandleRelationsConfig): Action ); } +function createValidationPaginationWatcher(store, paramPaginationAction: PaginatedAction): + Observable { + return store.select(selectPaginationState(entityCatalog.getEntityKey(paramPaginationAction), paramPaginationAction.paginationKey)).pipe( + map((paginationState: PaginationEntityState) => { + const pageRequest = paginationState && paginationState.pageRequests && paginationState.pageRequests[paginationState.currentPage]; + return { fetching: pageRequest ? pageRequest.busy : true }; + }) + ); +} + /** * Create actions required to fetch missing relations */ diff --git a/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts b/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts index ff93962667..557e5ef776 100644 --- a/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts +++ b/src/frontend/packages/cloud-foundry/src/entity-relations/processors/org-space-post-processor.ts @@ -3,7 +3,7 @@ import { map } from 'rxjs/operators'; import { APIResponse } from '../../../../store/src/actions/request.actions'; import { GeneralEntityAppState, GeneralRequestDataState, IRequestEntityTypeState } from '../../../../store/src/app-state'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { deepMergeState, mergeEntity } from '../../../../store/src/helpers/reducer.helper'; import { selectPaginationState } from '../../../../store/src/selectors/pagination.selectors'; import { APIResource } from '../../../../store/src/types/api.types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts index 41846a8b01..f5210fadd0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/application-delete.component.ts @@ -4,7 +4,6 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, ReplaySubject } from 'rxjs'; import { filter, first, map, pairwise, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; -import { DeleteUserProvidedInstance } from '../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { applicationEntityType, routeEntityType, @@ -19,15 +18,14 @@ import { import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EntityMonitor } from '../../../../../store/src/monitors/entity-monitor'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { PaginationMonitor } from '../../../../../store/src/monitors/pagination-monitor'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; +import { RequestInfoState } from '../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { RoutesActionBuilders } from '../../../entity-action-builders/routes.action-builder'; import { CfAppRoutesListConfigService, } from '../../../shared/components/list/list-types/app-route/cf-app-routes-list-config.service'; @@ -172,7 +170,6 @@ export class ApplicationDeleteComponent { private store: Store, private applicationService: ApplicationService, private paginationMonitorFactory: PaginationMonitorFactory, - private entityMonitorFactory: EntityMonitorFactory, private datePipe: DatePipe ) { this.setupAppMonitor(); @@ -204,10 +201,7 @@ export class ApplicationDeleteComponent { startWith(true) ); - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('get'); - const getApplicationAction = actionBuilder(applicationService.appGuid, applicationService.cfGuid); - this.store.dispatch(getApplicationAction); + cfEntityCatalog.application.api.get(applicationService.appGuid, applicationService.cfGuid, {}); } private setupAppMonitor() { @@ -223,46 +217,28 @@ export class ApplicationDeleteComponent { } public getApplicationMonitor() { - return this.entityMonitorFactory.create>( - this.applicationService.appGuid, - { - entityType: applicationEntityType, - endpointType: CF_ENDPOINT_TYPE - } - ); + return cfEntityCatalog.application.store.getEntityMonitor(this.applicationService.appGuid); } + /** * Builds the related entities actions and monitors to monitor the state of the entities. */ public buildRelatedEntitiesActionMonitors() { const { appGuid, cfGuid } = this.applicationService; const instanceAction = AppServiceBindingDataSource.createGetAllServiceBindings(appGuid, cfGuid); - - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const routesAction = actionBuilder(appGuid, cfGuid); - - const instancePaginationKey = instanceAction.paginationKey; - const routesPaginationKey = routesAction.paginationKey; - const instanceMonitor = this.paginationMonitorFactory.create>( - instancePaginationKey, + instanceAction.paginationKey, instanceAction.entity[0], instanceAction.flattenPagination ); - const routeMonitor = this.paginationMonitorFactory.create>( - routesPaginationKey, - routesAction.entity[0], - routesAction.flattenPagination - ); return { fetch: () => { this.store.dispatch(instanceAction); - this.store.dispatch(routesAction); + cfEntityCatalog.route.api.getAllForApplication(appGuid, cfGuid); }, monitors: { instanceMonitor, - routeMonitor + routeMonitor: cfEntityCatalog.route.store.getAllForApplication.getPaginationMonitor(appGuid, cfGuid) } }; } @@ -320,34 +296,22 @@ export class ApplicationDeleteComponent { return this.redirectToAppWall(); } this.deleteStarted = true; - const applicationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = applicationEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteApplicationAction = actionBuilder(this.applicationService.appGuid, this.applicationService.cfGuid); - this.store.dispatch(deleteApplicationAction); - return this.appMonitor.entityRequest$.pipe( + return cfEntityCatalog.application.api.remove(this.applicationService.appGuid, this.applicationService.cfGuid).pipe( filter(request => !request.deleting.busy && (request.deleting.deleted || request.deleting.error)), map((request) => ({ success: request.deleting.deleted })), tap(({ success }) => { if (success) { if (this.selectedRoutes && this.selectedRoutes.length) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const delActionBuilder = routeEntity.actionOrchestrator.getActionBuilder('delete'); this.selectedRoutes.forEach(route => { - const deleteRouteAction = - delActionBuilder(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid); - this.store.dispatch(deleteRouteAction); + cfEntityCatalog.route.api.delete(route.metadata.guid, this.applicationService.cfGuid, this.applicationService.appGuid) }); } if (this.selectedServiceInstances && this.selectedServiceInstances.length) { this.selectedServiceInstances.forEach(instance => { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (isUserProvidedServiceInstance(instance.entity.service_instance.entity)) { - this.store.dispatch(new DeleteUserProvidedInstance(this.applicationService.cfGuid, instance.entity.service_instance_guid)); + cfEntityCatalog.userProvidedService.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid) } else { - const remSiActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteServiceInstanceAction = - remSiActionBuilder(this.applicationService.cfGuid, instance.entity.service_instance_guid); - this.store.dispatch(deleteServiceInstanceAction); + cfEntityCatalog.serviceInstance.api.remove(instance.entity.service_instance_guid, this.applicationService.cfGuid) } }); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts index 60bb59f73e..29bf89725d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application-delete/delete-app-instances/app-delete-instances-routes-list-config.service.ts @@ -2,11 +2,10 @@ import { DatePipe } from '@angular/common'; import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { Observable, of as observableOf } from 'rxjs'; -import { first, map } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; -import { FetchAllServiceBindings } from '../../../../../../cloud-foundry/src/actions/service-bindings.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType, serviceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { serviceBindingEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; @@ -14,18 +13,15 @@ import { IServiceBinding } from '../../../../../../core/src/core/cf-api-svc.type import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; import { RowState } from '../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { ListViewTypes } from '../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { ServiceBindingActionBuilders } from '../../../../entity-action-builders/service-binding.action-builders'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AppServiceBindingListConfigService, } from '../../../../shared/components/list/list-types/app-sevice-bindings/app-service-binding-list-config.service'; import { ServiceActionHelperService } from '../../../../shared/data-services/service-action-helper.service'; -import { QParam, QParamJoiners } from '../../../../shared/q-param'; +import { fetchTotalResults } from '../../../cloud-foundry/cf.helpers'; import { ApplicationService } from '../../application.service'; @Injectable() @@ -34,21 +30,6 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin allowSelection: boolean; obsCache: { [serviceGuid: string]: Observable } = {}; - static createFetchServiceBinding = (cfGuid: string, serviceInstanceGuid: string): FetchAllServiceBindings => { - const sgEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = sgEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( - cfGuid, - createEntityRelationPaginationKey(serviceEntityType, serviceInstanceGuid) + '-count', - ); - action.initialParams['results-per-page'] = 1; - action.initialParams.q = [ - new QParam('service_instance_guid', serviceInstanceGuid, QParamJoiners.in).toString(), - ]; - return action; - } - constructor( store: Store, appService: ApplicationService, @@ -75,30 +56,24 @@ export class AppDeleteServiceInstancesListConfigService extends AppServiceBindin return observableOf({}); } if (!this.obsCache[serviceBinding.entity.service_instance_guid]) { - const action = AppDeleteServiceInstancesListConfigService.createFetchServiceBinding( + const action = cfEntityCatalog.serviceBinding.actions.getAllForServiceInstance( + serviceBinding.entity.service_instance_guid, appService.cfGuid, - serviceBinding.entity.service_instance_guid - ); - const catalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, action.entityType); - const pagObs = getPaginationObservables({ - store, + createEntityRelationPaginationKey(endpointSchemaKey, serviceBindingEntityType), + { + includeRelations: [], + } + ) + this.obsCache[serviceBinding.entity.service_instance_guid] = fetchTotalResults( action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - catalogEntity.getSchema(), - false - ) - }); - this.obsCache[serviceBinding.entity.service_instance_guid] = pagObs.pagination$.pipe( - map(pag => ({ + store, + this.paginationMonitorFactory + ).pipe( + map(totalResults => ({ disabledReason: 'Service is attached to other applications', - disabled: pag.totalResults > 1 + disabled: totalResults > 1 })) ); - // Ensure the request is made by sub'ing to the entities observable - pagObs.entities$.pipe( - first(), - ).subscribe(); } return this.obsCache[serviceBinding.entity.service_instance_guid]; }; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts index 61bf728b50..83ac02da05 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application.service.ts @@ -9,19 +9,14 @@ import { UpdateApplication, UpdateExistingApplication, } from '../../../../cloud-foundry/src/actions/application.actions'; -import { GetAllOrganizationDomains } from '../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; import { - appEnvVarsEntityType, applicationEntityType, - appStatsEntityType, - appSummaryEntityType, domainEntityType, organizationEntityType, routeEntityType, serviceBindingEntityType, spaceEntityType, - spaceWithOrgEntityType, stackEntityType, } from '../../../../cloud-foundry/src/cf-entity-types'; import { IApp, IAppSummary, IDomain, IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; @@ -30,24 +25,19 @@ import { ApplicationStateService, } from '../../../../core/src/shared/components/application-state/application-state.service'; import { APP_GUID, CF_GUID } from '../../../../core/src/shared/entity.tokens'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { EntityMonitorFactory } from '../../../../store/src/monitors/entity-monitor.factory.service'; -import { PaginationMonitor } from '../../../../store/src/monitors/pagination-monitor'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { ActionState, rootUpdatingKey } from '../../../../store/src/reducers/api-request-reducer/types'; import { getCurrentPageRequestInfo, - getPaginationObservables, PaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { selectUpdateInfo } from '../../../../store/src/selectors/api.selectors'; import { endpointEntitiesSelector } from '../../../../store/src/selectors/endpoint.selectors'; import { APIResource, EntityInfo } from '../../../../store/src/types/api.types'; -import { PaginatedAction, PaginationEntityState } from '../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../cf-types'; +import { PaginationEntityState } from '../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { createEntityRelationKey } from '../../entity-relations/entity-relations.types'; import { AppStat } from '../../store/types/app-metadata.types'; import { @@ -60,13 +50,13 @@ export function createGetApplicationAction(guid: string, endpointGuid: string) { return new GetApplication( guid, endpointGuid, [ - createEntityRelationKey(applicationEntityType, routeEntityType), - createEntityRelationKey(applicationEntityType, spaceEntityType), - createEntityRelationKey(applicationEntityType, stackEntityType), - createEntityRelationKey(applicationEntityType, serviceBindingEntityType), - createEntityRelationKey(routeEntityType, domainEntityType), - createEntityRelationKey(spaceEntityType, organizationEntityType), - ] + createEntityRelationKey(applicationEntityType, routeEntityType), + createEntityRelationKey(applicationEntityType, spaceEntityType), + createEntityRelationKey(applicationEntityType, stackEntityType), + createEntityRelationKey(applicationEntityType, serviceBindingEntityType), + createEntityRelationKey(routeEntityType, domainEntityType), + createEntityRelationKey(spaceEntityType, organizationEntityType), + ] ); } @@ -87,21 +77,20 @@ export class ApplicationService { @Inject(CF_GUID) public cfGuid: string, @Inject(APP_GUID) public appGuid: string, private store: Store, - private entityServiceFactory: EntityServiceFactory, private appStateService: ApplicationStateService, private appEnvVarsService: ApplicationEnvVarsHelper, - private paginationMonitorFactory: PaginationMonitorFactory, ) { - this.appEntityService = this.entityServiceFactory.create>( + this.appEntityService = cfEntityCatalog.application.store.getEntityService( appGuid, - createGetApplicationAction(appGuid, cfGuid) + cfGuid, + { + includeRelations: createGetApplicationAction(appGuid, cfGuid).includeRelations, + populateMissing: true + } ); - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const actionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = actionBuilder(appGuid, cfGuid); - this.appSummaryEntityService = this.entityServiceFactory.create( + this.appSummaryEntityService = cfEntityCatalog.appSummary.store.getEntityService( appGuid, - getAppSummaryAction + cfGuid ); this.constructCoreObservables(); @@ -142,21 +131,11 @@ export class ApplicationService { * Fetch the current state of the app (given it's instances) as an object ready */ static getApplicationState( - store: Store, appStateService: ApplicationStateService, app: IApp, appGuid: string, cfGuid: string): Observable { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const dummyAction = actionBuilder(appGuid, cfGuid) as PaginatedAction; - const paginationMonitor = new PaginationMonitor( - store, - dummyAction.paginationKey, - dummyAction, - dummyAction.flattenPagination - ); - return paginationMonitor.currentPage$.pipe( + return cfEntityCatalog.appStats.store.getPaginationMonitor(appGuid, cfGuid).currentPage$.pipe( map(appInstancesPages => { return appStateService.get(app, appInstancesPages); }) @@ -172,18 +151,9 @@ export class ApplicationService { this.appSpace$ = moreWaiting$.pipe( first(), switchMap(app => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + return cfEntityCatalog.space.store.getWithOrganization.getEntityService( app.space_guid, app.cfGuid, - { includeRelations: [createEntityRelationKey(spaceEntityType, organizationEntityType)], populateMissing: true } - ); - getSpaceAction.entity = cfEntityFactory(spaceWithOrgEntityType); - getSpaceAction.schemaKey = spaceWithOrgEntityType; - return this.entityServiceFactory.create>( - app.space_guid, - getSpaceAction ).waitForEntity$.pipe( map(entityInfo => entityInfo.entity) ); @@ -212,27 +182,14 @@ export class ApplicationService { } public getApplicationEnvVarsMonitor() { - const factory = new EntityMonitorFactory(this.store); - return factory.create>( - this.appGuid, - new CFEntityConfig(appEnvVarsEntityType) - ); + return cfEntityCatalog.appEnvVar.store.getEntityMonitor( + this.appGuid + ) } private constructAmalgamatedObservables() { // Assign/Amalgamate them to public properties (with mangling if required) - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(this.appGuid, this.cfGuid) as PaginatedAction; - const appStats = getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - new CFEntityConfig(appStatsEntityType), - action.flattenPagination - ) - }, true); + const appStats = cfEntityCatalog.appStats.store.getPaginationService(this.appGuid, this.cfGuid) // This will fail to fetch the app stats if the current app is not running but we're // willing to do this to speed up the initial fetch for a running application. this.appStats$ = appStats.entities$; @@ -270,22 +227,9 @@ export class ApplicationService { // In an ideal world we'd get domains inline with the application, however the inline path from app to org domains exceeds max cf depth // of 2 (app --> space --> org --> domains). this.orgDomains$ = this.appOrg$.pipe( - switchMap(org => { - const domainsAction = new GetAllOrganizationDomains(org.metadata.guid, this.cfGuid); - const paginationMonitor = this.paginationMonitorFactory.create( - domainsAction.paginationKey, - domainsAction, - domainsAction.flattenPagination - ); - return getPaginationObservables>( - { - store: this.store, - action: domainsAction, - paginationMonitor - }, - true - ).entities$; - }), + switchMap(org => + cfEntityCatalog.domain.store.getOrganizationDomains.getPaginationService(org.metadata.guid, this.cfGuid).entities$ + ), publishReplay(1), refCount() ); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts index 79b42a6f9f..6d1beb833c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-base.component.ts @@ -8,7 +8,6 @@ import { } from '../../../../../core/src/shared/components/application-state/application-state.service'; import { APP_GUID, CF_GUID, ENTITY_SERVICE } from '../../../../../core/src/shared/entity.tokens'; import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { ApplicationService, createGetApplicationAction } from '../application.service'; import { ApplicationEnvVarsHelper } from './application-tabs-base/tabs/build-tab/application-env-vars.service'; @@ -16,19 +15,15 @@ export function applicationServiceFactory( cfId: string, id: string, store: Store, - entityServiceFactoryInstance: EntityServiceFactory, appStateService: ApplicationStateService, appEnvVarsService: ApplicationEnvVarsHelper, - paginationMonitorFactory: PaginationMonitorFactory, ) { return new ApplicationService( cfId, id, store, - entityServiceFactoryInstance, appStateService, appEnvVarsService, - paginationMonitorFactory ); } @@ -76,10 +71,8 @@ export function getGuids(type?: string) { CF_GUID, APP_GUID, Store, - EntityServiceFactory, ApplicationStateService, ApplicationEnvVarsHelper, - PaginationMonitorFactory ] }, { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts index 3796e52a22..503d85ab9b 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-polling.service.ts @@ -3,16 +3,14 @@ import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { first, map, tap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { appStatsEntityType, appSummaryEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { IApp } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityService } from '../../../../../../store/src/entity-service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { ENTITY_SERVICE } from '../../../../../../core/src/shared/entity.tokens'; import { AppState } from '../../../../../../store/src/app-state'; +import { EntityService } from '../../../../../../store/src/entity-service'; import { selectDashboardState } from '../../../../../../store/src/selectors/dashboard.selectors'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationService } from '../../application.service'; @Injectable() @@ -69,7 +67,6 @@ export class ApplicationPollingService { public poll(withApp = false) { const { cfGuid, appGuid } = this.applicationService; - const actionDispatcher = (action) => this.store.dispatch(action); if (withApp) { const updatingApp = { ...this.entityService.action, @@ -80,13 +77,9 @@ export class ApplicationPollingService { this.entityService.entityObs$.pipe( first(), ).subscribe(resource => { - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const appSummaryActionDispatcher = appSummaryEntity.actionOrchestrator.getEntityActionDispatcher(actionDispatcher); - appSummaryActionDispatcher.dispatchGet(appGuid, cfGuid); + cfEntityCatalog.appSummary.api.get(appGuid, cfGuid); if (resource && resource.entity && resource.entity.entity && resource.entity.entity.state === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const appStatsActionDispatcher = appStatsEntity.actionOrchestrator.getEntityActionDispatcher(actionDispatcher); - appStatsActionDispatcher.dispatchGet(appGuid, cfGuid); + cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid) } }); } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts index c0b9a3e987..600bde7fc6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/application-tabs-base.component.ts @@ -30,7 +30,7 @@ import { IHeaderBreadcrumb } from '../../../../../../core/src/shared/components/ import { GitSCMService, GitSCMType } from '../../../../../../core/src/shared/data-services/scm/scm.service'; import { ENTITY_SERVICE } from '../../../../../../core/src/shared/entity.tokens'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityService } from '../../../../../../store/src/entity-service'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts index 0eca42f1d8..f3abf44de4 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/application-env-vars.service.ts @@ -1,18 +1,11 @@ import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { appEnvVarsEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { OverrideAppDetails } from '../../../../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../../../../store/src/monitors/pagination-monitor.factory'; import { - getPaginationObservables, PaginationObservables, -} from '../../../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +} from '../../../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; export interface EnvVarStratosProject { @@ -35,24 +28,8 @@ export interface EnvVarStratosProjectSource { @Injectable() export class ApplicationEnvVarsHelper { - constructor( - private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory, - ) { } - createEnvVarsObs(appGuid: string, cfGuid: string): PaginationObservables { - const catalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = catalogEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(appGuid, cfGuid) as PaginatedAction; - return getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - catalogEntity.getSchema(), - action.flattenPagination - ) - }, action.flattenPagination); + return cfEntityCatalog.appEnvVar.store.getPaginationService(appGuid, cfGuid); } FetchStratosProject(appEnvVars): EnvVarStratosProject { diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts index dce77b69da..7c3d7744d6 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/build-tab/build-tab.component.ts @@ -4,10 +4,9 @@ import { Store } from '@ngrx/store'; import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; import { combineLatest, delay, distinct, filter, first, map, mergeMap, startWith, tap } from 'rxjs/operators'; -import { AppMetadataTypes, GetAppStatsAction } from '../../../../../../../../cloud-foundry/src/actions/app-metadata.actions'; +import { AppMetadataTypes } from '../../../../../../../../cloud-foundry/src/actions/app-metadata.actions'; import { UpdateExistingApplication } from '../../../../../../../../cloud-foundry/src/actions/application.actions'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; -import { applicationEntityType, appStatsEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { IAppSummary } from '../../../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../../../../core/src/core/current-user-permissions.config'; import { getFullEndpointApiUrl } from '../../../../../../../../core/src/features/endpoints/endpoint-helpers'; @@ -16,11 +15,10 @@ import { ConfirmationDialogService } from '../../../../../../../../core/src/shar import { GitSCMService, GitSCMType } from '../../../../../../../../core/src/shared/data-services/scm/scm.service'; import { ENTITY_SERVICE } from '../../../../../../../../core/src/shared/entity.tokens'; import { ResetPagination } from '../../../../../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../../../../../store/src/entity-service'; import { ActionState } from '../../../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; import { ApplicationMonitorService } from '../../../../application-monitor.service'; import { ApplicationData, ApplicationService } from '../../../../application.service'; import { DEPLOY_TYPES_IDS } from '../../../../deploy-application/deploy-application-steps.types'; @@ -174,10 +172,7 @@ export class BuildTabComponent implements OnInit { private dispatchAppStats = () => { const { cfGuid, appGuid } = this.applicationService; - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(appGuid, cfGuid); - this.store.dispatch(getAppStatsAction); + cfEntityCatalog.appStats.api.getMultiple(appGuid, cfGuid); } restartApplication() { @@ -237,18 +232,14 @@ export class BuildTabComponent implements OnInit { this.updateApp(appStopConfirmation, 'stopping', 'STOPPED', () => { // On app reaching the 'STOPPED' state clear the app's stats pagination section const { cfGuid, appGuid } = this.applicationService; - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(appGuid, cfGuid) as GetAppStatsAction; + const getAppStatsAction = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid); this.store.dispatch(new ResetPagination(getAppStatsAction, getAppStatsAction.paginationKey)); }); } restageApplication() { const { cfGuid, appGuid } = this.applicationService; - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('restage'); - const restageAppAction = actionBuilder(appGuid, cfGuid); + const restageAppAction = cfEntityCatalog.application.actions.restage(appGuid, cfGuid) this.confirmAndPollForState( appRestageConfirmation, () => this.store.dispatch(restageAppAction), diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts index 32506fe4f9..b4a2496a9d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/application/application-tabs-base/tabs/gitscm-tab/gitscm-tab.component.ts @@ -5,21 +5,16 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators'; -import { GitCommit, GitRepo } from '../../../../../../../../cloud-foundry/src/store/types/git.types'; +import { GitBranch, GitCommit, GitRepo } from '../../../../../../../../cloud-foundry/src/store/types/git.types'; import { GithubCommitsListConfigServiceAppTab, } from '../../../../../../../../core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service'; import { ListConfig } from '../../../../../../../../core/src/shared/components/list/list.component.types'; import { GitSCMService, GitSCMType } from '../../../../../../../../core/src/shared/data-services/scm/scm.service'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; -import { FetchGitHubRepoInfo } from '../../../../../../actions/github.actions'; import { CFAppState } from '../../../../../../cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType, gitRepoEntityType } from '../../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; import { GitMeta } from '../../../../../../entity-action-builders/git-action-builder'; -import { GitBranch } from '../../../../../../store/types/github.types'; import { ApplicationService } from '../../../../application.service'; import { EnvVarStratosProject } from '../build-tab/application-env-vars.service'; @@ -34,11 +29,10 @@ import { EnvVarStratosProject } from '../build-tab/application-env-vars.service' store: Store, datePipe: DatePipe, scmService: GitSCMService, - applicationService: ApplicationService, - entityServiceFactory: EntityServiceFactory) => { - return new GithubCommitsListConfigServiceAppTab(store, datePipe, scmService, applicationService, entityServiceFactory); + applicationService: ApplicationService) => { + return new GithubCommitsListConfigServiceAppTab(store, datePipe, scmService, applicationService); }, - deps: [Store, DatePipe, GitSCMService, ApplicationService, EntityServiceFactory] + deps: [Store, DatePipe, GitSCMService, ApplicationService] } ] }) @@ -71,8 +65,6 @@ export class GitSCMTabComponent implements OnInit, OnDestroy { constructor( private applicationService: ApplicationService, - private store: Store, - private entityServiceFactory: EntityServiceFactory, private snackBar: MatSnackBar, private scmService: GitSCMService ) { } @@ -88,35 +80,20 @@ export class GitSCMTabComponent implements OnInit, OnDestroy { const scmType = stProject.deploySource.scm || stProject.deploySource.type; const scm = this.scmService.getSCM(scmType as GitSCMType); - // Ensure the SCM type is included in the key - const repoEntityID = `${scmType}-${projectName}`; - const commitEntityID = `${repoEntityID}-${commitSha}`; - - const gitRepoEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitRepoEntityType); - const getRepoActionBuilder = gitRepoEntity.actionOrchestrator.getActionBuilder('getRepoInfo'); - const getRepoAction = getRepoActionBuilder(stProject) as FetchGitHubRepoInfo; - this.gitSCMRepoEntityService = this.entityServiceFactory.create( - repoEntityID, - getRepoAction - ); + const gitRepInfoMeta: GitMeta = { projectName: stProject.deploySource.project, scm }; + this.gitSCMRepoEntityService = cfEntityCatalog.gitRepo.store.getRepoInfo.getEntityService(gitRepInfoMeta) const gitMeta: GitMeta = { projectName: stProject.deploySource.project, scm, commitSha }; - this.gitCommitEntityService = this.entityServiceFactory.create( - { - endpointType: CF_ENDPOINT_TYPE, - entityType: gitCommitEntityType, - actionMetadata: gitMeta, - entityGuid: commitEntityID, - } - ); + const repoEntityID = `${scmType}-${projectName}`; + const commitEntityID = `${repoEntityID}-${commitSha}`; // FIXME: Should come from action #4245 + this.gitCommitEntityService = cfEntityCatalog.gitCommit.store.getEntityService(commitEntityID, null, gitMeta) + + this.gitBranchEntityService = cfEntityCatalog.gitBranch.store.getEntityService(undefined, undefined, { + scm, + projectName: projectName, + branchName: stProject.deploySource.branch + }); - const branchID = `${scmType}-${projectName}-${stProject.deploySource.branch}`; - const gitBranchesEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitBranchesEntityType); - const fetchBranchesActionBuilder = gitBranchesEntity.actionOrchestrator.getActionBuilder('get'); - this.gitBranchEntityService = this.entityServiceFactory.create( - branchID, - fetchBranchesActionBuilder(branchID, null, { projectName, scm }) - ); this.gitSCMRepo$ = this.gitSCMRepoEntityService.waitForEntity$.pipe( map(p => p.entity && p.entity) diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html index ea2010b0b2..83bce9c427 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.html @@ -2,7 +2,7 @@
- + {{ domain.entity.name }} @@ -11,4 +11,4 @@ Host cannot exceed 63 characters -
+ \ No newline at end of file diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts index 83e6e1575b..2b478a9249 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/create-application/create-application-step3/create-application-step3.component.ts @@ -5,25 +5,16 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { catchError, filter, first, map, mergeMap, switchMap, tap } from 'rxjs/operators'; -import { CreateNewApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - domainEntityType, - organizationEntityType, - routeEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { domainEntityType, organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectNewAppState } from '../../../../../../cloud-foundry/src/store/effects/create-app-effects'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { CreateNewApplicationState } from '../../../../../../cloud-foundry/src/store/types/create-application.types'; import { IDomain } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { getDefaultRequestState, RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../../entity-relations/entity-relations.types'; import { createGetApplicationAction } from '../../application.service'; @@ -40,14 +31,14 @@ export class CreateApplicationStep3Component implements OnInit { setDomainHost: FormGroup; - constructor(private store: Store, private entityServiceFactory: EntityServiceFactory) { + constructor(private store: Store) { this.setDomainHost = new FormGroup({ domain: new FormControl('', [Validators.required]), host: new FormControl({ disabled: true }, [Validators.required, Validators.maxLength(63)]), }); } - domains$: Observable; + domains$: Observable[]>; message = null; @@ -95,14 +86,15 @@ export class CreateApplicationStep3Component implements OnInit { const { cloudFoundry, space } = cloudFoundryDetails; const newAppGuid = name + space; - this.store.dispatch(new CreateNewApplication( + const obs$ = cfEntityCatalog.application.api.create( newAppGuid, cloudFoundry, { - name, - space_guid: space - } - )); - return this.wrapObservable(this.store.select(selectCfRequestInfo(applicationEntityType, newAppGuid)), 'Could not create application'); + name, + space_guid: space + }).pipe( + filter(ris => !!ris.response) + ); + return this.wrapObservable(obs$, 'Could not create application'); } createRoute(): Observable { @@ -115,18 +107,18 @@ export class CreateApplicationStep3Component implements OnInit { const newRouteGuid = hostName + selectedDomainGuid; if (shouldCreate) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('create'); - const createRouteAction = actionBuilder(newRouteGuid, + const obs$ = cfEntityCatalog.route.api.create( + newRouteGuid, cloudFoundry, { space_guid: space, domain_guid: selectedDomainGuid, host: hostName - }); - this.store.dispatch(createRouteAction); - return this.wrapObservable(this.store.select(selectCfRequestInfo(routeEntityType, newRouteGuid)), - 'Application created. Could not create route'); + } + ).pipe( + filter(ris => !!ris.response) + ) + return this.wrapObservable(obs$, 'Application created. Could not create route'); } return observableOf({ ...getDefaultRequestState(), @@ -135,12 +127,8 @@ export class CreateApplicationStep3Component implements OnInit { } associateRoute(appGuid: string, routeGuid: string, endpointGuid: string): Observable { - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('assignRoute'); - const assignRouteAction = actionBuilder(endpointGuid, routeGuid, appGuid); - this.store.dispatch(assignRouteAction); - return this.wrapObservable(this.store.select(selectCfRequestInfo(applicationEntityType, appGuid)), - 'Application and route created. Could not associated route with app'); + const obs$ = cfEntityCatalog.application.api.assignRoute(endpointGuid, routeGuid, appGuid) + return this.wrapObservable(obs$, 'Application and route created. Could not associated route with app'); } private wrapObservable(obs$: Observable, errorString: string): Observable { @@ -163,23 +151,18 @@ export class CreateApplicationStep3Component implements OnInit { this.hostControl().setValue(state.name.split(' ').join('-').toLowerCase()); this.hostControl().markAsDirty(); this.newAppData = state; - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(state.cloudFoundryDetails.org, state.cloudFoundryDetails.cloudFoundry, { - includeRelations: [ - createEntityRelationKey(organizationEntityType, domainEntityType) - ], - populateMissing: true - }); - - const orgEntService = this.entityServiceFactory.create>( + + return cfEntityCatalog.org.store.getEntityService( state.cloudFoundryDetails.org, - getOrgAction - ); - return orgEntService.waitForEntity$.pipe( + state.cloudFoundryDetails.cloudFoundry, + { + includeRelations: [createEntityRelationKey(organizationEntityType, domainEntityType)], + populateMissing: true + } + ).waitForEntity$.pipe( map(({ entity }) => { if (!this.domainControl().value && entity.entity.domains && entity.entity.domains.length) { - this.domainControl().setValue(entity.entity.domains[0].entity.guid); + this.domainControl().setValue(entity.entity.domains[0].metadata.guid); this.hostControl().enable(); } return entity.entity.domains; diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts index 884071a5cf..557dde3485 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-options-step/deploy-application-options-step.component.ts @@ -7,9 +7,7 @@ import { combineLatest, Observable, of as observableOf, Subscription } from 'rxj import { filter, first, map, share, startWith, switchMap } from 'rxjs/operators'; import { SaveAppOverrides } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; -import { GetAllOrganizationDomains } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { stackEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectCfDetails, selectDeployAppState, @@ -18,11 +16,8 @@ import { import { OverrideAppDetails, SourceType } from '../../../../../../cloud-foundry/src/store/types/deploy-application.types'; import { IDomain } from '../../../../../../core/src/core/cf-api.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationEnvVarsHelper, } from '../../application/application-tabs-base/tabs/build-tab/application-env-vars.service'; @@ -53,7 +48,6 @@ export class DeployApplicationOptionsStepComponent implements OnInit, OnDestroy constructor( private fb: FormBuilder, private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory, private appEnvVarsService: ApplicationEnvVarsHelper, private activatedRoute: ActivatedRoute ) { @@ -130,44 +124,16 @@ export class DeployApplicationOptionsStepComponent implements OnInit, OnDestroy // Create the domains list for the domains drop down this.domains$ = cfDetails$.pipe( - switchMap(cfDetails => { - const action = new GetAllOrganizationDomains(cfDetails.org, cfDetails.cloudFoundry); - return getPaginationObservables>( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$; - }), + switchMap(cfDetails => + cfEntityCatalog.domain.store.getOrganizationDomains.getPaginationService(cfDetails.org, cfDetails.cloudFoundry).entities$ + ), // cf push overrides do not support tcp routes (no way to specify port) map(domains => domains.filter(domain => domain.entity.router_group_type !== 'tcp')), share() ); this.stacks$ = cfDetails$.pipe( - switchMap(cfDetails => { - const stackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, stackEntityType); - const getAllStacksActionBuilder = stackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = getAllStacksActionBuilder(cfDetails.cloudFoundry, null); - return getPaginationObservables>( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$; - }), + switchMap(cfDetails => cfEntityCatalog.stack.store.getPaginationService(null, cfDetails.cloudFoundry).entities$), share() ); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts index 949bec2fc7..19ec4e36bc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step2/deploy-application-step2.component.ts @@ -29,7 +29,6 @@ import { } from 'rxjs/operators'; import { - FetchBranchesForProject, ProjectDoesntExist, SaveAppDetails, SetAppSourceDetails, @@ -37,7 +36,6 @@ import { SetDeployBranch, } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { selectDeployAppState, selectDeployBranchName, @@ -50,15 +48,11 @@ import { DeployApplicationState, SourceType, } from '../../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { GitCommit, GitRepo } from '../../../../../../cloud-foundry/src/store/types/git.types'; -import { GitBranch } from '../../../../../../cloud-foundry/src/store/types/github.types'; +import { GitBranch, GitCommit, GitRepo } from '../../../../../../cloud-foundry/src/store/types/git.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { GitSCM } from '../../../../../../core/src/shared/data-services/scm/scm'; import { GitSCMService, GitSCMType } from '../../../../../../core/src/shared/data-services/scm/scm.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationDeploySourceTypes, DEPLOY_TYPES_IDS } from '../deploy-application-steps.types'; @Component({ @@ -131,10 +125,8 @@ export class DeployApplicationStep2Component } constructor( - private entityServiceFactory: EntityServiceFactory, private store: Store, private route: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, private scmService: GitSCMService, private httpClient: HttpClient, private appDeploySourceTypes: ApplicationDeploySourceTypes @@ -258,21 +250,12 @@ export class DeployApplicationStep2Component filter(state => state && !state.checking && !state.error && state.exists), distinctUntilChanged((x, y) => x.name === y.name), // Convert project name into branches pagination observable - switchMap(state => { - const fetchBranchesAction = new FetchBranchesForProject(this.scm, state.name); - return getPaginationObservables( - { - store: this.store, - action: fetchBranchesAction, - paginationMonitor: this.paginationMonitorFactory.create( - fetchBranchesAction.paginationKey, - new CFEntityConfig(gitBranchesEntityType), - true - ) - }, - true - ).entities$; - }), + switchMap(state => + cfEntityCatalog.gitBranch.store.getPaginationService(null, null, { + scm: this.scm, + projectName: state.name + }).entities$ + ), // Find the specific branch we're interested inS withLatestFrom(deployBranchName$), filter(([, branchName]) => !!branchName), @@ -300,17 +283,13 @@ export class DeployApplicationStep2Component if (this.isRedeploy) { const commitSha = commit || branch.commit.sha; - // This method to create entity id's should be standardised.... + // FIXME: This method to create entity id's should be standardised.... #4245 const repoEntityID = `${this.scm.getType()}-${projectInfo.full_name}`; const commitEntityID = `${repoEntityID}-${commitSha}`; - const commitEntityService = this.entityServiceFactory.create( - { - endpointType: CF_ENDPOINT_TYPE, - entityType: gitCommitEntityType, - actionMetadata: { projectName: projectInfo.full_name, scm: this.scm, commitSha }, - entityGuid: commitEntityID, - } - ); + const commitEntityService = cfEntityCatalog.gitCommit.store.getEntityService(commitEntityID, null, { + projectName: projectInfo.full_name, + scm: this.scm, commitSha + }) if (this.commitSubscription) { this.commitSubscription.unsubscribe(); diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts index 2b0e9b4e58..b676eda5b5 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-step3/deploy-application-step3.component.ts @@ -10,14 +10,12 @@ import { } from 'rxjs'; import { filter, first, map, startWith } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; import { DeleteDeployAppSection } from '../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { appEnvVarsEntityType, applicationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CfAppsDataSource } from '../../../../shared/components/list/list-types/app/cf-apps-data-source'; import { CfOrgSpaceDataService } from '../../../../shared/data-services/cf-org-space-service.service'; import { DeployApplicationDeployer } from '../deploy-application-deployer'; @@ -47,9 +45,6 @@ export class DeployApplicationStep3Component implements OnDestroy { private validSub: Subscription; private busySub: Subscription; - private appEnvVarCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - private appCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - public busy = false; constructor( @@ -84,15 +79,10 @@ export class DeployApplicationStep3Component implements OnDestroy { this.appGuid = guid; // Update the root app wall list - this.appCatalogEntity.actionDispatchManager.dispatchGetMultiple( - null, - CfAppsDataSource.paginationKey, - CfAppsDataSource.includeRelations - ); - // this.store.dispatch(createGetAllAppAction(CfAppsDataSource.paginationKey)); + cfEntityCatalog.application.api.getMultiple(undefined, CfAppsDataSource.paginationKey); + // Pre-fetch the app env vars - this.appEnvVarCatalogEntity.actionDispatchManager.dispatchGet(this.appGuid, this.deployer.cfGuid); - // this.store.dispatch(new GetAppEnvVarsAction(this.appGuid, this.deployer.cfGuid)); + cfEntityCatalog.appEnvVar.api.getMultiple(this.appGuid, this.deployer.cfGuid); }); this.closeable$ = observableCombineLatest( @@ -172,11 +162,10 @@ export class DeployApplicationStep3Component implements OnDestroy { // Take user to applications const { cfGuid } = this.deployer; if (this.appGuid) { - this.appEnvVarCatalogEntity.actionDispatchManager.dispatchGet(this.appGuid, cfGuid); - // this.store.dispatch(new GetAppEnvVarsAction(this.appGuid, cfGuid)); + cfEntityCatalog.appEnvVar.api.getMultiple(this.appGuid, this.deployer.cfGuid); // Ensure the application package_state is correct - this.appCatalogEntity.actionDispatchManager.dispatchGet( + cfEntityCatalog.application.api.get( this.appGuid, cfGuid, { includeRelations: [], populateMissing: false } diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts index d991638e17..a59c82a77e 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/deploy-application/deploy-application-steps.types.ts @@ -5,16 +5,11 @@ import { Observable, of } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap } from 'rxjs/operators'; import { SourceType } from '../../../../../cloud-foundry/src/store/types/deploy-application.types'; -import { IFeatureFlag } from '../../../../../core/src/core/cf-api.types'; import { PermissionConfig, PermissionTypes } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; import { CFFeatureFlagTypes } from '../../../../../core/src/shared/components/cf-auth/cf-auth.types'; -import { PaginationMonitor } from '../../../../../store/src/monitors/pagination-monitor'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { CFAppState } from '../../../cf-app-state'; -import { - createCfFeatureFlagFetchAction, -} from '../../../shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; export enum DEPLOY_TYPES_IDS { GITLAB = 'gitlab', @@ -103,20 +98,7 @@ export class ApplicationDeploySourceTypes { // We don't want to return until we have a trusted response (there's a `startsWith(false)` in the `.can`), otherwise we return false // then, if different, send the actual response (this leads to flashing misleading info in ux) // So fetch the feature flags for the cf, which is the blocker, first before checking if we `.can` - const action = createCfFeatureFlagFetchAction(cfId); - const fetchedFeatureFlags$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: new PaginationMonitor( - this.store, - action.paginationKey, - action, - true - ) - }, - true - ).entities$.pipe( + const fetchedFeatureFlags$ = cfEntityCatalog.featureFlag.store.getPaginationService(cfId).entities$.pipe( map(entities => !!entities), filter(hasEntities => hasEntities), first(), diff --git a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts index 8c5e71e8bf..add879d3ec 100644 --- a/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/applications/routes/add-routes/add-routes.component.ts @@ -5,18 +5,10 @@ import { BehaviorSubject, Observable, of as observableOf, Subscription } from 'r import { filter, map, mergeMap, pairwise, switchMap, take, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - domainEntityType, - routeEntityType, - spaceEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { domainEntityType, spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationKey } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { Route, RouteMode } from '../../../../../../cloud-foundry/src/store/types/route.types'; -import { IDomain, ISpace } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; +import { IDomain } from '../../../../../../core/src/core/cf-api.types'; import { pathGet } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction, @@ -25,7 +17,7 @@ import { import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { ApplicationService } from '../../application.service'; const hostPattern = '^([\\w\\-\\.]*)$'; @@ -62,7 +54,6 @@ export class AddRoutesComponent implements OnInit, OnDestroy { constructor( private applicationService: ApplicationService, private store: Store, - private entityServiceFactory: EntityServiceFactory, ) { this.appGuid = applicationService.appGuid; this.cfGuid = applicationService.cfGuid; @@ -111,19 +102,11 @@ export class AddRoutesComponent implements OnInit, OnDestroy { switchMap(() => this.appService.waitForAppEntity$ .pipe( switchMap(app => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + return cfEntityCatalog.space.store.getEntityService( app.entity.entity.space_guid, app.entity.entity.cfGuid, { includeRelations: [createEntityRelationKey(spaceEntityType, domainEntityType)] } - ); - this.spaceGuid = app.entity.entity.space_guid; - const spaceService = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ); - return spaceService.waitForEntity$; + ).waitForEntity$; }), filter(({ entity }) => !!entity.entity.domains), tap(({ entity }) => { @@ -221,30 +204,24 @@ export class AddRoutesComponent implements OnInit, OnDestroy { path = '/' + path; } - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('create'); - const createRouteAction = actionBuilder(newRouteGuid, this.cfGuid, new Route(domainGuid, this.spaceGuid, host, path, port)); - - this.store.dispatch(createRouteAction); - return this.store.select(selectCfRequestInfo(routeEntityType, newRouteGuid)) - .pipe( - filter(route => !route.creating && !route.fetching), - mergeMap(route => { - if (route.error) { - return observableOf({ success: false, message: `Failed to create route: ${route.message}` }); - } else { - return this.mapRoute(route.response.result[0]); - } - }) - ); + return cfEntityCatalog.route.api.create( + newRouteGuid, + this.cfGuid, + new Route(domainGuid, this.spaceGuid, host, path, port) + ).pipe( + filter(route => !route.creating && !route.fetching), + mergeMap(route => { + if (route.error) { + return observableOf({ success: false, message: `Failed to create route: ${route.message}` }); + } else { + return this.mapRoute(route.response.result[0]); + } + }) + ); } private mapRoute(routeGuid: string): Observable { - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('assignRoute'); - const assignRouteAction = actionBuilder(this.cfGuid, routeGuid, this.appGuid); - this.store.dispatch(assignRouteAction); - return this.store.select(selectCfRequestInfo(applicationEntityType, this.appGuid)).pipe( + return cfEntityCatalog.application.api.assignRoute(this.cfGuid, routeGuid, this.appGuid).pipe( pairwise(), filter(([oldApp, newApp]) => { return pathGet('updating.Assigning-Route.busy', oldApp) && !pathGet('updating.Assigning-Route.busy', newApp); @@ -263,12 +240,7 @@ export class AddRoutesComponent implements OnInit, OnDestroy { private mapRouteSubmit(): Observable { return this.selectedRoute$.pipe( - tap(route => { - entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType) - .actionOrchestrator - .getEntityActionDispatcher((action) => this.store.dispatch(action)) - .dispatchAction('assignRoute', this.cfGuid, route.metadata.guid, this.appGuid); - }), + tap(route => cfEntityCatalog.application.api.assignRoute(this.cfGuid, route.metadata.guid, this.appGuid)), switchMap(() => this.appService.app$), map(requestInfo => requestInfo.entityRequestInfo.updating['Assigning-Route']), filter(requestInfo => !requestInfo.busy), @@ -277,10 +249,7 @@ export class AddRoutesComponent implements OnInit, OnDestroy { if (requestInfo.error) { return { success: false, message: `Failed to associate route with app: ${requestInfo.message}` }; } else { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppRoutesAction = actionBuilder(this.appGuid, this.cfGuid); - this.store.dispatch(getAppRoutesAction); + cfEntityCatalog.route.api.getAllForApplication(this.appGuid, this.cfGuid) return { success: true, redirect: true }; } }) diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts index 8074e720e7..d5a55e2d1a 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-edit-space-step-base.ts @@ -5,24 +5,13 @@ import { Observable, Subscription } from 'rxjs'; import { filter, first, map, tap } from 'rxjs/operators'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - organizationEntityType, - spaceEntityType, - spaceQuotaEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { ISpaceQuotaDefinition } from '../../../../core/src/core/cf-api.types'; import { StepOnNextResult } from '../../../../core/src/shared/components/stepper/step/step.component'; import { getPaginationKey } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../cf-types'; -import { SpaceQuotaDefinitionActionBuilders } from '../../entity-action-builders/space-quota.action-builders'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from './cf-page.types'; export class AddEditSpaceStepBase { @@ -38,26 +27,16 @@ export class AddEditSpaceStepBase { constructor( protected store: Store, protected activatedRoute: ActivatedRoute, - protected paginationMonitorFactory: PaginationMonitorFactory, - protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace + protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; this.orgGuid = activeRouteCfOrgSpace.orgGuid; - const paginationKey = getPaginationKey(organizationEntityType, this.orgGuid); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const getAllSpaceActionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const action = getAllSpaceActionBuilder(this.orgGuid, this.cfGuid, paginationKey) as PaginatedAction; - this.allSpacesInOrg$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - new CFEntityConfig(spaceEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.allSpacesInOrg$ = cfEntityCatalog.space.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + getPaginationKey(organizationEntityType, this.orgGuid), { + flatten: true, + } ).entities$.pipe( filter(spaces => !!spaces), map(spaces => spaces.map(space => space.entity.name)), @@ -66,25 +45,10 @@ export class AddEditSpaceStepBase { ); this.fetchSpacesSubscription = this.allSpacesInOrg$.subscribe(); - const quotaPaginationKey = createEntityRelationPaginationKey(organizationEntityType, this.orgGuid); - - const quotaEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceQuotaEntityType - ); - const actionBuilder = quotaEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const getAllInOrganization = actionBuilder(this.orgGuid, this.cfGuid, quotaPaginationKey); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getAllInOrganization as PaginatedAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(spaceQuotaEntityType), - getAllInOrganization.flattenPagination - ) - }, - getAllInOrganization.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.spaceQuota.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + createEntityRelationPaginationKey(organizationEntityType, this.orgGuid) ).entities$.pipe( filter(o => !!o), first() diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts index 02408e0b7d..623327a2f7 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-organization/create-organization-step/create-organization-step.component.ts @@ -7,22 +7,20 @@ import { filter, map, tap } from 'rxjs/operators'; import { CreateOrganization } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType, quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { IOrganization, IOrgQuotaDefinition } from '../../../../../../core/src/core/cf-api.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { QuotaDefinitionActionBuilder } from '../../../../entity-action-builders/quota-definition.action-builders'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; @@ -48,7 +46,7 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { constructor( private store: Store, - private activatedRoute: ActivatedRoute, + activatedRoute: ActivatedRoute, private paginationMonitorFactory: PaginationMonitorFactory, ) { this.cfGuid = activatedRoute.snapshot.params.endpointId; @@ -78,23 +76,8 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { ); const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - quotaDefinitionEntityType - ); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid, { includeRelations: [] }); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService( + quotaPaginationKey, this.cfGuid, { includeRelations: [] } ).entities$.pipe( filter(o => !!o), tap(quotas => { @@ -104,7 +87,7 @@ export class CreateOrganizationStepComponent implements OnInit, OnDestroy { }); } }) - ); + ) this.orgSubscription = this.orgs$.subscribe(); } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts index 46a60f0fad..8557439921 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/add-space/create-space-step/create-space-step.component.ts @@ -6,14 +6,9 @@ import { Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { selectCfRequestInfo } from '../../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { SpaceActionBuilders } from '../../../../entity-action-builders/space.action-builders'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AddEditSpaceStepBase } from '../../add-edit-space-step-base'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; @@ -45,10 +40,9 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On constructor( store: Store, activatedRoute: ActivatedRoute, - paginationMonitorFactory: PaginationMonitorFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { - super(store, activatedRoute, paginationMonitorFactory, activeRouteCfOrgSpace); + super(store, activatedRoute, activeRouteCfOrgSpace); } ngOnInit() { @@ -79,20 +73,14 @@ export class CreateSpaceStepComponent extends AddEditSpaceStepBase implements On submit: StepOnNextFunction = () => { const id = `${this.orgGuid}-${this.spaceName.value}`; - const spaceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceEntityType - ); - spaceEntity.actionDispatchManager.dispatchCreate(id, this.cfGuid, { + return cfEntityCatalog.space.api.create(id, this.cfGuid, { createSpace: { name: this.spaceName.value, organization_guid: this.orgGuid, space_quota_definition_guid: this.quotaDefinition.value }, orgGuid: this.orgGuid - }); - - return this.store.select(selectCfRequestInfo(spaceEntityType, id)).pipe( + }).pipe( filter(o => !!o && !o.fetching && !o.creating), this.map('Failed to create space: ') ); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts index 0624440521..89823562a9 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-organization/edit-organization-step/edit-organization-step.component.ts @@ -6,23 +6,20 @@ import { filter, map, take, tap } from 'rxjs/operators'; import { UpdateOrganization } from '../../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { organizationEntityType, quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { organizationEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { IOrganization, IOrgQuotaDefinition } from '../../../../../../core/src/core/cf-api.types'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { selectRequestInfo } from '../../../../../../store/src/selectors/api.selectors'; import { APIResource } from '../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { QuotaDefinitionActionBuilder } from '../../../../entity-action-builders/quota-definition.action-builders'; import { getActiveRouteCfOrgSpaceProvider } from '../../cf.helpers'; import { CloudFoundryEndpointService } from '../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../services/cloud-foundry-organization.service'; @@ -115,23 +112,8 @@ export class EditOrganizationStepComponent implements OnInit, OnDestroy { this.fetchOrgsSub = this.allOrgsInEndpoint$.subscribe(); const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - quotaDefinitionEntityType - ); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid); - this.quotaDefinitions$ = getPaginationObservables>( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - action.flattenPagination - ) - }, - action.flattenPagination + this.quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService( + quotaPaginationKey, this.cfGuid, { includeRelations: [] } ).entities$.pipe( filter(o => !!o), ); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts index eb91cc358f..3876bbc139 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/edit-space/edit-space-step/edit-space-step.component.ts @@ -5,20 +5,12 @@ import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; import { filter, map, switchMap, take, tap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { - AssociateSpaceQuota, - DisassociateSpaceQuota, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; +import { AssociateSpaceQuota } from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; import { UpdateSpace } from '../../../../../../cloud-foundry/src/actions/space.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { spaceEntityType, spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { StepOnNextFunction } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { selectRequestInfo } from '../../../../../../store/src/selectors/api.selectors'; -import { SpaceQuotaDefinitionActionBuilders } from '../../../../entity-action-builders/space-quota.action-builders'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { AddEditSpaceStepBase } from '../../add-edit-space-step-base'; import { ActiveRouteCfOrgSpace } from '../../cf-page.types'; import { CloudFoundrySpaceService } from '../../services/cloud-foundry-space.service'; @@ -43,11 +35,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe constructor( store: Store, activatedRoute: ActivatedRoute, - paginationMonitorFactory: PaginationMonitorFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private cfSpaceService: CloudFoundrySpaceService + private cfSpaceService: CloudFoundrySpaceService, ) { - super(store, activatedRoute, paginationMonitorFactory, activeRouteCfOrgSpace); + super(store, activatedRoute, activeRouteCfOrgSpace); this.spaceGuid = activatedRoute.snapshot.params.spaceId; this.editSpaceForm = new FormGroup({ spaceName: new FormControl('', this.spaceNameTakenValidator()), @@ -111,15 +102,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe } updateSpace$() { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('update'); - const updateSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid, { + return cfEntityCatalog.space.api.update(this.spaceGuid, this.cfGuid, { name: this.editSpaceForm.value.spaceName, allow_ssh: this.editSpaceForm.value.toggleSsh as boolean, - }); - this.store.dispatch(updateSpaceAction); - - return this.store.select(selectRequestInfo(updateSpaceAction, this.spaceGuid)).pipe( + }).pipe( filter(o => !!o && !o.updating[UpdateSpace.UpdateExistingSpace].busy), map((state) => state.updating[UpdateSpace.UpdateExistingSpace]) ); @@ -127,26 +113,10 @@ export class EditSpaceStepComponent extends AddEditSpaceStepBase implements OnDe updateSpaceQuota$() { const spaceQuotaGuid = this.editSpaceForm.value.quotaDefinition; - let spaceQuotaQueryGuid; - let action: AssociateSpaceQuota | DisassociateSpaceQuota; - - const spaceQuotaEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceQuotaEntityType - ); - if (spaceQuotaGuid) { - spaceQuotaQueryGuid = spaceQuotaGuid; - const actionBuilder = spaceQuotaEntity.actionOrchestrator.getActionBuilder('associateWithSpace'); - action = actionBuilder(this.spaceGuid, this.cfGuid, spaceQuotaQueryGuid) as AssociateSpaceQuota; - } else { - spaceQuotaQueryGuid = this.originalSpaceQuotaGuid; - const actionBuilder = spaceQuotaEntity.actionOrchestrator.getActionBuilder('disassociateFromSpace'); - action = actionBuilder(this.spaceGuid, this.cfGuid, spaceQuotaQueryGuid) as DisassociateSpaceQuota; - } - this.store.dispatch(action); - - - return this.store.select(selectRequestInfo(action, spaceQuotaQueryGuid)).pipe( + const mon = spaceQuotaGuid ? + cfEntityCatalog.spaceQuota.api.associateWithSpace(this.spaceGuid, this.cfGuid, spaceQuotaGuid) : + cfEntityCatalog.spaceQuota.api.disassociateFromSpace(this.spaceGuid, this.cfGuid, this.originalSpaceQuotaGuid) + return mon.pipe( filter(o => { return !!o && o.updating[AssociateSpaceQuota.UpdateExistingSpaceQuota] && diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts index 89fdc4cf30..4f250dc1ca 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition-base/quota-definition-base.component.ts @@ -9,15 +9,12 @@ import { ISpace, ISpaceQuotaDefinition, } from '../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; import { APIResource } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { organizationEntityType, spaceEntityType } from '../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; export class QuotaDefinitionBaseComponent { @@ -33,7 +30,6 @@ export class QuotaDefinitionBaseComponent { orgSubscriber: Subscription; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, protected activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, protected activatedRoute: ActivatedRoute, @@ -49,13 +45,7 @@ export class QuotaDefinitionBaseComponent { setupOrgObservable() { if (this.orgGuid) { - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(this.orgGuid, this.cfGuid); - this.org$ = this.entityServiceFactory.create>( - this.orgGuid, - getOrgAction - ).waitForEntity$.pipe( + this.org$ = cfEntityCatalog.org.store.getEntityService(this.orgGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), ); } @@ -63,13 +53,7 @@ export class QuotaDefinitionBaseComponent { setupSpaceObservable() { if (this.spaceGuid) { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid); - this.space$ = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ).waitForEntity$.pipe( + this.space$ = cfEntityCatalog.space.store.getEntityService(this.spaceGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), ); } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts index de3bb0449e..4906870a5c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/quota-definition/quota-definition.component.ts @@ -4,15 +4,14 @@ import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { GetQuotaDefinition } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; import { IOrganization, IOrgQuotaDefinition, ISpace } from '../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; import { APIResource } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { QuotaDefinitionBaseComponent } from '../quota-definition-base/quota-definition-base.component'; @@ -44,13 +43,12 @@ export class QuotaDefinitionComponent extends QuotaDefinitionBaseComponent { public isCf = false; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, activatedRoute: ActivatedRoute, currentUserPermissionsService: CurrentUserPermissionsService ) { - super(entityServiceFactory, store, activeRouteCfOrgSpace, activatedRoute); + super(store, activeRouteCfOrgSpace, activatedRoute); this.setupQuotaDefinitionObservable(); const { cfGuid, orgGuid } = activeRouteCfOrgSpace; this.canEditQuota$ = currentUserPermissionsService.can(CurrentUserPermissions.QUOTA_EDIT, cfGuid); @@ -62,10 +60,7 @@ export class QuotaDefinitionComponent extends QuotaDefinitionBaseComponent { const quotaGuid$ = this.quotaGuid ? of(this.quotaGuid) : this.org$.pipe(map(org => org.entity.quota_definition_guid)); const entityInfo$ = quotaGuid$.pipe( first(), - switchMap(quotaGuid => this.entityServiceFactory.create>( - quotaGuid, - new GetQuotaDefinition(quotaGuid, this.cfGuid), - ).entityObs$) + switchMap(quotaGuid => cfEntityCatalog.quotaDefinition.store.getEntityService(quotaGuid, this.cfGuid, {}).entityObs$) ); this.quotaDefinition$ = entityInfo$.pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts index a5b1ba50c8..091e3f43b5 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service.ts @@ -4,10 +4,9 @@ import { Observable } from 'rxjs'; import { filter, first, map, publishReplay, refCount } from 'rxjs/operators'; import { GetAllApplications } from '../../../../../cloud-foundry/src/actions/application.actions'; -import { DeleteOrganization, GetAllOrganizations } from '../../../../../cloud-foundry/src/actions/organization.actions'; +import { DeleteOrganization } from '../../../../../cloud-foundry/src/actions/organization.actions'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { - cfInfoEntityType, domainEntityType, organizationEntityType, privateDomainsEntityType, @@ -20,27 +19,20 @@ import { } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { CfApplicationState } from '../../../../../cloud-foundry/src/store/types/application.types'; import { IApp, ICfV2Info, IOrganization, ISpace } from '../../../../../core/src/core/cf-api.types'; -import { EndpointsService } from '../../../../../core/src/core/endpoints.service'; import { GetAllEndpoints } from '../../../../../store/src/actions/endpoint.actions'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { EntityService } from '../../../../../store/src/entity-service'; import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { - getPaginationObservables, - PaginationObservables, -} from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { PaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; import { EndpointModel, EndpointUser } from '../../../../../store/src/types/endpoint.types'; import { PaginatedAction } from '../../../../../store/src/types/pagination.types'; import { GetAllRoutes } from '../../../actions/route.actions'; import { GetSpaceRoutes } from '../../../actions/space.actions'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { CfInfoDefinitionActionBuilders } from '../../../entity-action-builders/cf-info.action-builders'; -import { OrganizationActionBuilders } from '../../../entity-action-builders/organization.action-builders'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { QParam, QParamJoiners } from '../../../shared/q-param'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; @@ -76,18 +68,11 @@ export class CloudFoundryEndpointService { currentUser$: Observable; cfGuid: string; - getAllOrgsAction: GetAllOrganizations; - - private getAllAppsAction: GetAllApplications; - static createGetAllOrganizations(cfGuid: string) { const paginationKey = cfGuid ? createEntityRelationPaginationKey(endpointSchemaKey, cfGuid) : createEntityRelationPaginationKey(endpointSchemaKey); - const organizationEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(cfGuid, paginationKey, + const getAllOrganizationsAction = cfEntityCatalog.org.actions.getMultiple(cfGuid, paginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), @@ -102,9 +87,7 @@ export class CloudFoundryEndpointService { const paginationKey = cfGuid ? createEntityRelationPaginationKey(endpointSchemaKey, cfGuid) : createEntityRelationPaginationKey(endpointSchemaKey); - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(cfGuid, paginationKey, + const getAllOrganizationsAction = cfEntityCatalog.org.actions.getMultiple(cfGuid, paginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), @@ -159,25 +142,15 @@ export class CloudFoundryEndpointService { private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private pmf: PaginationMonitorFactory, - private endpointService: EndpointsService, - private paginationMonitorFactory: PaginationMonitorFactory ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; - this.getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(this.cfGuid) as GetAllOrganizations; - this.getAllAppsAction = new GetAllApplications(createEntityRelationPaginationKey('cf', this.cfGuid), this.cfGuid); this.cfEndpointEntityService = this.entityServiceFactory.create( this.cfGuid, new GetAllEndpoints() ); - const cfInfoEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfInfoEntityType); - const actionBuilder = cfInfoEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(this.cfGuid); - this.cfInfoEntityService = this.entityServiceFactory.create>( - this.cfGuid, - action, - ); + this.cfInfoEntityService = cfEntityCatalog.cfInfo.store.getEntityService(this.cfGuid) this.constructCoreObservables(); this.constructSecondaryObservable(); } @@ -185,15 +158,16 @@ export class CloudFoundryEndpointService { private constructCoreObservables() { this.endpoint$ = this.cfEndpointEntityService.waitForEntity$; + const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizations(this.cfGuid); this.orgs$ = getPaginationObservables>({ store: this.store, - action: this.getAllOrgsAction, + action: getAllOrgsAction, paginationMonitor: this.pmf.create( - this.getAllOrgsAction.paginationKey, + getAllOrgsAction.paginationKey, cfEntityFactory(organizationEntityType), - this.getAllOrgsAction.flattenPagination + getAllOrgsAction.flattenPagination ) - }, this.getAllOrgsAction.flattenPagination).entities$; + }, getAllOrgsAction.flattenPagination).entities$; this.info$ = this.cfInfoEntityService.waitForEntity$; @@ -205,16 +179,7 @@ export class CloudFoundryEndpointService { } constructAppObs() { - const appPaginationMonitor = this.pmf.create( - this.getAllAppsAction.paginationKey, - this.getAllAppsAction, - this.getAllAppsAction.flattenPagination - ); - this.appsPagObs = getPaginationObservables>({ - store: this.store, - action: this.getAllAppsAction, - paginationMonitor: appPaginationMonitor - }, this.getAllAppsAction.flattenPagination); + this.appsPagObs = cfEntityCatalog.application.store.getPaginationService(this.cfGuid); } private constructSecondaryObservable() { @@ -261,21 +226,7 @@ export class CloudFoundryEndpointService { } public fetchDomains = () => { - const domainEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, domainEntityType); - const actionBuilder = domainEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(this.cfGuid, null); - this.paginationSubscription = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.pmf.create( - action.paginationKey, - cfEntityFactory(domainEntityType), - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$.pipe(first()).subscribe(); + cfEntityCatalog.domain.api.getMultiple(this.cfGuid, null, {}); } public deleteOrg(orgGuid: string, endpointGuid: string) { @@ -283,7 +234,7 @@ export class CloudFoundryEndpointService { } fetchApps() { - this.store.dispatch(this.getAllAppsAction); + cfEntityCatalog.application.api.getMultiple(this.cfGuid); } } diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts index 10da08098e..7a5c11fadc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-org-space-quota.ts @@ -1,13 +1,13 @@ import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { CFEntityConfig } from '../../../cf-types'; import { IApp, IOrganization, ISpace } from '../../../../../core/src/core/cf-api.types'; import { truthyIncludingZero } from '../../../../../core/src/core/utils.service'; import { determineCardStatus } from '../../../../../core/src/shared/components/cards/card-status/card-status.component'; -import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; +import { EntityMonitorFactory } from '../../../../../store/src/monitors/entity-monitor.factory.service'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { CFEntityConfig } from '../../../cf-types'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts index a1c41cc54b..17f4e4e19c 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-organization.service.ts @@ -25,13 +25,9 @@ import { getEntityFlattenedList, getStartedAppInstanceCount } from '../../../../ import { CloudFoundryUserProvidedServicesService, } from '../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; -import { OrganizationActionBuilders } from '../../../entity-action-builders/organization.action-builders'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; @@ -89,7 +85,6 @@ export class CloudFoundryOrganizationService { constructor( public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private store: Store, - private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private paginationMonitorFactory: PaginationMonitorFactory, private cfEndpointService: CloudFoundryEndpointService, @@ -102,10 +97,7 @@ export class CloudFoundryOrganizationService { } public deleteSpace(spaceGuid: string, orgGuid: string, endpointGuid: string) { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('remove'); - const deleteSpaceAction = actionBuilder(spaceGuid, endpointGuid, { orgGuid }); - this.store.dispatch(deleteSpaceAction); + cfEntityCatalog.space.api.remove(spaceGuid, endpointGuid, { orgGuid }) } public fetchApps() { @@ -132,15 +124,7 @@ export class CloudFoundryOrganizationService { createEntityRelationKey(organizationEntityType, OrgUserRoleNames.AUDITOR), ); } - const orgEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(this.orgGuid, this.cfGuid, { includeRelations: relations }); - const orgEntityService = this.entityServiceFactory.create>( - this.orgGuid, - getOrgAction - ); - return orgEntityService.waitForEntity$; + return cfEntityCatalog.org.store.getEntityService(this.orgGuid, this.cfGuid, { includeRelations: relations }).waitForEntity$; }), publishReplay(1), refCount() diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts index 8b34067470..ad5c7101d3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-space.service.ts @@ -15,12 +15,12 @@ import { import { SpaceUserRoleNames } from '../../../../../cloud-foundry/src/store/types/user.types'; import { IApp, IOrgQuotaDefinition, IRoute, ISpace, ISpaceQuotaDefinition } from '../../../../../core/src/core/cf-api.types'; import { getStartedAppInstanceCount } from '../../../../../core/src/core/cf.helpers'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { CloudFoundryUserProvidedServicesService, } from '../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; +import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource, EntityInfo } from '../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationKey } from '../../../entity-relations/entity-relations.types'; import { CfUserService } from '../../../shared/data-services/cf-user.service'; import { fetchServiceInstancesCount } from '../../service-catalog/services-helper'; @@ -28,8 +28,6 @@ import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getSpaceRolesString } from '../cf.helpers'; import { CloudFoundryEndpointService } from './cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService, createOrgQuotaDefinition } from './cloud-foundry-organization.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; @Injectable() export class CloudFoundrySpaceService { @@ -63,7 +61,6 @@ export class CloudFoundrySpaceService { constructor( public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private store: Store, - private entityServiceFactory: EntityServiceFactory, private cfUserService: CfUserService, private paginationMonitorFactory: PaginationMonitorFactory, private cfEndpointService: CloudFoundryEndpointService, @@ -119,14 +116,8 @@ export class CloudFoundrySpaceService { createEntityRelationKey(spaceEntityType, SpaceUserRoleNames.AUDITOR), ); } - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(this.spaceGuid, this.cfGuid, { includeRelations: relations }); - const spaceEntityService = this.entityServiceFactory.create>( - this.spaceGuid, - getSpaceAction - ); - return spaceEntityService.entityObs$.pipe(filter(o => !!o && !!o.entity)); + return cfEntityCatalog.space.store.getEntityService(this.spaceGuid, this.cfGuid, { includeRelations: relations }) + .entityObs$.pipe(filter(o => !!o && !!o.entity)); }), publishReplay(1), refCount() diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts index da9f999835..cd34aed01f 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/space-quota-definition/space-quota-definition.component.ts @@ -4,15 +4,14 @@ import { Store } from '@ngrx/store'; import { Observable, of, Subscription } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { GetSpaceQuotaDefinition } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; import { IOrganization, ISpace, ISpaceQuotaDefinition } from '../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissions } from '../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/src/core/current-user-permissions.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { IHeaderBreadcrumb } from '../../../../../core/src/shared/components/page-header/page-header.types'; import { AppState } from '../../../../../store/src/app-state'; import { APIResource } from '../../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../cf.helpers'; import { QuotaDefinitionBaseComponent } from '../quota-definition-base/quota-definition-base.component'; @@ -42,13 +41,12 @@ export class SpaceQuotaDefinitionComponent extends QuotaDefinitionBaseComponent public isOrg = false; constructor( - protected entityServiceFactory: EntityServiceFactory, protected store: Store, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, activatedRoute: ActivatedRoute, currentUserPermissionsService: CurrentUserPermissionsService ) { - super(entityServiceFactory, store, activeRouteCfOrgSpace, activatedRoute); + super(store, activeRouteCfOrgSpace, activatedRoute); this.setupQuotaDefinitionObservable(); const { cfGuid, orgGuid, spaceGuid } = activeRouteCfOrgSpace; this.canEditQuota$ = currentUserPermissionsService.can(CurrentUserPermissions.SPACE_QUOTA_EDIT, cfGuid, orgGuid); @@ -60,11 +58,7 @@ export class SpaceQuotaDefinitionComponent extends QuotaDefinitionBaseComponent const quotaGuid$ = this.quotaGuid ? of(this.quotaGuid) : this.space$.pipe(map(space => space.entity.space_quota_definition_guid)); const entityInfo$ = quotaGuid$.pipe( first(), - switchMap(quotaGuid => this.entityServiceFactory.create>( - quotaGuid, - new GetSpaceQuotaDefinition(quotaGuid, this.cfGuid) - ).entityObs$ - ) + switchMap(quotaGuid => cfEntityCatalog.spaceQuota.store.getEntityService(quotaGuid, this.cfGuid).entityObs$) ); this.quotaDefinition$ = entityInfo$.pipe( diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts index 79b8b37122..361689d6b3 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-spaces/tabs/cloud-foundry-space-summary/cloud-foundry-space-summary.component.ts @@ -5,16 +5,16 @@ import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, pairwise, startWith, tap } from 'rxjs/operators'; import { CurrentUserPermissions } from '../../../../../../../../../core/src/core/current-user-permissions.config'; -import { entityCatalog } from '../../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogConfig } from '../../../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService, } from '../../../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { RouterNav } from '../../../../../../../../../store/src/actions/router.actions'; import { AppState } from '../../../../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectDeletionInfo } from '../../../../../../../../../store/src/selectors/api.selectors'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cf-types'; import { spaceEntityType } from '../../../../../../../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../../../../../../../cf-types'; import { CloudFoundryEndpointService } from '../../../../../services/cloud-foundry-endpoint.service'; import { CloudFoundryOrganizationService } from '../../../../../services/cloud-foundry-organization.service'; import { CloudFoundrySpaceService } from '../../../../../services/cloud-foundry-space.service'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts index d9f8b8ce43..f3f7716510 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/tabs/cloud-foundry-organizations/cloud-foundry-organization-summary/cloud-foundry-organization-summary.component.ts @@ -8,7 +8,7 @@ import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state' import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { entityCatalog } from '../../../../../../../store/src//entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; import { selectDeletionInfo } from '../../../../../../../store/src/selectors/api.selectors'; import { organizationEntityType } from '../../../../../cf-entity-types'; diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts index 48081d40ab..83b9905fd4 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/invite-users/invite-users-create/invite-users-create.component.ts @@ -4,8 +4,6 @@ import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { map } from 'rxjs/operators'; import { IOrganization, ISpace } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { StackedInputActionResult, } from '../../../../../../../core/src/shared/components/stacked-input-actions/stacked-input-action/stacked-input-action.component'; @@ -16,9 +14,10 @@ import { import { StepOnNextFunction } from '../../../../../../../core/src/shared/components/stepper/step/step.component'; import { ClearPaginationOfType } from '../../../../../../../store/src/actions/pagination.actions'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE, CFEntityConfig } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; -import { cfUserEntityType, organizationEntityType, spaceEntityType } from '../../../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; +import { cfUserEntityType } from '../../../../../cf-entity-types'; +import { CFEntityConfig } from '../../../../../cf-types'; import { SpaceUserRoleNames } from '../../../../../store/types/user.types'; import { UserRoleLabels } from '../../../../../store/types/users-roles.types'; import { ActiveRouteCfOrgSpace } from '../../../cf-page.types'; @@ -45,7 +44,6 @@ export class InviteUsersCreateComponent implements OnInit { constructor( private store: Store, private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private entityServiceFactory: EntityServiceFactory, private userInviteService: UserInviteService ) { this.valid$ = this.stepValid.asObservable(); @@ -54,12 +52,12 @@ export class InviteUsersCreateComponent implements OnInit { label: UserRoleLabels.space.short[SpaceUserRoleNames.AUDITOR], value: UserInviteSendSpaceRoles.auditor, }, { - label: UserRoleLabels.space.short[SpaceUserRoleNames.DEVELOPER], - value: UserInviteSendSpaceRoles.developer, - }, { - label: UserRoleLabels.space.short[SpaceUserRoleNames.MANAGER], - value: UserInviteSendSpaceRoles.manager, - }); + label: UserRoleLabels.space.short[SpaceUserRoleNames.DEVELOPER], + value: UserInviteSendSpaceRoles.developer, + }, { + label: UserRoleLabels.space.short[SpaceUserRoleNames.MANAGER], + value: UserInviteSendSpaceRoles.manager, + }); } stateOut(users: StackedInputActionsUpdate) { @@ -69,29 +67,17 @@ export class InviteUsersCreateComponent implements OnInit { ngOnInit() { this.isSpace = !!this.activeRouteCfOrgSpace.spaceGuid; - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder( + this.org$ = cfEntityCatalog.org.store.getEntityService( this.activeRouteCfOrgSpace.orgGuid, this.activeRouteCfOrgSpace.cfGuid, { includeRelations: [], populateMissing: false } - ); - this.org$ = this.entityServiceFactory.create>( - this.activeRouteCfOrgSpace.orgGuid, - getOrgAction ).waitForEntity$.pipe( map(entity => entity.entity) ); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder( + this.space$ = this.isSpace ? cfEntityCatalog.space.store.getEntityService( this.activeRouteCfOrgSpace.spaceGuid, this.activeRouteCfOrgSpace.cfGuid, { includeRelations: [], populateMissing: false } - ); - this.space$ = this.isSpace ? this.entityServiceFactory.create>( - this.activeRouteCfOrgSpace.spaceGuid, - getSpaceAction ).waitForEntity$.pipe( map(entity => entity.entity) ) : observableOf(null); diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts index f078fc0ed1..b2d09c7484 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/cf-roles.service.ts @@ -20,11 +20,7 @@ import { import { IOrganization, ISpace } from '../../../../../../core/src/core/cf-api.types'; import { CurrentUserPermissionsChecker } from '../../../../../../core/src/core/current-user-permissions.checker'; import { CurrentUserPermissionsService } from '../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { selectUsersRolesCf, selectUsersRolesPicked, @@ -33,9 +29,8 @@ import { import { APIResource, EntityInfo } from '../../../../../../store/src/types/api.types'; import { UsersRolesSetChanges } from '../../../../actions/users-roles.actions'; import { CFAppState } from '../../../../cf-app-state'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { organizationEntityType, spaceEntityType } from '../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; import { CfUserService } from '../../../../shared/data-services/cf-user.service'; import { createDefaultOrgRoles, createDefaultSpaceRoles } from '../../../../store/reducers/users-roles.reducer'; import { CfUser, IUserPermissionInOrg, UserRoleInOrg, UserRoleInSpace } from '../../../../store/types/user.types'; @@ -94,8 +89,6 @@ export class CfRolesService { constructor( private store: Store, private cfUserService: CfUserService, - private entityServiceFactory: EntityServiceFactory, - private paginationMonitorFactory: PaginationMonitorFactory, private userPerms: CurrentUserPermissionsService, ) { this.existingRoles$ = this.store.select(selectUsersRolesPicked).pipe( @@ -233,13 +226,8 @@ export class CfRolesService { } fetchOrg(cfGuid: string, orgGuid: string): Observable>> { - const orgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const getOrgActionBuilder = orgEntity.actionOrchestrator.getActionBuilder('get'); - const getOrgAction = getOrgActionBuilder(orgGuid, cfGuid, { includeRelations: [], populateMissing: false }); - return this.entityServiceFactory.create>( - orgGuid, - getOrgAction - ).waitForEntity$; + return cfEntityCatalog.org.store.getEntityService(orgGuid, cfGuid, { includeRelations: [], populateMissing: false }) + .waitForEntity$; } fetchOrgEntity(cfGuid: string, orgGuid: string): Observable> { @@ -252,9 +240,7 @@ export class CfRolesService { fetchOrgs(cfGuid: string): Observable[]> { if (!this.cfOrgs[cfGuid]) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder( + const orgs$ = cfEntityCatalog.org.store.getPaginationService( cfGuid, paginationKey, { @@ -262,18 +248,7 @@ export class CfRolesService { createEntityRelationKey(organizationEntityType, spaceEntityType) ], populateMissing: true } - ); - const orgs$ = getPaginationObservables>({ - store: this.store, - action: getAllOrganizationsAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(organizationEntityType), - getAllOrganizationsAction.flattenPagination - ), - }, - getAllOrganizationsAction.flattenPagination - ).entities$; + ).entities$ this.cfOrgs[cfGuid] = CfRolesService.filterEditableOrgOrSpace(this.userPerms, true, orgs$).pipe( map(orgs => orgs.sort((a, b) => a.entity.name.localeCompare(b.entity.name))), publishReplay(1), diff --git a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts index eeebe25d3d..c3360df331 100644 --- a/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/cloud-foundry/users/manage-users/manage-users-confirm/manage-users-confirm.component.ts @@ -10,7 +10,7 @@ import { ITableCellRequestMonitorIconConfig, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-request-monitor-icon/table-cell-request-monitor-icon.component'; import { ITableColumn } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { selectUsersRoles, selectUsersRolesChangedRoles, diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts index fec927604f..20db0e5ca0 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-base/service-base.component.ts @@ -1,19 +1,12 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { ServicesService } from '../services.service'; export function servicesServiceFactory( - store: Store, activatedRoute: ActivatedRoute, - entityServiceFactory: EntityServiceFactory, - paginationMonitorFactory: PaginationMonitorFactory ) { - return new ServicesService(store, entityServiceFactory, activatedRoute, paginationMonitorFactory); + return new ServicesService(activatedRoute); } @@ -25,14 +18,8 @@ export function servicesServiceFactory( { provide: ServicesService, useFactory: servicesServiceFactory, - deps: [Store, ActivatedRoute, EntityServiceFactory, PaginationMonitorFactory] + deps: [ActivatedRoute] } ] }) -export class ServiceBaseComponent { - - constructor(private servicesService: ServicesService, private store: Store) { - } - - -} +export class ServiceBaseComponent { } diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts index 2a74a1a3c5..a7cdbd8b7d 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/service-catalog.helpers.ts @@ -1,24 +1,17 @@ import { Provider } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { ServicesService } from './services.service'; export function servicesServiceFactory( - store: Store, activatedRoute: ActivatedRoute, - entityServiceFactory: EntityServiceFactory, - paginationMonitorFactory: PaginationMonitorFactory ) { - return new ServicesService(store, entityServiceFactory, activatedRoute, paginationMonitorFactory); + return new ServicesService(activatedRoute); } export const servicesServiceFactoryProvider: Provider = { provide: ServicesService, useFactory: servicesServiceFactory, - deps: [Store, ActivatedRoute, EntityServiceFactory, PaginationMonitorFactory] + deps: [ActivatedRoute] }; diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts index 248875a0ee..b34883e357 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services-helper.ts @@ -15,27 +15,17 @@ import { } from '../../../../core/src/core/cf-api-svc.types'; import { getIdFromRoute, safeStringToObj } from '../../../../core/src/core/utils.service'; import { StratosStatus } from '../../../../core/src/shared/shared.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; -import { EntityRequestAction } from '../../../../store/src/types/request.types'; import { CFAppState } from '../../cf-app-state'; -import { cfEntityFactory } from '../../cf-entity-factory'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { organizationEntityType, - serviceBrokerEntityType, - serviceEntityType, serviceInstancesEntityType, servicePlanEntityType, spaceEntityType, } from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../entity-action-builders/service-instance.action.builders'; import { QParam, QParamJoiners } from '../../shared/q-param'; import { fetchTotalResults } from '../cloud-foundry/cf.helpers'; import { ServicePlanAccessibility } from './services.service'; @@ -83,16 +73,9 @@ export const isEditServiceInstanceMode = (activatedRoute: ActivatedRoute) => { return !!cfId && !!serviceInstanceId; }; -export const getServiceInstancesInCf = (cfGuid: string, store: Store, paginationMonitorFactory: PaginationMonitorFactory) => { +export const getServiceInstancesInCf = (cfGuid: string) => { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); - return getPaginationObservables>({ - store, - action, - paginationMonitor: paginationMonitorFactory.create(paginationKey, action, action.flattenPagination) - }, action.flattenPagination).entities$; + return cfEntityCatalog.serviceInstance.store.getPaginationService(cfGuid, paginationKey).entities$; }; export const fetchServiceInstancesCount = ( @@ -103,14 +86,11 @@ export const fetchServiceInstancesCount = ( paginationMonitorFactory: PaginationMonitorFactory): Observable => { const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; const uniqueKey = spaceGuid || orgGuid || cfGuid; - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( + const action = cfEntityCatalog.serviceInstance.actions.getMultiple( cfGuid, createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), { includeRelations: [], populateMissing: false } - ); - action.initialParams.q = []; + ) if (orgGuid) { action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); } @@ -133,9 +113,7 @@ export const getServiceSummaryUrl = (cfGuid: string, serviceGuid: string): strin export const getServicePlans = ( service$: Observable>, - cfGuid: string, - store: Store, - paginationMonitorFactory: PaginationMonitorFactory + cfGuid: string ): Observable[]> => { return service$.pipe( filter(p => !!p), @@ -143,22 +121,12 @@ export const getServicePlans = ( if (service.entity.service_plans && service.entity.service_plans.length > 0) { return observableOf(service.entity.service_plans); } else { + // Could be a space-scoped service, make a request to fetch the plan const guid = service.metadata.guid; const paginationKey = createEntityRelationPaginationKey(servicePlanEntityType, guid); - const servicePlanEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanEntityType); - const actionBuilder = servicePlanEntity.actionOrchestrator.getActionBuilder('getAllForServiceInstance'); - const getServicePlansAction = actionBuilder(guid, cfGuid, paginationKey) as PaginatedAction; - // Could be a space-scoped service, make a request to fetch the plan - return getPaginationObservables>({ - store, - action: getServicePlansAction, - paginationMonitor: paginationMonitorFactory.create( - getServicePlansAction.paginationKey, - cfEntityFactory(servicePlanEntityType), - getServicePlansAction.flattenPagination - ) - }, getServicePlansAction.flattenPagination) - .entities$.pipe(share(), first()); + return cfEntityCatalog.servicePlan.store.getAllForServiceInstance.getPaginationService( + guid, cfGuid, paginationKey + ).entities$.pipe(share(), first()); } })); }; @@ -226,66 +194,37 @@ export const populateServicePlanExtraTyped = (servicePlan: APIResource( - serviceGuid: string, - entityRequestAction: EntityRequestAction, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - return entityServiceFactory.create>( - serviceGuid, - entityRequestAction - ); -}; export const getServiceBroker = ( serviceBrokerGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceBrokerAction = actionBuilder(serviceBrokerGuid, cfGuid); - return getEntityService(serviceBrokerGuid, getServiceBrokerAction, entityServiceFactory); -}; +): EntityService> => cfEntityCatalog.serviceBroker.store.getEntityService(serviceBrokerGuid, cfGuid, {}); export const getServiceBrokerName = ( serviceBrokerGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory): Observable => { - return getServiceBroker(serviceBrokerGuid, cfGuid, entityServiceFactory).waitForEntity$.pipe( - filter(res => !!res), - map(a => a.entity.entity.name), - first() - ); -}; +): Observable => getServiceBroker(serviceBrokerGuid, cfGuid).waitForEntity$.pipe( + filter(res => !!res), + map(a => a.entity.entity.name), + first() +); export const getCfService = ( serviceGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory -): EntityService> => { - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceAction = actionBuilder(serviceGuid, cfGuid); - return getEntityService(serviceGuid, getServiceAction, entityServiceFactory); -}; +): EntityService> => cfEntityCatalog.service.store.getEntityService(serviceGuid, cfGuid, {}); export const getCfServiceInstance = ( serviceInstanceGuid: string, cfGuid: string, - entityServiceFactory: EntityServiceFactory, includeRelations: string[] = null ): EntityService> => { - const entity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = entity.actionOrchestrator.getActionBuilder('get'); - const getAction = actionBuilder( + return cfEntityCatalog.serviceInstance.store.getEntityService( serviceInstanceGuid, cfGuid, { includeRelations, populateMissing: !!includeRelations } - ); - return getEntityService(serviceInstanceGuid, getAction, entityServiceFactory); + ) }; diff --git a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts index e51f6b2275..e7db49a1d4 100644 --- a/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/service-catalog/services.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; import { combineLatest, filter, first, map, publishReplay, refCount, switchMap } from 'rxjs/operators'; @@ -12,18 +11,11 @@ import { IServicePlan, IServicePlanVisibility, } from '../../../../core/src/core/cf-api-svc.types'; -import { ISpace } from '../../../../core/src/core/cf-api.types'; import { getIdFromRoute } from '../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { EntityService } from '../../../../store/src/entity-service'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../store/src/types/api.types'; -import { CFAppState } from '../../cf-app-state'; -import { cfEntityFactory } from '../../cf-entity-factory'; -import { serviceBrokerEntityType, servicePlanVisibilityEntityType, spaceEntityType } from '../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { serviceBrokerEntityType, servicePlanVisibilityEntityType } from '../../cf-entity-types'; import { createEntityRelationPaginationKey } from '../../entity-relations/entity-relations.types'; import { getCfService, getServiceInstancesInCf, getServiceName, getServicePlans } from './services-helper'; @@ -59,17 +51,17 @@ export class ServicesService { initialised$ = new BehaviorSubject(false); constructor( - private store: Store, - private entityServiceFactory: EntityServiceFactory, public activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory - ) { this.cfGuid = getIdFromRoute(activatedRoute, 'endpointId'); this.serviceGuid = getIdFromRoute(activatedRoute, 'serviceId'); - this.serviceEntityService = getCfService(this.serviceGuid, this.cfGuid, this.entityServiceFactory); + if (!this.serviceGuid) { + return; + } + + this.serviceEntityService = getCfService(this.serviceGuid, this.cfGuid); this.service$ = this.serviceEntityService.waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => o.entity), @@ -82,43 +74,15 @@ export class ServicesService { getServicePlanVisibilities = () => { const paginationKey = createEntityRelationPaginationKey(servicePlanVisibilityEntityType, this.cfGuid); - const servicePlanVisibilityEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanVisibilityEntityType); - const actionBuilder = servicePlanVisibilityEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicePlanVisibilitiesAction = actionBuilder(this.cfGuid, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServicePlanVisibilitiesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(servicePlanVisibilityEntityType), - getServicePlanVisibilitiesAction.flattenPagination - ) - }, - getServicePlanVisibilitiesAction.flattenPagination - ).entities$; + return cfEntityCatalog.servicePlanVisibility.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } private getServiceInstances = () => { - return getServiceInstancesInCf(this.cfGuid, this.store, this.paginationMonitorFactory); + return getServiceInstancesInCf(this.cfGuid); } private getServiceBrokers = () => { const paginationKey = createEntityRelationPaginationKey(serviceBrokerEntityType, this.cfGuid); - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServiceBrokersAction = actionBuilder(this.cfGuid, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServiceBrokersAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceBrokerEntityType), - getServiceBrokersAction.flattenPagination - ) - }, - getServiceBrokersAction.flattenPagination - ).entities$; + return cfEntityCatalog.serviceBroker.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } getServiceBrokerById = (guid: string): Observable> => this.serviceBrokers$ @@ -191,7 +155,7 @@ export class ServicesService { private initBaseObservables() { this.servicePlanVisibilities$ = this.getServicePlanVisibilities(); this.serviceExtraInfo$ = this.service$.pipe(map(o => JSON.parse(o.entity.extra))); - this.servicePlans$ = getServicePlans(this.service$, this.cfGuid, this.store, this.paginationMonitorFactory); + this.servicePlans$ = getServicePlans(this.service$, this.cfGuid); this.serviceBrokers$ = this.getServiceBrokers(); this.serviceBroker$ = this.serviceBrokers$.pipe( filter(p => !!p && p.length > 0), @@ -210,14 +174,7 @@ export class ServicesService { isSpaceScoped: false }); } else { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(spaceGuid, this.cfGuid); - const spaceEntityService = this.entityServiceFactory.create>( - spaceGuid, - getSpaceAction - ); - return spaceEntityService.waitForEntity$.pipe( + return cfEntityCatalog.space.store.getEntityService(spaceGuid, this.cfGuid).waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => ({ isSpaceScoped: true, diff --git a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts index 8db10f06a6..d0a0413e01 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/detach-service-instance/detach-service-instance.component.ts @@ -5,21 +5,21 @@ import { Store } from '@ngrx/store'; import { Observable, of as observableOf, ReplaySubject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType, serviceInstancesEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; +import { serviceBindingEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { ServiceActionHelperService, } from '../../../../../cloud-foundry/src/shared/data-services/service-action-helper.service'; -import { IServiceBinding, IServiceInstance } from '../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; +import { IServiceBinding } from '../../../../../core/src/core/cf-api-svc.types'; import { AppMonitorComponentTypes, } from '../../../../../core/src/shared/components/app-action-monitor-icon/app-action-monitor-icon.component'; import { ITableColumn } from '../../../../../core/src/shared/components/list/list-table/table.types'; import { RouterNav } from '../../../../../store/src/actions/router.actions'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../../cf-types'; @Component({ selector: 'app-detach-service-instance', @@ -61,24 +61,14 @@ export class DetachServiceInstanceComponent { private store: Store, private datePipe: DatePipe, private serviceActionHelperService: ServiceActionHelperService, - private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory + activatedRoute: ActivatedRoute, ) { this.cfGuid = activatedRoute.snapshot.params.endpointId; const serviceInstanceId = activatedRoute.snapshot.params.serviceInstanceId; - - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(serviceInstanceId, this.cfGuid); - const serviceBindingEntityService = this.entityServiceFactory.create>( - serviceInstanceId, - getServiceInstanceAction - ); - this.title$ = serviceBindingEntityService.waitForEntity$.pipe( + this.title$ = cfEntityCatalog.serviceInstance.store.getEntityService(serviceInstanceId, this.cfGuid).waitForEntity$.pipe( filter(o => !!o && !!o.entity), map(o => `Unbind apps from '${o.entity.entity.name}'`), ); - } getId = (el: APIResource) => el.metadata.guid; diff --git a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts index 3d76cfcc5c..32abd41efc 100644 --- a/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts +++ b/src/frontend/packages/cloud-foundry/src/features/services/services/services-wall.service.ts @@ -1,48 +1,25 @@ import { Injectable } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { filter, map, publishReplay, refCount } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { serviceEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { IService } from '../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../entity-relations/entity-relations.types'; @Injectable() export class ServicesWallService { services$: Observable[]>; - constructor( - private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory - ) { + constructor() { this.services$ = this.initServicesObservable(); } initServicesObservable = () => { - const paginationKey = createEntityRelationPaginationKey(serviceEntityType); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicesAction = actionBuilder(null, paginationKey); - return getPaginationObservables>( - { - store: this.store, - action: getServicesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceEntityType), - getServicesAction.flattenPagination - ) - }, - getServicesAction.flattenPagination - ).entities$; + const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey); + return cfEntityCatalog.service.store.getPaginationService(null, paginationKey, {}).entities$ } getServicesInCf = (cfGuid: string) => this.services$.pipe( @@ -59,20 +36,6 @@ export class ServicesWallService { getServicesInSpace = (cfGuid: string, spaceGuid: string) => { const paginationKey = this.getSpaceServicePagKey(cfGuid, spaceGuid); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const getAllServicesForSpaceAction = actionBuilder(cfGuid, paginationKey, spaceGuid) as PaginatedAction; - return getPaginationObservables>( - { - store: this.store, - action: getAllServicesForSpaceAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(serviceEntityType), - getAllServicesForSpaceAction.flattenPagination - ) - }, - getAllServicesForSpaceAction.flattenPagination - ).entities$; + return cfEntityCatalog.service.store.getAllInSpace.getPaginationService(cfGuid, paginationKey, spaceGuid).entities$; } } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts index dcdb7795b3..599a9393ad 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/add-service-instance/add-service-instance.component.ts @@ -16,7 +16,6 @@ import { tap, } from 'rxjs/operators'; -import { GetApplication } from '../../../../../../cloud-foundry/src/actions/application.actions'; import { ResetCreateServiceInstanceOrgAndSpaceState, ResetCreateServiceInstanceState, @@ -27,11 +26,7 @@ import { SetServiceInstanceGuid, } from '../../../../../../cloud-foundry/src/actions/create-service-instance.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; -import { - applicationEntityType, - serviceInstancesEntityType, - spaceEntityType, -} from '../../../../../../cloud-foundry/src/cf-entity-types'; +import { applicationEntityType, spaceEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationKey, createEntityRelationPaginationKey, @@ -45,21 +40,10 @@ import { import { selectCreateServiceInstance, } from '../../../../../../cloud-foundry/src/store/selectors/create-service-instance.selectors'; -import { IServiceInstance } from '../../../../../../core/src/core/cf-api-svc.types'; import { IApp, ISpace } from '../../../../../../core/src/core/cf-api.types'; import { getIdFromRoute } from '../../../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../store/src/types/pagination.types'; -import { cfEntityFactory } from '../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { ApplicationActionBuilders } from '../../../../entity-action-builders/application.action-builders'; -import { ServiceInstanceActionBuilders } from '../../../../entity-action-builders/service-instance.action.builders'; -import { SpaceActionBuilders } from '../../../../entity-action-builders/space.action-builders'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { SERVICE_INSTANCE_TYPES } from '../add-service-instance-base-step/add-service-instance.types'; import { CreateServiceInstanceHelperServiceFactory } from '../create-service-instance-helper-service-factory.service'; import { CreateServiceInstanceHelper } from '../create-service-instance-helper.service'; @@ -102,30 +86,13 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit map(details => details.spaceGuid) ); - private serviceInstanceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceInstancesEntityType - ); - - private spaceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - spaceEntityType - ); - - private appEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - applicationEntityType - ); - constructor( private cSIHelperServiceFactory: CreateServiceInstanceHelperServiceFactory, private activatedRoute: ActivatedRoute, private store: Store, private cfOrgSpaceService: CfOrgSpaceDataService, private csiGuidsService: CsiGuidsService, - private entityServiceFactory: EntityServiceFactory, public modeService: CsiModeService, - private paginationMonitorFactory: PaginationMonitorFactory, route: ActivatedRoute ) { const cfGuid = getIdFromRoute(this.activatedRoute, 'endpointId'); @@ -165,17 +132,9 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit switchMap(csi => { this.appsEmitted.next(false); const paginationKey = createEntityRelationPaginationKey(spaceEntityType, csi.spaceGuid); - const actionBuilder = this.appEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const getAllAppsInSpaceAction = actionBuilder(csi.spaceGuid, csi.cfGuid, paginationKey) as PaginatedAction; - return getPaginationObservables({ - store: this.store, - action: getAllAppsInSpaceAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(applicationEntityType), - getAllAppsInSpaceAction.flattenPagination - ) - }, getAllAppsInSpaceAction.flattenPagination).entities$; + return cfEntityCatalog.application.store.getAllInSpace.getPaginationService( + csi.spaceGuid, csi.cfGuid, paginationKey + ).entities$; }), tap(() => this.appsEmitted.next(true)), publishReplay(1), @@ -214,11 +173,12 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit const cfId = getIdFromRoute(this.activatedRoute, 'endpointId'); this.appId = appId; this.bindAppStepperText = 'Binding Params (Optional)'; - const entityService = this.entityServiceFactory.create>( + return cfEntityCatalog.application.store.getEntityService( appId, - new GetApplication(appId, cfId, [createEntityRelationKey(applicationEntityType, spaceEntityType)]) - ); - return entityService.waitForEntity$.pipe( + cfId, { + includeRelations: [createEntityRelationKey(applicationEntityType, spaceEntityType)] + } + ).waitForEntity$.pipe( filter(p => !!p), tap(app => { const spaceEntity = app.entity.entity.space as APIResource; @@ -238,8 +198,7 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit this.serviceInstanceId = serviceInstanceId; this.title$ = observableOf('Edit User Provided Service Instance'); } else { - const entityService = this.getServiceInstanceEntityService(serviceInstanceId, endpointId); - return entityService.waitForEntity$.pipe( + return cfEntityCatalog.serviceInstance.store.getEntityService(serviceInstanceId, endpointId).waitForEntity$.pipe( filter(p => !!p), tap(serviceInstance => { const serviceInstanceEntity = serviceInstance.entity.entity; @@ -257,8 +216,7 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit '' )); this.store.dispatch(new SetCreateServiceInstanceServicePlan(serviceInstanceEntity.service_plan_guid)); - const spaceEntityService = this.getSpaceEntityService(serviceInstanceEntity.space_guid, endpointId); - spaceEntityService.waitForEntity$.pipe( + cfEntityCatalog.space.store.getEntityService(serviceInstanceEntity.space_guid, endpointId).waitForEntity$.pipe( filter(p => !!p), tap(spaceEntity => { this.store.dispatch(new SetCreateServiceInstanceCFDetails( @@ -276,20 +234,6 @@ export class AddServiceInstanceComponent implements OnDestroy, AfterContentInit } } - private getServiceInstanceEntityService(serviceInstanceId: string, cfId: string) { - return this.entityServiceFactory.create>( - serviceInstanceId, - this.serviceInstanceEntity.actionOrchestrator.getActionBuilder('get')(serviceInstanceId, cfId) - ); - } - - private getSpaceEntityService(spaceGuid: string, cfGuid: string) { - return this.entityServiceFactory.create>( - spaceGuid, - this.spaceEntity.actionOrchestrator.getActionBuilder('get')(spaceGuid, cfGuid) - ); - } - ngOnDestroy(): void { this.store.dispatch(new ResetCreateServiceInstanceState()); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts index 2bba06cd52..22bacf5d6e 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/bind-apps-step/bind-apps-step.component.ts @@ -9,7 +9,6 @@ import { IServicePlan } from '../../../../../../core/src/core/cf-api-svc.types'; import { IApp } from '../../../../../../core/src/core/cf-api.types'; import { pathGet, safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; -import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { APIResource } from '../../../../../../store/src/types/api.types'; import { SchemaFormConfig } from '../../schema-form/schema-form.component'; @@ -37,7 +36,6 @@ export class BindAppsStepComponent implements OnDestroy, AfterContentInit { constructor( private store: Store, - private paginationMonitorFactory: PaginationMonitorFactory ) { this.stepperForm = new FormGroup({ apps: new FormControl(''), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts index db99edb66a..46bfdf8a89 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper-service-factory.service.ts @@ -1,9 +1,7 @@ import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { CreateServiceInstanceHelper } from './create-service-instance-helper.service'; @@ -15,8 +13,6 @@ export class CreateServiceInstanceHelperServiceFactory { } = {}; constructor( private store: Store, - private entityServiceFactory: EntityServiceFactory, - private activatedRoute: ActivatedRoute, private paginationMonitorFactory: PaginationMonitorFactory ) { } @@ -30,7 +26,6 @@ export class CreateServiceInstanceHelperServiceFactory { this.store, serviceGuid, cfGuid, - this.entityServiceFactory, this.paginationMonitorFactory ); this.serviceInstanceCache[key] = instance; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts index 45bd998cc6..23ec1f9838 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/create-service-instance-helper.service.ts @@ -17,13 +17,11 @@ import { IServicePlanVisibility, } from '../../../../../core/src/core/cf-api-svc.types'; import { CF_GUID } from '../../../../../core/src/shared/entity.tokens'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; import { getCfService, getServiceBroker, @@ -43,7 +41,6 @@ export class CreateServiceInstanceHelper { private store: Store, public serviceGuid: string, @Inject(CF_GUID) public cfGuid: string, - private entityServiceFactory: EntityServiceFactory, private paginationMonitorFactory: PaginationMonitorFactory ) { this.initBaseObservables(); @@ -51,9 +48,7 @@ export class CreateServiceInstanceHelper { initBaseObservables = () => { - const serviceEntityService = getCfService(this.serviceGuid, this.cfGuid, this.entityServiceFactory); - - this.service$ = serviceEntityService.waitForEntity$.pipe( + this.service$ = getCfService(this.serviceGuid, this.cfGuid).waitForEntity$.pipe( filter(o => !!o && !!o.entity && !!o.entity.entity && !!o.entity.entity.service_plans), // filter(o => !!o && !!o.entity), map(o => o.entity), @@ -62,41 +57,21 @@ export class CreateServiceInstanceHelper { ); this.serviceBroker$ = this.service$.pipe( - map(service => getServiceBroker(service.entity.service_broker_guid, this.cfGuid, this.entityServiceFactory)), + map(service => getServiceBroker(service.entity.service_broker_guid, this.cfGuid)), switchMap(serviceService => serviceService.waitForEntity$), map(entity => entity.entity) ); const paginationKey = createEntityRelationPaginationKey(servicePlanVisibilityEntityType, this.cfGuid); - const servicePlanVisibilityEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, servicePlanVisibilityEntityType); - const actionBuilder = servicePlanVisibilityEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicePlanVisibilitiesAction = actionBuilder(this.cfGuid, paginationKey); - this.servicePlanVisibilities$ = getPaginationObservables>( - { - store: this.store, - action: getServicePlanVisibilitiesAction, - paginationMonitor: this.paginationMonitorFactory.create( - paginationKey, - cfEntityFactory(servicePlanVisibilityEntityType), - getServicePlanVisibilitiesAction.flattenPagination - ) - }, - getServicePlanVisibilitiesAction.flattenPagination - ).entities$; - + this.servicePlanVisibilities$ = cfEntityCatalog.servicePlanVisibility.store.getPaginationService(this.cfGuid, paginationKey, {}).entities$ } getServicePlanVisibilities = (): Observable[]> => this.servicePlanVisibilities$.pipe(filter(p => !!p)) - // getServicePlanVisibilitiesForOrg = (orgGuid: string): Observable[]> => - // this.servicePlanVisibilities$.pipe( - // filter(p => !!p), - // map(entities => entities.filter(entity => entity.entity.organization_guid === orgGuid)) - // ) getServicePlans(): Observable[]> { - return getServicePlans(this.service$, this.cfGuid, this.store, this.paginationMonitorFactory); + return getServicePlans(this.service$, this.cfGuid); } getServiceName = () => { @@ -107,98 +82,19 @@ export class CreateServiceInstanceHelper { ); } - // getSelectedServicePlan = (): Observable> => { - // return observableCombineLatest(this.store.select(selectCreateServiceInstanceServicePlan), this.getServicePlans()) - // .pipe( - // filter(([p, q]) => !!p && !!q), - // map(([servicePlanGuid, servicePlans]) => servicePlans.filter(o => o.metadata.guid === servicePlanGuid)), - // map(p => p[0]), filter(p => !!p) - // ); - // } - - // getSelectedServicePlanAccessibility = (): Observable => { - // return this.getSelectedServicePlan().pipe( - // switchMap(plan => getServicePlanAccessibility(plan, this.getServicePlanVisibilities())) - // ); - // } - - // getOrgsForSelectedServicePlan = (): Observable[]> => { - // return this.getSelectedServicePlan() - // .pipe( - // switchMap(servicePlan => getServicePlanAccessibility(servicePlan, this.getServicePlanVisibilities())), - // switchMap(servicePlanAccessibility => { - // if (servicePlanAccessibility.isPublic) { - // const getAllOrgsAction = CloudFoundryEndpointService.createGetAllOrganizationsLimitedSchema(this.cfGuid); - // return getPaginationObservables>({ - // store: this.store, - // action: getAllOrgsAction, - // paginationMonitor: this.paginationMonitorFactory.create( - // getAllOrgsAction.paginationKey, - // cfEntityFactory(organizationEntityType) - // ) - // }, true) - // .entities$.pipe(share(), first()); - // } else if (servicePlanAccessibility.spaceScoped) { - // // Service plan is not public, but is space-scoped - // const action = new GetSpace(servicePlanAccessibility.spaceGuid, this.cfGuid, - // [ - // createEntityRelationKey(spaceEntityType, organizationEntityType), - // ] - // ); - // action.entity = [cfEntityFactory(spaceWithOrgEntityType)]; - // return this.entityServiceFactory.create>( - // spaceEntityType, - // cfEntityFactory(spaceWithOrgEntityType), - // servicePlanAccessibility.spaceGuid, - // action, - // true - // ).waitForEntity$ - // .pipe( - // // Block until the org is either fetched or associated with existing entity - // filter(p => !!pathGet('entity.entity.organization.entity', p)), - // map((p) => { - // const orgEntity = { ...p.entity.entity.organization.entity, spaces: [p.entity] }; - // return [{ ...p.entity.entity.organization, entity: orgEntity }]; - // }), - // ); - // } else if (servicePlanAccessibility.hasVisibilities) { - // // Service plan is not public, fetch visibilities - // return this.getServicePlanVisibilitiesForPlan(servicePlanAccessibility.guid) - // .pipe( - // map(s => s.map(o => o.entity.organization)), - // ); - // } - // } - // ), - // share(), first() - // ); - // } - - // getServicePlanVisibilitiesForPlan = (servicePlanGuid: string): Observable[]> => { - // return this.getServicePlanVisibilities().pipe( - // filter(p => !!p), - // map(vis => vis.filter(s => s.entity.service_plan_guid === servicePlanGuid)), - // first() - // ); - // } - getServiceInstancesForService = (servicePlanGuid: string = null, spaceGuid: string = null, cfGuid: string = null) => { let action; let paginationKey; - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (spaceGuid) { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, `${spaceGuid}-${servicePlanGuid}`); const q = [new QParam('service_plan_guid', servicePlanGuid, QParamJoiners.colon).toString()]; - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - action = actionBuilder(spaceGuid, cfGuid, paginationKey, q); + action = cfEntityCatalog.serviceInstance.actions.getAllInSpace(spaceGuid, cfGuid, paginationKey, q) } else if (servicePlanGuid) { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, servicePlanGuid); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInServicePlan'); - action = actionBuilder(servicePlanGuid, cfGuid, paginationKey); + action = cfEntityCatalog.serviceInstance.actions.getAllInServicePlan(servicePlanGuid, cfGuid, paginationKey); } else { paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - action = actionBuilder(cfGuid, paginationKey); + action = cfEntityCatalog.serviceInstance.actions.getMultiple(cfGuid, paginationKey); } return getPaginationObservables>({ store: this.store, @@ -214,24 +110,4 @@ export class CreateServiceInstanceHelper { refCount() ); } - - // getServicesForSpace = (spaceGuid: string, cfGuid: string) => { - // const paginationKey = createEntityRelationPaginationKey(serviceEntityType, spaceGuid); - // return getPaginationObservables>( - // { - // store: this.store, - // action: new GetAllServicesForSpace(paginationKey, cfGuid, spaceGuid), - // paginationMonitor: this.paginationMonitorFactory.create( - // paginationKey, - // entityFactory(serviceEntityType) - // ) - // }, - // true - // ).entities$.pipe( - // filter(p => !!p), - // publishReplay(1), - // refCount() - // ); - // } - } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts index f507f62e34..3b7f414439 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/csi-mode.service.ts @@ -1,15 +1,11 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { filter, map } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { serviceBindingEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; import { SpaceScopedService } from '../../../../../cloud-foundry/src/features/service-catalog/services.service'; -import { selectCfRequestInfo } from '../../../../../cloud-foundry/src/store/selectors/api.selectors'; import { getIdFromRoute } from '../../../../../core/src/core/utils.service'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../cf-types'; +import { RequestInfoState } from '../../../../../store/src/reducers/api-request-reducer/types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; export enum CreateServiceInstanceMode { MARKETPLACE_MODE = 'marketPlaceMode', @@ -54,7 +50,6 @@ export class CsiModeService { constructor( private activatedRoute: ActivatedRoute, - private store: Store ) { const serviceId = getIdFromRoute(activatedRoute, 'serviceId'); const serviceInstanceId = getIdFromRoute(activatedRoute, 'serviceInstanceId'); @@ -136,16 +131,11 @@ export class CsiModeService { public createApplicationServiceBinding(serviceInstanceGuid: string, cfGuid: string, appGuid: string, params: object) { const guid = `${cfGuid}-${appGuid}-${serviceInstanceGuid}`; - const servceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = servceBindingEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceBindingAction = actionBuilder( + return cfEntityCatalog.serviceBinding.api.create( guid, cfGuid, { applicationGuid: appGuid, serviceInstanceGuid, params } - ); - this.store.dispatch(createServiceBindingAction); - - return this.store.select(selectCfRequestInfo(serviceBindingEntityType, guid)).pipe( + ).pipe( filter(s => { return s && !s.creating; }), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts index 61ef2e0af5..c31b6f6142 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-details-step/specify-details-step.component.ts @@ -3,7 +3,13 @@ import { AfterContentInit, Component, Input, OnDestroy } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { MatChipInputEvent } from '@angular/material/chips'; import { Store } from '@ngrx/store'; -import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; +import { + BehaviorSubject, + combineLatest as observableCombineLatest, + Observable, + of as observableOf, + Subscription, +} from 'rxjs'; import { combineLatest, distinctUntilChanged, @@ -27,13 +33,12 @@ import { IServiceInstance, IServicePlan } from '../../../../../../core/src/core/ import { pathGet, safeStringToObj } from '../../../../../../core/src/core/utils.service'; import { StepOnNextResult } from '../../../../../../core/src/shared/components/stepper/step/step.component'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { getDefaultRequestState, RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource, NormalizedResponse } from '../../../../../../store/src/types/api.types'; import { UpdateServiceInstance } from '../../../../actions/service-instances.actions'; import { CFAppState } from '../../../../cf-app-state'; -import { appEnvVarsEntityType, serviceBindingEntityType, serviceInstancesEntityType } from '../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; +import { serviceInstancesEntityType } from '../../../../cf-entity-types'; import { selectCfRequestInfo, selectCfUpdateInfo } from '../../../../store/selectors/api.selectors'; import { selectCreateServiceInstance, @@ -312,13 +317,7 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit return req; } else { // Refetch env vars for app, since they have been changed by CF - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(state.bindAppGuid, state.cfGuid); - this.store.dispatch( - getAppEnvVarsAction - ); - + cfEntityCatalog.appEnvVar.api.getMultiple(state.bindAppGuid, state.cfGuid); return this.routeToServices(state.cfGuid, state.bindAppGuid); } }) @@ -416,35 +415,26 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit tagsStr: string[], isEditMode: boolean ) { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); if (isEditMode) { - const updateActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('update'); - const updateServiceInstanceAction = updateActionBuilder( - cfGuid, + return cfEntityCatalog.serviceInstance.actions.update( newServiceInstanceGuid, + cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ); - return updateServiceInstanceAction; + ) } - const createActionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceInstanceAction = createActionBuilder( - cfGuid, + return cfEntityCatalog.serviceInstance.actions.create( newServiceInstanceGuid, + cfGuid, { name, servicePlanGuid, spaceGuid, params, tags: tagsStr } - ); - return createServiceInstanceAction; + ) } private getIdFromResponseGetter(cfGuid: string, newId: string, isEditMode: boolean) { return (response: NormalizedResponse) => { if (!isEditMode) { - // We need to re-fetch the Service Instance - // incase of creation because the entity returned is incomplete + // We need to re-fetch the Service Instance in case of creation because the entity returned is incomplete const guid = response.result[0]; - const serviceIntanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceIntanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(guid, cfGuid); - this.store.dispatch(getServiceInstanceAction); + cfEntityCatalog.serviceInstance.api.get(guid, cfGuid); return guid; } return newId; @@ -492,22 +482,6 @@ export class SpecifyDetailsStepComponent implements OnDestroy, AfterContentInit ); } - - createBinding = (serviceInstanceGuid: string, cfGuid: string, appGuid: string, params: object) => { - - const guid = `${cfGuid}-${appGuid}-${serviceInstanceGuid}`; - const servceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = servceBindingEntity.actionOrchestrator.getActionBuilder('create'); - const createServiceBindingAction = actionBuilder( - cfGuid, - guid, - { applicationGuid: appGuid, serviceInstanceGuid, params } - ); - this.store.dispatch(createServiceBindingAction); - - return this.store.select(selectCfRequestInfo(serviceBindingEntityType, guid)); - } - addTag(event: MatChipInputEvent): void { const input = event.input; const value = event.value; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts index 433f914488..b40f8dda75 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/add-service-instance/specify-user-provided-details/specify-user-provided-details.component.ts @@ -14,7 +14,6 @@ import { } from '../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { - appEnvVarsEntityType, serviceBindingEntityType, userProvidedServiceInstanceEntityType, } from '../../../../../../cloud-foundry/src/cf-entity-types'; @@ -33,9 +32,8 @@ import { isValidJsonValidator } from '../../../../../../core/src/shared/form-val import { CloudFoundryUserProvidedServicesService, } from '../../../../../../core/src/shared/services/cloud-foundry-user-provided-services.service'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; import { CreateServiceFormMode, CsiModeService } from './../csi-mode.service'; const { proxyAPIVersion, cfAPIVersion } = environment; @@ -292,12 +290,7 @@ export class SpecifyUserProvidedDetailsComponent implements OnDestroy { return { success: false, message: `Failed to create service instance binding: ${req.message}` }; } else { // Refetch env vars for app, since they have been changed by CF - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(data.bindAppGuid, data.cfGuid); - this.store.dispatch( - getAppEnvVarsAction - ); + cfEntityCatalog.appEnvVar.api.getMultiple(data.bindAppGuid, data.cfGuid) return { success: true, redirect: true }; } }) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts index 147e03657b..34f2d6488c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/card-cf-recent-apps.component.ts @@ -9,10 +9,8 @@ import { CloudFoundryEndpointService, } from '../../../../../../cloud-foundry/src/features/cloud-foundry/services/cloud-foundry-endpoint.service'; import { IApp } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { appStatsEntityType } from '../../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; const RECENT_ITEMS_COUNT = 10; @@ -45,10 +43,7 @@ export class CardCfRecentAppsComponent implements OnInit { private fetchAppStats(recentApps: APIResource[]) { recentApps.forEach(app => { if (app.entity.state === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppStatsAction = actionBuilder(app.metadata.guid, this.cfEndpointService.cfGuid); - this.store.dispatch(getAppStatsAction); + cfEntityCatalog.appStats.api.getMultiple(app.metadata.guid, this.cfEndpointService.cfGuid); } }); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts index 6006ee7bc3..a674581596 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/card-cf-recent-apps/compact-app-card/compact-app-card.component.ts @@ -41,7 +41,6 @@ export class CompactAppCardComponent implements OnInit { this.bcType = this.setBreadcrumbType(this.activeRouteCfOrgSpace); const initState = this.appStateService.get(this.app.entity, null); this.applicationState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.app.entity, this.app.metadata.guid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts index 079ba90a05..1783dd1c18 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/cards/service-broker-card/service-broker-card.component.ts @@ -1,18 +1,12 @@ import { Component, OnDestroy } from '@angular/core'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, switchMap, take, tap } from 'rxjs/operators'; -import { CFAppState } from '../../../../../../cloud-foundry/src/cf-app-state'; import { ServicesService } from '../../../../../../cloud-foundry/src/features/service-catalog/services.service'; import { IServiceBroker } from '../../../../../../core/src/core/cf-api-svc.types'; -import { ISpace } from '../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; import { safeUnsubscribe } from '../../../../../../core/src/core/utils.service'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../cf-types'; -import { spaceEntityType } from '../../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../../cf-entity-catalog'; @Component({ selector: 'app-service-broker-card', @@ -27,9 +21,7 @@ export class ServiceBrokerCardComponent implements OnDestroy { subs: Subscription[] = []; constructor( - private servicesService: ServicesService, - private store: Store, - private entityServiceFactory: EntityServiceFactory + private servicesService: ServicesService ) { this.serviceBroker$ = this.servicesService.serviceBroker$; this.subs.push(this.serviceBroker$.pipe( @@ -39,14 +31,7 @@ export class ServiceBrokerCardComponent implements OnDestroy { filter(o => !!o), // Broker is space scoped switchMap(spaceGuid => { - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const actionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('get'); - const getSpaceAction = actionBuilder(spaceGuid, this.servicesService.cfGuid); - const spaceService = this.entityServiceFactory.create>( - spaceGuid, - getSpaceAction - ); - return spaceService.waitForEntity$; + return cfEntityCatalog.space.store.getEntityService(spaceGuid, this.servicesService.cfGuid).waitForEntity$ }), tap(space => { this.spaceLink = ['/cloud-foundry', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts index f7832d76a6..3976e36dc2 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-data-source.ts @@ -2,14 +2,12 @@ import { Store } from '@ngrx/store'; import { map } from 'rxjs/operators'; import { AppStat } from '../../../../../../../cloud-foundry/src/store/types/app-metadata.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { applicationEntityType, appStatsEntityType } from '../../../../../cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../../entity-relations/entity-relations.types'; @@ -24,9 +22,7 @@ export class CfAppInstancesDataSource extends ListDataSource ) { const paginationKey = createEntityRelationPaginationKey(applicationEntityType, appGuid); - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const action = actionBuilder(appGuid, cfGuid) as PaginatedAction; + const action = cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid) super( { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts index c133b21cca..a07393539f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-map-routes-list-config.service.ts @@ -3,21 +3,19 @@ import { Injectable } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Store } from '@ngrx/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { GetSpaceRoutes } from '../../../../../../../cloud-foundry/src/actions/space.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType, spaceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; +import { spaceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { TableCellRadioComponent, } from '../../../../../../../core/src/shared/components/list/list-table/table-cell-radio/table-cell-radio.component'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfAppRoutesListConfigServiceBase } from './cf-app-routes-list-config-base'; @@ -33,13 +31,11 @@ export class CfAppMapRoutesListConfigService extends CfAppRoutesListConfigServic currentUserPermissionsService: CurrentUserPermissionsService, ) { const spaceGuid = activatedRoute.snapshot.queryParamMap.get('spaceGuid'); - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder( + const action = cfEntityCatalog.route.actions.getAllInSpace( spaceGuid, appService.cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid) - ) as GetSpaceRoutes; + ) // If parentEntitySchema is set the entity validation process will look for the space routes in the parent space entity // In this case, we do have them however they're missing the route-->app relationship.. which means we fetch them at a rate of one per // route. For spaces with hundreds of routes this isn't acceptable, so remove the link to the parent and fetch the list afresh. diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts index 7c4e0decb6..2f970c7cfa 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-route/cf-app-routes-list-config-base.ts @@ -3,17 +3,15 @@ import { Store } from '@ngrx/store'; import { of as observableOf } from 'rxjs'; import { publishReplay, refCount, switchMap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { GetAppRoutes } from '../../../../../../../cloud-foundry/src/actions/application-service-routes.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { CurrentUserPermissions } from '../../../../../../../core/src/core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../../../core/src/core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { ApplicationService } from '../../../../../features/applications/application.service'; import { CfRoutesListConfigBase } from '../cf-routes/cf-routes-list-config-base'; import { CfAppRoutesDataSource } from './cf-app-routes-data-source'; @@ -64,9 +62,7 @@ export abstract class CfAppRoutesListConfigServiceBase extends CfRoutesListConfi this.getDataSource = () => { // Lazy init so that any changes to the columns & data functions (like sort) are correctly applied if (!this.dataSource) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppRoutesAction = actionBuilder(appService.appGuid, appService.cfGuid) as PaginatedAction; + const getAppRoutesAction = cfEntityCatalog.route.actions.getAllForApplication(appService.appGuid, appService.cfGuid) this.dataSource = new CfAppRoutesDataSource( store, appService, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts index 671f85f971..4ccaeafd9b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-card/app-service-binding-card.component.ts @@ -19,16 +19,10 @@ import { } from '../../../../../../../../core/src/shared/components/list/list-cards/meta-card/meta-card-base/meta-card.component'; import { CardCell, IListRowCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { ComponentEntityMonitorConfig } from '../../../../../../../../core/src/shared/shared.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource, EntityInfo } from '../../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../../cf-entity-factory'; -import { - serviceBindingEntityType, - serviceInstancesEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; +import { serviceBindingEntityType } from '../../../../../../cf-entity-types'; import { ApplicationService } from '../../../../../../features/applications/application.service'; import { isUserProvidedServiceInstance } from '../../../../../../features/cloud-foundry/cf.helpers'; import { @@ -73,7 +67,6 @@ export class AppServiceBindingCardComponent extends CardCell>( - this.row.entity.service_instance_guid, - getServiceInstanceAction + const serviceInstance$ = cfEntityCatalog.serviceInstance.store.getEntityService( + this.row.entity.service_instance_guid, this.appService.cfGuid ).waitForEntity$; this.serviceInstance$ = serviceInstance$; this.service$ = serviceInstance$.pipe( - switchMap(o => getCfService(o.entity.entity.service_guid, this.appService.cfGuid, this.entityServiceFactory).waitForEntity$), + switchMap(o => getCfService(o.entity.entity.service_guid, this.appService.cfGuid).waitForEntity$), filter(service => !!service) ); this.listData = [{ @@ -163,7 +152,6 @@ export class AppServiceBindingCardComponent extends CardCell>( - this.row.entity.service_instance_guid, - getUserProvidedServiceAction + const userProvidedServiceInstance$ = cfEntityCatalog.userProvidedService.store.getEntityService( + this.row.entity.service_instance_guid, this.appService.cfGuid ).waitForEntity$; this.serviceInstance$ = userProvidedServiceInstance$; this.service$ = of(null); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts index 6b324918a8..c8fc20d7ac 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-sevice-bindings/app-service-binding-data-source.ts @@ -19,30 +19,23 @@ import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceBindingActionBuilders } from '../../../../../entity-action-builders/service-binding.action-builders'; export class AppServiceBindingDataSource extends ListDataSource> { static createGetAllServiceBindings(appGuid: string, cfGuid: string) { const paginationKey = createEntityRelationPaginationKey(serviceBindingEntityType, appGuid); - const serviceBindingEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = serviceBindingEntity.actionOrchestrator.getActionBuilder('getAllForApplication'); - const getAppServiceBindingsAction = actionBuilder( + return cfEntityCatalog.serviceBinding.actions.getAllForApplication( appGuid, cfGuid, paginationKey, { - includeRelations: [ - createEntityRelationKey(serviceBindingEntityType, applicationEntityType), - createEntityRelationKey(serviceBindingEntityType, serviceInstancesEntityType), - createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), - createEntityRelationKey(servicePlanEntityType, serviceEntityType), - ], - populateMissing: true - }); - return getAppServiceBindingsAction; + includeRelations: [ + createEntityRelationKey(serviceBindingEntityType, applicationEntityType), + createEntityRelationKey(serviceBindingEntityType, serviceInstancesEntityType), + createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), + createEntityRelationKey(servicePlanEntityType, serviceEntityType), + ], + populateMissing: true + }); } constructor(store: Store, appService: ApplicationService, listConfig?: IListConfig>) { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts index 43ff0a9f2d..c16c3fc0b4 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app-variables/cf-app-variables-data-source.ts @@ -4,15 +4,13 @@ import { map } from 'rxjs/operators'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { appEnvVarsEntityType, applicationEntityType } from '../../../../../cf-entity-types'; import { ApplicationService } from '../../../../../features/applications/application.service'; @@ -31,11 +29,10 @@ export class CfAppVariablesDataSource extends ListDataSource, appService: ApplicationService, - listConfig: IListConfig + listConfig: IListConfig, ) { - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(appService.appGuid, appService.cfGuid) as PaginatedAction; + const getAppEnvVarsAction = cfEntityCatalog.appEnvVar.actions.getMultiple(appService.appGuid, appService.cfGuid); + super({ store, action: getAppEnvVarsAction, @@ -61,11 +58,8 @@ export class CfAppVariablesDataSource extends ListDataSource { - this.store.dispatch(action); + cfEntityCatalog.appEnvVar.api.removeFromApplication( + this.envVarsDataSource.appGuid, + this.envVarsDataSource.cfGuid, + this.envVarsDataSource.transformedEntities, + newValues + ); trigger$.next(); } ); @@ -119,8 +116,8 @@ export class CfAppVariablesListConfigService implements IListConfig, private appService: ApplicationService, - private confirmDialog: ConfirmationDialogService + private confirmDialog: ConfirmationDialogService, ) { this.envVarsDataSource = new CfAppVariablesDataSource(this.store, this.appService, this); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts index 692f9f8c9b..cc9f26c9d0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/card/card-app.component.ts @@ -62,7 +62,6 @@ export class CardAppComponent extends CardCell> implements OnI const initState = this.appStateService.get(this.row.entity, null); this.applicationState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.row.entity, this.row.metadata.guid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts index f20011ad2b..284ae8a40f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/cf-apps-data-source.ts @@ -7,7 +7,6 @@ import { GetAllApplications } from '../../../../../../../cloud-foundry/src/actio import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, - appStatsEntityType, organizationEntityType, routeEntityType, spaceEntityType, @@ -23,12 +22,11 @@ import { import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { CreatePagination } from '../../../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { MultiActionListEntity } from '../../../../../../../store/src/monitors/pagination-monitor'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationParam } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { cfOrgSpaceFilter, getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; @@ -44,18 +42,16 @@ export class CfAppsDataSource extends CFListDataSource { private subs: Subscription[]; public action: GetAllApplications; - constructor( store: Store, listConfig?: IListConfig, transformEntities?: any[], paginationKey = CfAppsDataSource.paginationKey, seedPaginationKey = CfAppsDataSource.paginationKey, - startingCfGuid?: string + startingCfGuidFilter?: string ) { const syncNeeded = paginationKey !== seedPaginationKey; - const action = new GetAllApplications(paginationKey, null, CfAppsDataSource.includeRelations); - action.endpointGuid = startingCfGuid; + const action = cfEntityCatalog.application.actions.getMultiple(undefined, CfAppsDataSource.paginationKey); const dispatchSequencer = new DispatchSequencer(store); @@ -107,12 +103,9 @@ export class CfAppsDataSource extends CFListDataSource { const appGuid = app.metadata.guid; const cfGuid = app.entity.cfGuid; if (appState === 'STARTED') { - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const actionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const getAction = actionBuilder(appGuid, cfGuid); actions.push({ id: appGuid, - action: getAction + action: cfEntityCatalog.appStats.actions.getMultiple(appGuid, cfGuid) }); } }); diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts index 4024d1e75a..2342e06ff0 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/app/table-cell-app-status/table-cell-app-status.component.ts @@ -45,7 +45,6 @@ export class TableCellAppStatusComponent extends TableCellCustom implement ngOnInit() { const applicationState = this.appStateService.get(this.row.entity, null); this.fetchAppState$ = ApplicationService.getApplicationState( - this.store, this.appStateService, this.row.entity, this.row.metadata.guid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts index 240c641023..e1b766844a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-buildpacks/cf-buildpacks-data-source.ts @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { FetchAllBuildpacks } from '../../../../../../../cloud-foundry/src/actions/buildpack.action'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { buildpackEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -12,18 +11,14 @@ import { import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; export class CfBuildpacksDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const buildpackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, buildpackEntityType); - const actionBuilder = buildpackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey) as PaginatedAction; + const action = cfEntityCatalog.buildPack.actions.getMultiple(cfGuid, paginationKey) super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts index 42368617ee..d04883addc 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-events/cf-events-data-source.ts @@ -4,14 +4,11 @@ import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../cf-app-state'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { cfEventEntityType } from '../../../../../cf-entity-types'; -import { CfEventActionBuilders } from '../../../../../entity-action-builders/cf-event.action-builders'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { QParam, QParamJoiners } from '../../../../q-param'; @@ -25,18 +22,14 @@ export class CfEventsDataSource extends ListDataSource { spaceGuid?: string, actee?: string, ) { - const appEventEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - cfEventEntityType - ); - const actionBuilder = appEventEntity.actionOrchestrator.getActionBuilder('getMultiple'); const paginationKey = CfEventsDataSource.createPaginationKey( cfGuid, orgGuid, spaceGuid, actee ); - const action = actionBuilder(cfGuid, paginationKey); + + const action = cfEntityCatalog.event.actions.getMultiple(cfGuid, paginationKey) action.initialParams.q = CfEventsDataSource.createInitialQParams( orgGuid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts deleted file mode 100644 index be5fd42b22..0000000000 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - createEntityRelationPaginationKey, -} from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { featureFlagEntityType } from '../../../../../cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; - -export function createCfFeatureFlagFetchAction(cfGuid: string) { - const paginationKey = createCFFeatureFlagPaginationKey(cfGuid); - const featureFlagEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, featureFlagEntityType); - const actionBuilder = featureFlagEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey) as PaginatedAction; - action.flattenPagination = true; - return action; -} - -export function createCFFeatureFlagPaginationKey(cfGuid: string) { - return createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); -} diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts index 3981cf1173..105119741b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.ts @@ -8,8 +8,8 @@ import { } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { createCfFeatureFlagFetchAction } from './cf-feature-flags-data-source.helpers'; export const FeatureFlagDescriptions = { user_org_creation: 'Any user can create an organization', @@ -35,7 +35,7 @@ export class CfFeatureFlagsDataSource extends ListDataSource { static descriptionColumnId = 'description'; constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { - const action = createCfFeatureFlagFetchAction(cfGuid); + const action = cfEntityCatalog.featureFlag.actions.getMultiple(cfGuid); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts index e308c75400..6b5a9d03e3 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-list-config.service.ts @@ -9,8 +9,10 @@ import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { ActiveRouteCfOrgSpace } from '../../../../../features/cloud-foundry/cf-page.types'; import { BaseCfListConfig } from '../base-cf/base-cf-list-config'; import { CfFeatureFlagsDataSource } from './cf-feature-flags-data-source'; +import { + TableCellFeatureFlagDescriptionComponent, +} from './table-cell-feature-flag-description/table-cell-feature-flag-description.component'; import { TableCellFeatureFlagStateComponent } from './table-cell-feature-flag-state/table-cell-feature-flag-state.component'; -import { TableCellFeatureFlagDescriptionComponent } from './table-cell-feature-flag-description/table-cell-feature-flag-description.component'; @Injectable() export class CfFeatureFlagsListConfigService extends BaseCfListConfig { diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts index f862c9380d..2e944f8323 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source-base.ts @@ -14,7 +14,8 @@ import { TableRowStateManager, } from '../../../../../../../core/src/shared/components/list/list-table/table-row/table-row-state-manager'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { AppState } from '../../../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitor } from '../../../../../../../store/src/monitors/pagination-monitor'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction, PaginationParam } from '../../../../../../../store/src/types/pagination.types'; @@ -117,7 +118,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationKey, genericRouteState: boolean, isLocal: boolean): { rowsState: Observable, sub: Subscription } { @@ -135,7 +136,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationKey: string, isLocal: boolean): { + private static getRowStateManager(store: Store, paginationKey: string, isLocal: boolean): { rowStateManager: TableRowStateManager, sub: Subscription } { @@ -151,7 +152,6 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource, paginationMonitor: PaginationMonitor, rowStateManager: TableRowStateManager ) { @@ -174,7 +173,7 @@ export abstract class CfRoutesDataSourceBase extends CFListDataSource { const unmapping = request.updating.unmapping || { busy: false }; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts index 27a4ce752b..ab825a63ba 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-data-source.ts @@ -2,14 +2,12 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { IListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { routeEntityType } from '../../../../../cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { CfRoutesDataSourceBase } from '../cf-routes/cf-routes-data-source-base'; @@ -20,11 +18,7 @@ export class CfRoutesDataSource extends CfRoutesDataSourceBase implements IListD listConfig: IListConfig, cfGuid: string ) { - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const createRouteAction = actionBuilder(cfGuid, null); - super(store, listConfig, cfGuid, createRouteAction, true); + super(store, listConfig, cfGuid, cfEntityCatalog.route.actions.getMultiple(cfGuid, null, {}), true); } - } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts index ba099a47b8..b1a7ae262b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-routes/cf-routes-list-config-base.ts @@ -4,7 +4,6 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { routeEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { ConfirmationDialogConfig } from '../../../../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../../../../core/src/shared/components/confirmation-dialog.service'; import { ITableColumn, ITableText } from '../../../../../../../core/src/shared/components/list/list-table/table.types'; @@ -16,9 +15,8 @@ import { IMultiListAction, ListViewTypes, } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { TableCellRouteAppsAttachedComponent, } from '../cf-routes/table-cell-route-apps-attached/table-cell-route-apps-attached.component'; @@ -88,8 +86,6 @@ export abstract class CfRoutesListConfigBase implements IListConfig }; enableTextFilter = true; - private routeCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - private multiListActionDelete: IMultiListAction = { action: (items: APIResource[]) => { if (items.length === 1) { @@ -136,7 +132,7 @@ export abstract class CfRoutesListConfigBase implements IListConfig private dispatchDeleteAction(route: APIResource) { const appGuids = (route.entity.apps || []).map(app => app.metadata.guid); const singleApp = appGuids.length === 1; - this.routeCatalogEntity.actionDispatchManager.dispatchDelete( + cfEntityCatalog.route.api.delete( route.metadata.guid, this.cfGuid, // FIXME: The appGuid/appGuids params need merging @@ -147,7 +143,7 @@ export abstract class CfRoutesListConfigBase implements IListConfig private dispatchUnmapAction(routeGuid: string, appGuids: string[]) { appGuids.forEach(appGuid => { - this.routeCatalogEntity.actionDispatchManager.dispatchAction('unmap', + cfEntityCatalog.route.api.unmap( routeGuid, appGuid, this.cfGuid, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts index 670afdb18c..b728e72aee 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-security-groups/cf-security-groups-data-source.ts @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { GetAllSecurityGroups } from '../../../../../../../cloud-foundry/src/actions/security-groups-actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { securityGroupEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -12,17 +11,14 @@ import { import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; export class CfSecurityGroupsDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey, cfGuid); - const sgEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, securityGroupEntityType); - const actionBuilder = sgEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); + const action = cfEntityCatalog.securityGroup.actions.getMultiple(cfGuid, paginationKey, {}) super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts index 46a8c9d81c..a60d8d0c6c 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-select-users/cf-select-users-list-config.service.ts @@ -59,7 +59,7 @@ export class CfSelectUsersListConfigService implements IListConfig, private cfGuid: string, - private cfUserService: CfUserService, + cfUserService: CfUserService, private activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, private paginationMonitorFactory: PaginationMonitorFactory, private entityMonitorFactory: EntityMonitorFactory diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts index eb28c1b577..433d2c8ba8 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-service-card/cf-service-card.component.ts @@ -4,11 +4,11 @@ import { Observable } from 'rxjs'; import { CFAppState } from '../../../../../../../../cloud-foundry/src/cf-app-state'; import { IService, IServiceExtra } from '../../../../../../../../core/src/core/cf-api-svc.types'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { CardCell } from '../../../../../../../../core/src/shared/components/list/list.types'; import { CfOrgSpaceLabelService } from '../../../../../../../../core/src/shared/services/cf-org-space-label.service'; import { RouterNav } from '../../../../../../../../store/src/actions/router.actions'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { getServiceBrokerName, getServiceName } from '../../../../../../features/service-catalog/services-helper'; @@ -50,7 +50,6 @@ export class CfServiceCardComponent extends CardCell> { this.serviceBrokerName$ = getServiceBrokerName( this.serviceEntity.entity.service_broker_guid, this.serviceEntity.entity.cfGuid, - this.entityServiceFactory ); } } @@ -58,7 +57,6 @@ export class CfServiceCardComponent extends CardCell> { constructor( private store: Store, - private entityServiceFactory: EntityServiceFactory ) { super(); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts index 651f3bd158..982e384e25 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-services/cf-services-data-source.ts @@ -1,27 +1,26 @@ import { Store } from '@ngrx/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { serviceEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfServicesDataSource extends ListDataSource { constructor(store: Store, endpointGuid: string, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(endpointSchemaKey); - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getServicesAction = actionBuilder(endpointGuid, paginationKey); + const getServicesAction = cfEntityCatalog.service.actions.getMultiple(endpointGuid, paginationKey, {}) super({ store, action: getServicesAction, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts index f7721a1783..9fc55fb4b5 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-apps/cf-space-apps-data-source.service.ts @@ -5,14 +5,12 @@ import { applicationEntityType, spaceEntityType } from '../../../../../../../clo import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/services/cloud-foundry-space.service'; @@ -20,9 +18,14 @@ import { CloudFoundrySpaceService } from '../../../../../features/cloud-foundry/ export class CfSpaceAppsDataSource extends ListDataSource { constructor(store: Store, cfSpaceService: CloudFoundrySpaceService, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, cfSpaceService.spaceGuid) + '-tab'; - const appEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, applicationEntityType); - const actionBuilder = appEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfSpaceService.spaceGuid, cfSpaceService.cfGuid, paginationKey, [], false, false) as PaginatedAction; + const action = cfEntityCatalog.application.actions.getAllInSpace( + cfSpaceService.spaceGuid, + cfSpaceService.cfGuid, + paginationKey, + [], + false, + false + ) super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts index e29bca0710..ecdcaa8cd5 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-space-routes/cf-space-routes-data-source.ts @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, @@ -13,13 +12,12 @@ import { createEntityRelationPaginationKey, } from '../../../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { IRoute } from '../../../../../../../core/src/core/cf-api.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { IListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { CfRoutesDataSourceBase } from '../cf-routes/cf-routes-data-source-base'; @@ -32,13 +30,12 @@ export class CfSpaceRoutesDataSource extends CfRoutesDataSourceBase implements I cfGuid: string ) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const routeEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, routeEntityType); - const actionBuilder = routeEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(spaceGuid, cfGuid, paginationKey, [ + const action = cfEntityCatalog.route.actions.getAllInSpace( + spaceGuid, cfGuid, paginationKey, [ createEntityRelationKey(routeEntityType, applicationEntityType), createEntityRelationKey(routeEntityType, domainEntityType), - ], true, false) as PaginatedAction; - + ], true, false + ) action.initialParams['order-direction-field'] = 'creation'; super(store, listConfig, cfGuid, action, false); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts index 0635f65e7a..f0d9413db2 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts @@ -18,21 +18,15 @@ import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../../../../entity-action-builders/service-instance.action.builders'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfSpacesServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, spaceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const serviceInstanceEntity = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(spaceGuid, cfGuid, paginationKey, null, { + const action = cfEntityCatalog.serviceInstance.actions.getAllInSpace(spaceGuid, cfGuid, paginationKey, null, { includeRelations: [ createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType), createEntityRelationKey(serviceInstancesEntityType, servicePlanEntityType), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts index b444fefc85..e3d9e31448 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-user-service-instances-data-source.ts @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { GetAllUserProvidedServices } from '../../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { applicationEntityType, @@ -22,21 +21,15 @@ import { IListConfig, } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { UserProvidedServiceActionBuilder } from '../../../../../entity-action-builders/user-provided-service.action-builders'; export class CfSpacesUserServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, spaceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(spaceEntityType, spaceGuid); - const userProvidedServiceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - userProvidedServiceInstanceEntityType - ); - const actionBuilder = userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfGuid, spaceGuid, paginationKey, + const action = cfEntityCatalog.userProvidedService.actions.getAllInSpace( + cfGuid, spaceGuid, paginationKey, [ createEntityRelationKey(userProvidedServiceInstanceEntityType, spaceWithOrgEntityType), createEntityRelationKey(spaceEntityType, organizationEntityType), diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts index 5270763504..7c55300b2b 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service-instance-apps-attached/table-cell-service-instance-apps-attached.component.ts @@ -5,7 +5,6 @@ import { filter, first, map, switchMap } from 'rxjs/operators'; import { IServiceInstance } from '../../../../../../../../core/src/core/cf-api-svc.types'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { TableCellCustom } from '../../../../../../../../core/src/shared/components/list/list.types'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { applicationEntityType, @@ -26,12 +25,6 @@ export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCust config$ = new BehaviorSubject(null); row$ = new BehaviorSubject>(null); - constructor( - private entityServiceFactory: EntityServiceFactory, - ) { - super(); - } - @Input('config') set config(config: any) { this.config$.next(config); @@ -57,7 +50,6 @@ export class TableCellServiceInstanceAppsAttachedComponent extends TableCellCust getCfServiceInstance( row.metadata.guid, row.entity.cfGuid, - this.entityServiceFactory, [ createEntityRelationKey(serviceInstancesEntityType, serviceBindingEntityType), createEntityRelationKey(serviceBindingEntityType, applicationEntityType) diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts index 21e1121ab9..002d1d784a 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-spaces/cf-spaces-data-source.service.ts @@ -15,20 +15,18 @@ import { } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; export class CfSpacesDataSourceService extends ListDataSource { constructor(cfGuid: string, orgGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(organizationEntityType, orgGuid); - const spaceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceEntityType); - const getAllSpaceActionBuilder = spaceEntity.actionOrchestrator.getActionBuilder('getAllInOrganization'); - const action = getAllSpaceActionBuilder(orgGuid, cfGuid, paginationKey, [ - createEntityRelationKey(spaceEntityType, spaceQuotaEntityType), - ]) as PaginatedAction; + const action = cfEntityCatalog.space.actions.getAllInOrganization(orgGuid, cfGuid, paginationKey, { + includeRelations: [ + createEntityRelationKey(spaceEntityType, spaceQuotaEntityType), + ] + }); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts index 1a0c89eab6..b1a250c1e1 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-stacks/cf-stacks-data-source.ts @@ -1,24 +1,19 @@ import { Store } from '@ngrx/store'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; import { stackEntityType } from '../../../../../cf-entity-types'; -import { StackActionBuilders } from '../../../../../entity-action-builders/stack-action-builders'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class CfStacksDataSource extends ListDataSource { constructor(store: Store, cfGuid: string, listConfig?: IListConfig) { - const stackEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, stackEntityType); - const getAllStacksActionBuilder = stackEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = getAllStacksActionBuilder(null, cfGuid); + const action = cfEntityCatalog.stack.actions.getMultiple(null, cfGuid); super({ store, action, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts index 39545b54a2..78d28cda50 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/cf-users/cf-org-permission-cell/cf-org-permission-cell.component.ts @@ -17,7 +17,7 @@ import { CurrentUserPermissionsService } from '../../../../../../../../core/src/ import { arrayHelper } from '../../../../../../../../core/src/core/helper-classes/array.helper'; import { AppChip } from '../../../../../../../../core/src/shared/components/chips/chips.component'; import { ConfirmationDialogService } from '../../../../../../../../core/src/shared/components/confirmation-dialog.service'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; import { CF_ENDPOINT_TYPE } from '../../../../../../cf-types'; import { getOrgRoles } from '../../../../../../features/cloud-foundry/cf.helpers'; @@ -36,7 +36,7 @@ export class CfOrgPermissionCellComponent extends CfPermissionCell, cfUserService: CfUserService, private userPerms: CurrentUserPermissionsService, - confirmDialog: ConfirmationDialogService + confirmDialog: ConfirmationDialogService, ) { super(store, confirmDialog, cfUserService); this.chipsConfig$ = combineLatest( @@ -74,8 +74,7 @@ export class CfOrgPermissionCellComponent extends CfPermissionCell, cfUserService: CfUserService, private userPerms: CurrentUserPermissionsService, - confirmDialog: ConfirmationDialogService + confirmDialog: ConfirmationDialogService, ) { super(store, confirmDialog, cfUserService); @@ -130,8 +130,7 @@ export class CfSpacePermissionCellComponent extends CfPermissionCell { constructor(cfGuid: string, serviceInstanceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceBindingEntityType, serviceInstanceGuid); - const serviceBindingEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBindingEntityType); - const actionBuilder = serviceBindingEntity.actionOrchestrator.getActionBuilder('getAllForServiceInstance'); - const getAppServiceBindingsAction = actionBuilder(serviceInstanceGuid, cfGuid, paginationKey) as PaginatedAction; + const getAppServiceBindingsAction = cfEntityCatalog.serviceBinding.actions.getAllForServiceInstance( + serviceInstanceGuid, cfGuid, paginationKey, { + includeRelations: [ + createEntityRelationKey(serviceBindingEntityType, applicationEntityType) + ] + } + ); super({ store, action: getAppServiceBindingsAction, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts index a3cc6ae5f2..7453abfe53 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/detach-apps/detach-apps-list-config.service.ts @@ -26,7 +26,7 @@ export class DetachAppsListConfigService implements IListConfig { columnId: 'appName', headerCell: () => 'App Name', cellDefinition: { - getValue: (row: APIResource) => `${row.entity.app.entity.name}` + valuePath: 'entity.app.entity.name' }, sort: { type: 'sort', diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts index 09bb9e0867..d03fc43149 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-instances/service-instances-data-source.ts @@ -12,19 +12,16 @@ import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginationEntityState } from '../../../../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; export class ServiceInstancesDataSource extends ListDataSource { constructor(cfGuid: string, serviceGuid: string, store: Store, listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder(cfGuid, paginationKey); + const action = cfEntityCatalog.serviceInstance.actions.getMultiple(cfGuid, paginationKey); super({ store, diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts index 2020eb9613..ab3aed7715 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/service-plans/service-plans-data-source.ts @@ -15,14 +15,13 @@ import { populateServicePlanExtraTyped, } from '../../../../../../../cloud-foundry/src/features/service-catalog/services-helper'; import { IServicePlan } from '../../../../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { ListDataSource, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { cfEntityFactory } from '../../../../../cf-entity-factory'; export class ServicePlansDataSource extends ListDataSource> { @@ -34,9 +33,7 @@ export class ServicePlansDataSource extends ListDataSource, private serviceActionHelperService: ServiceActionHelperService, private currentUserPermissionsService: CurrentUserPermissionsService, - private entityServiceFactory: EntityServiceFactory ) { super(); } diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts index 57ffd72bc7..eb98c422bf 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/list/list-types/services-wall/service-instances-wall-data-source.ts @@ -1,6 +1,5 @@ import { Store } from '@ngrx/store'; -import { GetAllUserProvidedServices } from '../../../../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { serviceInstancesEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { @@ -14,12 +13,9 @@ import { ListPaginationMultiFilterChange, } from '../../../../../../../core/src/shared/components/list/data-sources-controllers/list-data-source-types'; import { IListConfig } from '../../../../../../../core/src/shared/components/list/list.component.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../../store/src/entity-catalog/entity-catalog.types'; import { APIResource } from '../../../../../../../store/src/types/api.types'; import { PaginatedAction, PaginationParam } from '../../../../../../../store/src/types/pagination.types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cf-types'; -import { ServiceInstanceActionBuilders } from '../../../../../entity-action-builders/service-instance.action.builders'; +import { cfEntityCatalog } from '../../../../../cf-entity-catalog'; import { getRowMetadata } from '../../../../../features/cloud-foundry/cf.helpers'; import { CFListDataSource } from '../../../../cf-list-data-source'; import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-org-space-service.service'; @@ -27,11 +23,8 @@ import { createCfOrSpaceMultipleFilterFn } from '../../../../data-services/cf-or export class ServiceInstancesWallDataSource extends CFListDataSource { constructor(store: Store, transformEntities: any[], listConfig?: IListConfig) { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType); - const serviceInstanceEntity = entityCatalog - .getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const marketplaceAction = actionBuilder(null, paginationKey); - const userProvidedAction = new GetAllUserProvidedServices(); + const marketplaceAction = cfEntityCatalog.serviceInstance.actions.getMultiple(null, paginationKey); + const userProvidedAction = cfEntityCatalog.userProvidedService.actions.getMultiple(); const actionSchemaConfigs = [ new ActionSchemaConfig( marketplaceAction diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts index 1d663a7458..29614fb734 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/running-instances/running-instances.component.ts @@ -2,9 +2,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { GetAppStatsAction } from '../../../../../cloud-foundry/src/actions/app-metadata.actions'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { AppStat } from '../../../store/types/app-metadata.types'; +import { cfEntityCatalog } from '../../../cf-entity-catalog'; @Component({ selector: 'app-running-instances', @@ -19,16 +17,8 @@ export class RunningInstancesComponent implements OnInit { // Observable on the running instances count for the application public runningInstances$: Observable; - constructor(private paginationMonitorFactory: PaginationMonitorFactory) { } - ngOnInit() { - const dummyAction = new GetAppStatsAction(this.appGuid, this.cfGuid); - const paginationMonitor = this.paginationMonitorFactory.create( - dummyAction.paginationKey, - dummyAction, - dummyAction.flattenPagination - ); - this.runningInstances$ = paginationMonitor.currentPage$.pipe( + this.runningInstances$ = cfEntityCatalog.appStats.store.getPaginationMonitor(this.appGuid, this.cfGuid).currentPage$.pipe( map(appInstancesPages => { const allInstances = [].concat.apply([], Object.values(appInstancesPages || [])).filter(instance => !!instance); return allInstances.filter(stat => stat.state === 'RUNNING').length; diff --git a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts index d50491f5fb..a278c89b7d 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/components/service-plan-public/service-plan-public.component.ts @@ -9,7 +9,6 @@ import { } from '../../../../../cloud-foundry/src/features/service-catalog/services-helper'; import { ServicesService } from '../../../../../cloud-foundry/src/features/service-catalog/services.service'; import { IServiceBroker, IServicePlan } from '../../../../../core/src/core/cf-api-svc.types'; -import { EntityServiceFactory } from '../../../../../store/src/entity-service-factory.service'; import { StratosStatus } from '../../../../../core/src/shared/shared.types'; import { APIResource } from '../../../../../store/src/types/api.types'; @@ -51,13 +50,12 @@ export class ServicePlanPublicComponent { constructor( private servicesService: ServicesService, - private entityServiceFactory: EntityServiceFactory ) { } private getServiceBroker(serviceGuid: string, cfGuid: string): Observable> { - return getCfService(serviceGuid, cfGuid, this.entityServiceFactory).waitForEntity$.pipe( - map(service => getServiceBroker(service.entity.entity.service_broker_guid, cfGuid, this.entityServiceFactory)), + return getCfService(serviceGuid, cfGuid).waitForEntity$.pipe( + map(service => getServiceBroker(service.entity.entity.service_broker_guid, cfGuid)), switchMap(serviceService => serviceService.waitForEntity$), map(entity => entity.entity) ); diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts index b24ccb35a1..8d38830e06 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-org-space-service.service.ts @@ -26,18 +26,15 @@ import { valueOrCommonFalsy, } from '../../../../core/src/shared/components/list/data-sources-controllers/list-pagination-controller'; import { ResetPagination, SetParams } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; -import { - getCurrentPageRequestInfo, - getPaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +import { getCurrentPageRequestInfo } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { selectPaginationState } from '../../../../store/src/selectors/pagination.selectors'; import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; import { PaginatedAction, PaginationParam } from '../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { QParam, QParamJoiners } from '../q-param'; export function spreadPaginationParams(params: PaginationParam): PaginationParam { @@ -304,15 +301,12 @@ export class CfOrgSpaceDataService implements OnDestroy { } private createPaginationAction() { - const organizationEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, organizationEntityType); - const actionBuilder = organizationEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getAllOrganizationsAction = actionBuilder(null, CfOrgSpaceDataService.CfOrgSpaceServicePaginationKey, { + return cfEntityCatalog.org.actions.getMultiple(null, CfOrgSpaceDataService.CfOrgSpaceServicePaginationKey, { includeRelations: [ createEntityRelationKey(organizationEntityType, spaceEntityType), ], populateMissing: true }); - return getAllOrganizationsAction; } public getEndpointOrgs(endpointGuid: string) { diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts index 706d2dfa56..2eb596e4cc 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/cf-user.service.ts @@ -20,23 +20,20 @@ import { IOrganization, ISpace } from '../../../../core/src/core/cf-api.types'; import { LocalPaginationHelpers, } from '../../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { getDefaultPaginationEntityState, } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination'; +import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { getCurrentPageRequestInfo, - getPaginationObservables, PaginationObservables, -} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; +} from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.types'; import { APIResource } from '../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../store/src/types/pagination.types'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { cfEntityFactory } from '../../cf-entity-factory'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { UserActionBuilders } from '../../entity-action-builders/user.action-builders'; import { ActiveRouteCfOrgSpace } from '../../features/cloud-foundry/cf-page.types'; import { fetchTotalResults, @@ -56,15 +53,12 @@ import { selectCfPaginationState } from '../../store/selectors/pagination.select export class CfUserService { private allUsers$: Observable>>; - private userCatalogEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfUserEntityType); - users: { [guid: string]: Observable> } = {}; constructor( private store: Store, public paginationMonitorFactory: PaginationMonitorFactory, public activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, - private entityServiceFactory: EntityServiceFactory, ) { } getUsers = (endpointGuid: string, filterEmpty = true): Observable[]> => @@ -114,15 +108,11 @@ export class CfUserService { return observableOf(users.filter(o => o.metadata.guid === userGuid)[0]); } if (!this.users[userGuid]) { - const actionBuilder = this.userCatalogEntity.actionOrchestrator.getActionBuilder('get'); - const getUserAction = actionBuilder(userGuid, endpointGuid); - this.users[userGuid] = this.entityServiceFactory.create>( - userGuid, - getUserAction - ).waitForEntity$.pipe( - filter(entity => !!entity), - map(entity => entity.entity) - ); + this.users[userGuid] = cfEntityCatalog.user.store.getEntityService(userGuid, endpointGuid) + .waitForEntity$.pipe( + filter(entity => !!entity), + map(entity => entity.entity) + ); } return this.users[userGuid]; }), @@ -458,11 +448,11 @@ export class CfUserService { } private createCfGetAllUsersAction = (cfGuid: string): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getMultiple')(cfGuid, null); + return cfEntityCatalog.user.actions.getMultiple(cfGuid, null); } private createOrgGetUsersAction = (isAdmin: boolean, cfGuid: string, orgGuid: string): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getAllInOrganization')( + return cfEntityCatalog.user.actions.getAllInOrganization( orgGuid, cfGuid, createEntityRelationPaginationKey(organizationEntityType, orgGuid), @@ -471,7 +461,7 @@ export class CfUserService { } private createSpaceGetUsersAction = (isAdmin: boolean, cfGuid: string, spaceGuid: string, ): PaginatedAction => { - return this.userCatalogEntity.actionOrchestrator.getActionBuilder('getAllInSpace')( + return cfEntityCatalog.user.actions.getAllInSpace( spaceGuid, cfGuid, createEntityRelationPaginationKey(spaceEntityType, spaceGuid), diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts index 349c1928cb..6fb379d819 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/service-action-helper.service.ts @@ -3,29 +3,19 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { filter, first, map, pairwise } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; -import { - DeleteUserProvidedInstance, - UpdateUserProvidedServiceInstance, -} from '../../../../cloud-foundry/src/actions/user-provided-service.actions'; +import { UpdateUserProvidedServiceInstance } from '../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - serviceBindingEntityType, - serviceInstancesEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; +import { serviceInstancesEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { IServiceBinding, IServiceInstance, IUserProvidedServiceInstance } from '../../../../core/src/core/cf-api-svc.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata, EntityCatalogEntityConfig } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; import { ConfirmationDialogConfig } from '../../../../core/src/shared/components/confirmation-dialog.config'; import { ConfirmationDialogService } from '../../../../core/src/shared/components/confirmation-dialog.service'; import { RouterNav, RouterQueryParams } from '../../../../store/src/actions/router.actions'; +import { EntityCatalogEntityConfig } from '../../../../store/src/entity-catalog/entity-catalog.types'; import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../../../store/src/types/api.types'; import { UpdateServiceInstance } from '../../actions/service-instances.actions'; -import { ServiceBindingActionBuilders } from '../../entity-action-builders/service-binding.action-builders'; -import { ServiceInstanceActionBuilders } from '../../entity-action-builders/service-instance.action.builders'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; +import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { SERVICE_INSTANCE_TYPES, } from '../components/add-service-instance/add-service-instance-base-step/add-service-instance.types'; @@ -34,20 +24,9 @@ import { @Injectable() export class ServiceActionHelperService { - private sgEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceBindingEntityType - ); - - private serviceInstanceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - serviceInstancesEntityType - ); - constructor( private confirmDialog: ConfirmationDialogService, private store: Store, - private entityServiceFactory: EntityServiceFactory ) { } detachServiceBinding = ( @@ -65,8 +44,7 @@ export class ServiceActionHelperService { return; } - const actionBuilder = this.sgEntity.actionOrchestrator.getActionBuilder('remove'); - const action = actionBuilder(serviceBindings[0].metadata.guid, endpointGuid, { serviceInstanceGuid }); + const action = cfEntityCatalog.serviceBinding.actions.remove(serviceBindings[0].metadata.guid, endpointGuid, { serviceInstanceGuid }); if (!noConfirm) { const confirmation = new ConfirmationDialogConfig( 'Detach Service Instance', @@ -94,8 +72,8 @@ export class ServiceActionHelperService { }; const action = userProvided ? - new DeleteUserProvidedInstance(endpointGuid, serviceInstanceGuid, serviceInstancesEntityConfig) : - this.serviceInstanceEntity.actionOrchestrator.getActionBuilder('remove')(serviceInstanceGuid, endpointGuid); + cfEntityCatalog.userProvidedService.actions.remove(serviceInstanceGuid, endpointGuid, serviceInstancesEntityConfig) : + cfEntityCatalog.serviceInstance.actions.remove(serviceInstanceGuid, endpointGuid); const confirmation = new ConfirmationDialogConfig( 'Delete Service Instance', @@ -147,22 +125,10 @@ export class ServiceActionHelperService { private createUserProvidedServiceInstanceObs(guid: string, endpointGuid: string): Observable>> { - const serviceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, userProvidedServiceInstanceEntityType); - const actionBuilder = serviceEntity.actionOrchestrator.getActionBuilder('get'); - const getUserProvidedServiceAction = actionBuilder(guid, endpointGuid); - return this.entityServiceFactory.create>( - guid, - getUserProvidedServiceAction - ).entityObs$; + return cfEntityCatalog.userProvidedService.store.getEntityService(guid, endpointGuid, {}).entityObs$; } private createServiceInstanceObs(guid: string, endpointGuid: string): Observable>> { - const serviceInstanceEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceInstancesEntityType); - const actionBuilder = serviceInstanceEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceInstanceAction = actionBuilder(guid, endpointGuid); - return this.entityServiceFactory.create>( - guid, - getServiceInstanceAction - ).entityObs$; + return cfEntityCatalog.serviceInstance.store.getEntityService(guid, endpointGuid).entityObs$; } } diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts index 955712ef86..7f86644ba1 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/cloud-foundry.effects.ts @@ -1,15 +1,19 @@ +import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { catchError, flatMap, mergeMap } from 'rxjs/operators'; -import { GET_CF_INFO, GetCFInfo } from '../../actions/cloud-foundry.actions'; -import { CFAppState } from '../../cf-app-state'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; import { environment } from '../../../../core/src/environments/environment.prod'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { NormalizedResponse } from '../../../../store/src/types/api.types'; -import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess } from '../../../../store/src/types/request.types'; -import { HttpClient } from '@angular/common/http'; +import { + StartRequestAction, + WrapperRequestActionFailed, + WrapperRequestActionSuccess, +} from '../../../../store/src/types/request.types'; +import { GET_CF_INFO, GetCFInfo } from '../../actions/cloud-foundry.actions'; +import { CFAppState } from '../../cf-app-state'; @Injectable() export class CloudFoundryEffects { @@ -29,7 +33,7 @@ export class CloudFoundryEffects { const cfInfoKey = catalogEntity.entityKey; this.store.dispatch(new StartRequestAction(action, actionType)); const requestArgs = { - headers: { 'x-cap-cnsi-list': action.cfGuid } + headers: { 'x-cap-cnsi-list': action.guid } }; const url = `/pp/${this.proxyAPIVersion}/proxy/v2/info`; return this.http @@ -40,7 +44,7 @@ export class CloudFoundryEffects { entities: { [cfInfoKey]: {} }, result: [] } as NormalizedResponse; - const id = action.cfGuid; + const id = action.guid; mappedData.entities[cfInfoKey][id] = { entity: info[id], @@ -53,7 +57,7 @@ export class CloudFoundryEffects { }), catchError(error => [ new WrapperRequestActionFailed(error.message, action, actionType, { - endpointIds: [action.cfGuid], + endpointIds: [action.guid], url: error.url || url, eventCode: error.status ? error.status + '' : '500', message: 'Cloud Foundry Info request error', diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts index 569136aa7b..11a4310bf8 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts @@ -6,7 +6,7 @@ import { of as observableOf } from 'rxjs'; import { catchError, filter, map, mergeMap, switchMap, withLatestFrom } from 'rxjs/operators'; import { LoggerService } from '../../../../core/src/core/logger.service'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { NormalizedResponse } from '../../../../store/src/types/api.types'; import { PaginatedAction } from '../../../../store/src/types/pagination.types'; import { @@ -18,10 +18,12 @@ import { import { CHECK_PROJECT_EXISTS, CheckProjectExists, + FETCH_BRANCH_FOR_PROJECT, FETCH_BRANCHES_FOR_PROJECT, FETCH_COMMIT, FETCH_COMMITS, FetchBranchesForProject, + FetchBranchForProject, FetchCommit, FetchCommits, ProjectDoesntExist, @@ -122,6 +124,38 @@ export class DeployAppEffects { ])); })); + @Effect() + fetchBranch$ = this.actions$.pipe( + ofType(FETCH_BRANCH_FOR_PROJECT), + mergeMap(action => { + const actionType = 'fetch'; + const apiAction = { + entityType: gitBranchesEntityType, + endpointType: CF_ENDPOINT_TYPE, + type: action.type, + guid: action.guid + }; + this.store.dispatch(new StartRequestAction(apiAction, actionType)); + return action.scm.getBranch(this.httpClient, action.projectName, action.branchName).pipe( + mergeMap(branch => { + const entityKey = entityCatalog.getEntity(apiAction).entityKey; + const mappedData: NormalizedResponse = { + entities: { [entityKey]: {} }, + result: [] + }; + branch.projectId = action.projectName; + branch.entityId = action.guid; + mappedData.entities[entityKey][action.guid] = branch; + mappedData.result.push(action.guid); + return [ + new WrapperRequestActionSuccess(mappedData, apiAction, actionType) + ]; + }), + catchError(err => [ + new WrapperRequestActionFailed(createFailedGithubRequestMessage(err, this.logger), apiAction, actionType) + ])); + })); + @Effect() fetchCommit$ = this.actions$.pipe( ofType(FETCH_COMMIT), @@ -182,7 +216,7 @@ export class DeployAppEffects { })); addCommit(entityKey: string, mappedData: NormalizedResponse, scmType: string, projectName: string, commit: GitCommit) { - const id = scmType + '-' + projectName + '-' + commit.sha; + const id = scmType + '-' + projectName + '-' + commit.sha; // FIXME: get from action, see #4245 mappedData.entities[entityKey][id] = commit; // mappedData.entities[entityKey][id] = { // entity: commit, diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts index e2bd9fc694..24ac509d51 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/github.effects.ts @@ -5,17 +5,17 @@ import { Store } from '@ngrx/store'; import { catchError, mergeMap } from 'rxjs/operators'; import { LoggerService } from '../../../../core/src/core/logger.service'; -import { GitSCMService, GitSCMType } from '../../../../core/src/shared/data-services/scm/scm.service'; +import { GitSCMService } from '../../../../core/src/shared/data-services/scm/scm.service'; import { NormalizedResponse } from '../../../../store/src/types/api.types'; import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess, } from '../../../../store/src/types/request.types'; -import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { FETCH_GITHUB_REPO, FetchGitHubRepoInfo } from '../../actions/github.actions'; import { CFAppState } from '../../cf-app-state'; import { gitRepoEntityType } from '../../cf-entity-types'; +import { CF_ENDPOINT_TYPE } from '../../cf-types'; import { createFailedGithubRequestMessage } from './deploy-app.effects'; // TODO: Remove this in favour of action builder config. @@ -41,24 +41,17 @@ export class GithubEffects { entityType: gitRepoEntityType, endpointType: CF_ENDPOINT_TYPE, type: action.type, - guid: action.stProject.deploySource.project + guid: action.guid }; this.store.dispatch(new StartRequestAction(apiAction, actionType)); - const scmType = action.stProject.deploySource.scm || action.stProject.deploySource.type; - const scm = this.scmService.getSCM(scmType as GitSCMType); - return scm.getRepository(this.httpClient, action.stProject.deploySource.project).pipe( + return action.meta.scm.getRepository(this.httpClient, action.meta.projectName).pipe( mergeMap(repoDetails => { const mappedData = { entities: { cfGitRepo: {} }, result: [] } as NormalizedResponse; - const id = scmType + '-' + repoDetails.full_name; - mappedData.entities.cfGitRepo[id] = repoDetails; - // mappedData.entities.cfGitRepo[id] = { - // entity: repoDetails, - // metadata: {} - // }; - mappedData.result.push(id); + mappedData.entities.cfGitRepo[action.guid] = repoDetails; + mappedData.result.push(action.guid); return [ new WrapperRequestActionSuccess(mappedData, apiAction, actionType) ]; diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts b/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts index 0a49a853e8..8c713def7c 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/permissions.effect.ts @@ -19,7 +19,7 @@ import { import { LoggerService } from '../../../../core/src/core/logger.service'; import { CONNECT_ENDPOINTS_SUCCESS, EndpointActionComplete } from '../../../../store/src/actions/endpoint.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { BaseHttpClientFetcher, flattenPagination, @@ -44,9 +44,7 @@ import { UserRelationTypes, } from '../../actions/permissions.actions'; import { CFAppState } from '../../cf-app-state'; -import { - createCfFeatureFlagFetchAction, -} from '../../shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { cfEntityCatalog } from '../../cf-entity-catalog'; import { CFResponse } from '../types/cf-api.types'; class PermissionFlattener extends BaseHttpClientFetcher implements PaginationFlattener { @@ -213,7 +211,7 @@ export class PermissionsEffects { this.store.dispatch(new GetUserCfRelations(endpoint.guid, GET_CURRENT_USER_CF_RELATIONS)); // Dispatch feature flags fetch actions - const ffAction = createCfFeatureFlagFetchAction(endpoint.guid); + const ffAction = cfEntityCatalog.featureFlag.actions.getMultiple(endpoint.guid) requests[endpoint.guid] = [createPaginationCompleteWatcher(this.store, ffAction)]; this.store.dispatch(ffAction); diff --git a/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts b/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts index 9d61db0197..73f6b888ad 100644 --- a/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts +++ b/src/frontend/packages/cloud-foundry/src/store/types/github.types.ts @@ -1,5 +1,3 @@ -import { schema } from 'normalizr'; - export interface GithubRepo { pushed_at: string; created_at: string; @@ -18,7 +16,7 @@ export interface GithubUser { type: string; } -export interface GitBranch { +export interface GitHubBranch { name: string; commit?: GithubCommit; } diff --git a/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts index 7a72e4072a..e9d28e530e 100644 --- a/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts +++ b/src/frontend/packages/cloud-foundry/test-framework/cloud-foundry-endpoint-service.helper.ts @@ -92,16 +92,14 @@ export function generateTestCfUserServiceProvider(guid = testSCFEndpointGuid) { useFactory: ( store: Store, paginationMonitorFactory: PaginationMonitorFactory, - entityServiceFactory: EntityServiceFactory ) => { return new CfUserService( store, paginationMonitorFactory, { cfGuid: guid, orgGuid: guid, spaceGuid: guid }, - entityServiceFactory, ); }, - deps: [Store, PaginationMonitorFactory, EntityServiceFactory, HttpClient] + deps: [Store, PaginationMonitorFactory, HttpClient] }; } diff --git a/src/frontend/packages/core/endpoints-health-checks.ts b/src/frontend/packages/core/endpoints-health-checks.ts index 1351edc0b0..2c7624fd76 100644 --- a/src/frontend/packages/core/endpoints-health-checks.ts +++ b/src/frontend/packages/core/endpoints-health-checks.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; +import { entityCatalog } from '../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../store/src/types/endpoint.types'; -import { entityCatalog } from '../store/src/entity-catalog/entity-catalog.service'; export class EndpointHealthCheck { diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts index 62571bf9a2..c897ea9c69 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-endpoint-type-select-page/api-endpoint-type-select-page.component.ts @@ -6,7 +6,7 @@ import { map } from 'rxjs/operators'; import { GeneralAppState } from '../../../../../store/src/app-state'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { ApiEntityType } from '../../api-drive-views.types'; @Component({ diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts index 70c9cba22e..eff169381f 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-entity-list-page/api-entity-list-page.component.ts @@ -1,7 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { StratosBaseCatalogEntity } from '../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; + +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, +} from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; @Component({ selector: 'app-api-entity-list-page', diff --git a/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts b/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts index f99ceb1cc7..69ce1bc3f9 100644 --- a/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts +++ b/src/frontend/packages/core/src/api-driven-views/features/api-entity-type-select-page/api-entity-type-select-page.component.ts @@ -1,14 +1,13 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { ApiEntityType } from '../../api-drive-views.types'; -import { TabNavService } from '../../../../tab-nav.service'; import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + import { GeneralAppState } from '../../../../../store/src/app-state'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { connectedEndpointsOfTypesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; -import { map } from 'rxjs/operators'; -import { Observable } from 'rxjs'; -import { TabNavItem } from '../../../../tab-nav.types'; +import { TabNavService } from '../../../../tab-nav.service'; import { IPageSideNavTab } from '../../../features/dashboard/page-side-nav/page-side-nav.component'; @Component({ diff --git a/src/frontend/packages/core/src/app.module.ts b/src/frontend/packages/core/src/app.module.ts index bfeef7669a..7787fddcfe 100644 --- a/src/frontend/packages/core/src/app.module.ts +++ b/src/frontend/packages/core/src/app.module.ts @@ -14,8 +14,9 @@ import { } from '../../store/src/actions/user-favourites-actions/update-user-favorite-metadata-action'; import { GeneralEntityAppState, GeneralRequestDataState } from '../../store/src/app-state'; import { EntityCatalogModule } from '../../store/src/entity-catalog.module'; -import { EntityActionDispatcher } from '../../store/src/entity-catalog/action-dispatcher/action-dispatcher'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog'; +import { EntityCatalogHelper } from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; +import { EntityCatalogHelpers } from '../../store/src/entity-catalog/entity-catalog.helper'; import { endpointSchemaKey } from '../../store/src/helpers/entity-factory'; import { getAPIRequestDataState, selectEntity } from '../../store/src/selectors/api.selectors'; import { internalEventStateSelector } from '../../store/src/selectors/internal-events.selectors'; @@ -125,8 +126,10 @@ export class AppModule { eventService: GlobalEventService, private userFavoriteManager: UserFavoriteManager, private favoritesConfigMapper: FavoritesConfigMapper, + ech: EntityCatalogHelper ) { - EntityActionDispatcher.initialize(this.store); + EntityCatalogHelpers.SetEntityCatalogEntityHelper(ech); + eventService.addEventConfig({ eventTriggered: (state: GeneralEntityAppState) => new GlobalEventData(!state.dashboard.timeoutSession), message: 'Timeout session is disabled - this is considered a security risk.', diff --git a/src/frontend/packages/core/src/base-entity-types.ts b/src/frontend/packages/core/src/base-entity-types.ts index 33ba893917..9c878d627c 100644 --- a/src/frontend/packages/core/src/base-entity-types.ts +++ b/src/frontend/packages/core/src/base-entity-types.ts @@ -1,8 +1,12 @@ -import { systemEndpointsReducer } from '../../store/src/reducers/system-endpoints.reducer'; +import { + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { addOrUpdateUserFavoriteMetadataReducer, deleteUserFavoriteMetadataReducer, } from '../../store/src/reducers/favorite.reducer'; +import { systemEndpointsReducer } from '../../store/src/reducers/system-endpoints.reducer'; import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE, @@ -10,7 +14,6 @@ import { userFavoritesEntitySchema, userProfileEntitySchema, } from './base-entity-schemas'; -import { StratosCatalogEndpointEntity, StratosCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity'; import { BaseEndpointAuth } from './features/endpoints/endpoint-auth'; // @@ -38,10 +41,10 @@ class DefaultEndpointCatalogEntity extends StratosCatalogEntity { type: endpointEntitySchema.entityType, endpoint: stratosType, }, { - dataReducers: [ - systemEndpointsReducer - ] - }); + dataReducers: [ + systemEndpointsReducer + ] + }); } } @@ -52,11 +55,11 @@ class UserFavoriteCatalogEntity extends StratosCatalogEntity { type: userFavoritesEntitySchema.entityType, endpoint: stratosType, }, { - dataReducers: [ - addOrUpdateUserFavoriteMetadataReducer, - deleteUserFavoriteMetadataReducer, - ] - }); + dataReducers: [ + addOrUpdateUserFavoriteMetadataReducer, + deleteUserFavoriteMetadataReducer, + ] + }); } } diff --git a/src/frontend/packages/core/src/core/cf-api.types.ts b/src/frontend/packages/core/src/core/cf-api.types.ts index 9442951898..ac83e78b88 100644 --- a/src/frontend/packages/core/src/core/cf-api.types.ts +++ b/src/frontend/packages/core/src/core/cf-api.types.ts @@ -182,6 +182,7 @@ export interface IOrganization { default_isolation_segment_guid?: any; quota_definition_url?: string; spaces_url?: string; + domains: APIResource[]; domains_url?: string; private_domains_url?: string; users?: APIResource[]; diff --git a/src/frontend/packages/core/src/core/core.module.ts b/src/frontend/packages/core/src/core/core.module.ts index 0c5547ad70..39b6412c5f 100644 --- a/src/frontend/packages/core/src/core/core.module.ts +++ b/src/frontend/packages/core/src/core/core.module.ts @@ -1,22 +1,25 @@ import { PortalModule } from '@angular/cdk/portal'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; import { Title } from '@angular/platform-browser'; +import { RouterModule } from '@angular/router'; import { MomentModule } from 'ngx-moment'; +import { EntityCatalogHelper } from '../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog.service'; +import { EntityServiceFactory } from '../../../store/src/entity-service-factory.service'; import { NoContentMessageComponent } from '../shared/components/no-content-message/no-content-message.component'; import { RecentEntitiesComponent } from '../shared/components/recent-entities/recent-entities.component'; +import { UserAvatarComponent } from './../shared/components/user-avatar/user-avatar.component'; import { AuthGuardService } from './auth-guard.service'; import { ButtonBlurOnClickDirective } from './button-blur-on-click.directive'; import { BytesToHumanSize, MegaBytesToHumanSize } from './byte-formatters.pipe'; import { ClickStopPropagationDirective } from './click-stop-propagation.directive'; +import { APP_TITLE, appTitleFactory } from './core.types'; import { CurrentUserPermissionsService } from './current-user-permissions.service'; import { DisableRouterLinkDirective } from './disable-router-link.directive'; import { DotContentComponent } from './dot-content/dot-content.component'; import { EndpointsService } from './endpoints.service'; import { EntityFavoriteStarComponent } from './entity-favorite-star/entity-favorite-star.component'; -import { EntityServiceFactory } from '../../../store/src/entity-service-factory.service'; import { EventWatcherService } from './event-watcher/event-watcher.service'; import { InfinityPipe } from './infinity.pipe'; import { LogOutDialogComponent } from './log-out-dialog/log-out-dialog.component'; @@ -28,12 +31,10 @@ import { PageNotFoundComponentComponent } from './page-not-found-component/page- import { SafeImgPipe } from './safe-img.pipe'; import { StatefulIconComponent } from './stateful-icon/stateful-icon.component'; import { TruncatePipe } from './truncate.pipe'; +import { UserProfileService } from './user-profile.service'; import { UserService } from './user.service'; import { UtilsService } from './utils.service'; import { WindowRef } from './window-ref/window-ref.service'; -import { APP_TITLE, appTitleFactory } from './core.types'; -import { UserProfileService } from './user-profile.service'; -import { UserAvatarComponent } from './../shared/components/user-avatar/user-avatar.component'; @NgModule({ imports: [ @@ -77,6 +78,7 @@ import { UserAvatarComponent } from './../shared/components/user-avatar/user-ava EndpointsService, UserService, EntityServiceFactory, + EntityCatalogHelper, UserProfileService, CurrentUserPermissionsService, { diff --git a/src/frontend/packages/core/src/core/current-user-permissions.checker.ts b/src/frontend/packages/core/src/core/current-user-permissions.checker.ts index f0050f0832..234279fec8 100644 --- a/src/frontend/packages/core/src/core/current-user-permissions.checker.ts +++ b/src/frontend/packages/core/src/core/current-user-permissions.checker.ts @@ -2,9 +2,7 @@ import { Store } from '@ngrx/store'; import { combineLatest, Observable, of as observableOf } from 'rxjs'; import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; -import { - createCfFeatureFlagFetchAction, -} from '../../../cloud-foundry/src/shared/components/list/list-types/cf-feature-flags/cf-feature-flags-data-source.helpers'; +import { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { getCurrentUserCFEndpointHasScope, getCurrentUserCFEndpointRolesState, @@ -16,8 +14,6 @@ import { ISpacesRoleState, } from '../../../cloud-foundry/src/store/types/cf-current-user-roles.types'; import { GeneralEntityAppState } from '../../../store/src/app-state'; -import { PaginationMonitor } from '../../../store/src/monitors/pagination-monitor'; -import { getPaginationObservables } from '../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { getCurrentUserStratosHasScope, getCurrentUserStratosRole, @@ -194,24 +190,11 @@ export class CurrentUserPermissionsChecker { const endpointGuids$ = this.getEndpointGuidObservable(endpointGuid); return endpointGuids$.pipe( switchMap(guids => { - const createFFObs = guid => { + const createFFObs = guid => // For admins we don't have the ff list which is usually fetched right at the start, // so this can't be a pagination monitor on its own (which doesn't fetch if list is missing) - const action = createCfFeatureFlagFetchAction(guid); - return getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: new PaginationMonitor( - this.store, - action.paginationKey, - action, - true - ) - }, - true - ).entities$; - }; + cfEntityCatalog.featureFlag.store.getPaginationService(guid).entities$ + ; return combineLatest(guids.map(createFFObs)); }), diff --git a/src/frontend/packages/core/src/core/endpoints.service.ts b/src/frontend/packages/core/src/core/endpoints.service.ts index 51749fccf5..842330f087 100644 --- a/src/frontend/packages/core/src/core/endpoints.service.ts +++ b/src/frontend/packages/core/src/core/endpoints.service.ts @@ -6,7 +6,7 @@ import { first, map, skipWhile, withLatestFrom } from 'rxjs/operators'; import { RouterNav } from '../../../store/src/actions/router.actions'; import { EndpointOnlyAppState, IRequestEntityTypeState } from '../../../store/src/app-state'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { AuthState } from '../../../store/src/reducers/auth.reducer'; import { endpointEntitiesSelector, endpointStatusSelector } from '../../../store/src/selectors/endpoint.selectors'; import { EndpointModel, EndpointState } from '../../../store/src/types/endpoint.types'; diff --git a/src/frontend/packages/core/src/core/user-favorite-manager.ts b/src/frontend/packages/core/src/core/user-favorite-manager.ts index 44a07d676a..45e4fded8a 100644 --- a/src/frontend/packages/core/src/core/user-favorite-manager.ts +++ b/src/frontend/packages/core/src/core/user-favorite-manager.ts @@ -5,6 +5,7 @@ import { filter, map, switchMap, tap } from 'rxjs/operators'; import { ToggleUserFavoriteAction } from '../../../store/src/actions/user-favourites-actions/toggle-user-favorite-action'; import { GeneralEntityAppState, IRequestEntityTypeState } from '../../../store/src/app-state'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from '../../../store/src/selectors/endpoint.selectors'; import { errorFetchingFavoritesSelector, @@ -19,7 +20,6 @@ import { FavoritesConfigMapper, TFavoriteMapperFunction, } from '../shared/components/favorites-meta-card/favorite-config-mapper'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; import { LoggerService } from './logger.service'; export interface IFavoriteEntity { diff --git a/src/frontend/packages/core/src/core/user-profile.service.ts b/src/frontend/packages/core/src/core/user-profile.service.ts index 95fd5c5a4b..cab800a9cc 100644 --- a/src/frontend/packages/core/src/core/user-profile.service.ts +++ b/src/frontend/packages/core/src/core/user-profile.service.ts @@ -10,21 +10,13 @@ import { } from '../../../store/src/actions/user-profile.actions'; import { AppState } from '../../../store/src/app-state'; import { UserProfileEffect, userProfilePasswordUpdatingKey } from '../../../store/src/effects/user-profile.effects'; -import { - ActionState, - getDefaultActionState, - rootUpdatingKey, -} from '../../../store/src/reducers/api-request-reducer/types'; +import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog'; +import { EntityMonitor } from '../../../store/src/monitors/entity-monitor'; +import { ActionState, getDefaultActionState, rootUpdatingKey } from '../../../store/src/reducers/api-request-reducer/types'; import { AuthState } from '../../../store/src/reducers/auth.reducer'; import { selectRequestInfo, selectUpdateInfo } from '../../../store/src/selectors/api.selectors'; -import { - UserProfileInfo, - UserProfileInfoEmail, - UserProfileInfoUpdates, -} from '../../../store/src/types/user-profile.types'; +import { UserProfileInfo, UserProfileInfoEmail, UserProfileInfoUpdates } from '../../../store/src/types/user-profile.types'; import { userProfileEntitySchema } from '../base-entity-schemas'; -import { entityCatalog } from '../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityMonitor } from '../../../store/src/monitors/entity-monitor'; @Injectable() @@ -40,14 +32,16 @@ export class UserProfileService { private stratosUserConfig = entityCatalog.getEntity(userProfileEntitySchema.endpointType, userProfileEntitySchema.entityType); - constructor(private store: Store) { + constructor( + private store: Store, + ) { if (!this.stratosUserConfig) { console.error('Can not get user profile entity'); this.userProfile$ = of({} as UserProfileInfo); return; } - this.entityMonitor = this.stratosUserConfig.getEntityMonitor(this.store, UserProfileEffect.guid); + this.entityMonitor = this.stratosUserConfig.store.getEntityMonitor(UserProfileEffect.guid); this.userProfile$ = this.entityMonitor.entity$.pipe( filter(data => data && !!data.id) @@ -99,7 +93,7 @@ export class UserProfileService { updateProfile(profile: UserProfileInfo, profileChanges: UserProfileInfoUpdates): Observable<[ActionState, ActionState]> { const didChangeProfile = (profileChanges.givenName !== undefined || profileChanges.familyName !== undefined || - profileChanges.emailAddress !== undefined ); + profileChanges.emailAddress !== undefined); const didChangePassword = !!(profileChanges.newPassword && profileChanges.currentPassword); const profileObs$ = didChangeProfile ? this.updateProfileInfo(profile, profileChanges) : observableOf(getDefaultActionState()); const passwordObs$ = didChangePassword ? this.updatePassword(profile, profileChanges) : observableOf(getDefaultActionState()); diff --git a/src/frontend/packages/core/src/core/utils.service.ts b/src/frontend/packages/core/src/core/utils.service.ts index 422447cb4a..415a8f89c6 100644 --- a/src/frontend/packages/core/src/core/utils.service.ts +++ b/src/frontend/packages/core/src/core/utils.service.ts @@ -11,7 +11,55 @@ export function getIdFromRoute(activatedRoute: ActivatedRoute, id: string) { return null; } -export type Omit = Pick>; +export type OptionalKeys = Exclude<{ + [K in keyof T]: T extends Record + ? K + : never +}[keyof T], undefined> + + +export type NonOptionalKeys = Exclude<{ + [K in keyof T]: T extends Record + ? K + : never +}[keyof T], undefined> + +export type NeverKeys = Exclude<{ + [K in keyof T]: T[K] extends never + ? K + : never +}[keyof T], undefined> + + +/** + * Remove keys such as typed indexes (i.e. [key: string]) + * For magic see + * - https://github.com/Microsoft/TypeScript/issues/25987#issuecomment-441224690 + * - https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-414808995 + */ +export type KnownKeys = { + [K in keyof T]: string extends K ? never : number extends K ? never : K +} extends { [_ in keyof T]: infer U } ? ({} extends U ? never : U) : never; + +/** + * Pick all properties who's function has the specified return type U + */ +export type FilteredByReturnType any }, U> = { + [P in keyof T]: ReturnType extends U ? T[P] : never +}; + +/** + * Pick all properties who's function do not have the specified return type U + */ +export type FilteredByNotReturnType any }, U> = { + [P in keyof T]: ReturnType extends U ? never : T[P] +}; + +// Note - Adding }[keyof T] to [P in keyof T] types should filter out properties of type `never`, however this fails with generics! +export type FilteredByValueType any }, U> = { + [P in keyof T]: T[P] extends U ? never : T[P] +}; + export const urlValidationExpression = '^' + diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts index 64d39dd41e..3dd8541e5b 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/add-quota/create-quota-step/create-quota-step.component.ts @@ -1,20 +1,13 @@ import { Component, ViewChild } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Subscription } from 'rxjs'; import { filter, map, pairwise } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; -import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; -import { quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ @@ -32,7 +25,6 @@ export class CreateQuotaStepComponent { form: QuotaDefinitionFormComponent; constructor( - private store: Store, private activatedRoute: ActivatedRoute, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; @@ -42,10 +34,7 @@ export class CreateQuotaStepComponent { submit: StepOnNextFunction = () => { const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - entityConfig.actionDispatchManager.dispatchCreate(formValues.name, this.cfGuid, formValues); - return entityConfig.getEntityMonitor(this.store, formValues.name).entityRequest$.pipe( + return cfEntityCatalog.quotaDefinition.api.create(formValues.name, this.cfGuid, formValues).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), diff --git a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts index b1371907dc..a63b5b2489 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/add-space-quota/create-space-quota-step/create-space-quota-step.component.ts @@ -1,21 +1,14 @@ import { Component, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, pairwise } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - SpaceQuotaDefinitionActionBuilders, -} from '../../../../../../cloud-foundry/src/entity-action-builders/space-quota.action-builders'; -import { AppState } from '../../../../../../store/src/app-state'; +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { RequestInfoState } from '../../../../../../store/src/reducers/api-request-reducer/types'; import { APIResource } from '../../../../../../store/src/types/api.types'; import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; -import { spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ @@ -34,7 +27,6 @@ export class CreateSpaceQuotaStepComponent { form: SpaceQuotaDefinitionFormComponent; constructor( - private store: Store, private activatedRoute: ActivatedRoute, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; @@ -46,14 +38,10 @@ export class CreateSpaceQuotaStepComponent { submit: StepOnNextFunction = () => { const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceQuotaEntityType); - entityConfig.actionDispatchManager.dispatchCreate(formValues.name, this.cfGuid, { + return cfEntityCatalog.spaceQuota.api.create(formValues.name, this.cfGuid, { orgGuid: this.orgGuid, createQuota: formValues - }); - - return entityConfig.getEntityMonitor(this.store, formValues.name).entityRequest$.pipe( + }).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts index 5bb4a1ef34..b15cbe0a71 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/edit-quota/edit-quota-step/edit-quota-step.component.ts @@ -4,26 +4,15 @@ import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, first, map, pairwise, tap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - GetQuotaDefinition, - UpdateQuotaDefinition, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; import { ActiveRouteCfOrgSpace } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf-page.types'; import { getActiveRouteCfOrgSpaceProvider } from '../../../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; import { AppState } from '../../../../../../store/src/app-state'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; +import { IOrgQuotaDefinition } from '../../../../core/cf-api.types'; import { safeUnsubscribe } from '../../../../core/utils.service'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { QuotaDefinitionFormComponent } from '../../quota-definition-form/quota-definition-form.component'; -import { quotaDefinitionEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ @@ -38,9 +27,9 @@ export class EditQuotaStepComponent implements OnDestroy { cfGuid: string; quotaGuid: string; - quotaDefinition$: Observable>; + quotaDefinition$: Observable>; quotaSubscription: Subscription; - quota: IQuotaDefinition; + quota: IOrgQuotaDefinition; @ViewChild('form', { static: false }) form: QuotaDefinitionFormComponent; @@ -48,7 +37,6 @@ export class EditQuotaStepComponent implements OnDestroy { constructor( private store: Store, private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, activeRouteCfOrgSpace: ActiveRouteCfOrgSpace, ) { this.cfGuid = activeRouteCfOrgSpace.cfGuid; @@ -58,10 +46,7 @@ export class EditQuotaStepComponent implements OnDestroy { } fetchQuotaDefinition() { - this.quotaDefinition$ = this.entityServiceFactory.create>( - this.quotaGuid, - new GetQuotaDefinition(this.quotaGuid, this.cfGuid), - ).waitForEntity$.pipe( + this.quotaDefinition$ = cfEntityCatalog.quotaDefinition.store.getEntityService(this.quotaGuid, this.cfGuid, {}).waitForEntity$.pipe( first(), map(data => data.entity), tap((resource) => this.quota = resource.entity) @@ -74,12 +59,10 @@ export class EditQuotaStepComponent implements OnDestroy { submit: StepOnNextFunction = () => { const formValues = this.form.formGroup.value; - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - entityConfig.actionDispatchManager.dispatchUpdate(this.quotaGuid, this.cfGuid, formValues); - return entityConfig - .getEntityMonitor(this.store, this.quotaGuid) - .getUpdatingSection(UpdateQuotaDefinition.UpdateExistingQuota).pipe( + const action = cfEntityCatalog.quotaDefinition.actions.update(this.quotaGuid, this.cfGuid, formValues); + this.store.dispatch(action); + return cfEntityCatalog.quotaDefinition.store.getEntityMonitor(this.quotaGuid) + .getUpdatingSection(action.updatingKey).pipe( pairwise(), filter(([oldV, newV]) => oldV.busy && !newV.busy), map(([, newV]) => newV), diff --git a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts index cd832da790..c1d149dcc5 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/edit-space-quota/edit-space-quota-step/edit-space-quota-step.component.ts @@ -4,24 +4,13 @@ import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, pairwise, tap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../../../../cloud-foundry/src/cf-types'; -import { - GetSpaceQuotaDefinition, - UpdateSpaceQuotaDefinition, -} from '../../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { - SpaceQuotaDefinitionActionBuilders, -} from '../../../../../../cloud-foundry/src/entity-action-builders/space-quota.action-builders'; +import { cfEntityCatalog } from '../../../../../../cloud-foundry/src/cf-entity-catalog'; import { AppState } from '../../../../../../store/src/app-state'; import { APIResource } from '../../../../../../store/src/types/api.types'; -import { IQuotaDefinition } from '../../../../core/cf-api.types'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../../../store/src/entity-service-factory.service'; +import { ISpaceQuotaDefinition } from '../../../../core/cf-api.types'; import { safeUnsubscribe } from '../../../../core/utils.service'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { SpaceQuotaDefinitionFormComponent } from '../../space-quota-definition-form/space-quota-definition-form.component'; -import { spaceQuotaEntityType } from '../../../../../../cloud-foundry/src/cf-entity-types'; @Component({ @@ -35,8 +24,8 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { cfGuid: string; spaceQuotaGuid: string; allQuotas: string[]; - spaceQuotaDefinition$: Observable>; - quota: IQuotaDefinition; + spaceQuotaDefinition$: Observable>; + quota: ISpaceQuotaDefinition; @ViewChild('form', { static: false }) form: SpaceQuotaDefinitionFormComponent; @@ -44,7 +33,6 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { constructor( private store: Store, private activatedRoute: ActivatedRoute, - private entityServiceFactory: EntityServiceFactory, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; this.spaceQuotaGuid = this.activatedRoute.snapshot.params.quotaId; @@ -53,10 +41,7 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { } fetchQuotaDefinition() { - this.spaceQuotaDefinition$ = this.entityServiceFactory.create>( - this.spaceQuotaGuid, - new GetSpaceQuotaDefinition(this.spaceQuotaGuid, this.cfGuid), - ).waitForEntity$.pipe( + this.spaceQuotaDefinition$ = cfEntityCatalog.spaceQuota.store.getEntityService(this.spaceQuotaGuid, this.cfGuid).waitForEntity$.pipe( map(data => data.entity), tap((resource) => this.quota = resource.entity) ); @@ -68,16 +53,11 @@ export class EditSpaceQuotaStepComponent implements OnDestroy { submit: StepOnNextFunction = () => { const formValues = this.form.formGroup.value; - const action = new UpdateSpaceQuotaDefinition(this.spaceQuotaGuid, this.cfGuid, formValues); - this.store.dispatch(action); - - const entityConfig = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, spaceQuotaEntityType); - entityConfig.actionDispatchManager.dispatchUpdate(this.spaceQuotaGuid, this.cfGuid, formValues); - return entityConfig - .getEntityMonitor(this.store, this.spaceQuotaGuid) - .getUpdatingSection(UpdateSpaceQuotaDefinition.UpdateExistingSpaceQuota) + const action = cfEntityCatalog.spaceQuota.actions.update(this.spaceQuotaGuid, this.cfGuid, formValues); + this.store.dispatch(action); + return cfEntityCatalog.quotaDefinition.store.getEntityMonitor(this.spaceQuotaGuid) + .getUpdatingSection(action.updatingKey) .pipe( pairwise(), filter(([oldV, newV]) => oldV.busy && !newV.busy), diff --git a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts index 0f73bbfb4b..ed39df04bd 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/quota-definition-form/quota-definition-form.component.ts @@ -1,24 +1,12 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { Observable, Subscription } from 'rxjs'; +import { Subscription } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; -import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; -import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; -import { quotaDefinitionEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../cloud-foundry/src/cf-types'; -import { - QuotaDefinitionActionBuilder, -} from '../../../../../cloud-foundry/src/entity-action-builders/quota-definition.action-builders'; +import { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../../store/src/types/api.types'; import { IQuotaDefinition } from '../../../core/cf-api.types'; import { safeUnsubscribe } from '../../../core/utils.service'; @@ -45,15 +33,12 @@ export class QuotaDefinitionFormComponent implements OnInit, OnDestroy { quotasSubscription: Subscription; cfGuid: string; allQuotas: string[]; - quotaDefinitions$: Observable[]>; formGroup: FormGroup; @Input() quota: IQuotaDefinition; constructor( - private store: Store, private activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; } @@ -83,28 +68,14 @@ export class QuotaDefinitionFormComponent implements OnInit, OnDestroy { fetchQuotasDefinitions() { const quotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const quotaDefinitionEntity = - entityCatalog.getEntity(CF_ENDPOINT_TYPE, quotaDefinitionEntityType); - const actionBuilder = quotaDefinitionEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const getQuotaDefinitionsAction = actionBuilder(quotaPaginationKey, this.cfGuid, {}); - this.quotaDefinitions$ = getPaginationObservables( - { - store: this.store, - action: getQuotaDefinitionsAction, - paginationMonitor: this.paginationMonitorFactory.create( - quotaPaginationKey, - cfEntityFactory(quotaDefinitionEntityType), - getQuotaDefinitionsAction.flattenPagination - ) - }, - getQuotaDefinitionsAction.flattenPagination - ).entities$.pipe( - filter(o => !!o), - map(o => o.map(org => org.entity.name)), - tap((o) => this.allQuotas = o) - ); - - this.quotasSubscription = this.quotaDefinitions$.subscribe(); + const quotaDefinitions$ = cfEntityCatalog.quotaDefinition.store.getPaginationService(quotaPaginationKey, this.cfGuid, {}) + .entities$.pipe( + filter(o => !!o), + map(o => o.map(org => org.entity.name)), + tap((o: string[]) => this.allQuotas = o) + ); + + this.quotasSubscription = quotaDefinitions$.subscribe(); } nameTakenValidator = (): ValidatorFn => { diff --git a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts b/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts index a5055fbf0a..154be20360 100644 --- a/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts +++ b/src/frontend/packages/core/src/features/cloud-foundry/space-quota-definition-form/space-quota-definition-form.component.ts @@ -1,19 +1,12 @@ import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; -import { Store } from '@ngrx/store'; import { Observable, Subscription } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; -import { GetOrganizationSpaceQuotaDefinitions } from '../../../../../cloud-foundry/src/actions/quota-definitions.actions'; -import { cfEntityFactory } from '../../../../../cloud-foundry/src/cf-entity-factory'; -import { spaceQuotaEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; import { createEntityRelationPaginationKey } from '../../../../../cloud-foundry/src/entity-relations/entity-relations.types'; -import { AppState } from '../../../../../store/src/app-state'; import { endpointSchemaKey } from '../../../../../store/src/helpers/entity-factory'; -import { PaginationMonitorFactory } from '../../../../../store/src/monitors/pagination-monitor.factory'; -import { getPaginationObservables } from '../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; -import { APIResource } from '../../../../../store/src/types/api.types'; import { IQuotaDefinition } from '../../../core/cf-api.types'; import { safeUnsubscribe } from '../../../core/utils.service'; @@ -28,15 +21,13 @@ export class SpaceQuotaDefinitionFormComponent implements OnInit, OnDestroy { cfGuid: string; orgGuid: string; allQuotas: string[]; - spaceQuotaDefinitions$: Observable[]>; + spaceQuotaDefinitions$: Observable; formGroup: FormGroup; @Input() quota: IQuotaDefinition; constructor( - private store: Store, private activatedRoute: ActivatedRoute, - private paginationMonitorFactory: PaginationMonitorFactory, ) { this.cfGuid = this.activatedRoute.snapshot.params.endpointId; this.orgGuid = this.activatedRoute.snapshot.params.orgId; @@ -65,24 +56,16 @@ export class SpaceQuotaDefinitionFormComponent implements OnInit, OnDestroy { } fetchQuotasDefinitions() { - const spaceQuotaPaginationKey = createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid); - const action = new GetOrganizationSpaceQuotaDefinitions(spaceQuotaPaginationKey, this.orgGuid, this.cfGuid); - this.spaceQuotaDefinitions$ = getPaginationObservables( - { - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - spaceQuotaPaginationKey, - cfEntityFactory(spaceQuotaEntityType), - action.flattenPagination - ) - }, - action.flattenPagination - ).entities$.pipe( - filter(o => !!o), - map(o => o.map(org => org.entity.name)), - tap((o) => this.allQuotas = o) - ); + this.spaceQuotaDefinitions$ = cfEntityCatalog.spaceQuota.store.getAllInOrganization.getPaginationService( + this.orgGuid, + this.cfGuid, + createEntityRelationPaginationKey(endpointSchemaKey, this.cfGuid) + ).entities$ + .pipe( + filter(o => !!o), + map(o => o.map(org => org.entity.name)), + tap((o) => this.allQuotas = o) + ); this.quotasSubscription = this.spaceQuotaDefinitions$.subscribe(); } diff --git a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts index 91e4819fba..22bf3bd7c6 100644 --- a/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts +++ b/src/frontend/packages/core/src/features/dashboard/dashboard-base/dashboard-base.component.ts @@ -4,17 +4,12 @@ import { AfterViewInit, Component, NgZone, OnDestroy, OnInit, ViewChild, ViewCon import { MatDrawer } from '@angular/material'; import { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Route, Router } from '@angular/router'; import { Store } from '@ngrx/store'; -import { entityCatalog } from 'frontend/packages/store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata } from 'frontend/packages/store/src/entity-catalog/entity-catalog.types'; import { combineLatest, Observable, of, Subscription } from 'rxjs'; import { distinctUntilChanged, filter, map, startWith, withLatestFrom } from 'rxjs/operators'; import { GetCurrentUsersRelations } from '../../../../../cloud-foundry/src/actions/permissions.actions'; -import { cfInfoEntityType } from '../../../../../cloud-foundry/src/cf-entity-types'; +import { cfEntityCatalog } from '../../../../../cloud-foundry/src/cf-entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../../../cloud-foundry/src/cf-types'; -import { - CfInfoDefinitionActionBuilders, -} from '../../../../../cloud-foundry/src/entity-action-builders/cf-info.action-builders'; import { CloseSideNav, DisableMobileNav, EnableMobileNav } from '../../../../../store/src/actions/dashboard-actions'; import { GetUserFavoritesAction } from '../../../../../store/src/actions/user-favourites-actions/get-user-favorites-action'; import { DashboardOnlyAppState } from '../../../../../store/src/app-state'; @@ -144,10 +139,7 @@ export class DashboardBaseComponent implements OnInit, OnDestroy, AfterViewInit ); // TODO: Move cf code out to cf module #3849 this.endpointsService.registerHealthCheck( - new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => { - entityCatalog.getEntity(CF_ENDPOINT_TYPE, cfInfoEntityType) - .actionDispatchManager.dispatchGet(endpoint.guid); - }) + new EndpointHealthCheck(CF_ENDPOINT_TYPE, (endpoint) => cfEntityCatalog.cfInfo.api.get(endpoint.guid)) ); this.dispatchRelations(); this.store.dispatch(new GetUserFavoritesAction()); diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts index 978f098196..13bddabaaa 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-connection-cell/backup-connection-cell.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel, SystemSharedUserGuid } from '../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../../shared/components/list/list.types'; import { BackupEndpointsService } from '../backup-endpoints.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts index d10c9144e8..5251a66479 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints.service.ts @@ -5,7 +5,7 @@ import { BehaviorSubject, Observable } from 'rxjs'; import { first, map } from 'rxjs/operators'; import { GeneralEntityAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; import { BrowserStandardEncoder } from '../../../helper'; import { diff --git a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts index 1d24656803..3ad6856b48 100644 --- a/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/backup-restore/backup-endpoints/backup-endpoints.component.ts @@ -7,7 +7,7 @@ import { filter, first, map } from 'rxjs/operators'; import { GetAllEndpoints } from '../../../../../../store/src/actions/endpoint.actions'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationMonitorFactory } from '../../../../../../store/src/monitors/pagination-monitor.factory'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { EndpointModel } from '../../../../../../store/src/types/endpoint.types'; diff --git a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts index 185456b739..fc355c4928 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect-endpoint/connect-endpoint.component.ts @@ -15,7 +15,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointAuthTypeConfig, IAuthForm, IEndpointAuthComponent } from '../../../core/extension/extension-types'; import { safeUnsubscribe } from '../../../core/utils.service'; import { ConnectEndpointConfig, ConnectEndpointData, ConnectEndpointService } from '../connect.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/connect.service.ts b/src/frontend/packages/core/src/features/endpoints/connect.service.ts index 102df34440..015ff5b14d 100644 --- a/src/frontend/packages/core/src/features/endpoints/connect.service.ts +++ b/src/frontend/packages/core/src/features/endpoints/connect.service.ts @@ -17,7 +17,7 @@ import { GetSystemInfo } from '../../../../store/src/actions/system.actions'; import { EndpointOnlyAppState } from '../../../../store/src/app-state'; import { EndpointsEffect } from '../../../../store/src/effects/endpoint.effects'; import { SystemEffects } from '../../../../store/src/effects/system.effects'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../store/src/helpers/entity-factory'; import { ActionState } from '../../../../store/src/reducers/api-request-reducer/types'; import { selectEntity, selectRequestInfo, selectUpdateInfo } from '../../../../store/src/selectors/api.selectors'; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts index 38ed86cbca..85fedb80c1 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-base-step/create-endpoint-base-step.component.ts @@ -5,7 +5,7 @@ import { first, map } from 'rxjs/operators'; import { RouterNav } from '../../../../../../store/src/actions/router.actions'; import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; import { selectSessionData } from '../../../../../../store/src/reducers/auth.reducer'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { BASE_REDIRECT_QUERY } from '../../../../shared/components/stepper/stepper.types'; import { TileConfigManager } from '../../../../shared/components/tile/tile-selector.helpers'; import { ITileConfig, ITileData } from '../../../../shared/components/tile/tile-selector.types'; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts index 1a576df5dd..c2ca34a7c9 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts @@ -10,8 +10,10 @@ import { GetAllEndpoints, RegisterEndpoint } from '../../../../../../store/src/a import { ShowSnackBar } from '../../../../../../store/src/actions/snackBar.actions'; import { GeneralEntityAppState } from '../../../../../../store/src/app-state'; import { EndpointsEffect } from '../../../../../../store/src/effects/endpoint.effects'; -import { StratosCatalogEndpointEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosCatalogEndpointEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../../../../../store/src/helpers/entity-factory'; import { getAPIRequestDataState, selectUpdateInfo } from '../../../../../../store/src/selectors/api.selectors'; import { selectPaginationState } from '../../../../../../store/src/selectors/pagination.selectors'; diff --git a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts index 9a2d225ea3..1bd0f9c07c 100644 --- a/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { getIdFromRoute } from '../../../core/utils.service'; diff --git a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts index ce966903ba..5f4447afec 100644 --- a/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts +++ b/src/frontend/packages/core/src/features/endpoints/edit-endpoint/edit-endpoint-step/edit-endpoint-step.component.ts @@ -7,7 +7,7 @@ import { filter, map, first, pairwise, startWith } from 'rxjs/operators'; import { EndpointModel } from './../../../../../../store/src/types/endpoint.types'; import { UpdateEndpoint } from './../../../../../../store/src/actions/endpoint.actions'; import { IStratosEndpointDefinition, EntityCatalogSchemas } from './../../../../../../store/src/entity-catalog/entity-catalog.types'; -import { entityCatalog } from './../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from './../../../../../../store/src/selectors/endpoint.selectors'; import { StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component'; import { selectUpdateInfo } from '../../../../../../store/src/selectors/api.selectors'; diff --git a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts index 348b5ebf48..15bc240559 100644 --- a/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts +++ b/src/frontend/packages/core/src/features/metrics/metrics/metrics.component.ts @@ -6,7 +6,7 @@ import { filter, first, map } from 'rxjs/operators'; import { MetricsAPIAction, MetricsAPITargets } from '../../../../../store/src/actions/metrics-api.actions'; import { AppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { getIdFromRoute } from '../../../core/utils.service'; import { IHeaderBreadcrumb } from '../../../shared/components/page-header/page-header.types'; import { EndpointIcon } from '../../endpoints/endpoint-helpers'; diff --git a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts index 0e39935fd9..94e4d2bbd6 100644 --- a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts +++ b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorite-config-mapper.ts @@ -1,19 +1,21 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, +} from '../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; +import { IEntityMetadata, IStratosEntityDefinition } from '../../../../../store/src/entity-catalog/entity-catalog.types'; +import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; +import { EntityRequestAction } from '../../../../../store/src/types/request.types'; import { IFavoriteMetadata, IFavoriteTypeInfo, UserFavorite, UserFavoriteEndpoint, } from '../../../../../store/src/types/user-favorites.types'; -import { StratosBaseCatalogEntity } from '../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { EntityCatalogHelpers } from '../../../../../store/src/entity-catalog/entity-catalog.helper'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; -import { IEntityMetadata, IStratosEntityDefinition } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { MetaCardMenuItem } from '../list/list-cards/meta-card/meta-card-base/meta-card.component'; -import { EntityRequestAction } from '../../../../../store/src/types/request.types'; -import { EndpointModel } from '../../../../../store/src/types/endpoint.types'; export interface IFavoriteTypes { diff --git a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts index 7476f5156f..f75c0a63dc 100644 --- a/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/favorites-meta-card/favorites-meta-card.component.ts @@ -7,6 +7,7 @@ import { CFAppState } from '../../../../../cloud-foundry/src/cf-app-state'; import { RemoveUserFavoriteAction, } from '../../../../../store/src/actions/user-favourites-actions/remove-user-favorite-action'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { endpointEntitiesSelector } from '../../../../../store/src/selectors/endpoint.selectors'; import { IFavoriteMetadata, UserFavorite } from '../../../../../store/src/types/user-favorites.types'; import { userFavoritesEntitySchema } from '../../../base-entity-schemas'; @@ -16,7 +17,6 @@ import { ComponentEntityMonitorConfig, StratosStatus } from '../../shared.types' import { ConfirmationDialogConfig } from '../confirmation-dialog.config'; import { ConfirmationDialogService } from '../confirmation-dialog.service'; import { MetaCardMenuItem } from '../list/list-cards/meta-card/meta-card-base/meta-card.component'; -import { entityCatalog } from './../../../../../store/src/entity-catalog/entity-catalog.service'; import { IFavoritesMetaCardConfig } from './favorite-config-mapper'; diff --git a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts index 762a4df7c4..b1fdfc75c7 100644 --- a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/list-data-source.ts @@ -29,7 +29,7 @@ import { ListFilter, ListSort } from '../../../../../../store/src/actions/list.a import { MetricsAction } from '../../../../../../store/src/actions/metrics.actions'; import { IgnorePaginationMaxedState, SetResultCount } from '../../../../../../store/src/actions/pagination.actions'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { PaginationMonitor } from '../../../../../../store/src/monitors/pagination-monitor'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; diff --git a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts index 663ef63e5e..c84c1c7402 100644 --- a/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts +++ b/src/frontend/packages/core/src/shared/components/list/data-sources-controllers/local-list.helpers.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { PaginationEntityState } from '../../../../../../store/src/types/pagination.types'; export class LocalPaginationHelpers { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts index 9f35194807..02ae1b0203 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/table-cell-service/table-cell-service.component.ts @@ -1,20 +1,17 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { filter, first, map, switchMap } from 'rxjs/operators'; -import { - serviceBrokerEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../../../../../cloud-foundry/src/cf-entity-types'; +import { cfEntityCatalog } from '../../../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { userProvidedServiceInstanceEntityType } from '../../../../../../../../cloud-foundry/src/cf-entity-types'; import { CF_ENDPOINT_TYPE } from '../../../../../../../../cloud-foundry/src/cf-types'; import { getCfService, getServiceName, } from '../../../../../../../../cloud-foundry/src/features/service-catalog/services-helper'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { APIResource } from '../../../../../../../../store/src/types/api.types'; -import { IServiceBroker, IServiceInstance } from '../../../../../../core/cf-api-svc.types'; +import { IServiceInstance } from '../../../../../../core/cf-api-svc.types'; import { TableCellCustom } from '../../../list.types'; // TODO: Move CF code to CF Module #3769 @@ -35,45 +32,38 @@ export class TableCellServiceComponent extends TableCellCustom; @Input() entityKey: string; - constructor(private entityServiceFactory: EntityServiceFactory) { - super(); - } ngOnInit() { this.isUserProvidedServiceInstance = this.entityKey === entityCatalog.getEntityKey(CF_ENDPOINT_TYPE, userProvidedServiceInstanceEntityType); - const service$ = getCfService(this.row.entity.service_guid, this.row.entity.cfGuid, this.entityServiceFactory).waitForEntity$.pipe( - filter(s => !!s), - ); - - this.serviceName$ = service$.pipe( - map(s => this.isUserProvidedServiceInstance ? 'User Provided' : getServiceName(s.entity)) - ); + if (!this.isUserProvidedServiceInstance) { + const service$ = getCfService(this.row.entity.service_guid, this.row.entity.cfGuid).waitForEntity$.pipe( + filter(s => !!s), + ); - this.serviceUrl$ = service$.pipe( - map(service => `/marketplace/${service.entity.entity.cfGuid}/${service.entity.metadata.guid}/summary`) - ); + this.serviceName$ = service$.pipe( + map(s => getServiceName(s.entity)) + ); - this.serviceBrokerName$ = service$.pipe( - first(), - switchMap(service => { - const brokerGuid = service.entity.entity.service_broker_guid; - const serviceBrokerEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, serviceBrokerEntityType); - const actionBuilder = serviceBrokerEntity.actionOrchestrator.getActionBuilder('get'); - const getServiceBrokersAction = actionBuilder(brokerGuid, service.entity.entity.cfGuid); - return this.entityServiceFactory.create>( - brokerGuid, - getServiceBrokersAction - ).waitForEntity$.pipe( - map(a => a.entity), - filter(res => !!res), - map(a => a.entity.name), - first() - ); - }) - ); + this.serviceUrl$ = this.isUserProvidedServiceInstance ? of(null) : service$.pipe( + map(service => `/marketplace/${service.entity.entity.cfGuid}/${service.entity.metadata.guid}/summary`) + ); + this.serviceBrokerName$ = service$.pipe( + first(), + switchMap(service => { + const brokerGuid = service.entity.entity.service_broker_guid; + return cfEntityCatalog.serviceBroker.store.getEntityService(brokerGuid, service.entity.entity.cfGuid, {}) + .waitForEntity$.pipe( + map(a => a.entity), + filter(res => !!res), + map(a => a.entity.name), + first() + ); + }) + ); + } } } diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts index e8a189b97a..42cdbed9bf 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-card/endpoint-card.component.ts @@ -15,8 +15,10 @@ import { AppState } from 'frontend/packages/store/src/app-state'; import { Observable, of, ReplaySubject, Subscription } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { StratosCatalogEndpointEntity } from '../../../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; +import { + StratosCatalogEndpointEntity, +} from '../../../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { UserFavoriteEndpoint } from '../../../../../../../../store/src/types/user-favorites.types'; import { safeUnsubscribe } from '../../../../../../core/utils.service'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts index a90bb816ad..25ba15e604 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers.ts @@ -9,13 +9,13 @@ import { DisconnectEndpoint, UnregisterEndpoint } from '../../../../../../../sto import { ShowSnackBar } from '../../../../../../../store/src/actions/snackBar.actions'; import { GetSystemInfo } from '../../../../../../../store/src/actions/system.actions'; import { EndpointsEffect } from '../../../../../../../store/src/effects/endpoint.effects'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../../../../../../../store/src/helpers/entity-factory'; import { selectDeletionInfo, selectUpdateInfo } from '../../../../../../../store/src/selectors/api.selectors'; import { EndpointModel } from '../../../../../../../store/src/types/endpoint.types'; import { STRATOS_ENDPOINT_TYPE } from '../../../../../base-entity-schemas'; import { CurrentUserPermissions } from '../../../../../core/current-user-permissions.config'; import { CurrentUserPermissionsService } from '../../../../../core/current-user-permissions.service'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { LoggerService } from '../../../../../core/logger.service'; import { ConnectEndpointDialogComponent, @@ -98,7 +98,7 @@ export class EndpointListHelper { description: '', createVisible: (row$: Observable) => row$.pipe(map(row => { const endpoint = entityCatalog.getEndpoint(row.cnsi_type, row.sub_type); - const ep = endpoint ? endpoint.definition : {unConnectable: false}; + const ep = endpoint ? endpoint.definition : { unConnectable: false }; return !ep.unConnectable && row.connectionStatus === 'disconnected'; })) }, diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts index 8483e01383..e7516adeed 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/endpoints-list-config.service.ts @@ -4,7 +4,7 @@ import { filter } from 'rxjs/operators'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityMonitorFactory } from '../../../../../../../store/src/monitors/entity-monitor.factory.service'; import { InternalEventMonitorFactory } from '../../../../../../../store/src/monitors/internal-event-monitor.factory'; import { PaginationMonitorFactory } from '../../../../../../../store/src/monitors/pagination-monitor.factory'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts index e402966099..33ce1723a0 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-details/table-cell-endpoint-details.component.ts @@ -9,8 +9,8 @@ import { ViewContainerRef, } from '@angular/core'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { TableCellCustom } from '../../../list.types'; import { EndpointListDetailsComponent, EndpointListHelper } from '../endpoint-list.helpers'; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts index fb694f04f3..62928cef55 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-name/table-cell-endpoint-name.component.ts @@ -3,11 +3,11 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/internal/operators/map'; import { GetAllEndpoints } from '../../../../../../../../store/src/actions/endpoint.actions'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; +import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { EndpointsService } from '../../../../../../core/endpoints.service'; -import { EntityServiceFactory } from '../../../../../../../../store/src/entity-service-factory.service'; import { TableCellCustom } from '../../../list.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; export interface RowWithEndpointId { endpointId: string; diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts index 148bb9a7de..7d1d870f70 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/endpoint/table-cell-endpoint-status/table-cell-endpoint-status.component.ts @@ -1,8 +1,8 @@ import { Component, Input, OnInit } from '@angular/core'; +import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog'; import { EndpointModel } from '../../../../../../../../store/src/types/endpoint.types'; import { TableCellCustom } from '../../../list.types'; -import { entityCatalog } from '../../../../../../../../store/src/entity-catalog/entity-catalog.service'; @Component({ selector: 'app-table-cell-endpoint-status', diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts index c93962a412..a376791728 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-data-source.ts @@ -2,12 +2,11 @@ import { Store } from '@ngrx/store'; import { of as observableOf } from 'rxjs'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; +import { cfEntityCatalog } from '../../../../../../../cloud-foundry/src/cf-entity-catalog'; import { CFEntitySchema } from '../../../../../../../cloud-foundry/src/cf-entity-schema-types'; import { gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cloud-foundry/src/cf-types'; import { GitMeta } from '../../../../../../../cloud-foundry/src/entity-action-builders/git-action-builder'; import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; import { GitSCM } from '../../../../data-services/scm/scm'; import { ListDataSource } from '../../data-sources-controllers/list-data-source'; import { IListConfig } from '../../list.component.types'; @@ -30,15 +29,12 @@ export class GithubCommitsDataSource extends ListDataSource { sha: string, commitSha?: string, ) { - const gitCommitEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitCommitEntityType); - const fetchCommitActionBuilder = gitCommitEntity.actionOrchestrator.getActionBuilder('getMultiple'); const gitMeta: GitMeta = { scm, projectName, commitSha: sha }; - const fetchCommitAction = fetchCommitActionBuilder(sha, null, gitMeta); - const action = fetchCommitAction; + const action = cfEntityCatalog.gitCommit.actions.getMultiple(sha, null, gitMeta); const paginationKey = action.paginationKey; const rowsState = observableOf(commitSha ? { [commitSha]: { diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts index 9d8fbab53c..28816401e5 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/github-commits/github-commits-list-config-app-tab.service.ts @@ -13,14 +13,12 @@ import { StoreCFSettings, } from '../../../../../../../cloud-foundry/src/actions/deploy-applications.actions'; import { CFAppState } from '../../../../../../../cloud-foundry/src/cf-app-state'; -import { gitBranchesEntityType, gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../../../../cloud-foundry/src/cf-types'; +import { cfEntityCatalog } from '../../../../../../../cloud-foundry/src/cf-entity-catalog'; +import { gitCommitEntityType } from '../../../../../../../cloud-foundry/src/cf-entity-types'; import { ApplicationService } from '../../../../../../../cloud-foundry/src/features/applications/application.service'; import { selectCfEntity } from '../../../../../../../cloud-foundry/src/store/selectors/api.selectors'; -import { GitBranch, GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; +import { GitCommit } from '../../../../../../../cloud-foundry/src/store/types/git.types'; import { RouterNav } from '../../../../../../../store/src/actions/router.actions'; -import { entityCatalog } from '../../../../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityServiceFactory } from '../../../../../../../store/src/entity-service-factory.service'; import { GitSCM } from '../../../../data-services/scm/scm'; import { GitSCMService, GitSCMType } from '../../../../data-services/scm/scm.service'; import { IListAction } from '../../list.component.types'; @@ -103,7 +101,6 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi datePipe: DatePipe, private scmService: GitSCMService, private applicationService: ApplicationService, - private entityServiceFactory: EntityServiceFactory ) { super(store, datePipe); this.setGuids(); @@ -131,25 +128,19 @@ export class GithubCommitsListConfigServiceAppTab extends GithubCommitsListConfi const scmType = stratosProject.deploySource.scm || stratosProject.deploySource.type; this.scm = this.scmService.getSCM(scmType as GitSCMType); - const branchKey = `${scmType}-${this.projectName}-${stratosProject.deploySource.branch}`; - const gitBranchesEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, gitBranchesEntityType); - const fetchBranchesActionBuilder = gitBranchesEntity.actionOrchestrator.getActionBuilder('get'); - const fetchBranchesAction = fetchBranchesActionBuilder(this.projectName, this.cfGuid, { + cfEntityCatalog.gitBranch.store.getEntityService(undefined, undefined, { scm: this.scm, - projectName: this.projectName - }); - const gitBranchEntityService = this.entityServiceFactory.create( - branchKey, - fetchBranchesAction - ); - gitBranchEntityService.waitForEntity$.pipe( - first(), - ).subscribe(branch => { - this.branchName = branch.entity.name; - this.dataSource = new GithubCommitsDataSource( - this.store, this, this.scm, this.projectName, this.branchName, this.deployedCommitSha); - this.initialised.next(true); - }); + projectName: this.projectName, + branchName: stratosProject.deploySource.branch + }) + .waitForEntity$.pipe( + first(), + ).subscribe(branch => { + this.branchName = branch.entity.name; + this.dataSource = new GithubCommitsDataSource( + this.store, this, this.scm, this.projectName, this.branchName, this.deployedCommitSha); + this.initialised.next(true); + }); this.setDeployedCommitDetails(); }); diff --git a/src/frontend/packages/core/src/shared/components/list/list.component.ts b/src/frontend/packages/core/src/shared/components/list/list.component.ts index 557bf779ab..5c14153089 100644 --- a/src/frontend/packages/core/src/shared/components/list/list.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list.component.ts @@ -51,7 +51,7 @@ import { } from '../../../../../store/src/actions/list.actions'; import { SetClientFilterKey, SetPage } from '../../../../../store/src/actions/pagination.actions'; import { GeneralAppState } from '../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../../../store/src/entity-catalog/entity-catalog.types'; import { ActionState } from '../../../../../store/src/reducers/api-request-reducer/types'; import { getListStateObservables } from '../../../../../store/src/reducers/list.reducer'; @@ -230,7 +230,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView private store: Store, private cd: ChangeDetectorRef, @Optional() public config: ListConfig, - private ngZone: NgZone + private ngZone: NgZone, ) { } ngOnInit() { @@ -690,8 +690,7 @@ export class ListComponent implements OnInit, OnChanges, OnDestroy, AfterView return observableOf(getDefaultRowState()); } const catalogEntity = entityCatalog.getEntity(entityConfig); - const entityMonitor = catalogEntity.getEntityMonitor( - this.store, + const entityMonitor = catalogEntity.store.getEntityMonitor( dataSource.getRowUniqueId(row), { schemaKey: entityConfig.schemaKey diff --git a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts index 1e82d3bd24..36294cb32f 100644 --- a/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/max-list-message/max-list-message.component.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { AppState } from '../../../../../../store/src/app-state'; -import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { PaginationPageIteratorConfig, diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts index ad051defa2..0b75bc20e1 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/entity-catalog-datasource.ts @@ -1,10 +1,13 @@ -import { ListDataSource } from '../data-sources-controllers/list-data-source'; import { Store } from '@ngrx/store'; -import { StratosBaseCatalogEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; -import { ListConfig, ListViewTypes } from '../list.component.types'; -import { createTableColumnFavorite } from '../list-table/table-cell-favorite/table-cell-favorite.component'; + +import { + StratosBaseCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityPipelineEntity } from '../../../../../../store/src/entity-request-pipeline/pipeline.types'; import { UserFavorite } from '../../../../../../store/src/types/user-favorites.types'; -import { EntityPipelineEntity, } from '../../../../../../store/src/entity-request-pipeline/pipeline.types'; +import { ListDataSource } from '../data-sources-controllers/list-data-source'; +import { createTableColumnFavorite } from '../list-table/table-cell-favorite/table-cell-favorite.component'; +import { ListConfig, ListViewTypes } from '../list.component.types'; export interface GetMultipleActionConfig { endpointGuid?: string; diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts index 94b7067d6c..a3edaef193 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.spec.ts @@ -1,15 +1,18 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { RouterTestingModule } from '@angular/router/testing'; -import { SimpleListComponent } from './simple-list.component'; -import { SharedModule } from '../../../shared.module'; -import { CoreModule } from '../../../../core/core.module'; -import { AppReducersModule } from '../../../../../../store/src/reducers.module'; -import { StratosCatalogEntity, StratosCatalogEndpointEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; +import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from '../../../../../../store/src/entity-catalog-test.module'; +import { + StratosCatalogEndpointEntity, + StratosCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { StratosEndpointExtensionDefinition } from '../../../../../../store/src/entity-catalog/entity-catalog.types'; import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; -import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from '../../../../../../store/src/entity-catalog-test.module'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterTestingModule } from '@angular/router/testing'; +import { AppReducersModule } from '../../../../../../store/src/reducers.module'; +import { CoreModule } from '../../../../core/core.module'; +import { SharedModule } from '../../../shared.module'; +import { SimpleListComponent } from './simple-list.component'; describe('SimpleListComponent', () => { let component: SimpleListComponent; diff --git a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts index 64568a8aea..b5377d1ee4 100644 --- a/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/simple-list/simple-list.component.ts @@ -1,11 +1,14 @@ -import { Component, OnInit, Input, ChangeDetectorRef, NgZone, ComponentFactoryResolver, ViewChild, Injector } from '@angular/core'; -import { StratosCatalogEntity } from '../../../../../../store/src/entity-catalog/entity-catalog-entity'; +import { Component, ComponentFactoryResolver, Injector, Input, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; + +import { + StratosCatalogEntity, +} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ListComponent } from '../list.component'; -import { ListConfig, ListViewTypes } from '../list.component.types'; -import { ListHostDirective } from './list-host.directive'; +import { ListConfig } from '../list.component.types'; import { CatalogEntityDrivenListDataSource } from './entity-catalog-datasource'; -import { Store } from '@ngrx/store'; -import { ActivatedRoute } from '@angular/router'; +import { ListHostDirective } from './list-host.directive'; @Component({ selector: 'app-simple-list', diff --git a/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts b/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts index 5de5a777ca..f58b374197 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/github-scm.ts @@ -32,6 +32,10 @@ export class GitHubSCM implements GitSCM { return httpClient.get(`${this.gitHubURL}/repos/${projectName}`) as Observable; } + getBranch(httpClient: HttpClient, projectName: string, branchName: string): Observable { + return httpClient.get(`${this.gitHubURL}/repos/${projectName}/branches/${branchName}`) as Observable; + } + getBranches(httpClient: HttpClient, projectName: string): Observable { return httpClient.get(`${this.gitHubURL}/repos/${projectName}/branches`) as Observable; } @@ -44,8 +48,8 @@ export class GitHubSCM implements GitSCM { return `${this.gitHubURL}/repos/${projectName}/commits/${commitSha}`; } - getCommits(httpClient: HttpClient, projectName: string, commitSha: string): Observable { - return httpClient.get(`${this.gitHubURL}/repos/${projectName}/commits?sha=${commitSha}`) as Observable; + getCommits(httpClient: HttpClient, projectName: string, ref: string): Observable { + return httpClient.get(`${this.gitHubURL}/repos/${projectName}/commits?sha=${ref}`) as Observable; } getCloneURL(projectName: string): string { diff --git a/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts b/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts index 2b6daa1931..90c079e14b 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/gitlab-scm.ts @@ -46,6 +46,17 @@ export class GitLabSCM implements GitSCM { ); } + getBranch(httpClient: HttpClient, projectName: string, branchName: string): Observable { + const prjNameEncoded = encodeURIComponent(projectName); + return httpClient.get(`${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/branches/${branchName}`).pipe( + map((data: any) => { + const nb = { ...data }; + nb.commit.sha = nb.commit.id; + return nb; + }) + ); + } + getBranches(httpClient: HttpClient, projectName: string): Observable { const prjNameEncoded = encodeURIComponent(projectName); return httpClient.get(`${gitLabAPIUrl}/projects/${prjNameEncoded}/repository/branches`).pipe( diff --git a/src/frontend/packages/core/src/shared/data-services/scm/scm.ts b/src/frontend/packages/core/src/shared/data-services/scm/scm.ts index eb25e03cb9..d20a2c9538 100644 --- a/src/frontend/packages/core/src/shared/data-services/scm/scm.ts +++ b/src/frontend/packages/core/src/shared/data-services/scm/scm.ts @@ -15,6 +15,7 @@ export interface GitSCM { getLabel(): string; getIcon(): SCMIcon; getRepository(httpClient: HttpClient, projectName: string): Observable; + getBranch(httpClient: HttpClient, projectName: string, branchId: string): Observable; getBranches(httpClient: HttpClient, projectName: string): Observable; getCommit(httpClient: HttpClient, projectName: string, commitSha: string): Observable; getCommits(httpClient: HttpClient, projectName: string, commitSha: string): Observable; diff --git a/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts b/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts index 933441c5d6..e9690804fa 100644 --- a/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts +++ b/src/frontend/packages/core/src/shared/services/cf-org-space-label.service.ts @@ -12,7 +12,7 @@ import { APIResource } from '../../../../store/src/types/api.types'; import { EndpointModel } from '../../../../store/src/types/endpoint.types'; import { STRATOS_ENDPOINT_TYPE } from '../../base-entity-schemas'; import { IOrganization, ISpace } from '../../core/cf-api.types'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog'; export class CfOrgSpaceLabelService { diff --git a/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts b/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts index 6fa1765b3b..7fcb69adba 100644 --- a/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts +++ b/src/frontend/packages/core/src/shared/services/cloud-foundry-user-provided-services.service.ts @@ -4,59 +4,26 @@ import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, pairwise, tap } from 'rxjs/operators'; import { - CreateUserProvidedServiceInstance, getUserProvidedServiceInstanceRelations, IUserProvidedServiceInstanceData, - UpdateUserProvidedServiceInstance, } from '../../../../cloud-foundry/src/actions/user-provided-service.actions'; import { CFAppState } from '../../../../cloud-foundry/src/cf-app-state'; -import { - organizationEntityType, - serviceInstancesEntityType, - spaceEntityType, - userProvidedServiceInstanceEntityType, -} from '../../../../cloud-foundry/src/cf-entity-types'; -import { CF_ENDPOINT_TYPE } from '../../../../cloud-foundry/src/cf-types'; -import { - UserProvidedServiceActionBuilder, -} from '../../../../cloud-foundry/src/entity-action-builders/user-provided-service.action-builders'; +import { cfEntityCatalog } from '../../../../cloud-foundry/src/cf-entity-catalog'; +import { organizationEntityType, spaceEntityType } from '../../../../cloud-foundry/src/cf-entity-types'; import { createEntityRelationPaginationKey } from '../../../../cloud-foundry/src/entity-relations/entity-relations.types'; import { fetchTotalResults } from '../../../../cloud-foundry/src/features/cloud-foundry/cf.helpers'; import { QParam, QParamJoiners } from '../../../../cloud-foundry/src/shared/q-param'; -import { selectCfRequestInfo } from '../../../../cloud-foundry/src/store/selectors/api.selectors'; import { ClearPaginationOfType } from '../../../../store/src/actions/pagination.actions'; -import { entityCatalog } from '../../../../store/src/entity-catalog/entity-catalog.service'; -import { EntityCatalogEntityConfig, IEntityMetadata } from '../../../../store/src/entity-catalog/entity-catalog.types'; -import { EntityServiceFactory } from '../../../../store/src/entity-service-factory.service'; import { PaginationMonitorFactory } from '../../../../store/src/monitors/pagination-monitor.factory'; import { RequestInfoState } from '../../../../store/src/reducers/api-request-reducer/types'; -import { getPaginationObservables } from '../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { APIResource } from '../../../../store/src/types/api.types'; -import { PaginatedAction } from '../../../../store/src/types/pagination.types'; import { IUserProvidedServiceInstance } from '../../core/cf-api-svc.types'; - @Injectable() export class CloudFoundryUserProvidedServicesService { - private serviceInstancesEntityConfig: EntityCatalogEntityConfig = { - endpointType: CF_ENDPOINT_TYPE, - entityType: serviceInstancesEntityType - }; - - private userProvidedServiceInstancesEntityConfig: EntityCatalogEntityConfig = { - endpointType: CF_ENDPOINT_TYPE, - entityType: userProvidedServiceInstanceEntityType - }; - - private userProvidedServiceEntity = entityCatalog.getEntity( - CF_ENDPOINT_TYPE, - userProvidedServiceInstanceEntityType - ); - constructor( private store: Store, - private entityServiceFactory: EntityServiceFactory, private paginationMonitorFactory: PaginationMonitorFactory, ) { @@ -64,17 +31,10 @@ export class CloudFoundryUserProvidedServicesService { public getUserProvidedServices(cfGuid: string, spaceGuid?: string, relations = getUserProvidedServiceInstanceRelations) : Observable[]> { - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getAllInSpace'); - const action = actionBuilder(cfGuid, spaceGuid, null, relations, true); - const pagObs = getPaginationObservables({ - store: this.store, - action, - paginationMonitor: this.paginationMonitorFactory.create( - action.paginationKey, - action, - action.flattenPagination - ) - }, action.flattenPagination); + + const pagObs = cfEntityCatalog.userProvidedService.store.getAllInSpace.getPaginationService( + cfGuid, spaceGuid, null, relations, true + ); return combineLatest([ pagObs.entities$, // Ensure entities is subbed to the fetch kicks off pagObs.fetchingEntities$ @@ -88,12 +48,12 @@ export class CloudFoundryUserProvidedServicesService { : Observable { const parentSchemaKey = spaceGuid ? spaceEntityType : orgGuid ? organizationEntityType : 'cf'; const uniqueKey = spaceGuid || orgGuid || cfGuid; - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('getMultiple'); - const action = actionBuilder( + + const action = cfEntityCatalog.userProvidedService.actions.getMultiple( createEntityRelationPaginationKey(parentSchemaKey, uniqueKey), cfGuid, { includeRelations: [], populateMissing: false } - ) as PaginatedAction; + ); action.initialParams.q = []; if (orgGuid) { action.initialParams.q.push(new QParam('organization_guid', orgGuid, QParamJoiners.in).toString()); @@ -105,13 +65,7 @@ export class CloudFoundryUserProvidedServicesService { } public getUserProvidedService(cfGuid: string, upsGuid: string): Observable> { - const actionBuilder = this.userProvidedServiceEntity.actionOrchestrator.getActionBuilder('get'); - const getUserProvidedServiceAction = actionBuilder(upsGuid, cfGuid); - const service = this.entityServiceFactory.create>( - upsGuid, - getUserProvidedServiceAction - ); - return service.waitForEntity$.pipe( + return cfEntityCatalog.userProvidedService.store.getEntityService(upsGuid, cfGuid, {}).waitForEntity$.pipe( map(e => e.entity) ); } @@ -121,10 +75,12 @@ export class CloudFoundryUserProvidedServicesService { guid: string, data: IUserProvidedServiceInstanceData ): Observable { - const action = new CreateUserProvidedServiceInstance(cfGuid, guid, data, this.userProvidedServiceInstancesEntityConfig); - const create$ = this.store.select(selectCfRequestInfo(userProvidedServiceInstanceEntityType, guid)); - this.store.dispatch(action); - return create$.pipe( + return cfEntityCatalog.userProvidedService.api.create( + cfGuid, + guid, + data, + // this.userProvidedServiceInstancesEntityConfig + ).pipe( pairwise(), filter(([oldV, newV]) => oldV.creating && !newV.creating), map(([, newV]) => newV), @@ -133,7 +89,7 @@ export class CloudFoundryUserProvidedServicesService { if (!v.error) { // Problem - Lists with multiple actions aren't updated following the creation of an entity based on secondary action // Here the service instance list (1st action SI, 2nd action UPSI) isn't updated so manually do so - this.store.dispatch(new ClearPaginationOfType(this.serviceInstancesEntityConfig)); + this.store.dispatch(new ClearPaginationOfType(cfEntityCatalog.service)); } }) ); @@ -144,23 +100,25 @@ export class CloudFoundryUserProvidedServicesService { guid: string, data: Partial, ): Observable { - this.userProvidedServiceEntity.actionDispatchManager.dispatchUpdate( + // TODO: RC Q + const updatingKey = cfEntityCatalog.userProvidedService.actions.update(guid, cfGuid, data).updatingKey; + // const updatingKey = UpdateUserProvidedServiceInstance.updateServiceInstance; + return cfEntityCatalog.userProvidedService.api.update( guid, cfGuid, data, - this.userProvidedServiceInstancesEntityConfig - ); - return this.userProvidedServiceEntity.getEntityMonitor( - this.store, - guid - ).entityRequest$.pipe( - filter(v => !!v.updating[UpdateUserProvidedServiceInstance.updateServiceInstance]), + // this.userProvidedServiceInstancesEntityConfig + ).pipe( + filter(v => !!v.updating[updatingKey]), pairwise(), filter(([oldV, newV]) => - oldV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy && - !newV.updating[UpdateUserProvidedServiceInstance.updateServiceInstance].busy), + oldV.updating[updatingKey].busy && + !newV.updating[updatingKey].busy), map(([, newV]) => newV) ); } } + + + diff --git a/src/frontend/packages/core/src/shared/shared.module.ts b/src/frontend/packages/core/src/shared/shared.module.ts index c380a0c102..b890491046 100644 --- a/src/frontend/packages/core/src/shared/shared.module.ts +++ b/src/frontend/packages/core/src/shared/shared.module.ts @@ -125,7 +125,6 @@ import { PercentagePipe } from './pipes/percentage.pipe'; import { UptimePipe } from './pipes/uptime.pipe'; import { UsageBytesPipe } from './pipes/usage-bytes.pipe'; import { ValuesPipe } from './pipes/values.pipe'; -import { CloudFoundryUserProvidedServicesService } from './services/cloud-foundry-user-provided-services.service'; import { LongRunningOperationsService } from './services/long-running-op.service'; import { MetricsRangeSelectorService } from './services/metrics-range-selector.service'; import { UserPermissionDirective } from './user-permission.directive'; @@ -347,17 +346,13 @@ import { UserPermissionDirective } from './user-permission.directive'; ApplicationStateService, EndpointListHelper, EndpointsListConfigService, - // CfUserService, ConfirmationDialogService, EntityMonitorFactory, PaginationMonitorFactory, - // CloudFoundryService, InternalEventMonitorFactory, - // ServiceActionHelperService, MetricsRangeSelectorService, GitSCMService, - LongRunningOperationsService, - CloudFoundryUserProvidedServicesService + LongRunningOperationsService ] }) export class SharedModule { } diff --git a/src/frontend/packages/core/test-framework/application-service-helper.ts b/src/frontend/packages/core/test-framework/application-service-helper.ts index e4fcb83dab..a9caaa3ae8 100644 --- a/src/frontend/packages/core/test-framework/application-service-helper.ts +++ b/src/frontend/packages/core/test-framework/application-service-helper.ts @@ -11,12 +11,10 @@ import { AppStat } from '../../cloud-foundry/src/store/types/app-metadata.types' import { RequestInfoState } from '../../store/src/reducers/api-request-reducer/types'; import { APIResource, EntityInfo } from '../../store/src/types/api.types'; import { IApp, IAppSummary, IDomain, ISpace } from '../src/core/cf-api.types'; -import { EntityServiceFactory } from '../../store/src/entity-service-factory.service'; import { ApplicationStateData, ApplicationStateService, } from '../src/shared/components/application-state/application-state.service'; -import { PaginationMonitorFactory } from '../../store/src/monitors/pagination-monitor.factory'; function createEntity(entity: T): APIResource { return { @@ -91,28 +89,22 @@ export function generateTestApplicationServiceProvider(appGuid: string, cfGuid: provide: ApplicationService, useFactory: ( store: Store, - entityServiceFactory: EntityServiceFactory, applicationStateService: ApplicationStateService, applicationEnvVarsService: ApplicationEnvVarsHelper, - paginationMonitorFactory: PaginationMonitorFactory, ) => { const appService = new ApplicationService( cfGuid, appGuid, store, - entityServiceFactory, applicationStateService, applicationEnvVarsService, - paginationMonitorFactory ); return appService; }, deps: [ Store, - EntityServiceFactory, ApplicationStateService, ApplicationEnvVarsHelper, - PaginationMonitorFactory ] }; } diff --git a/src/frontend/packages/core/test-framework/core-test.modules.ts b/src/frontend/packages/core/test-framework/core-test.modules.ts index dd28d46d6b..f2e0bc6e7a 100644 --- a/src/frontend/packages/core/test-framework/core-test.modules.ts +++ b/src/frontend/packages/core/test-framework/core-test.modules.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { generateStratosEntities } from '../../core/src/base-entity-types'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../store/src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../store/src/entity-catalog/entity-catalog'; @NgModule({ imports: [ diff --git a/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts b/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts index b59fcf4258..010004b460 100644 --- a/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts +++ b/src/frontend/packages/core/test-framework/entity-catalog-test-helpers.ts @@ -1,5 +1,5 @@ -import { StratosBaseCatalogEntity } from '../..store/src/entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../store/src/entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogEntityConfig } from '../../store/src/entity-catalog/entity-catalog.types'; export interface EntityCatalogHelperConfig { diff --git a/src/frontend/packages/store/src/effects/app.effects.ts b/src/frontend/packages/store/src/effects/app.effects.ts index e1f43f644b..d4ddf1346d 100644 --- a/src/frontend/packages/store/src/effects/app.effects.ts +++ b/src/frontend/packages/store/src/effects/app.effects.ts @@ -3,14 +3,12 @@ import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { first, map } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; import { ASSIGN_ROUTE_SUCCESS } from '../../../cloud-foundry/src/actions/application-service-routes.actions'; import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../../cloud-foundry/src/actions/application.actions'; -import { appSummaryEntityType } from '../../../cloud-foundry/src/cf-entity-types'; +import { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { createAppInstancesMetricAction, } from '../../../cloud-foundry/src/shared/components/list/list-types/app-instance/cf-app-instances-config.service'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { endpointHasMetrics } from '../../../core/src/features/endpoints/endpoint-helpers'; import { EndpointOnlyAppState } from '../app-state'; import { APISuccessOrFailedAction } from '../types/request.types'; @@ -27,10 +25,7 @@ export class AppEffects { @Effect({ dispatch: false }) updateSummary$ = this.actions$.pipe( ofType(ASSIGN_ROUTE_SUCCESS), map(action => { - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const actionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = actionBuilder(action.apiAction.guid, action.apiAction.endpointGuid); - this.store.dispatch(getAppSummaryAction); + cfEntityCatalog.appSummary.api.get(action.apiAction.guid, action.apiAction.endpointGuid) }), ); diff --git a/src/frontend/packages/store/src/effects/endpoint.effects.ts b/src/frontend/packages/store/src/effects/endpoint.effects.ts index 32f5cf3e7e..3ebaf0694a 100644 --- a/src/frontend/packages/store/src/effects/endpoint.effects.ts +++ b/src/frontend/packages/store/src/effects/endpoint.effects.ts @@ -1,4 +1,3 @@ -import { UpdateEndpoint, UPDATE_ENDPOINT, UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED } from './../actions/endpoint.actions'; import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; @@ -35,7 +34,7 @@ import { ClearPaginationOfEntity } from '../actions/pagination.actions'; import { GET_SYSTEM_INFO_SUCCESS, GetSystemInfo, GetSystemSuccess } from '../actions/system.actions'; import { GetUserFavoritesAction } from '../actions/user-favourites-actions/get-user-favorites-action'; import { DispatchOnlyAppState } from '../app-state'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { endpointSchemaKey } from '../helpers/entity-factory'; import { ApiRequestTypes } from '../reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from '../types/api.types'; @@ -46,6 +45,12 @@ import { WrapperRequestActionFailed, WrapperRequestActionSuccess, } from '../types/request.types'; +import { + UPDATE_ENDPOINT, + UPDATE_ENDPOINT_FAILED, + UPDATE_ENDPOINT_SUCCESS, + UpdateEndpoint, +} from './../actions/endpoint.actions'; import { PaginatedAction } from './../types/pagination.types'; @@ -236,36 +241,36 @@ export class EndpointsEffect { ); })); - @Effect() updateEndpoint$ = this.actions$.pipe( - ofType(UPDATE_ENDPOINT), - mergeMap(action => { - const apiAction = this.getEndpointUpdateAction(action.id, action.type, EndpointsEffect.updatingKey); - const paramsObj = { - name: action.name, - skipSSL: action.skipSSL, - setClientInfo: action.setClientInfo, - clientID: action.clientID, - clientSecret: action.clientSecret, - allowSSO: action.allowSSO, - }; + @Effect() updateEndpoint$ = this.actions$.pipe( + ofType(UPDATE_ENDPOINT), + mergeMap(action => { + const apiAction = this.getEndpointUpdateAction(action.id, action.type, EndpointsEffect.updatingKey); + const paramsObj = { + name: action.name, + skipSSL: action.skipSSL, + setClientInfo: action.setClientInfo, + clientID: action.clientID, + clientSecret: action.clientSecret, + allowSSO: action.allowSSO, + }; - // Encode auth values in the body, not the query string - const body: any = new FormData(); - Object.keys(paramsObj).forEach(key => { - body.set(key, paramsObj[key]); - }); + // Encode auth values in the body, not the query string + const body: any = new FormData(); + Object.keys(paramsObj).forEach(key => { + body.set(key, paramsObj[key]); + }); - return this.doEndpointAction( - apiAction, - '/pp/v1/endpoint/' + action.id, - new HttpParams({}), - 'update', - [UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED], - action.endpointType, - body, - this.processUpdateError - ); - })); + return this.doEndpointAction( + apiAction, + '/pp/v1/endpoint/' + action.id, + new HttpParams({}), + 'update', + [UPDATE_ENDPOINT_SUCCESS, UPDATE_ENDPOINT_FAILED], + action.endpointType, + body, + this.processUpdateError + ); + })); private processUpdateError(e: HttpErrorResponse): string { const err = e.error ? e.error.error : {}; diff --git a/src/frontend/packages/store/src/effects/metrics.effects.ts b/src/frontend/packages/store/src/effects/metrics.effects.ts index f4bc789531..b075191891 100644 --- a/src/frontend/packages/store/src/effects/metrics.effects.ts +++ b/src/frontend/packages/store/src/effects/metrics.effects.ts @@ -4,7 +4,6 @@ import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { catchError, map, mergeMap } from 'rxjs/operators'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { METRIC_API_FAILED, METRIC_API_START, @@ -13,6 +12,7 @@ import { } from '../actions/metrics-api.actions'; import { getFullMetricQueryQuery, METRICS_START, MetricsAction } from '../actions/metrics.actions'; import { DispatchOnlyAppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { IMetricsResponse } from '../types/base-metric.types'; import { StartRequestAction, WrapperRequestActionFailed, WrapperRequestActionSuccess } from './../types/request.types'; @@ -60,11 +60,11 @@ export class MetricsEffect { errObservable.message, action, 'fetch', { - endpointIds: [action.endpointGuid], - url: errObservable.url || fullUrl, - eventCode: errObservable.status ? errObservable.status + '' : '500', - message: 'Metric request error', - } + endpointIds: [action.endpointGuid], + url: errObservable.url || fullUrl, + eventCode: errObservable.status ? errObservable.status + '' : '500', + message: 'Metric request error', + } ) ]; })); diff --git a/src/frontend/packages/store/src/effects/update-app-effects.ts b/src/frontend/packages/store/src/effects/update-app-effects.ts index a0558f9851..c4cab46c0f 100644 --- a/src/frontend/packages/store/src/effects/update-app-effects.ts +++ b/src/frontend/packages/store/src/effects/update-app-effects.ts @@ -2,11 +2,9 @@ import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { mergeMap } from 'rxjs/operators'; -import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; import { AppMetadataTypes } from '../../../cloud-foundry/src/actions/app-metadata.actions'; import { UPDATE_SUCCESS, UpdateExistingApplication } from '../../../cloud-foundry/src/actions/application.actions'; -import { appEnvVarsEntityType, appStatsEntityType, appSummaryEntityType } from '../../../cloud-foundry/src/cf-entity-types'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { cfEntityCatalog } from '../../../cloud-foundry/src/cf-entity-catalog'; import { WrapperRequestActionSuccess } from '../types/request.types'; @@ -29,15 +27,10 @@ export class UpdateAppEffects { switch (updateEntity) { case AppMetadataTypes.ENV_VARS: // This is done so the app metadata env vars environment_json matches that of the app - const appEnvVarsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appEnvVarsEntityType); - const actionBuilder = appEnvVarsEntity.actionOrchestrator.getActionBuilder('get'); - const getAppEnvVarsAction = actionBuilder(action.apiAction.guid, action.apiAction.endpointGuid as string); - actions.push(getAppEnvVarsAction); + actions.push(cfEntityCatalog.appEnvVar.actions.getMultiple(action.apiAction.guid, action.apiAction.endpointGuid)); break; case AppMetadataTypes.STATS: - const appStatsEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appStatsEntityType); - const appStatsActionBuilder = appStatsEntity.actionOrchestrator.getActionBuilder('get'); - const statsAction = appStatsActionBuilder(action.apiAction.guid, action.apiAction.endpointGuid as string); + const statsAction = cfEntityCatalog.appStats.actions.getMultiple(action.apiAction.guid, action.apiAction.endpointGuid as string) // Application has changed and the associated app stats need to also be updated. // Apps that are started can just make the stats call to update cached stats, however this call will fail for stopped apps. // For those cases create a fake stats request response that should result in the same thing @@ -48,10 +41,7 @@ export class UpdateAppEffects { } break; case AppMetadataTypes.SUMMARY: - const appSummaryEntity = entityCatalog.getEntity(CF_ENDPOINT_TYPE, appSummaryEntityType); - const appSummaryActionBuilder = appSummaryEntity.actionOrchestrator.getActionBuilder('get'); - const getAppSummaryAction = appSummaryActionBuilder(action.apiAction.guid, action.apiAction.endpointGuid as string); - actions.push(getAppSummaryAction); + actions.push(cfEntityCatalog.appSummary.actions.get(action.apiAction.guid, action.apiAction.endpointGuid)); break; } }); diff --git a/src/frontend/packages/store/src/effects/user-favorites-effect.ts b/src/frontend/packages/store/src/effects/user-favorites-effect.ts index 9c9e677bee..deebce83a7 100644 --- a/src/frontend/packages/store/src/effects/user-favorites-effect.ts +++ b/src/frontend/packages/store/src/effects/user-favorites-effect.ts @@ -5,7 +5,7 @@ import { Store } from '@ngrx/store'; import { catchError, first, map, mergeMap, switchMap } from 'rxjs/operators'; import { userFavoritesEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { UserFavoriteManager } from '../../../core/src/core/user-favorite-manager'; import { environment } from '../../../core/src/environments/environment.prod'; import { ClearPaginationOfEntity } from '../actions/pagination.actions'; diff --git a/src/frontend/packages/store/src/effects/user-profile.effects.ts b/src/frontend/packages/store/src/effects/user-profile.effects.ts index c58d969600..175ac3a4ef 100644 --- a/src/frontend/packages/store/src/effects/user-profile.effects.ts +++ b/src/frontend/packages/store/src/effects/user-profile.effects.ts @@ -5,7 +5,6 @@ import { Store } from '@ngrx/store'; import { catchError, mergeMap, switchMap } from 'rxjs/operators'; import { userProfileEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { environment } from '../../../core/src/environments/environment'; import { FetchUserProfileAction, @@ -15,6 +14,7 @@ import { UpdateUserPasswordAction, UpdateUserProfileAction, } from '../actions/user-profile.actions'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { rootUpdatingKey } from '../reducers/api-request-reducer/types'; import { UserProfileInfo } from '../types/user-profile.types'; import { DispatchOnlyAppState } from './../app-state'; diff --git a/src/frontend/packages/store/src/effects/users-roles.effects.ts b/src/frontend/packages/store/src/effects/users-roles.effects.ts index 4785818511..640bebb891 100644 --- a/src/frontend/packages/store/src/effects/users-roles.effects.ts +++ b/src/frontend/packages/store/src/effects/users-roles.effects.ts @@ -20,7 +20,7 @@ import { CfUserService } from '../../../cloud-foundry/src/shared/data-services/c import { OrgUserRoleNames } from '../../../cloud-foundry/src/store/types/user.types'; import { CfRoleChange, UsersRolesState } from '../../../cloud-foundry/src/store/types/users-roles.types'; import { ResetPagination } from '../actions/pagination.actions'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { ActionState } from '../reducers/api-request-reducer/types'; import { selectSessionData } from '../reducers/auth.reducer'; import { selectUsersRoles } from '../selectors/users-roles.selector'; @@ -35,7 +35,7 @@ export class UsersRolesEffects { constructor( private actions$: Actions, private store: Store, - private cfUserService: CfUserService + private cfUserService: CfUserService, ) { } @Effect() clearEntityUpdates$ = this.actions$.pipe( @@ -230,10 +230,9 @@ export class UsersRolesEffects { private createActionObs(action: ChangeUserRole): Observable { return entityCatalog.getEntity(action) - .getEntityMonitor( - this.store, - action.guid - ).getUpdatingSection(action.updatingKey).pipe( + .store + .getEntityMonitor(action.guid) + .getUpdatingSection(action.updatingKey).pipe( pairwise(), filter(([oldUpdate, newUpdate]) => !!oldUpdate.busy && !newUpdate.busy), map(([, newUpdate]) => newUpdate), diff --git a/src/frontend/packages/store/src/entity-catalog-test.module.ts b/src/frontend/packages/store/src/entity-catalog-test.module.ts index db4da3027c..83df6de2b1 100644 --- a/src/frontend/packages/store/src/entity-catalog-test.module.ts +++ b/src/frontend/packages/store/src/entity-catalog-test.module.ts @@ -1,13 +1,11 @@ import { Inject, NgModule } from '@angular/core'; import { ReducerManager, Store } from '@ngrx/store'; -import { - requestDataReducerFactory, -} from './reducers/api-request-data-reducer/request-data-reducer.factory'; -import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; import { InitCatalogEntitiesAction } from './entity-catalog.actions'; -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; -import { entityCatalog, TestEntityCatalog } from './entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from './entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { requestDataReducerFactory } from './reducers/api-request-data-reducer/request-data-reducer.factory'; +import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; export const TEST_CATALOGUE_ENTITIES = '__TEST_CATALOGUE_ENTITIES__'; diff --git a/src/frontend/packages/store/src/entity-catalog.actions.ts b/src/frontend/packages/store/src/entity-catalog.actions.ts index 408b40a8f9..fdc7936cf0 100644 --- a/src/frontend/packages/store/src/entity-catalog.actions.ts +++ b/src/frontend/packages/store/src/entity-catalog.actions.ts @@ -1,6 +1,7 @@ -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; import { Action } from '@ngrx/store'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; + export class InitCatalogEntitiesAction implements Action { static ACTION_TYPE = '@stratos/add-catalog-entities'; public type = InitCatalogEntitiesAction.ACTION_TYPE; diff --git a/src/frontend/packages/store/src/entity-catalog.module.ts b/src/frontend/packages/store/src/entity-catalog.module.ts index ce1830c9af..25982e2653 100644 --- a/src/frontend/packages/store/src/entity-catalog.module.ts +++ b/src/frontend/packages/store/src/entity-catalog.module.ts @@ -2,8 +2,8 @@ import { Inject, ModuleWithProviders, NgModule } from '@angular/core'; import { ReducerManager, Store } from '@ngrx/store'; import { InitCatalogEntitiesAction } from './entity-catalog.actions'; -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; -import { entityCatalog } from './entity-catalog/entity-catalog.service'; +import { entityCatalog } from './entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { requestDataReducerFactory } from './reducers/api-request-data-reducer/request-data-reducer.factory'; import { chainApiReducers, requestActions } from './reducers/api-request-reducers.generator.helpers'; diff --git a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts index ed0cb38c8c..38572f044d 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts +++ b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.spec.ts @@ -1,124 +1,125 @@ -import { Action } from '@ngrx/store'; +// import { Action } from '@ngrx/store'; -import { EntityRequestAction } from '../../types/request.types'; -import { ActionOrchestrator, OrchestratedActionBuilders } from '../action-orchestrator/action-orchestrator'; -import { getPaginationAction, getRequestAction } from '../action-orchestrator/action-orchestrator.spec.helpers'; -import { EntityActionDispatcherManager } from './action-dispatcher'; +// import { EntityRequestAction } from '../../types/request.types'; +// import { ActionOrchestrator, OrchestratedActionBuilders } from '../action-orchestrator/action-orchestrator'; +// import { getPaginationAction, getRequestAction } from '../action-orchestrator/action-orchestrator.spec.helpers'; +// import { EntityActionDispatcherManager } from './action-dispatcher'; -function actionDispatcher(action: Action) { - // noop -} +// function actionDispatcher(action: Action) { +// // noop +// } -describe('ActionDispatcher', () => { - it('should not dispatch unknown action', () => { - const actionOrchestrator = new ActionOrchestrator('Empty'); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.getActionDispatcher('get').dispatch('1', '2')).toBe(false); - }); - it('should dispatch custom action', () => { - interface CustomOrchestratedActionBuilders extends OrchestratedActionBuilders { - custom: (guid: string) => EntityRequestAction; - } - const actionBuilders = { - custom: guid => getRequestAction(), - customAarb: guid => getRequestAction(), - get: guid => getRequestAction() - } as CustomOrchestratedActionBuilders; - const data = 'adsd'; - const data2 = 'adsd2'; - const spy = spyOn(actionBuilders, 'custom'); - const actionOrchestrator = new ActionOrchestrator('Custom', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - // By getting action dispatcher - const dipatcher = entityActionDispatcher.getActionDispatcher('custom'); - const dipatcher2 = entityActionDispatcher.getActionDispatcher('customAarb'); - expect(entityActionDispatcher.getActionDispatcher('custom').dispatch(data)).toBe(true); - expect(spy).toHaveBeenCalledWith(data); - expect(entityActionDispatcher.getActionDispatcher('customAarb').dispatch(data)).toBe(true); - // By dispatching action directly - expect(entityActionDispatcher.dispatchAction('custom', data2)).toBe(true); - expect(spy).toHaveBeenCalledWith(data2); - }); +// TODO: RC Update tests +// describe('ActionDispatcher', () => { +// it('should not dispatch unknown action', () => { +// const actionOrchestrator = new ActionOrchestrator('Empty'); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.getActionDispatcher('get').dispatch('1', '2')).toBe(false); +// }); +// it('should dispatch custom action', () => { +// interface CustomOrchestratedActionBuilders extends OrchestratedActionBuilders { +// custom: (guid: string) => EntityRequestAction; +// } +// const actionBuilders = { +// custom: guid => getRequestAction(), +// customAarb: guid => getRequestAction(), +// get: guid => getRequestAction() +// } as CustomOrchestratedActionBuilders; +// const data = 'adsd'; +// const data2 = 'adsd2'; +// const spy = spyOn(actionBuilders, 'custom'); +// const actionOrchestrator = new ActionOrchestrator('Custom', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// // By getting action dispatcher +// const dipatcher = entityActionDispatcher.getActionDispatcher('custom'); +// const dipatcher2 = entityActionDispatcher.getActionDispatcher('customAarb'); +// expect(entityActionDispatcher.getActionDispatcher('custom').dispatch(data)).toBe(true); +// expect(spy).toHaveBeenCalledWith(data); +// expect(entityActionDispatcher.getActionDispatcher('customAarb').dispatch(data)).toBe(true); +// // By dispatching action directly +// expect(entityActionDispatcher.dispatchAction('custom', data2)).toBe(true); +// expect(spy).toHaveBeenCalledWith(data2); +// }); - it('should dispatch get action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const actionBuilders = { - get: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'get'); - const actionOrchestrator = new ActionOrchestrator('get', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchGet(guid, endpointGuid)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid); - }); +// it('should dispatch get action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const actionBuilders = { +// get: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'get'); +// const actionOrchestrator = new ActionOrchestrator('get', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchGet(guid, endpointGuid)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid); +// }); - it('should dispatch delete action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const actionBuilders = { - delete: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'delete'); - const actionOrchestrator = new ActionOrchestrator('delete', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchDelete(guid, endpointGuid)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid); - }); +// it('should dispatch delete action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const actionBuilders = { +// delete: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'delete'); +// const actionOrchestrator = new ActionOrchestrator('delete', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchDelete(guid, endpointGuid)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid); +// }); - it('should dispatch update action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const guid = 'guid'; - const endpointGuid = 'guid'; - const arbData = { arb: true }; - const actionBuilders = { - update: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'update'); - const actionOrchestrator = new ActionOrchestrator('update', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchUpdate(guid, endpointGuid, arbData)).toBe(true); - expect(spy).toHaveBeenCalledWith(guid, endpointGuid, arbData); - }); +// it('should dispatch update action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const guid = 'guid'; +// const endpointGuid = 'guid'; +// const arbData = { arb: true }; +// const actionBuilders = { +// update: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'update'); +// const actionOrchestrator = new ActionOrchestrator('update', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchUpdate(guid, endpointGuid, arbData)).toBe(true); +// expect(spy).toHaveBeenCalledWith(guid, endpointGuid, arbData); +// }); - it('should dispatch create action', () => { - function getActionBuilder() { - return getRequestAction(); - } - const endpointGuid = 'guid'; - const aString = 'stringy'; - const actionBuilders = { - create: getActionBuilder - } as OrchestratedActionBuilders; - const spy = spyOn(actionBuilders, 'create'); - const actionOrchestrator = new ActionOrchestrator('create', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchCreate(endpointGuid, aString)).toBe(true); - expect(spy).toHaveBeenCalledWith(endpointGuid, aString); - }); +// it('should dispatch create action', () => { +// function getActionBuilder() { +// return getRequestAction(); +// } +// const endpointGuid = 'guid'; +// const aString = 'stringy'; +// const actionBuilders = { +// create: getActionBuilder +// } as OrchestratedActionBuilders; +// const spy = spyOn(actionBuilders, 'create'); +// const actionOrchestrator = new ActionOrchestrator('create', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchCreate(endpointGuid, aString)).toBe(true); +// expect(spy).toHaveBeenCalledWith(endpointGuid, aString); +// }); - it('should dispatch getMultiple action', () => { - function getActionBuilder() { - return getPaginationAction(); - } +// it('should dispatch getMultiple action', () => { +// function getActionBuilder() { +// return getPaginationAction(); +// } - const actionBuilders = { - getMultiple: getActionBuilder - } as OrchestratedActionBuilders; - const endpointGuid = 'guid'; - const paginationKey = 'pagKey'; - const spy = spyOn(actionBuilders, 'getMultiple'); - const actionOrchestrator = new ActionOrchestrator('getMultiple', actionBuilders); - const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); - expect(entityActionDispatcher.dispatchGetMultiple(endpointGuid, paginationKey)).toBe(true); - expect(spy).toHaveBeenCalledWith(endpointGuid, paginationKey); - }); -}); +// const actionBuilders = { +// getMultiple: getActionBuilder +// } as OrchestratedActionBuilders; +// const endpointGuid = 'guid'; +// const paginationKey = 'pagKey'; +// const spy = spyOn(actionBuilders, 'getMultiple'); +// const actionOrchestrator = new ActionOrchestrator('getMultiple', actionBuilders); +// const entityActionDispatcher = new EntityActionDispatcherManager(actionDispatcher, actionOrchestrator); +// expect(entityActionDispatcher.dispatchGetMultiple(endpointGuid, paginationKey)).toBe(true); +// expect(spy).toHaveBeenCalledWith(endpointGuid, paginationKey); +// }); +// }); diff --git a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts b/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts deleted file mode 100644 index a4c6b9fba4..0000000000 --- a/src/frontend/packages/store/src/entity-catalog/action-dispatcher/action-dispatcher.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Action, Store } from '@ngrx/store'; - -import { AppState } from '../../app-state'; -import { - ActionOrchestrator, - OrchestratedActionBuilder, - OrchestratedActionBuilders, -} from '../action-orchestrator/action-orchestrator'; - -type ActionDispatcher = (action: Action) => void; -export class EntityActionDispatcher< - T extends OrchestratedActionBuilder = - OrchestratedActionBuilder, - > { - - private static STORE: Store; - static initialize(store: Store) { - EntityActionDispatcher.STORE = store; - } - - constructor( - private actionDispatcher?: ActionDispatcher, - private actionBuilder?: T | ((...args: Parameters) => ReturnType) - ) { } - public dispatch(...args: Parameters) { - if (this.actionBuilder) { - const action = this.actionBuilder(...args); - if (this.actionDispatcher) { - this.actionDispatcher(action); - } else if (EntityActionDispatcher.STORE && EntityActionDispatcher.STORE.dispatch) { - EntityActionDispatcher.STORE.dispatch(action); - } else { - console.error('Failed to find dispatcher: ', this.actionBuilder); - return false; - } - return true; - } - return false; - } -} -export class EntityActionDispatcherManager { - constructor(private actionDispatcher: (action: Action) => void, private actionOrchestrator: ActionOrchestrator) { } - - public getActionDispatcher(actionType: Y) { - const actionBuilder = this.getActionBuilder(actionType); - return new EntityActionDispatcher( - this.actionDispatcher, - actionBuilder - ); - } - - public getActionBuilder(actionType: Y) { - return this.actionOrchestrator.getActionBuilder(actionType); - } - - public dispatchGet(...args: Parameters) { - return this.getActionDispatcher('get').dispatch(...args); - } - - public dispatchDelete(...args: Parameters) { - return this.getActionDispatcher('delete').dispatch(...args); - } - - public dispatchUpdate(...args: Parameters) { - return this.getActionDispatcher('update').dispatch(...args); - } - - public dispatchCreate(...args: Parameters) { - return this.getActionDispatcher('create').dispatch(...args); - } - - public dispatchGetMultiple(...args: Parameters) { - return this.getActionDispatcher('getMultiple').dispatch(...args); - } - - public dispatchAction(actionType: K, ...args: Parameters) { - return this.getActionDispatcher(actionType).dispatch(...args); - } -} diff --git a/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts b/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts index 7bdb21e3b8..f6eb1bf5d3 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts +++ b/src/frontend/packages/store/src/entity-catalog/action-orchestrator/action-orchestrator.ts @@ -4,8 +4,6 @@ import { Action } from '@ngrx/store'; import { EntitySchema } from '../../helpers/entity-schema'; import { PaginatedAction } from '../../types/pagination.types'; import { EntityRequestAction, StartAction } from '../../types/request.types'; -import { Omit } from '../../../../core/src/core/utils.service'; -import { EntityActionDispatcherManager } from '../action-dispatcher/action-dispatcher'; export interface ActionBuilderAction extends EntityRequestAction { actionBuilderActionType: string; @@ -23,7 +21,7 @@ export type KnownEntityActionBuilder< > = (guid: string, endpointGuid: string, extraArgs?: T) => EntityRequestAction; // createTrackingId should be unique to the thing that's being created. // It is used to track the status of the entity creation. -type CreateActionBuilder< +export type CreateActionBuilder< T extends Record = Record > = (createTrackingId: string, endpointGuid: string, extraArgs?: T) => EntityRequestAction; // paginationKey could be optional, we could give it a default value. @@ -156,14 +154,22 @@ export class BasePaginationRequestAction extends BasePipelineRequestAction imple } } - -// A list of functions that can be used get interface with the entity -export interface OrchestratedActionBuilders { +/** + * Collection of common types of actions that should be associated with an entity. + * Generic code will make use of get and getMultiple + */ +export interface OrchestratedActionCoreBuilders { get?: KnownEntityActionBuilder; remove?: KnownEntityActionBuilder; update?: KnownEntityActionBuilder; create?: CreateActionBuilder; getMultiple?: GetMultipleActionBuilder; +} + +/** + * Generic interface for functions that create actions for an entity + */ +export interface OrchestratedActionBuilders extends OrchestratedActionCoreBuilders { [actionType: string]: OrchestratedActionBuilder; } @@ -178,14 +184,8 @@ export interface OrchestratedActionBuilderConfig { PaginationRequestActionConfig; } -export class OrchestratedActionBuildersClass implements OrchestratedActionBuilders { - [actionType: string]: OrchestratedActionBuilder; -} export class ActionOrchestrator { - public getEntityActionDispatcher(actionDispatcher?: (action: Action) => void) { - return new EntityActionDispatcherManager(actionDispatcher, this); - } public getActionBuilder(actionType: Y) { const actionBuilderForType = this.actionBuilders[actionType]; if (!actionBuilderForType) { diff --git a/src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts similarity index 94% rename from src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts index 0648298774..cb22364ae8 100644 --- a/src/frontend/packages/store/src/entity-catalog/action-builder-config.mapper.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/action-builder-config.mapper.ts @@ -1,4 +1,4 @@ -import { EntitySchema } from '../helpers/entity-schema'; +import { EntitySchema } from '../../helpers/entity-schema'; import { BaseEntityRequestAction, BaseEntityRequestConfig, @@ -10,7 +10,7 @@ import { OrchestratedActionBuilderConfig, OrchestratedActionBuilders, PaginationRequestActionConfig, -} from './action-orchestrator/action-orchestrator'; +} from '../action-orchestrator/action-orchestrator'; export class ActionBuilderConfigMapper { @@ -49,7 +49,9 @@ export class ActionBuilderConfigMapper { schemaGetter: (schemaKey: string) => EntitySchema ): OrchestratedActionBuilder { if (configOrBuilder instanceof EntityRequestActionConfig) { - return (...args: Parameters) => { + return ( + ...args: Parameters + ) => { const [guid, endpointGuid, ...meta] = args; return new BaseEntityRequestAction( schemaGetter(configOrBuilder.schemaKey), diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts new file mode 100644 index 0000000000..6e79f49192 --- /dev/null +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity-store-helpers.ts @@ -0,0 +1,222 @@ +import { Observable } from 'rxjs'; + +import { EntityService } from '../../entity-service'; +import { EntitySchema } from '../../helpers/entity-schema'; +import { EntityMonitor } from '../../monitors/entity-monitor'; +import { PaginationMonitor } from '../../monitors/pagination-monitor'; +import { ListActionState, RequestInfoState } from '../../reducers/api-request-reducer/types'; +import { PaginationObservables } from '../../reducers/pagination-reducer/pagination-reducer.types'; +import { isPaginatedAction, PaginatedAction } from '../../types/pagination.types'; +import { EntityRequestAction, RequestAction } from '../../types/request.types'; +import { + ActionOrchestrator, + OrchestratedActionBuilder, + OrchestratedActionBuilders, +} from '../action-orchestrator/action-orchestrator'; +import { EntityCatalogHelpers } from '../entity-catalog.helper'; +import { KnownActionBuilders } from './entity-catalog-entity'; +import { + CoreEntityCatalogEntityStore, + CustomEntityCatalogEntityStore, + EntityCatalogEntityStore, +} from './entity-catalog-entity.types'; + +type ActionDispatcher = ( + ...args: Parameters +) => Observable; + +export type ActionDispatchers = { + [K in keyof ABC]: ActionDispatcher +}; + +export class EntityCatalogEntityStoreHelpers { + + private static createEntityService( + actionBuilderKey: string, + action: any, + ): EntityService { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is of type pagination`); + } + if (!action.guid) { + throw new Error(`\`${actionBuilderKey}\` action has no guid`); + } + return helper.esf.create( + action.guid, + action + ) + } + + private static createPaginationMonitor( + actionBuilderKey: string, + action: any, + ): PaginationMonitor { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (!isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is not of type pagination`); + } + const pAction = action as PaginatedAction; + return helper.pmf.create(pAction.paginationKey, pAction, pAction.flattenPagination); + } + + private static createPaginationService( + actionBuilderKey: string, + action: any, + ): PaginationObservables { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + if (!isPaginatedAction(action)) { + throw new Error(`\`${actionBuilderKey}\` action is not of type pagination`); + } + const pAction = action as PaginatedAction; + return helper.getPaginationObservables({ + store: helper.store, + action: pAction, + paginationMonitor: helper.pmf.create( + pAction.paginationKey, + pAction, + pAction.flattenPagination + ) + }, pAction.flattenPagination); + } + + static getActionDispatchers( + es: EntityCatalogEntityStore, + builders: ABC, + ): ActionDispatchers { + if (!builders) { + return {} as ActionDispatchers; + } + return Object.keys(builders).reduce((actionDispatchers, key) => ({ + ...actionDispatchers, + [key]: EntityCatalogEntityStoreHelpers.getActionDispatcher( + es, + builders[key], + key + ) + }), {} as ActionDispatchers); + } + + private static getActionDispatcher( + es: CoreEntityCatalogEntityStore, + builder: OrchestratedActionBuilder, + actionKey: string, + ): ActionDispatcher { + return ( + ...args: Parameters): Observable => { + const helper = EntityCatalogHelpers.GetEntityCatalogEntityHelper(); + + const action = builder(...args); + helper.store.dispatch(action); + if (isPaginatedAction(action)) { + return es[actionKey].getPaginationMonitor( + ...args + ).currentPageState$; + } + const rAction = action as RequestAction; + const schema = rAction.entity ? rAction.entity[0] || rAction.entity : null; + const schemaKey = schema ? schema.schemaKey : null; + + if (!rAction.guid) { + throw new Error(`\`${actionKey}\` action has no guid`); + } + + return es.getEntityMonitor( + rAction.guid, + { + schemaKey, + startWithNull: false + } + ).entityRequest$ as unknown as Observable; + }; + } + + static createCoreStore( + actionOrchestrator: ActionOrchestrator, + entityKey: string, + getSchema: (schema: string) => EntitySchema + ): CoreEntityCatalogEntityStore { + return { + getEntityMonitor: ( + entityId: string, + params = { + schemaKey: '', + startWithNull: false + } + ): EntityMonitor => + new EntityMonitor(EntityCatalogHelpers.GetEntityCatalogEntityHelper().store, entityId, entityKey, getSchema(params.schemaKey), params.startWithNull) + , + getEntityService: ( + ...args: Parameters + ): EntityService => { + const actionBuilder = actionOrchestrator.getActionBuilder('get'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createEntityService('get', actionBuilder(...args)) + }, + getPaginationMonitor: ( + ...args: Parameters + ) => { + const actionBuilder = actionOrchestrator.getActionBuilder('getMultiple'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createPaginationMonitor('getMultiple', actionBuilder(...args)); + }, + getPaginationService: ( + ...args: Parameters + ) => { + const actionBuilder = actionOrchestrator.getActionBuilder('getMultiple'); + if (!actionBuilder) { + throw new Error(`\`get\` action builder not implemented for ${entityKey}`); + } + return EntityCatalogEntityStoreHelpers.createPaginationService('getMultiple', actionBuilder(...args)); + }, + }; + } + + static getPaginationStore( + builders: KnownActionBuilders, + entityKey: string, + getSchema: (schema: string) => EntitySchema + ): CustomEntityCatalogEntityStore { + if (!builders) { + return {} as CustomEntityCatalogEntityStore; + } + return Object.keys(builders).reduce((entityInstances, key) => { + // This isn't smart like the PaginationBuilders type. Here key will be all properties from an action builder (get, getMultiple, etc) + // which will be available from the dev console. Attempting to use in code pre-transpile will result in error + return { + ...entityInstances, + [key]: { + getEntityMonitor: ( + startWithNull: boolean, + ...args: any + ): EntityMonitor => { + const action: EntityRequestAction = builders[key](...args); + if (isPaginatedAction(action)) { + throw new Error(`\`${key}\` action is of type pagination`); + } + return new EntityMonitor( + EntityCatalogHelpers.GetEntityCatalogEntityHelper().store, + action.guid, + entityKey, + getSchema(action.schemaKey), + startWithNull + ) + }, + getEntityService: ( + ...args: any + ): EntityService => EntityCatalogEntityStoreHelpers.createEntityService(key, builders[key](...args)), + getPaginationMonitor: ( + ...args: any + ): PaginationMonitor => EntityCatalogEntityStoreHelpers.createPaginationMonitor(key, builders[key](...args)), + getPaginationService: ( + ...args: any + ): PaginationObservables => EntityCatalogEntityStoreHelpers.createPaginationService(key, builders[key](...args)) + } + }; + }, {} as CustomEntityCatalogEntityStore); + } +} \ No newline at end of file diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts similarity index 80% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts index 12d4cb43b9..adfc5469c2 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity.ts @@ -1,26 +1,24 @@ -import { ActionReducer, Store } from '@ngrx/store'; +import { ActionReducer } from '@ngrx/store'; -import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; -import { getFullEndpointApiUrl } from '../../../core/src/features/endpoints/endpoint-helpers'; -import { AppState, IRequestEntityTypeState } from '../app-state'; +import { endpointEntitySchema, STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; +import { KnownKeys, NonOptionalKeys } from '../../../../core/src/core/utils.service'; +import { getFullEndpointApiUrl } from '../../../../core/src/features/endpoints/endpoint-helpers'; +import { IRequestEntityTypeState } from '../../app-state'; import { PaginationPageIteratorConfig, -} from '../entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe'; -import { EntityPipelineEntity, stratosEndpointGuidKey } from '../entity-request-pipeline/pipeline.types'; -import { EntitySchema } from '../helpers/entity-schema'; -import { EntityMonitor } from '../monitors/entity-monitor'; -import { EndpointModel } from '../types/endpoint.types'; -import { APISuccessOrFailedAction, EntityRequestAction } from '../types/request.types'; -import { IEndpointFavMetadata } from '../types/user-favorites.types'; -import { ActionBuilderConfigMapper } from './action-builder-config.mapper'; -import { EntityActionDispatcherManager } from './action-dispatcher/action-dispatcher'; +} from '../../entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe'; +import { EntityPipelineEntity, stratosEndpointGuidKey } from '../../entity-request-pipeline/pipeline.types'; +import { EntitySchema } from '../../helpers/entity-schema'; +import { EndpointModel } from '../../types/endpoint.types'; +import { APISuccessOrFailedAction, EntityRequestAction } from '../../types/request.types'; +import { IEndpointFavMetadata } from '../../types/user-favorites.types'; import { ActionBuilderAction, ActionOrchestrator, OrchestratedActionBuilderConfig, OrchestratedActionBuilders, -} from './action-orchestrator/action-orchestrator'; -import { EntityCatalogHelpers } from './entity-catalog.helper'; +} from '../action-orchestrator/action-orchestrator'; +import { EntityCatalogHelpers } from '../entity-catalog.helper'; import { EntityCatalogSchemas, IEntityMetadata, @@ -29,12 +27,17 @@ import { IStratosEntityBuilder, IStratosEntityDefinition, StratosEndpointExtensionDefinition, -} from './entity-catalog.types'; +} from '../entity-catalog.types'; +import { ActionBuilderConfigMapper } from './action-builder-config.mapper'; +import { ActionDispatchers, EntityCatalogEntityStoreHelpers } from './entity-catalog-entity-store-helpers'; +import { EntityCatalogEntityStore } from './entity-catalog-entity.types'; + +export type KnownActionBuilders = Pick>>> export interface EntityCatalogBuilders< T extends IEntityMetadata = IEntityMetadata, Y = any, - AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders + AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders, > { entityBuilder?: IStratosEntityBuilder; // Allows extensions to modify entities data in the store via none API Effect or unrelated actions. @@ -49,15 +52,9 @@ export class StratosBaseCatalogEntity< Y = any, AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilderConfig, // This typing may cause an issue down the line. - ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders + ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders, > { - public readonly entityKey: string; - public readonly type: string; - public readonly definition: DefinitionTypes; - public readonly isEndpoint: boolean; - public readonly actionDispatchManager: EntityActionDispatcherManager; - public readonly actionOrchestrator: ActionOrchestrator; - public readonly endpointType: string; + constructor( definition: IStratosEntityDefinition | IStratosEndpointDefinition | IStratosBaseEntityDefinition, public readonly builders: EntityCatalogBuilders = {} @@ -77,10 +74,51 @@ export class StratosBaseCatalogEntity< this.type, (schemaKey: string) => this.getSchema(schemaKey) ); + + this.actions = actionBuilders as KnownActionBuilders; + this.actionOrchestrator = new ActionOrchestrator(this.entityKey, actionBuilders as ABC); - this.actionDispatchManager = this.actionOrchestrator.getEntityActionDispatcher(); + + this.store = { + ...EntityCatalogEntityStoreHelpers.createCoreStore( + this.actionOrchestrator, + this.entityKey, + Object.bind(this.getSchema, this) + ), + ...EntityCatalogEntityStoreHelpers.getPaginationStore( + this.actions, + this.entityKey, + Object.bind(this.getSchema, this) + ) + } as EntityCatalogEntityStore; // TODO: RC investigate more + this.api = EntityCatalogEntityStoreHelpers.getActionDispatchers( + this.store, + actionBuilders as ABC + ); } + + /** + * Create actions specific to the entity type + */ + public readonly actions: KnownActionBuilders; + /** + * Create and dispatch actions specific to the entity type. Response will provide an observable reporting entity or pagination state + */ + public readonly api: ActionDispatchers>; + /** + * Monitor an entity or collection of entities. Services will fetch the entity/entities if missing, monitors will not + */ + public readonly store: EntityCatalogEntityStore; + + + public readonly entityKey: string; + public readonly type: string; + public readonly definition: DefinitionTypes; + public readonly isEndpoint: boolean; + public readonly actionOrchestrator: ActionOrchestrator; + public readonly endpointType: string; + private populateEntitySchemaKey(entitySchemas: EntityCatalogSchemas): EntityCatalogSchemas { return Object.keys(entitySchemas).reduce((newSchema, schemaKey) => { if (schemaKey !== 'default') { @@ -145,17 +183,6 @@ export class StratosBaseCatalogEntity< return entity[stratosEndpointGuidKey]; } - public getEntityMonitor( - store: Store, - entityId: string, - { - schemaKey = '', - startWithNull = false - } = {} - ) { - return new EntityMonitor(store, entityId, this.entityKey, this.getSchema(schemaKey), startWithNull); - } - public getTypeAndSubtype() { const type = this.definition.parentType || this.definition.type; const subType = this.definition.parentType ? this.definition.type : null; @@ -229,8 +256,8 @@ export class StratosCatalogEntity< T extends IEntityMetadata = IEntityMetadata, Y = any, AB extends OrchestratedActionBuilderConfig = OrchestratedActionBuilders, - ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders - > extends StratosBaseCatalogEntity { + ABC extends OrchestratedActionBuilders = AB extends OrchestratedActionBuilders ? AB : OrchestratedActionBuilders, + > extends StratosBaseCatalogEntity { public definition: IStratosEntityDefinition; constructor( entity: IStratosEntityDefinition, @@ -284,3 +311,4 @@ export class StratosCatalogEndpointEntity extends StratosBaseCatalogEntity { + /** + * Return a collection of observables for the given entity id. If the entity is missing is will NOT be fetched + */ + getEntityMonitor: ( + entityId: string, + params?: { + schemaKey?: string, + startWithNull?: boolean + } + ) => EntityMonitor; + /** + * Return a collection of observables for the given entity id. Subscribing to core observables (like entityObs$) will fetch the entity if missing + */ + getEntityService: ( + ...args: Parameters + ) => EntityService; + /** + * Return a collection of observables for the given collection of entities. If the collection is missing it will NOT be fetched + */ + getPaginationMonitor: ( + ...args: Parameters + ) => PaginationMonitor; + /** + * Return a collection of observables for the given collection of entities. Subscribing to core (like entities$) will fetch the entity if missing + */ + getPaginationService: ( + ...args: Parameters + ) => PaginationObservables; +} + +/** + * Filter out all common builders in OrchestratedActionCoreBuilders from ABC + */ +type CustomBuilders = Omit>, keyof OrchestratedActionCoreBuilders>; + +/** + * Mark builders that don't return a pagination action as `never` + */ +type PaginatedActionBuildersWithNevers = FilteredByReturnType, PaginatedAction>; +/** + * Filter out builders that don't return pagination actions from ABC + */ +type PaginatedActionBuilders = Omit, NeverKeys>> + +/** + * Mark builders that return a pagination action as `never` + */ +type NonPaginatedActionBuildersWithNevers = FilteredByNotReturnType, PaginatedAction>; +/** + * Filter out builders that return pagination actions from ABC + */ +type NonPaginatedActionBuilders = Omit, NeverKeys>> + + + + +/** + * Provided a typed way to create pagination monitor/service per action (this ultimately only provides ones for paginated actions) + */ +type EntityCatalogEntityStoreCollections = { + [K in keyof ABC]: { + getPaginationMonitor: ( + ...args: Parameters + ) => PaginationMonitor; + getPaginationService: ( + ...args: Parameters + ) => PaginationObservables; + } +}; + +/** + * Provided a typed way to create entity monitor/service per action (this ultimately only provides ones for non-paginated actions) + */ +type EntityCatalogEntityStoreSingles = { + [K in keyof ABC]: { + getEntityMonitor: ( + startWithNull: boolean, + ...args: Parameters + ) => EntityMonitor; + getEntityService: ( + ...args: Parameters + ) => EntityService + } +}; + +export type CustomEntityCatalogEntityStore = + EntityCatalogEntityStoreCollections> & + EntityCatalogEntityStoreSingles> + + +/** + * Combine all types of store + * - CoreEntityCatalogEntityStore (entity and entities store access) + * - EntityCatalogEntityStoreCollections (per entity custom entities lists) + * - EntityCatalogEntityStoreSingles (per entity custom entity's) + */ +export type EntityCatalogEntityStore = + CoreEntityCatalogEntityStore & + CustomEntityCatalogEntityStore + + + diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts new file mode 100644 index 0000000000..ededbee860 --- /dev/null +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog-entity/entity-catalog.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; + +import { AppState } from '../../app-state'; +import { EntityServiceFactory } from '../../entity-service-factory.service'; +import { PaginationMonitorFactory } from '../../monitors/pagination-monitor.factory'; +import { getPaginationObservables } from '../../reducers/pagination-reducer/pagination-reducer.helper'; + +@Injectable() +export class EntityCatalogHelper { + + // Remove cyclic dependency by accessing this here instead of in entity catalog entity + public getPaginationObservables = getPaginationObservables; + + constructor( + public esf: EntityServiceFactory, + public pmf: PaginationMonitorFactory, + public store: Store, + ) { + + } +} diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts index cd1663bf8a..c65c640779 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.helper.ts @@ -1,3 +1,5 @@ +import { EntityCatalogHelper as EntityCatalogEntityHelper } from './entity-catalog-entity/entity-catalog.service'; + export abstract class EntityCatalogHelpers { static readonly endpointType = 'endpoint'; static buildEntityKey(entityType: string, endpointType: string): string { @@ -10,4 +12,12 @@ export abstract class EntityCatalogHelpers { // Camelcased to make it work better with the store. return `${endpointType}${entityType.charAt(0).toUpperCase() + entityType.slice(1)}`; } + + private static Instance: EntityCatalogEntityHelper; + static SetEntityCatalogEntityHelper(ecf: EntityCatalogEntityHelper) { + this.Instance = ecf; + } + static GetEntityCatalogEntityHelper(): EntityCatalogEntityHelper { + return this.Instance; + } } diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts similarity index 95% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts index 352c91f1e0..7f7a44f245 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.spec.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.spec.ts @@ -1,10 +1,12 @@ -import { EntitySchema } from '../helpers/entity-schema'; import { endpointEntitySchema } from '../../../core/src/base-entity-schemas'; import { BaseEndpointAuth } from '../../../core/src/features/endpoints/endpoint-auth'; -import { EndpointListDetailsComponent } from '../../../core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers'; -import { StratosCatalogEndpointEntity, StratosCatalogEntity } from './entity-catalog-entity'; -import { TestEntityCatalog } from './entity-catalog.service'; -import { IStratosEndpointDefinition, EntityCatalogSchemas } from './entity-catalog.types'; +import { + EndpointListDetailsComponent, +} from '../../../core/src/shared/components/list/list-types/endpoint/endpoint-list.helpers'; +import { EntitySchema } from '../helpers/entity-schema'; +import { TestEntityCatalog } from './entity-catalog'; +import { StratosCatalogEndpointEntity, StratosCatalogEntity } from './entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogSchemas, IStratosEndpointDefinition } from './entity-catalog.types'; describe('EntityCatalogService', () => { let entityCatalog: TestEntityCatalog; diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts index fb9eb2b43d..4082342470 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.store-setup.ts @@ -1,19 +1,4 @@ import { IRequestTypeState } from '../app-state'; -import { entityCatalog } from './entity-catalog.service'; - -// FIXME: These should be removed/come from the entity catalog - STRAT-151 -const baseEntities = [ - 'user', - 'system' -]; - -export function getAllEntityStoreKeys() { - const entities = entityCatalog.getAllEntitiesTypes(); - return [ - ...entities.map(entity => entity.entityKey), - ...baseEntities - ]; -} export function getDefaultStateFromEntityCatalog(entityKeys: string[], defaultState: T, initialState: IRequestTypeState) { return entityKeys.reduce((currentState, entityKey) => { diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.ts similarity index 86% rename from src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts rename to src/frontend/packages/store/src/entity-catalog/entity-catalog.ts index 68faff02eb..d10b67359f 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.service.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.ts @@ -1,12 +1,12 @@ +import { STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; import { IRequestEntityTypeState } from '../app-state'; import { ExtraApiReducers } from '../reducers/api-request-reducers.generator.helpers'; -import { STRATOS_ENDPOINT_TYPE } from '../../../core/src/base-entity-schemas'; import { OrchestratedActionBuilders } from './action-orchestrator/action-orchestrator'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, StratosCatalogEntity, -} from './entity-catalog-entity'; +} from './entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogHelpers } from './entity-catalog.helper'; import { EntityCatalogEntityConfig, IEntityMetadata, IStratosBaseEntityDefinition } from './entity-catalog.types'; @@ -103,25 +103,36 @@ class EntityCatalog { return this.entities.get(entityKey) || this.endpoints.get(entityKey); } - /* tslint:disable:max-line-length */ - public getEntity( + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders + >( entityConfig: EntityCatalogEntityConfig - ): StratosBaseCatalogEntity; - public getEntity( - endpointType: string, - entityType: string, - subType?: string - ): StratosBaseCatalogEntity; - public getEntity( - endpointTypeOrConfig: string | EntityCatalogEntityConfig, - entityType?: string, - subType?: string - ): StratosBaseCatalogEntity { + ): StratosBaseCatalogEntity; + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders, + >( + endpointType: string, + entityType: string, + subType?: string + ): StratosBaseCatalogEntity; + public getEntity< + T extends IEntityMetadata = IEntityMetadata, + Y = any, + AB extends OrchestratedActionBuilders = OrchestratedActionBuilders, + >( + endpointTypeOrConfig: string | EntityCatalogEntityConfig, + entityType?: string, + subType?: string + ): StratosBaseCatalogEntity { /* tslint:enable:max-line-length */ const config = this.getConfig(endpointTypeOrConfig, entityType, subType); const entityOfType = this.getEntityOfType(config.entityType, config.endpointType); if (entityOfType && subType) { - return this.getEntitySubType(entityOfType, subType) as StratosBaseCatalogEntity; + return this.getEntitySubType(entityOfType, subType) as StratosBaseCatalogEntity; } if (!entityOfType) { console.warn( @@ -129,7 +140,7 @@ class EntityCatalog { new Error().stack ); } - return entityOfType as StratosBaseCatalogEntity; + return entityOfType as StratosBaseCatalogEntity; } public getEntityKey(endpointType: string, entityType: string): string; @@ -203,4 +214,4 @@ export class TestEntityCatalog extends EntityCatalog { // https://github.com/cloudfoundry-incubator/stratos/issues/3753 - Reverting the entity catalog to an Angular service // makes testing much easier and remove the need for this. /* tslint:disable-next-line:no-string-literal */ -export const entityCatalog = !!window['__karma__'] ? new TestEntityCatalog() : new EntityCatalog(); +export const entityCatalog: EntityCatalog = !!window['__karma__'] ? new TestEntityCatalog() : new EntityCatalog(); diff --git a/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts b/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts index 80e9d7a61a..09277100b9 100644 --- a/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts +++ b/src/frontend/packages/store/src/entity-catalog/entity-catalog.types.ts @@ -2,7 +2,6 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { EndpointAuthTypeConfig } from '../../../core/src/core/extension/extension-types'; -import { Omit } from '../../../core/src/core/utils.service'; import { StratosStatus } from '../../../core/src/shared/shared.types'; import { GeneralEntityAppState } from '../app-state'; import { diff --git a/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts index 6672986f46..f8ac38b4ca 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/base-single-entity-request.pipeline.ts @@ -2,20 +2,20 @@ import { Action, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; -import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { AppState, InternalAppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { EntityRequestAction } from '../types/request.types'; import { buildRequestEntityPipe } from './entity-request-base-handlers/build-entity-request.pipe'; import { handleJetstreamResponsePipeFactory, - handleNonJetstreamResponsePipeFactory + handleNonJetstreamResponsePipeFactory, } from './entity-request-base-handlers/handle-multi-endpoints.pipe'; import { makeRequestEntityPipe } from './entity-request-base-handlers/make-request-entity-request.pipe'; import { mapMultiEndpointResponses } from './entity-request-base-handlers/map-multi-endpoint.pipes'; import { BasePipelineConfig, EntityRequestPipeline, PipelineResult } from './entity-request-pipeline.types'; -import { singleRequestToPaged, isJetstreamRequest } from './pipeline-helpers'; +import { isJetstreamRequest, singleRequestToPaged } from './pipeline-helpers'; import { PipelineHttpClient } from './pipline-http-client.service'; export interface SingleRequestPipelineConfig extends BasePipelineConfig { diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts index a2bbe9bb6b..163ec04dc5 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-pagination-request-pipeline.ts @@ -4,8 +4,11 @@ import { isObservable, Observable, of } from 'rxjs'; import { first, map, switchMap } from 'rxjs/operators'; import { AppState, InternalAppState } from '../app-state'; -import { StratosBaseCatalogEntity, StratosCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { + StratosBaseCatalogEntity, + StratosCatalogEntity, +} from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { PaginationFlattenerConfig } from '../helpers/paginated-request-helpers'; import { selectPaginationState } from '../selectors/pagination.selectors'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts index 2e39ebde17..d03761d51c 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.spec.ts @@ -1,7 +1,7 @@ import { Action } from '@ngrx/store'; import { SendEventAction } from '../../actions/internal-events.actions'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { InternalEventSeverity } from '../../types/internal-events.types'; import { APISuccessOrFailedAction, EntityRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts index 6ff1efc269..8b6fc07532 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/endpoint-errors.handler.ts @@ -1,5 +1,5 @@ import { SendEventAction } from '../../actions/internal-events.actions'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../helpers/entity-factory'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { InternalEventSeverity, InternalEventStateMetadata } from '../../types/internal-events.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts index d930e58ec7..26f25612a6 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.spec.ts @@ -1,4 +1,4 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { EntityRequestAction } from '../../types/request.types'; import { failedEntityHandler } from './fail-entity-request.handler'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts index 9d0803744b..ebe6478295 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler.ts @@ -1,5 +1,5 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; import { RecursiveDeleteFailed } from '../../effects/recursive-entity-delete.effect'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { EntityRequestAction, WrapperRequestActionFailed } from '../../types/request.types'; import { ActionDispatcher, PipelineResult } from '../entity-request-pipeline.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts index 01c607cd4b..9eaeb471ca 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/forced-action-type.helpers.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginatedAction } from '../../types/pagination.types'; import { EntityRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts index 950dd6c51b..d68ddd27ab 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/jetstream-error.handler.ts @@ -1,6 +1,6 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; import { SendEventAction } from '../../actions/internal-events.actions'; import { RecursiveDeleteFailed } from '../../effects/recursive-entity-delete.effect'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { endpointSchemaKey } from '../../helpers/entity-factory'; import { ApiRequestTypes, getFailApiRequestActions } from '../../reducers/api-request-reducer/request-helpers'; import { GLOBAL_EVENT, InternalEventSeverity, InternalEventStateMetadata } from '../../types/internal-events.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts index 9748006ba2..b6bd9dfeac 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/make-request-entity-request.pipe.ts @@ -1,7 +1,7 @@ import { HttpRequest } from '@angular/common/http'; import { switchMap } from 'rxjs/operators'; -import { StratosCatalogEndpointEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosCatalogEndpointEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { MakeEntityRequestPipe } from '../entity-request-pipeline.types'; export const makeRequestEntityPipe: MakeEntityRequestPipe = ( diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts index b078c3d189..953c96884d 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/map-multi-endpoint.pipes.ts @@ -1,8 +1,8 @@ import { Action } from '@ngrx/store'; import { normalize } from 'normalizr'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../../entity-catalog/entity-catalog.types'; import { ApiRequestTypes } from '../../reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from '../../types/api.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts index 9efad1f5ca..4c88fa24ad 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/start-entity-request.handler.spec.ts @@ -1,4 +1,4 @@ -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntitySchema } from '../../helpers/entity-schema'; import { EntityRequestAction } from '../../types/request.types'; import { startEntityHandler } from './start-entity-request.handler'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts index bf0d187b9e..9302a6a42c 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-base-handlers/success-entity-request.handler.ts @@ -1,8 +1,8 @@ import { CF_ENDPOINT_TYPE } from '../../../../cloud-foundry/src/cf-types'; import { ClearPaginationOfEntity, ClearPaginationOfType } from '../../actions/pagination.actions'; import { RecursiveDeleteComplete } from '../../effects/recursive-entity-delete.effect'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { WrapperRequestActionSuccess } from '../../types/request.types'; export function successEntityHandler( diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts index fb7ef8483e..2fbc4f3eda 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.ts @@ -5,8 +5,8 @@ import { catchError, map, tap } from 'rxjs/operators'; import { isHttpErrorResponse } from '../../../core/src/jetstream.helpers'; import { AppState, InternalAppState } from '../app-state'; import { RecursiveDelete } from '../effects/recursive-entity-delete.effect'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes, getRequestTypeFromMethod } from '../reducers/api-request-reducer/request-helpers'; import { PaginatedAction } from '../types/pagination.types'; import { EntityRequestAction } from '../types/request.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts index c6b24fd81b..4ae26e792a 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/entity-request-pipeline.types.ts @@ -2,12 +2,12 @@ import { HttpRequest } from '@angular/common/http'; import { Action, Store } from '@ngrx/store'; import { Observable } from 'rxjs'; +import { JetStreamErrorResponse } from '../../../core/src/jetstream.helpers'; +import { AppState, InternalAppState } from '../app-state'; import { StratosBaseCatalogEntity, StratosCatalogEndpointEntity, -} from '../entity-catalog/entity-catalog-entity'; -import { JetStreamErrorResponse } from '../../../core/src/jetstream.helpers'; -import { AppState, InternalAppState } from '../app-state'; +} from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { ApiRequestTypes } from '../reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from '../types/api.types'; import { PaginatedAction } from '../types/pagination.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts index 2ccb2a0856..d02ef516b6 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/get-params.pipe.ts @@ -1,9 +1,6 @@ import { HttpParams } from '@angular/common/http'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { InternalAppState } from '../../app-state'; import { resultPerPageParam, resultPerPageParamDefault } from '../../reducers/pagination-reducer/pagination-reducer.types'; -import { selectPaginationState } from '../../selectors/pagination.selectors'; import { PaginatedAction, PaginationEntityState, PaginationParam } from '../../types/pagination.types'; export function getPaginationParams(paginationState: PaginationEntityState): PaginationParam { diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts index 1038a7e569..cbc69245b2 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pagination-request-base-handlers/pagination-iterator.pipe.ts @@ -5,7 +5,7 @@ import { map, mergeMap, reduce, switchMap } from 'rxjs/operators'; import { UpdatePaginationMaxedState } from '../../actions/pagination.actions'; import { AppState } from '../../app-state'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginatedAction, PaginationMaxedState } from '../../types/pagination.types'; import { ActionDispatcher, JetstreamResponse, PagedJetstreamResponse } from '../entity-request-pipeline.types'; import { PipelineHttpClient } from '../pipline-http-client.service'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts b/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts index 9c03bc9d79..e587aed932 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pipeline-helpers.ts @@ -1,6 +1,4 @@ -import { HttpParams } from '@angular/common/http'; - -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEntityDefinition } from '../entity-catalog/entity-catalog.types'; import { JetstreamResponse, PagedJetstreamResponse } from './entity-request-pipeline.types'; diff --git a/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts b/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts index 9cf1fd1bac..863ac58cef 100644 --- a/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts +++ b/src/frontend/packages/store/src/entity-request-pipeline/pipline-http-client.service.ts @@ -6,7 +6,7 @@ import { filter, first, map, mergeMap } from 'rxjs/operators'; import { environment } from '../../../core/src/environments/environment'; import { InternalAppState } from '../app-state'; -import { StratosCatalogEndpointEntity } from '../entity-catalog/entity-catalog-entity'; +import { StratosCatalogEndpointEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { IStratosEndpointDefinition } from '../entity-catalog/entity-catalog.types'; import { connectedEndpointsOfTypesSelector, endpointOfTypeSelector } from '../selectors/endpoint.selectors'; diff --git a/src/frontend/packages/store/src/entity-service-factory.service.ts b/src/frontend/packages/store/src/entity-service-factory.service.ts index d320c5779d..42e02864b6 100644 --- a/src/frontend/packages/store/src/entity-service-factory.service.ts +++ b/src/frontend/packages/store/src/entity-service-factory.service.ts @@ -4,7 +4,7 @@ import { Store } from '@ngrx/store'; import { GeneralEntityAppState } from './app-state'; import { EntityRequestAction } from './types/request.types'; import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; -import { entityCatalog } from './entity-catalog/entity-catalog.service'; +import { entityCatalog } from './entity-catalog/entity-catalog'; import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; import { ENTITY_INFO_HANDLER, EntityInfoHandler, EntityService } from './entity-service'; diff --git a/src/frontend/packages/store/src/entity-service.spec.ts b/src/frontend/packages/store/src/entity-service.spec.ts index b8a4a290e5..e0e752ada8 100644 --- a/src/frontend/packages/store/src/entity-service.spec.ts +++ b/src/frontend/packages/store/src/entity-service.spec.ts @@ -4,27 +4,25 @@ import { inject, TestBed } from '@angular/core/testing'; import { Action, Store } from '@ngrx/store'; import { filter, first, map, pairwise, tap } from 'rxjs/operators'; +import { STRATOS_ENDPOINT_TYPE } from '../../core/src/base-entity-schemas'; +import { ENTITY_SERVICE } from '../../core/src/shared/entity.tokens'; +import { generateTestEntityServiceProvider } from '../../core/test-framework/entity-service.helper'; +import { createEntityStore, TestStoreEntity } from '../testing/src/store-test-helper'; import { APIResponse } from './actions/request.actions'; import { GeneralAppState } from './app-state'; -import { - failedEntityHandler, -} from './entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler'; +import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from './entity-catalog-test.module'; +import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity/entity-catalog-entity'; +import { EntityCatalogEntityConfig, IStratosEndpointDefinition } from './entity-catalog/entity-catalog.types'; +import { failedEntityHandler } from './entity-request-pipeline/entity-request-base-handlers/fail-entity-request.handler'; import { PipelineResult } from './entity-request-pipeline/entity-request-pipeline.types'; +import { EntityService } from './entity-service'; +import { EntityServiceFactory } from './entity-service-factory.service'; import { EntitySchema } from './helpers/entity-schema'; +import { EntityMonitor } from './monitors/entity-monitor'; +import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; import { completeApiRequest, startApiRequest } from './reducers/api-request-reducer/request-helpers'; import { NormalizedResponse } from './types/api.types'; import { EntityRequestAction, ICFAction } from './types/request.types'; -import { generateTestEntityServiceProvider } from '../../core/test-framework/entity-service.helper'; -import { createEntityStore, TestStoreEntity } from '../testing/src/store-test-helper'; -import { STRATOS_ENDPOINT_TYPE } from '../../core/src/base-entity-schemas'; -import { ENTITY_SERVICE } from '../../core/src/shared/entity.tokens'; -import { EntityMonitor } from './monitors/entity-monitor'; -import { EntityMonitorFactory } from './monitors/entity-monitor.factory.service'; -import { EntityCatalogTestModule, TEST_CATALOGUE_ENTITIES } from './entity-catalog-test.module'; -import { StratosBaseCatalogEntity } from './entity-catalog/entity-catalog-entity'; -import { EntityCatalogEntityConfig, IStratosEndpointDefinition } from './entity-catalog/entity-catalog.types'; -import { EntityService } from './entity-service'; -import { EntityServiceFactory } from './entity-service-factory.service'; function getActionDispatcher(store: Store) { return (action: Action) => { diff --git a/src/frontend/packages/store/src/entity-service.ts b/src/frontend/packages/store/src/entity-service.ts index 0b3e3066b2..f138ed1e40 100644 --- a/src/frontend/packages/store/src/entity-service.ts +++ b/src/frontend/packages/store/src/entity-service.ts @@ -4,14 +4,14 @@ import { combineLatest, Observable } from 'rxjs'; import { filter, first, map, publishReplay, refCount, switchMap, tap, withLatestFrom } from 'rxjs/operators'; import { GeneralEntityAppState } from './app-state'; +import { entityCatalog } from './entity-catalog/entity-catalog'; +import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; import { ActionDispatcher } from './entity-request-pipeline/entity-request-pipeline.types'; +import { EntityMonitor } from './monitors/entity-monitor'; import { RequestInfoState, UpdatingSection } from './reducers/api-request-reducer/types'; import { getEntityUpdateSections, getUpdateSectionById } from './selectors/api.selectors'; import { EntityInfo } from './types/api.types'; import { EntityRequestAction } from './types/request.types'; -import { EntityMonitor } from './monitors/entity-monitor'; -import { entityCatalog } from './entity-catalog/entity-catalog.service'; -import { EntityActionBuilderEntityConfig } from './entity-catalog/entity-catalog.types'; export const ENTITY_INFO_HANDLER = '__ENTITY_INFO_HANDLER__'; @@ -25,7 +25,6 @@ export function isEntityBlocked(entityRequestInfo: RequestInfoState) { entityRequestInfo.error || entityRequestInfo.deleting.busy || entityRequestInfo.deleting.deleted; - // TODO: RC test removal of updating._root_.busy } const dispatcherFactory = (store: Store, action: EntityRequestAction) => (updatingKey?: string) => { diff --git a/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts b/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts index a3c18a2f81..c7a6dadd26 100644 --- a/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts +++ b/src/frontend/packages/store/src/monitors/entity-monitor.factory.service.ts @@ -1,15 +1,17 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { AppState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { EntityMonitor } from './entity-monitor'; -import { AppState } from '../app-state'; @Injectable() export class EntityMonitorFactory { - constructor(private store: Store) { } + constructor( + private store: Store, + ) { } private monitorCache: { [key: string]: EntityMonitor @@ -29,17 +31,15 @@ export class EntityMonitorFactory { if (!catalogEntity) { throw new Error(`Could not find catalog entity for endpoint type '${endpointType}' and entity type '${entityType}'`); } - const monitor = catalogEntity.getEntityMonitor( + const monitor = new EntityMonitor( this.store, id, - { - startWithNull, - schemaKey: entityConfig.schemaKey - } + catalogEntity.entityKey, + catalogEntity.getSchema(entityConfig.schemaKey), + startWithNull ); this.monitorCache[cacheKey] = monitor; return monitor; } } - } diff --git a/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts b/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts index 814898ba23..4b4fa9cddc 100644 --- a/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts +++ b/src/frontend/packages/store/src/monitors/pagination-monitor.factory.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '../app-state'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { PaginationMonitor } from './pagination-monitor'; diff --git a/src/frontend/packages/store/src/monitors/pagination-monitor.ts b/src/frontend/packages/store/src/monitors/pagination-monitor.ts index 03e06a4d68..84dd3e5080 100644 --- a/src/frontend/packages/store/src/monitors/pagination-monitor.ts +++ b/src/frontend/packages/store/src/monitors/pagination-monitor.ts @@ -18,11 +18,12 @@ import { LocalPaginationHelpers, } from '../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; import { AppState, GeneralEntityAppState, GeneralRequestDataState } from '../app-state'; -import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { EntityCatalogEntityConfig } from '../entity-catalog/entity-catalog.types'; import { EntitySchema } from '../helpers/entity-schema'; import { ActionState, ListActionState } from '../reducers/api-request-reducer/types'; +import { getCurrentPageRequestInfo } from '../reducers/pagination-reducer/pagination-reducer.types'; import { getAPIRequestDataState, selectEntities } from '../selectors/api.selectors'; import { selectPaginationState } from '../selectors/pagination.selectors'; import { PaginationEntityState } from '../types/pagination.types'; @@ -48,6 +49,7 @@ export class PaginationMonitor; + public currentPageState$: Observable; /** * Emits a boolean stating if the current page is fetching or not. */ @@ -121,19 +123,14 @@ export class PaginationMonitor this.getCurrentPageRequestInfo(pagination)) + ); } private createPaginationObservable( diff --git a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts index 8947039baa..8797f5abfa 100644 --- a/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts +++ b/src/frontend/packages/store/src/reducers/api-request-data-reducer/request-data-reducer.factory.ts @@ -1,9 +1,9 @@ import { Action, ActionReducer } from '@ngrx/store'; +import { RECURSIVE_ENTITY_SET_DELETED, SetTreeDeleted } from '../../effects/recursive-entity-delete.effect'; import { InitCatalogEntitiesAction } from '../../entity-catalog.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { getDefaultStateFromEntityCatalog } from '../../entity-catalog/entity-catalog.store-setup'; -import { RECURSIVE_ENTITY_SET_DELETED, SetTreeDeleted } from '../../effects/recursive-entity-delete.effect'; import { deepMergeState } from '../../helpers/reducer.helper'; import { IFlatTree } from '../../helpers/schema-tree-traverse'; import { ISuccessRequestAction } from '../../types/request.types'; diff --git a/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts b/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts index 3f641545a1..ae52213fd9 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducer/request-helpers.ts @@ -1,9 +1,11 @@ import { Store } from '@ngrx/store'; -import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; + import { pathGet } from '../../../../core/src/core/utils.service'; import { APIResponse } from '../../actions/request.actions'; import { BaseRequestState, GeneralAppState } from '../../app-state'; +import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; +import { StratosBaseCatalogEntity } from '../../entity-catalog/entity-catalog-entity/entity-catalog-entity'; import { mergeState } from '../../helpers/reducer.helper'; import { NormalizedResponse } from '../../types/api.types'; import { PaginatedAction } from '../../types/pagination.types'; @@ -17,7 +19,6 @@ import { WrapperRequestActionSuccess, } from '../../types/request.types'; import { defaultDeletingActionState, getDefaultRequestState, RequestInfoState, rootUpdatingKey } from './types'; -import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; export function getEntityRequestState( state: BaseRequestState, diff --git a/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts b/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts index 418feaa0fe..71b79e9aaa 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducer/succeed-request.ts @@ -1,7 +1,7 @@ import { isNullOrUndefined } from 'util'; -import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; import { BaseRequestState } from '../../app-state'; +import { BaseEntityRequestAction } from '../../entity-catalog/action-orchestrator/action-orchestrator'; import { mergeState } from '../../helpers/reducer.helper'; import { ISuccessRequestAction, WrapperRequestActionSuccess } from '../../types/request.types'; import { diff --git a/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts b/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts index f88d73d7ad..8ab5be4e86 100644 --- a/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts +++ b/src/frontend/packages/store/src/reducers/api-request-reducers.generator.ts @@ -6,7 +6,7 @@ import { requestReducerFactory } from './api-request-reducer/request-reducer.fac import { RequestInfoState } from './api-request-reducer/types'; import { chainApiReducers, ExtraApiReducers, requestActions } from './api-request-reducers.generator.helpers'; import { appStatsReducer } from '../../../cloud-foundry/src/store/reducers/app-stats-request.reducer'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { CF_ENDPOINT_TYPE } from '../../../cloud-foundry/src/cf-types'; /** diff --git a/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts b/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts index 0d999fb9f5..2a83934d21 100644 --- a/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts +++ b/src/frontend/packages/store/src/reducers/current-user-roles-reducer/recently-visited.reducer.ts @@ -10,7 +10,7 @@ import { import { AddRecentlyVisitedEntityAction, SetRecentlyVisitedEntityAction } from '../../actions/recently-visited.actions'; import { IRecentlyVisitedState } from '../../types/recently-visited.types'; import { addNewHit, cleanRecentsList, getDefaultRecentState } from './recently-visited.reducer.helpers'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { STRATOS_ENDPOINT_TYPE } from '../../../../core/src/base-entity-schemas'; import { endpointSchemaKey } from '../../helpers/entity-factory'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts index f42251932a..8188fc3fff 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-of-entity.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { ClearPaginationOfEntity } from '../../actions/pagination.actions'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; import { spreadClientPagination } from './pagination-reducer.helper'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts index 25cede1fdd..61cc841a8a 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-clear-pagination-type.ts @@ -1,5 +1,5 @@ import { EndpointAction } from '../../actions/endpoint.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationState } from '../../types/pagination.types'; import { getDefaultPaginationEntityState } from './pagination-reducer-reset-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts index c97da32f57..d9c0465284 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.spec.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { CreatePagination } from '../../actions/pagination.actions'; import { PaginationState } from '../../types/pagination.types'; import { createNewPaginationSection } from './pagination-reducer-create-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts index ef05eefaf2..7e57e52957 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-create-pagination.ts @@ -1,4 +1,4 @@ -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../entity-catalog/entity-catalog.types'; import { CreatePagination } from '../../actions/pagination.actions'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts index b24dc25f4e..3d8080a705 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-max-reached.ts @@ -2,7 +2,7 @@ import { LocalPaginationHelpers, } from '../../../../core/src/shared/components/list/data-sources-controllers/local-list.helpers'; import { IgnorePaginationMaxedState, UpdatePaginationMaxedState } from '../../actions/pagination.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationEntityTypeState, PaginationState } from '../../types/pagination.types'; import { getDefaultPaginationEntityState } from './pagination-reducer-reset-pagination'; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts index 1509f943c2..603b2b767f 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer-reset-pagination.ts @@ -1,5 +1,5 @@ import { ResetPagination } from '../../actions/pagination.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationEntityState, PaginationEntityTypeState, PaginationState } from '../../types/pagination.types'; export const defaultClientPaginationPageSize = 9; diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts index 7cbe24d032..2153fec07a 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.helper.ts @@ -18,7 +18,7 @@ import { sortStringify } from '../../../../core/src/core/utils.service'; import { SetInitialParams } from '../../actions/pagination.actions'; import { CfValidateEntitiesStart } from '../../actions/request.actions'; import { AppState, GeneralEntityAppState } from '../../app-state'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { PaginationMonitor } from '../../monitors/pagination-monitor'; import { selectEntities } from '../../selectors/api.selectors'; import { selectPaginationState } from '../../selectors/pagination.selectors'; @@ -28,24 +28,7 @@ import { PaginationEntityState, PaginationParam, } from '../../types/pagination.types'; -import { ListActionState } from '../api-request-reducer/types'; - -export interface PaginationObservables { - pagination$: Observable; - entities$: Observable; - /** - * Convenience observable on !!entities - */ - hasEntities$: Observable; - /** - * Convenience observable on pagination totalResults (note - not entities.length. In maxed world this can be different) - */ - totalEntities$: Observable; - /** - * Equate to current page fetching observable - */ - fetchingEntities$: Observable; -} +import { getCurrentPageRequestInfo, PaginationObservables } from './pagination-reducer.types'; export function removeEmptyParams(params: PaginationParam) { const newObject = {}; @@ -306,14 +289,6 @@ export function hasError(pagination: PaginationEntityState): boolean { return pagination && getCurrentPageRequestInfo(pagination).error; } -export function getCurrentPageRequestInfo(pagination: PaginationEntityState, valueIfMissing = { - busy: false, - error: false, - message: '' -}): ListActionState { - return pagination.pageRequests[pagination.currentPage] || valueIfMissing; -} - export function spreadClientPagination(pag: PaginationClientPagination): PaginationClientPagination { return { ...pag, diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts index 4175f69173..bfaa0c3aeb 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination-reducer.types.ts @@ -1,5 +1,39 @@ +import { Observable } from 'rxjs'; import { PaginationEntityState } from '../../types/pagination.types'; +import { ListActionState } from '../api-request-reducer/types'; export const resultPerPageParam = 'results-per-page'; export const resultPerPageParamDefault = 5; +export interface PaginationObservables { + pagination$: Observable; + entities$: Observable; + /** + * Convenience observable on !!entities + */ + hasEntities$: Observable; + /** + * Convenience observable on pagination totalResults (note - not entities.length. In maxed world this can be different) + */ + totalEntities$: Observable; + /** + * Equate to current page fetching observable + */ + fetchingEntities$: Observable; +} + +export function getCurrentPageRequestInfo(pagination: PaginationEntityState, valueIfMissing = { + busy: false, + error: false, + message: '' +}): ListActionState { + if ( + !pagination || + !pagination.pageRequests || + !pagination.pageRequests[pagination.currentPage] + ) { + return valueIfMissing; + } else { + return pagination.pageRequests[pagination.currentPage]; + } +} \ No newline at end of file diff --git a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts index 0784503537..f39aa853f0 100644 --- a/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts +++ b/src/frontend/packages/store/src/reducers/pagination-reducer/pagination.reducer.ts @@ -27,7 +27,7 @@ import { } from '../../actions/pagination.actions'; import { ApiActionTypes } from '../../actions/request.actions'; import { InitCatalogEntitiesAction } from '../../entity-catalog.actions'; -import { entityCatalog } from '../../entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../entity-catalog/entity-catalog'; import { getDefaultStateFromEntityCatalog } from '../../entity-catalog/entity-catalog.store-setup'; import { mergeState } from '../../helpers/reducer.helper'; import { PaginationEntityState, PaginationState } from '../../types/pagination.types'; diff --git a/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts b/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts index 38ac1f8f07..5f52c49b13 100644 --- a/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts +++ b/src/frontend/packages/store/src/selectors/current-user-role.selectors.ts @@ -6,8 +6,6 @@ import { CurrentUserRolesAppState } from '../app-state'; import { ICurrentUserRolesState, IStratosRolesState } from '../types/current-user-roles.types'; -type Omit = Pick>; - export const selectCurrentUserRolesState = (state: CurrentUserRolesAppState) => state.currentUserRoles; export const selectCurrentUserStratosRolesState = (state: ICurrentUserRolesState) => state.internal; diff --git a/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts b/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts index f7100c7f94..a1b3158b2e 100644 --- a/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts +++ b/src/frontend/packages/store/src/selectors/favorite-groups.selectors.ts @@ -1,9 +1,9 @@ import { compose } from '@ngrx/store'; import { STRATOS_ENDPOINT_TYPE, userFavoritesEntitySchema } from '../../../core/src/base-entity-schemas'; -import { entityCatalog } from '../entity-catalog/entity-catalog.service'; import { deriveEndpointFavoriteFromFavorite } from '../../../core/src/core/user-favorite-helpers'; -import { IRequestEntityTypeState, InternalAppState } from '../app-state'; +import { InternalAppState, IRequestEntityTypeState } from '../app-state'; +import { entityCatalog } from '../entity-catalog/entity-catalog'; import { IUserFavoriteGroup, IUserFavoritesGroups, IUserFavoritesGroupsState } from '../types/favorite-groups.types'; import { IFavoriteMetadata, UserFavorite } from '../types/user-favorites.types'; diff --git a/src/frontend/packages/store/testing/src/store-test-helper.ts b/src/frontend/packages/store/testing/src/store-test-helper.ts index 8d4ce58cd0..9ad3e9ab30 100644 --- a/src/frontend/packages/store/testing/src/store-test-helper.ts +++ b/src/frontend/packages/store/testing/src/store-test-helper.ts @@ -4,7 +4,7 @@ import { Store, StoreModule } from '@ngrx/store'; import { endpointEntitySchema } from '../../../core/src/base-entity-schemas'; import { AppState } from '../../src/app-state'; -import { entityCatalog } from '../../src/entity-catalog/entity-catalog.service'; +import { entityCatalog } from '../../src/entity-catalog/entity-catalog'; import { EntityCatalogEntityConfig } from '../../src/entity-catalog/entity-catalog.types'; import { appReducers } from '../../src/reducers.module'; import { getDefaultRequestState } from '../../src/reducers/api-request-reducer/types'; diff --git a/src/frontend/packages/store/testing/src/store-test.module.ts b/src/frontend/packages/store/testing/src/store-test.module.ts index a651b603fb..9bb257559b 100644 --- a/src/frontend/packages/store/testing/src/store-test.module.ts +++ b/src/frontend/packages/store/testing/src/store-test.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { CATALOGUE_ENTITIES, EntityCatalogFeatureModule } from '../../src/entity-catalog.module'; -import { entityCatalog, TestEntityCatalog } from '../../src/entity-catalog/entity-catalog.service'; +import { entityCatalog, TestEntityCatalog } from '../../src/entity-catalog/entity-catalog'; @NgModule({ imports: [ From cf9e658937e05648c51e9e62570e29cea380d291 Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Thu, 30 Apr 2020 15:44:58 +0100 Subject: [PATCH 02/20] Fix disabling of polling - fixes #4244 --- .../user-profile/profile-info/profile-info.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html index 0eca5d5d7d..c08c7704c5 100644 --- a/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html +++ b/src/frontend/packages/core/src/features/user-profile/profile-info/profile-info.component.html @@ -86,7 +86,7 @@

User Profile

[ngClass]="{'user-profile__option-warning': pollingEnabled === 'false'}">