import { CreateCompassComponentRelationship, CreateCompassRelationshipInput, DeleteCompassComponentRelationship, DeleteCompassRelationshipInput, Relationship, } from '@atlassian/forge-graphql-types'; import { GqlSegment } from './types'; import constructGqlSegmentFromArray from '../constructGqlSegmentFromArray'; import generateMutationGql from '../generateMutationGql'; function isRelationshipEqual(a: Relationship, b: Relationship) { return a.type === b.type && a.nodeId === b.nodeId; } function transformIntoDeleteRelationshipInput( item: Relationship, componentId: string, ): DeleteCompassRelationshipInput { const { type, nodeId } = item; return { type, startNodeId: componentId, endNodeId: nodeId, }; } function transformIntoCreateRelationshipInput( item: Relationship, componentId: string, ): CreateCompassRelationshipInput { const { type, nodeId } = item; return { type, startNodeId: componentId, endNodeId: nodeId, }; } export default function updateRelationshipsSegment( componentId: string, oldRelationships: Array = [], newRelationships: Array = undefined, ): GqlSegment { let segmentAcc = { mutation: '', parameters: [] as Array, variables: {} as Record, }; // if newRelationships is null, remove existing relationships if (newRelationships === undefined) { return segmentAcc; } newRelationships = newRelationships || []; console.log(oldRelationships); console.log(newRelationships); const relationshipsInBoth = oldRelationships.filter((existingRelationship) => newRelationships.some((newRelationship) => isRelationshipEqual(newRelationship, existingRelationship), ), ); const toBeCreated = newRelationships.filter( (newRelationship) => !relationshipsInBoth.some((overlapRelationship) => isRelationshipEqual(overlapRelationship, newRelationship), ), ); const toBeRemoved = oldRelationships.filter( (oldRelationship) => !relationshipsInBoth.some((overlapRelationship) => isRelationshipEqual(overlapRelationship, oldRelationship), ), ); const createRelationshipGqlSegment = () => generateMutationGql( CreateCompassComponentRelationship, 'createRelationship', ); const deleteRelationshipGqlSegment = () => generateMutationGql( DeleteCompassComponentRelationship, 'deleteRelationship', ); if (toBeRemoved.length > 0) { segmentAcc = constructGqlSegmentFromArray( toBeRemoved, deleteRelationshipGqlSegment, transformIntoDeleteRelationshipInput, segmentAcc, componentId, ); } if (toBeCreated.length > 0) { segmentAcc = constructGqlSegmentFromArray( toBeCreated, createRelationshipGqlSegment, transformIntoCreateRelationshipInput, segmentAcc, componentId, ); } return segmentAcc; }