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 bdd80ddc59..7c71858638 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-factory.ts @@ -37,7 +37,7 @@ export const serviceBrokerEntityType = 'serviceBroker'; export const userProvidedServiceInstanceEntityType = 'userProvidedServiceInstance'; export const spaceWithOrgEntityType = 'spaceWithOrg'; -export const serviceInstancesWithspaceEntityType = 'serviceInstancesWithSpace'; +export const serviceInstancesWithSpaceEntityType = 'serviceInstancesWithSpace'; export const serviceInstancesWithNoBindingsEntityType = 'serviceInstanceWithNoBindings'; export const serviceBindingNoBindingsEntityType = 'serviceBindingNoBindings'; @@ -272,7 +272,7 @@ const ServiceInstancesWithSpaceSchema = new CFEntitySchema(serviceInstancesEntit service: ServiceSchema } }, { idAttribute: getAPIResourceGuid }); -entityCache[serviceInstancesWithspaceEntityType] = ServiceInstancesWithSpaceSchema; +entityCache[serviceInstancesWithSpaceEntityType] = ServiceInstancesWithSpaceSchema; const ServiceInstancesWithNoBindingsSchema = new CFEntitySchema(serviceInstancesEntityType, { entity: { 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 8538401d80..1ca08e8907 100644 --- a/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts +++ b/src/frontend/packages/cloud-foundry/src/cf-entity-generator.ts @@ -57,7 +57,7 @@ import { serviceEntityType, serviceInstancesEntityType, serviceInstancesWithNoBindingsEntityType, - serviceInstancesWithspaceEntityType, + serviceInstancesWithSpaceEntityType, servicePlanEntityType, servicePlanVisibilityEntityType, spaceEntityType, @@ -301,7 +301,7 @@ function generateCFServiceInstanceEntity(endpointDefinition: IStratosEndpointDef type: serviceInstancesEntityType, schema: { default: cfEntityFactory(serviceInstancesEntityType), - [serviceInstancesWithspaceEntityType]: cfEntityFactory(serviceInstancesWithspaceEntityType), + [serviceInstancesWithSpaceEntityType]: cfEntityFactory(serviceInstancesWithSpaceEntityType), [serviceInstancesWithNoBindingsEntityType]: cfEntityFactory(serviceInstancesWithNoBindingsEntityType), }, label: 'Marketplace Service Instance', diff --git a/src/frontend/packages/core/src/core/entity-catalogue/entity-catalogue-entity.ts b/src/frontend/packages/core/src/core/entity-catalogue/entity-catalogue-entity.ts index 56143e8d2d..9937df36f2 100644 --- a/src/frontend/packages/core/src/core/entity-catalogue/entity-catalogue-entity.ts +++ b/src/frontend/packages/core/src/core/entity-catalogue/entity-catalogue-entity.ts @@ -1,21 +1,22 @@ +import { Store } from '@ngrx/store'; + +import { AppState } from '../../../../store/src/app-state'; +import { EntitySchema } from '../../../../store/src/helpers/entity-schema'; +import { EndpointModel } from '../../../../store/src/types/endpoint.types'; +import { IEndpointFavMetadata } from '../../../../store/src/types/user-favorites.types'; +import { endpointEntitySchema } from '../../base-entity-schemas'; +import { getFullEndpointApiUrl } from '../../features/endpoints/endpoint-helpers'; +import { EntityMonitor } from '../../shared/monitors/entity-monitor'; +import { EntityCatalogueHelpers } from './entity-catalogue.helper'; import { - IEntityMetadata, - IStratosEntityDefinition, EntityCatalogueSchemas, + IEntityMetadata, + IStratosBaseEntityDefinition, IStratosEndpointDefinition, - IStratosEntityBuilder, IStratosEndpointWithoutSchemaDefinition, - IStratosBaseEntityDefinition + IStratosEntityBuilder, + IStratosEntityDefinition, } from './entity-catalogue.types'; -import { Store } from '@ngrx/store'; -import { GeneralEntityAppState, AppState } from '../../../../store/src/app-state'; -import { EntityCatalogueHelpers } from './entity-catalogue.helper'; -import { IEndpointFavMetadata } from '../../../../store/src/types/user-favorites.types'; -import { EndpointModel } from '../../../../store/src/types/endpoint.types'; -import { getFullEndpointApiUrl } from '../../features/endpoints/endpoint-helpers'; -import { endpointEntitySchema } from '../../base-entity-schemas'; -import { EntitySchema } from '../../../../store/src/helpers/entity-schema'; -import { EntityMonitor } from '../../shared/monitors/entity-monitor'; export class StratosBaseCatalogueEntity<T extends IEntityMetadata = IEntityMetadata, Y = any> { public readonly entityKey: string; @@ -56,6 +57,8 @@ export class StratosBaseCatalogueEntity<T extends IEntityMetadata = IEntityMetad * If no schemaKey is provided then the default schema will be returned */ public getSchema(schemaKey?: string) { + // TODO: schemaKey - ensure wherever this is called it contains the correct schemaKey (with respect to any config + // EntityCatalogueEntityConfig that may use a schemeKey different than that provided by entityCatalogue.getEntity's) // TODO(NJ) We should do a better job at typeing schemax // schema always gets changed to a EntityCatalogueSchamas. const catalogueSchema = (this.definition.schema as EntityCatalogueSchemas); diff --git a/src/frontend/packages/core/src/features/service-catalog/services-helper.ts b/src/frontend/packages/core/src/features/service-catalog/services-helper.ts index e2693435e4..bb9711a8a7 100644 --- a/src/frontend/packages/core/src/features/service-catalog/services-helper.ts +++ b/src/frontend/packages/core/src/features/service-catalog/services-helper.ts @@ -36,8 +36,8 @@ import { ServicePlanAccessibility } from './services.service'; export const getSvcAvailability = (servicePlan: APIResource<IServicePlan>, - serviceBroker: APIResource<IServiceBroker>, - allServicePlanVisibilities: APIResource<IServicePlanVisibility>[]) => { + serviceBroker: APIResource<IServiceBroker>, + allServicePlanVisibilities: APIResource<IServicePlanVisibility>[]) => { const svcAvailability = { isPublic: false, spaceScoped: false, hasVisibilities: false, guid: servicePlan.metadata.guid, spaceGuid: null }; @@ -79,6 +79,8 @@ export const isEditServiceInstanceMode = (activatedRoute: ActivatedRoute) => { export const getServiceInstancesInCf = (cfGuid: string, store: Store<CFAppState>, paginationMonitorFactory: PaginationMonitorFactory) => { const paginationKey = createEntityRelationPaginationKey(serviceInstancesEntityType, cfGuid); + // TODO: schemaKey - Dispatches the action which has the correct schema key (SI with space), however uses incorrect schema to denormalise + // so entities$ does not contain space return getPaginationObservables<APIResource<IServiceInstance>>({ store, action: new GetServiceInstances(cfGuid, paginationKey), 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 606bbf80cf..3d5f203b19 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 @@ -28,6 +28,7 @@ import { ListFilter, ListSort } from '../../../../../../store/src/actions/list.a import { MetricsAction } from '../../../../../../store/src/actions/metrics.actions'; import { SetResultCount } from '../../../../../../store/src/actions/pagination.actions'; import { CFAppState } from '../../../../../../store/src/app-state'; +import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; import { getPaginationObservables } from '../../../../../../store/src/reducers/pagination-reducer/pagination-reducer.helper'; import { PaginatedAction, @@ -35,6 +36,7 @@ import { PaginationParam, QParam, } from '../../../../../../store/src/types/pagination.types'; +import { entityCatalogue } from '../../../../core/entity-catalogue/entity-catalogue.service'; import { PaginationMonitor } from '../../../monitors/pagination-monitor'; import { IListDataSourceConfig, MultiActionConfig } from './list-data-source-config'; import { @@ -49,8 +51,6 @@ import { import { getDataFunctionList } from './local-filtering-sorting'; import { LocalListController } from './local-list-controller'; import { LocalPaginationHelpers } from './local-list.helpers'; -import { entityCatalogue } from '../../../../core/entity-catalogue/entity-catalogue.service'; -import { EntitySchema } from '../../../../../../store/src/helpers/entity-schema'; export class DataFunctionDefinition { type: 'sort' | 'filter'; @@ -309,6 +309,7 @@ export abstract class ListDataSource<T, A = T> extends DataSource<T> implements private getSourceSchema(schema: EntitySchema | MultiActionConfig) { if (schema instanceof MultiActionConfig) { const { paginationAction } = schema.schemaConfigs[0]; + // TODO: schemaKey - getSchema needs to accept an EntityCatalogueEntityConfig with the correct schemaKey const catalogueEntity = entityCatalogue.getEntity(paginationAction.endpointType, paginationAction.entityType); return catalogueEntity.getSchema(paginationAction.schemaKey); } diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts b/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts index 5904bd7f7e..96562d4694 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/cf-spaces-service-instances/cf-spaces-service-instances-data-source.ts @@ -6,7 +6,7 @@ import { serviceBindingEntityType, serviceEntityType, serviceInstancesEntityType, - serviceInstancesWithspaceEntityType, + serviceInstancesWithSpaceEntityType, servicePlanEntityType, spaceEntityType, } from '../../../../../../../cloud-foundry/src/cf-entity-factory'; @@ -31,11 +31,11 @@ export class CfSpacesServiceInstancesDataSource extends ListDataSource<APIResour createEntityRelationKey(serviceInstancesEntityType, spaceEntityType), createEntityRelationKey(serviceBindingEntityType, applicationEntityType), ], true, false); - action.entity = [cfEntityFactory(serviceInstancesWithspaceEntityType)]; + action.entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)]; super({ store, action, - schema: cfEntityFactory(serviceInstancesWithspaceEntityType), + schema: cfEntityFactory(serviceInstancesWithSpaceEntityType), getRowUniqueId: getRowMetadata, paginationKey, // This would normally be fetched inline, however some of the SI's children will be missing if the SI was fetched by the org diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts b/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts index c7abb6d33a..e5346892a8 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instance-card/service-instance-card.component.ts @@ -77,7 +77,10 @@ export class ServiceInstanceCardComponent extends CardCell<APIResource<IServiceI this.cfOrgSpace = new CfOrgSpaceLabelService( this.store, this.cfGuid, - row.entity.space.entity.organization_guid, + // TODO: schemaKey - `space` is null due to the incorrect schema used when fetching the service instance + // (see service instance wall data source) + // row.entity.space.entity.organization_guid, + 'junk', row.entity.space_guid); } } diff --git a/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts b/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts index 544110dfa5..fa23f1b079 100644 --- a/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts +++ b/src/frontend/packages/core/src/shared/components/list/list-types/services-wall/service-instances-wall-list-config.service.ts @@ -6,6 +6,7 @@ import { serviceInstancesEntityType, userProvidedServiceInstanceEntityType, } from '../../../../../../../cloud-foundry/src/cf-entity-factory'; +import { getCFEntityKey } from '../../../../../../../cloud-foundry/src/cf-entity-helpers'; import { ListView } from '../../../../../../../store/src/actions/list.actions'; import { CFAppState } from '../../../../../../../store/src/app-state'; import { CurrentUserPermissionsService } from '../../../../../core/current-user-permissions.service'; @@ -38,8 +39,8 @@ export class ServiceInstancesWallListConfigService extends CfServiceInstancesLis enableTextFilter = true; defaultView = 'cards' as ListView; cardComponent = new CardMultiActionComponents({ - [serviceInstancesEntityType]: ServiceInstanceCardComponent, - [userProvidedServiceInstanceEntityType]: UserProvidedServiceInstanceCardComponent + [getCFEntityKey(serviceInstancesEntityType)]: ServiceInstanceCardComponent, + [getCFEntityKey(userProvidedServiceInstanceEntityType)]: UserProvidedServiceInstanceCardComponent }); viewType = ListViewTypes.BOTH; pageSizeOptions = defaultPaginationPageSizeOptionsCards; diff --git a/src/frontend/packages/core/src/shared/monitors/pagination-monitor.ts b/src/frontend/packages/core/src/shared/monitors/pagination-monitor.ts index 72f0165df8..6c067f6fba 100644 --- a/src/frontend/packages/core/src/shared/monitors/pagination-monitor.ts +++ b/src/frontend/packages/core/src/shared/monitors/pagination-monitor.ts @@ -14,18 +14,17 @@ import { withLatestFrom, } from 'rxjs/operators'; -import { GeneralEntityAppState, AppState, GeneralRequestDataState } from '../../../../store/src/app-state'; +import { AppState, GeneralEntityAppState, GeneralRequestDataState } from '../../../../store/src/app-state'; +import { EntitySchema } from '../../../../store/src/helpers/entity-schema'; import { ActionState, ListActionState } from '../../../../store/src/reducers/api-request-reducer/types'; import { getAPIRequestDataState, selectEntities } from '../../../../store/src/selectors/api.selectors'; import { selectPaginationState } from '../../../../store/src/selectors/pagination.selectors'; -import { BaseRequestDataState } from '../../../../store/src/types/entity.types'; import { PaginationEntityState } from '../../../../store/src/types/pagination.types'; -import { LocalPaginationHelpers } from '../components/list/data-sources-controllers/local-list.helpers'; -import { EntitySchema } from '../../../../store/src/helpers/entity-schema'; -import { EntityCatalogueHelpers } from '../../core/entity-catalogue/entity-catalogue.helper'; import { StratosBaseCatalogueEntity } from '../../core/entity-catalogue/entity-catalogue-entity'; +import { EntityCatalogueHelpers } from '../../core/entity-catalogue/entity-catalogue.helper'; import { entityCatalogue } from '../../core/entity-catalogue/entity-catalogue.service'; import { EntityCatalogueEntityConfig } from '../../core/entity-catalogue/entity-catalogue.types'; +import { LocalPaginationHelpers } from '../components/list/data-sources-controllers/local-list.helpers'; export class MultiActionListEntity { static getEntity(entity: MultiActionListEntity | any) { @@ -79,7 +78,7 @@ export class PaginationMonitor<T = any, Y extends AppState = GeneralEntityAppSta schemaKey = '' }: any ) { - // This is a static on the pagintion monitor rather than a member of StratosBaseCatalogueEntity due to + // This is a static on the pagintion monitor rather than a member of StratosBaseCatalogueEntity due to // a circular dependency on entityFactory from the getPageInfo function below. const schema = catalogueEntity.getSchema(schemaKey); return new PaginationMonitor(store, paginationKey, schema, isLocal); @@ -294,6 +293,7 @@ export class PaginationMonitor<T = any, Y extends AppState = GeneralEntityAppSta } private denormalizePage(page: string[], schema: normalizrSchema.Entity, allEntities: GeneralRequestDataState) { + // TODO: schemaKey - the schema passed must come from a correct EntityCatalogueEntityConfig with schemaKey populated return page.length ? denormalize(page, [schema], allEntities).filter(ent => !!ent) : []; diff --git a/src/frontend/packages/store/src/actions/service-instances.actions.ts b/src/frontend/packages/store/src/actions/service-instances.actions.ts index ef2a146385..0ccd14cf60 100644 --- a/src/frontend/packages/store/src/actions/service-instances.actions.ts +++ b/src/frontend/packages/store/src/actions/service-instances.actions.ts @@ -8,7 +8,7 @@ import { serviceBindingNoBindingsEntityType, serviceEntityType, serviceInstancesEntityType, - serviceInstancesWithspaceEntityType, + serviceInstancesWithSpaceEntityType, servicePlanEntityType, spaceEntityType, } from '../../../cloud-foundry/src/cf-entity-factory'; @@ -43,7 +43,7 @@ export class GetServiceInstances this.options.params = new URLSearchParams(); } actions = getActions('Service Instances', 'Get all'); - entity = [cfEntityFactory(serviceInstancesWithspaceEntityType)]; + entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)]; entityType = serviceInstancesEntityType; options: RequestOptions; initialParams = { @@ -70,7 +70,7 @@ export class GetServiceInstance this.options.params = new URLSearchParams(); } actions = getActions('Service Instances', 'Get particular instance'); - entity = [cfEntityFactory(serviceInstancesWithspaceEntityType)]; + entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)]; entityType = serviceInstancesEntityType; options: RequestOptions; } diff --git a/src/frontend/packages/store/src/actions/space.actions.ts b/src/frontend/packages/store/src/actions/space.actions.ts index 2beddc9dd3..8a1f229463 100644 --- a/src/frontend/packages/store/src/actions/space.actions.ts +++ b/src/frontend/packages/store/src/actions/space.actions.ts @@ -8,7 +8,7 @@ import { routeEntityType, serviceEntityType, serviceInstancesEntityType, - serviceInstancesWithspaceEntityType, + serviceInstancesWithSpaceEntityType, servicePlanEntityType, spaceEntityType, spaceWithOrgEntityType, @@ -273,7 +273,7 @@ export class GetServiceInstancesForSpace this.parentGuid = spaceGuid; } actions = getActions('Space', 'Get all service instances'); - entity = [cfEntityFactory(serviceInstancesWithspaceEntityType)]; + entity = [cfEntityFactory(serviceInstancesWithSpaceEntityType)]; entityType = serviceInstancesEntityType; options: RequestOptions; initialParams = {