diff --git a/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts b/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts index 13dbe52c2..47183bf2d 100644 --- a/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts +++ b/projects/observability/src/shared/graphql/request/builders/selections/observability-specification-builder.ts @@ -37,9 +37,10 @@ export class ObservabilitySpecificationBuilder extends SpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes?: string[] + additionalAttributes?: string[], + additionalSpecifications: Specification[] = [] ): EntitySpecification { - return this.entitySpecBuilder.build(idKey, nameKey, entityType, additionalAttributes); + return this.entitySpecBuilder.build(idKey, nameKey, entityType, additionalAttributes, additionalSpecifications); } public neighborAttributeSpecificationForKey( diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts index 2d83ad133..b4faf9711 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.test.ts @@ -1,4 +1,6 @@ import { entityIdKey, entityTypeKey, ObservabilityEntityType } from '../../../../model/schema/entity'; +import { TraceStatusType } from '../../../../model/schema/trace'; +import { TraceStatusSpecificationBuilder } from './../trace/trace-status/trace-status-specification-builder'; import { EntitySpecificationBuilder } from './entity-specification-builder'; describe('Entity Specification Builder', () => { @@ -69,6 +71,115 @@ describe('Entity Specification Builder', () => { }); }); + test('correctly builds entity specification with explicit entity type and additional specification', () => { + const traceSpec = new TraceStatusSpecificationBuilder().build(); + + const entitySpec = entitySpecificationBuilder.build( + 'id', + 'name', + ObservabilityEntityType.Api, + ['attribute1', 'attribute2'], + + [traceSpec] + ); + + expect(entitySpec.asGraphQlSelections()).toEqual([ + { + path: 'attribute', + alias: 'id', + arguments: [ + { + name: 'key', + value: 'id' + } + ] + }, + { + path: 'attribute', + alias: 'name', + arguments: [ + { + name: 'key', + value: 'name' + } + ] + }, + { + path: 'attribute', + alias: 'attribute1', + arguments: [ + { + name: 'key', + value: 'attribute1' + } + ] + }, + { + path: 'attribute', + alias: 'attribute2', + arguments: [ + { + name: 'key', + value: 'attribute2' + } + ] + }, + { + path: 'attribute', + alias: 'status', + arguments: [ + { + name: 'key', + value: 'status' + } + ] + }, + { + path: 'attribute', + alias: 'statusCode', + arguments: [ + { + name: 'key', + value: 'statusCode' + } + ] + }, + { + path: 'attribute', + alias: 'statusMessage', + arguments: [ + { + name: 'key', + value: 'statusMessage' + } + ] + } + ]); + + expect( + entitySpec.extractFromServerData({ + id: 'test-id', + name: 'test-name', + attribute1: 'test-value-attrib1', + attribute2: 'test-value-attrib2', + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' + }) + ).toEqual({ + [entityIdKey]: 'test-id', + [entityTypeKey]: ObservabilityEntityType.Api, + name: 'test-name', + attribute1: 'test-value-attrib1', + attribute2: 'test-value-attrib2', + [traceSpec.name]: { + status: TraceStatusType.FAIL, + statusCode: '404', + statusMessage: 'Not Found' + } + }); + }); + test('correctly builds entity specification without entity type', () => { const entitySpec = entitySpecificationBuilder.build('id', 'name'); diff --git a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts index e39250db5..0f46ffad4 100644 --- a/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts +++ b/projects/observability/src/shared/graphql/request/builders/specification/entity/entity-specification-builder.ts @@ -9,6 +9,7 @@ import { } from '../../../../model/schema/entity'; import { EntitySpecification } from '../../../../model/schema/specifications/entity-specification'; import { GraphQlArgumentBuilder } from '../../argument/graphql-argument-builder'; +import { Specification } from './../../../../model/schema/specifier/specification'; export class EntitySpecificationBuilder { private static readonly DEFAULT_TYPE_FIELD: string = 'type'; @@ -19,15 +20,29 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): EntitySpecification { return { resultAlias: () => this.buildResultAlias(idKey, nameKey, entityType), name: idKey, asGraphQlSelections: () => - this.buildGraphQlSelections(idKey, nameKey, entityType === undefined, additionalAttributes), + this.buildGraphQlSelections( + idKey, + nameKey, + entityType === undefined, + additionalAttributes, + additionalSpecifications + ), extractFromServerData: serverData => - this.extractFromServerData(serverData, idKey, nameKey, entityType, additionalAttributes), + this.extractFromServerData( + serverData, + idKey, + nameKey, + entityType, + additionalAttributes, + additionalSpecifications + ), asGraphQlOrderByFragment: () => ({ key: nameKey }) @@ -42,7 +57,8 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, withEntityType: boolean, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): GraphQlSelection[] { const graphqlSelections: GraphQlSelection[] = [ { @@ -59,7 +75,8 @@ export class EntitySpecificationBuilder { path: 'attribute', alias: attribute, arguments: [this.argBuilder.forAttributeKey(attribute)] - })) + })), + ...additionalSpecifications.map(specification => specification.asGraphQlSelections()).flat() ]; if (withEntityType) { @@ -74,7 +91,8 @@ export class EntitySpecificationBuilder { idKey: string, nameKey: string, entityType?: EntityType, - additionalAttributes: string[] = [] + additionalAttributes: string[] = [], + additionalSpecifications: Specification[] = [] ): Entity { let entity = { [entityIdKey]: serverData[idKey] as string, @@ -85,6 +103,10 @@ export class EntitySpecificationBuilder { entity = { ...entity, [attribute]: serverData[attribute] }; }); + additionalSpecifications.forEach(specification => { + entity = { ...entity, [specification.name]: specification.extractFromServerData(serverData) }; + }); + return entity; }