diff --git a/hub-js/graphql/local/schema.graphql b/hub-js/graphql/local/schema.graphql index 838764257..db6c754db 100644 --- a/hub-js/graphql/local/schema.graphql +++ b/hub-js/graphql/local/schema.graphql @@ -503,7 +503,9 @@ type Mutation { RETURN specBackend ', ' - CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: apoc.convert.toJson(item.typeInstance.backend.context)}) + MATCH (latestRevision)-[:SPECIFIED_BY]->(latestSpec: TypeInstanceResourceVersionSpec) + MATCH (latestSpec)-[:WITH_BACKEND]->(oldSpecBackend:TypeInstanceResourceVersionSpecBackend) + CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: oldSpecBackend.context}) RETURN specBackend ', {spec:spec, latestRevision: latestRevision, item: item}) YIELD value as backendRef diff --git a/pkg/hub/api/graphql/local/schema_gen.go b/pkg/hub/api/graphql/local/schema_gen.go index 15e09761b..b572a979b 100644 --- a/pkg/hub/api/graphql/local/schema_gen.go +++ b/pkg/hub/api/graphql/local/schema_gen.go @@ -1103,7 +1103,9 @@ type Mutation { RETURN specBackend ', ' - CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: apoc.convert.toJson(item.typeInstance.backend.context)}) + MATCH (latestRevision)-[:SPECIFIED_BY]->(latestSpec: TypeInstanceResourceVersionSpec) + MATCH (latestSpec)-[:WITH_BACKEND]->(oldSpecBackend:TypeInstanceResourceVersionSpecBackend) + CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: oldSpecBackend.context}) RETURN specBackend ', {spec:spec, latestRevision: latestRevision, item: item}) YIELD value as backendRef @@ -1673,7 +1675,7 @@ func (ec *executionContext) _Mutation_updateTypeInstances(ctx context.Context, f return ec.resolvers.Mutation().UpdateTypeInstances(rctx, args["in"].([]*UpdateTypeInstancesInput)) } directive1 := func(ctx context.Context) (interface{}, error) { - statement, err := ec.unmarshalOString2áš–string(ctx, "CALL {\n UNWIND $in AS item\n RETURN collect(item.id) as allInputIDs\n}\n\n// Check if all TypeInstances were found\nWITH *\nCALL {\n WITH allInputIDs\n MATCH (ti:TypeInstance)\n WHERE ti.id IN allInputIDs\n WITH collect(ti.id) as foundIDs\n RETURN foundIDs\n}\nCALL apoc.util.validate(size(foundIDs) < size(allInputIDs), apoc.convert.toJson({code: 404, ids: foundIDs}), null)\n\n// Check if given TypeInstances are not already locked by others\nWITH *\nCALL {\n WITH *\n UNWIND $in AS item\n MATCH (tic:TypeInstance {id: item.id})\n WHERE tic.lockedBy IS NOT NULL AND (item.ownerID IS NULL OR tic.lockedBy <> item.ownerID)\n WITH collect(tic.id) as lockedIDs\n RETURN lockedIDs\n}\nCALL apoc.util.validate(size(lockedIDs) > 0, apoc.convert.toJson({code: 409, ids: lockedIDs}), null)\n\nUNWIND $in as item\nMATCH (ti: TypeInstance {id: item.id})\nCALL {\n WITH ti\n MATCH (ti)-[:CONTAINS]->(latestRevision:TypeInstanceResourceVersion)\n RETURN latestRevision\n ORDER BY latestRevision.resourceVersion DESC LIMIT 1\n}\n\nCREATE (tir: TypeInstanceResourceVersion {resourceVersion: latestRevision.resourceVersion + 1, createdBy: item.createdBy})\nCREATE (ti)-[:CONTAINS]->(tir)\n\n// Handle the `spec.value` property\nCREATE (spec: TypeInstanceResourceVersionSpec)\nCREATE (tir)-[:SPECIFIED_BY]->(spec)\n\nWITH ti, tir, spec, latestRevision, item\nMATCH (ti)-[:STORED_IN]->(storageRef:TypeInstanceBackendReference)\n\nWITH ti, tir, spec, latestRevision, item, storageRef\nCALL apoc.do.case([\n storageRef.abstract AND item.typeInstance.value IS NOT NULL, // built-in: store new value\n '\n SET spec.value = apoc.convert.toJson(item.typeInstance.value) RETURN spec\n ',\n storageRef.abstract AND item.typeInstance.value IS NULL, // built-in: no value, so use old one\n '\n MATCH (latestRevision)-[:SPECIFIED_BY]->(latestSpec: TypeInstanceResourceVersionSpec)\n SET spec.value = latestSpec.value RETURN spec\n '\n ],\n '\n RETURN spec // external storage, do nothing\n ',\n{spec:spec, latestRevision: latestRevision, item: item}) YIELD value\n\n// Handle the `backend.context`\nWITH ti, tir, spec, latestRevision, item\nCALL apoc.do.when(\n item.typeInstance.backend IS NOT NULL,\n '\n CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: apoc.convert.toJson(item.typeInstance.backend.context)})\n RETURN specBackend\n ',\n '\n CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: apoc.convert.toJson(item.typeInstance.backend.context)})\n RETURN specBackend\n ',\n{spec:spec, latestRevision: latestRevision, item: item}) YIELD value as backendRef\nWITH ti, tir, spec, latestRevision, item, backendRef.specBackend as specBackend\nCREATE (spec)-[:WITH_BACKEND]->(specBackend)\n\n// Handle the `metadata.attributes` property\nCREATE (metadata: TypeInstanceResourceVersionMetadata)\nCREATE (tir)-[:DESCRIBED_BY]->(metadata)\n\nWITH ti, tir, latestRevision, metadata, item\nCALL apoc.do.when(\n item.typeInstance.attributes IS NOT NULL,\n '\n FOREACH (attr in item.typeInstance.attributes |\n MERGE (attrRef: AttributeReference {path: attr.path, revision: attr.revision})\n CREATE (metadata)-[:CHARACTERIZED_BY]->(attrRef)\n )\n\n RETURN metadata\n ',\n '\n OPTIONAL MATCH (latestRevision)-[:DESCRIBED_BY]->(TypeInstanceResourceVersionMetadata)-[:CHARACTERIZED_BY]->(latestAttrRef: AttributeReference)\n WHERE latestAttrRef IS NOT NULL\n WITH *, COLLECT(latestAttrRef) AS latestAttrRefs\n FOREACH (attr in latestAttrRefs |\n CREATE (metadata)-[:CHARACTERIZED_BY]->(attr)\n )\n\n RETURN metadata\n ',\n {metadata: metadata, latestRevision: latestRevision, item: item}\n) YIELD value\n\nRETURN ti") + statement, err := ec.unmarshalOString2áš–string(ctx, "CALL {\n UNWIND $in AS item\n RETURN collect(item.id) as allInputIDs\n}\n\n// Check if all TypeInstances were found\nWITH *\nCALL {\n WITH allInputIDs\n MATCH (ti:TypeInstance)\n WHERE ti.id IN allInputIDs\n WITH collect(ti.id) as foundIDs\n RETURN foundIDs\n}\nCALL apoc.util.validate(size(foundIDs) < size(allInputIDs), apoc.convert.toJson({code: 404, ids: foundIDs}), null)\n\n// Check if given TypeInstances are not already locked by others\nWITH *\nCALL {\n WITH *\n UNWIND $in AS item\n MATCH (tic:TypeInstance {id: item.id})\n WHERE tic.lockedBy IS NOT NULL AND (item.ownerID IS NULL OR tic.lockedBy <> item.ownerID)\n WITH collect(tic.id) as lockedIDs\n RETURN lockedIDs\n}\nCALL apoc.util.validate(size(lockedIDs) > 0, apoc.convert.toJson({code: 409, ids: lockedIDs}), null)\n\nUNWIND $in as item\nMATCH (ti: TypeInstance {id: item.id})\nCALL {\n WITH ti\n MATCH (ti)-[:CONTAINS]->(latestRevision:TypeInstanceResourceVersion)\n RETURN latestRevision\n ORDER BY latestRevision.resourceVersion DESC LIMIT 1\n}\n\nCREATE (tir: TypeInstanceResourceVersion {resourceVersion: latestRevision.resourceVersion + 1, createdBy: item.createdBy})\nCREATE (ti)-[:CONTAINS]->(tir)\n\n// Handle the `spec.value` property\nCREATE (spec: TypeInstanceResourceVersionSpec)\nCREATE (tir)-[:SPECIFIED_BY]->(spec)\n\nWITH ti, tir, spec, latestRevision, item\nMATCH (ti)-[:STORED_IN]->(storageRef:TypeInstanceBackendReference)\n\nWITH ti, tir, spec, latestRevision, item, storageRef\nCALL apoc.do.case([\n storageRef.abstract AND item.typeInstance.value IS NOT NULL, // built-in: store new value\n '\n SET spec.value = apoc.convert.toJson(item.typeInstance.value) RETURN spec\n ',\n storageRef.abstract AND item.typeInstance.value IS NULL, // built-in: no value, so use old one\n '\n MATCH (latestRevision)-[:SPECIFIED_BY]->(latestSpec: TypeInstanceResourceVersionSpec)\n SET spec.value = latestSpec.value RETURN spec\n '\n ],\n '\n RETURN spec // external storage, do nothing\n ',\n{spec:spec, latestRevision: latestRevision, item: item}) YIELD value\n\n// Handle the `backend.context`\nWITH ti, tir, spec, latestRevision, item\nCALL apoc.do.when(\n item.typeInstance.backend IS NOT NULL,\n '\n CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: apoc.convert.toJson(item.typeInstance.backend.context)})\n RETURN specBackend\n ',\n '\n MATCH (latestRevision)-[:SPECIFIED_BY]->(latestSpec: TypeInstanceResourceVersionSpec)\n MATCH (latestSpec)-[:WITH_BACKEND]->(oldSpecBackend:TypeInstanceResourceVersionSpecBackend)\n CREATE (specBackend: TypeInstanceResourceVersionSpecBackend {context: oldSpecBackend.context})\n RETURN specBackend\n ',\n{spec:spec, latestRevision: latestRevision, item: item}) YIELD value as backendRef\nWITH ti, tir, spec, latestRevision, item, backendRef.specBackend as specBackend\nCREATE (spec)-[:WITH_BACKEND]->(specBackend)\n\n// Handle the `metadata.attributes` property\nCREATE (metadata: TypeInstanceResourceVersionMetadata)\nCREATE (tir)-[:DESCRIBED_BY]->(metadata)\n\nWITH ti, tir, latestRevision, metadata, item\nCALL apoc.do.when(\n item.typeInstance.attributes IS NOT NULL,\n '\n FOREACH (attr in item.typeInstance.attributes |\n MERGE (attrRef: AttributeReference {path: attr.path, revision: attr.revision})\n CREATE (metadata)-[:CHARACTERIZED_BY]->(attrRef)\n )\n\n RETURN metadata\n ',\n '\n OPTIONAL MATCH (latestRevision)-[:DESCRIBED_BY]->(TypeInstanceResourceVersionMetadata)-[:CHARACTERIZED_BY]->(latestAttrRef: AttributeReference)\n WHERE latestAttrRef IS NOT NULL\n WITH *, COLLECT(latestAttrRef) AS latestAttrRefs\n FOREACH (attr in latestAttrRefs |\n CREATE (metadata)-[:CHARACTERIZED_BY]->(attr)\n )\n\n RETURN metadata\n ',\n {metadata: metadata, latestRevision: latestRevision, item: item}\n) YIELD value\n\nRETURN ti") if err != nil { return nil, err }