WITH 'graphql-participant/update-label-participant/' + $cypherParams.identityId AS by MATCH (globalVendor:Vendor {id:'*'}) MATCH (label)-[:HAS_LABEL_PARTICIPANT]->(lp:LabelParticipant { uuid: $id }) WHERE id(label) IN $cypherParams.permittedLabelNodeIds OR id(globalVendor) IN $cypherParams.permittedLabelNodeIds SET lp += apoc.map.removeKeys($input, ['name', 'spotifyId']), lp.spotifyId = COALESCE($input.spotifyId, lp.spotifyId), lp.lastModifiedAt = datetime(), lp.lastModifiedBy = by FOREACH (hasSpotifyId IN CASE WHEN lp.spotifyId IS NOT NULL THEN [1] ELSE [] END | MERGE (gp:GlobalParticipant {spotifyId: lp.spotifyId}) ON CREATE SET gp.id = randomUUID(), gp.name = lp.name, gp.appleMusicId = lp.appleMusicId, gp.createdAt = datetime(), gp.createdBy = by MERGE (gp)-[gpToLp:REPRESENTS]->(lp) ON CREATE SET gpToLp.createdAt = datetime(), gpToLp.createdBy = by ON MATCH SET gpToLp.lastModifiedAt = datetime(), gpToLp.lastModifiedBy = by ) WITH * OPTIONAL MATCH (oldGp:GlobalParticipant)-[oldRepresents:REPRESENTS]->(lp) WHERE oldGp.spotifyId <> lp.spotifyId OR COALESCE(lp.spotifyId, '') = '' FOREACH (hasOldGp IN CASE WHEN oldGp IS NOT NULL THEN [1] ELSE [] END | MERGE (oldGp)-[deletedRepresents:DELETED_REPRESENTS]->(lp) SET deletedRepresents.deletedAt = datetime(), deletedRepresents.deletedBy = by DELETE oldRepresents ) RETURN lp