From 13e652a419b1e239233040192696b644ab0f2172 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Thu, 29 Feb 2024 16:17:37 +0100 Subject: [PATCH 01/10] feat: hidden-graph add flag to Cube Metadata (cc:isHiddenCube) --- apis/core/bootstrap/shapes/dataset.ts | 15 ++++++++++++++- packages/core/namespace.ts | 3 ++- packages/model/Dataset.ts | 4 ++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/apis/core/bootstrap/shapes/dataset.ts b/apis/core/bootstrap/shapes/dataset.ts index c0ad13f99..5a146bb0e 100644 --- a/apis/core/bootstrap/shapes/dataset.ts +++ b/apis/core/bootstrap/shapes/dataset.ts @@ -1,4 +1,4 @@ -import { shape, editor, lindasSchema } from '@cube-creator/core/namespace' +import { shape, editor, lindasSchema, cc } from '@cube-creator/core/namespace' import { supportedLanguages } from '@cube-creator/core/languages' import { hydra, rdfs, sh, dcat, dcterms, xsd, rdf, vcard, schema, _void, dash, skos } from '@tpluscode/rdf-ns-builders' import { sparql, turtle } from '@tpluscode/rdf-string' @@ -209,6 +209,19 @@ ${shapeId} { ${sh.description} "Only published datasets will be listed in the external tools. A draft will be nevertheless be public." ; ${sh.group} ${mainGroup} ; ] ; + + ${sh.property} [ + ${sh.name} "Hide this cube?" ; + ${sh.path} ${cc.isHiddenCube} ; + ${sh.datatype} ${xsd.boolean} ; + ${sh.defaultValue} ${false} ; + ${sh.minCount} 1 ; + ${sh.maxCount} 1 ; + ${sh.order} 31 ; + ${sh.description} "Hidden cubes are only visible in *visualize* for logged-in users" ; + ${sh.group} ${mainGroup} ; + ] ; + ${sh.property} [ ${sh.name} "Publish to" ; ${sh.path} ${schema.workExample} ; diff --git a/packages/core/namespace.ts b/packages/core/namespace.ts index 39ca5c27c..ff54c8c99 100644 --- a/packages/core/namespace.ts +++ b/packages/core/namespace.ts @@ -83,7 +83,8 @@ type CubeCreatorProperty = 'export' | 'projectDetails' | 'validationReport' | - 'batchMapping' + 'batchMapping' | + 'isHiddenCube' type OtherTerms = 'dash' | diff --git a/packages/model/Dataset.ts b/packages/model/Dataset.ts index 44b6c4029..a21e26aaf 100644 --- a/packages/model/Dataset.ts +++ b/packages/model/Dataset.ts @@ -16,6 +16,7 @@ export interface Dataset extends RdfResource { title: Literal[] created: Date published: Date + isHiddenCube: boolean } export const Error = { @@ -43,6 +44,9 @@ export function DatasetMixin(Resource: Base): Mixin { @property.literal({ path: schema.datePublished, type: Date, datatype: xsd.date }) published!: Date + + @property.literal({ path: cc.isHiddenCube, datatype: xsd.boolean }) + isHiddenCube!: boolean } return Impl From d93e2e061791d22aeea24f5321b89ef563fdfadf Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Thu, 29 Feb 2024 16:22:15 +0100 Subject: [PATCH 02/10] feat: hidden-graph PublishJob: conditional publishGraph IRI --- apis/core/lib/domain/job/create.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apis/core/lib/domain/job/create.ts b/apis/core/lib/domain/job/create.ts index 4f352947b..ec5d82dbc 100644 --- a/apis/core/lib/domain/job/create.ts +++ b/apis/core/lib/domain/job/create.ts @@ -76,12 +76,14 @@ export async function createPublishJob({ const metadata = await store.getResource(project.dataset) + const targetGraph = metadata.isHiddenCube ? $rdf.namedNode(organization.publishGraph.value + '/hidden') : organization.publishGraph + const jobPointer = await store.createMember(jobCollection.term, id.job(jobCollection)) const job = Job.createPublish(jobPointer, { project: projectPointer, name: 'Publish job', revision: project.nextRevision, - publishGraph: organization.publishGraph, + publishGraph: targetGraph, status: metadata?.pointer.out(schema.creativeWorkStatus).term, publishedTo: metadata?.pointer.out(schema.workExample).term, }) From dcf70653e993e9903e66b8c7b7e0f91e7c14fc06 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Wed, 6 Mar 2024 19:04:54 +0100 Subject: [PATCH 03/10] feat: hidden-graph move flag from Cube Metadata to Project (cc:isHiddenCube) --- apis/core/bootstrap/shapes/cube-project.ts | 12 +++++++++++- apis/core/bootstrap/shapes/dataset.ts | 15 +-------------- apis/core/lib/domain/job/create.ts | 2 +- packages/model/Dataset.ts | 4 ---- packages/model/Project.ts | 6 +++++- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/apis/core/bootstrap/shapes/cube-project.ts b/apis/core/bootstrap/shapes/cube-project.ts index af9ab29f4..99ac1601d 100644 --- a/apis/core/bootstrap/shapes/cube-project.ts +++ b/apis/core/bootstrap/shapes/cube-project.ts @@ -1,5 +1,5 @@ import { cc, sh1, shape, editor } from '@cube-creator/core/namespace' -import { dash, dcterms, hydra, rdf, rdfs, schema, sh } from '@tpluscode/rdf-ns-builders' +import { dash, dcterms, hydra, rdf, rdfs, schema, sh, xsd } from '@tpluscode/rdf-ns-builders' import { turtle } from '@tpluscode/rdf-string' import $rdf from 'rdf-ext' @@ -144,6 +144,16 @@ const projectProperties = ({ xoneAlternatives = [] }: { xoneAlternatives?: unkno ${hydra.collection} ; ${sh.order} 20 ; ] ; + ${sh.property} [ + ${sh.name} "Hide this cube?" ; + ${sh.description} "Hidden cubes are only visible in *visualize* for logged-in users" ; + ${sh.path} ${cc.isHiddenCube} ; + ${sh.datatype} ${xsd.boolean} ; + ${sh.defaultValue} ${true} ; + ${sh.minCount} 1 ; + ${sh.maxCount} 1 ; + ${sh.order} 21 ; + ] ; ${sh.xone} ( ${xoneAlternatives} ) ;` export const CubeProjectShape = turtle` diff --git a/apis/core/bootstrap/shapes/dataset.ts b/apis/core/bootstrap/shapes/dataset.ts index 5a146bb0e..c0ad13f99 100644 --- a/apis/core/bootstrap/shapes/dataset.ts +++ b/apis/core/bootstrap/shapes/dataset.ts @@ -1,4 +1,4 @@ -import { shape, editor, lindasSchema, cc } from '@cube-creator/core/namespace' +import { shape, editor, lindasSchema } from '@cube-creator/core/namespace' import { supportedLanguages } from '@cube-creator/core/languages' import { hydra, rdfs, sh, dcat, dcterms, xsd, rdf, vcard, schema, _void, dash, skos } from '@tpluscode/rdf-ns-builders' import { sparql, turtle } from '@tpluscode/rdf-string' @@ -209,19 +209,6 @@ ${shapeId} { ${sh.description} "Only published datasets will be listed in the external tools. A draft will be nevertheless be public." ; ${sh.group} ${mainGroup} ; ] ; - - ${sh.property} [ - ${sh.name} "Hide this cube?" ; - ${sh.path} ${cc.isHiddenCube} ; - ${sh.datatype} ${xsd.boolean} ; - ${sh.defaultValue} ${false} ; - ${sh.minCount} 1 ; - ${sh.maxCount} 1 ; - ${sh.order} 31 ; - ${sh.description} "Hidden cubes are only visible in *visualize* for logged-in users" ; - ${sh.group} ${mainGroup} ; - ] ; - ${sh.property} [ ${sh.name} "Publish to" ; ${sh.path} ${schema.workExample} ; diff --git a/apis/core/lib/domain/job/create.ts b/apis/core/lib/domain/job/create.ts index ec5d82dbc..02640c311 100644 --- a/apis/core/lib/domain/job/create.ts +++ b/apis/core/lib/domain/job/create.ts @@ -76,7 +76,7 @@ export async function createPublishJob({ const metadata = await store.getResource(project.dataset) - const targetGraph = metadata.isHiddenCube ? $rdf.namedNode(organization.publishGraph.value + '/hidden') : organization.publishGraph + const targetGraph = project.isHiddenCube ? $rdf.namedNode(organization.publishGraph.value + '/hidden') : organization.publishGraph const jobPointer = await store.createMember(jobCollection.term, id.job(jobCollection)) const job = Job.createPublish(jobPointer, { diff --git a/packages/model/Dataset.ts b/packages/model/Dataset.ts index a21e26aaf..44b6c4029 100644 --- a/packages/model/Dataset.ts +++ b/packages/model/Dataset.ts @@ -16,7 +16,6 @@ export interface Dataset extends RdfResource { title: Literal[] created: Date published: Date - isHiddenCube: boolean } export const Error = { @@ -44,9 +43,6 @@ export function DatasetMixin(Resource: Base): Mixin { @property.literal({ path: schema.datePublished, type: Date, datatype: xsd.date }) published!: Date - - @property.literal({ path: cc.isHiddenCube, datatype: xsd.boolean }) - isHiddenCube!: boolean } return Impl diff --git a/packages/model/Project.ts b/packages/model/Project.ts index 7906e89ad..cf23408cf 100644 --- a/packages/model/Project.ts +++ b/packages/model/Project.ts @@ -5,7 +5,7 @@ import type { GraphPointer } from 'clownface' import RdfResourceImpl, { Initializer, RdfResourceCore } from '@tpluscode/rdfine/RdfResource' import { Mixin } from '@tpluscode/rdfine/lib/ResourceFactory' import { cc, lindasSchema } from '@cube-creator/core/namespace' -import { dcterms, schema } from '@tpluscode/rdf-ns-builders' +import { dcterms, schema, xsd } from '@tpluscode/rdf-ns-builders' import { Organization, Person, PersonMixin } from '@rdfine/schema' import type { Collection } from '@rdfine/hydra' import { initializer } from './lib/initializer' @@ -28,6 +28,7 @@ export interface Project extends RdfResource { export: Link details: Link plannedNextUpdate?: Date + isHiddenCube: boolean } export interface CsvProject extends Project { @@ -97,6 +98,9 @@ export function ProjectMixin(base: Base): Mixin { @property.literal({ path: lindasSchema.datasetNextDateModified, type: Date }) plannedNextUpdate?: Date + + @property.literal({ path: cc.isHiddenCube, datatype: xsd.boolean }) + isHiddenCube!: boolean } return Impl From aa004c0f516f6972786f7b20882af544cf6acb31 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Thu, 7 Mar 2024 16:19:05 +0100 Subject: [PATCH 04/10] feat: hidden-graph add flag to the published cubes metadata (cc:isHiddenCube) --- cli/lib/commands/publish.ts | 5 ++++- cli/lib/publish/hiddenCube.ts | 25 +++++++++++++++++++++++++ cli/lib/variables.ts | 1 + cli/pipelines/publish.ttl | 6 ++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 cli/lib/publish/hiddenCube.ts diff --git a/cli/lib/commands/publish.ts b/cli/lib/commands/publish.ts index e8d4a8292..79c8216d1 100644 --- a/cli/lib/commands/publish.ts +++ b/cli/lib/commands/publish.ts @@ -29,7 +29,7 @@ export default runner.create({ const { publishStore, job: jobUri } = options const Hydra = variable.get('apiClient') - const { job, namespace, cubeIdentifier, cubeCreatorVersion } = await getJob(jobUri, Hydra) + const { job, namespace, cubeIdentifier, cubeCreatorVersion, isHiddenCube } = await getJob(jobUri, Hydra) if (options.to === 'filesystem' && !variable.has('targetFile')) { variable.set('targetFile', tempy.file()) @@ -59,6 +59,7 @@ export default runner.create({ variable.set('revision', job.revision) variable.set('namespace', namespace) variable.set('cubeIdentifier', cubeIdentifier) + variable.set('isHiddenCube', isHiddenCube) logger.info(`Publishing cube <${cubeIdentifier}>`) }, async after(options, variables) { @@ -77,6 +78,7 @@ async function getJob(jobUri: string, Hydra: HydraClient): Promise<{ namespace: string cubeIdentifier: string cubeCreatorVersion: string | undefined | null + isHiddenCube: boolean }> { const jobResource = await Hydra.loadResource(jobUri) const cubeCreatorVersion = jobResource.response?.xhr.headers.get('x-cube-creator') @@ -105,5 +107,6 @@ async function getJob(jobUri: string, Hydra: HydraClient): Promise<{ namespace: datasetResource.representation?.root?.hasPart[0].id.value, cubeIdentifier, cubeCreatorVersion, + isHiddenCube: project.isHiddenCube, } } diff --git a/cli/lib/publish/hiddenCube.ts b/cli/lib/publish/hiddenCube.ts new file mode 100644 index 000000000..96f77013b --- /dev/null +++ b/cli/lib/publish/hiddenCube.ts @@ -0,0 +1,25 @@ +import type { Context } from 'barnard59-core/lib/Pipeline' +import $rdf from 'rdf-ext' +import through2 from 'through2' +import clownface from 'clownface' +import { cc } from '@cube-creator/core/namespace' + +export function inject(this: Pick) { + const isHiddenCube = this.variables.get('isHiddenCube') + const cubeNamespace = this.variables.get('namespace') + const revision = this.variables.get('revision') + + const cubeId = $rdf.namedNode(`${cubeNamespace}/${revision}`) + + const dataset = $rdf.dataset() + clownface({ dataset }) + .node(cubeId) + .addOut(cc.isHiddenCube, !!isHiddenCube) + + return through2.obj( + (chunk, enc, cb) => cb(null, chunk), + function (done) { + dataset.forEach(this.push.bind(this)) + done() + }) +} diff --git a/cli/lib/variables.ts b/cli/lib/variables.ts index e72a51abe..cde95a76b 100644 --- a/cli/lib/variables.ts +++ b/cli/lib/variables.ts @@ -39,5 +39,6 @@ declare module 'barnard59-core' { originalValueQuads: DatasetExt cubeCreatorVersion: string cliVersion: string + isHiddenCube: boolean } } diff --git a/cli/pipelines/publish.ttl b/cli/pipelines/publish.ttl index 22d39e94e..1f2160029 100644 --- a/cli/pipelines/publish.ttl +++ b/cli/pipelines/publish.ttl @@ -49,6 +49,7 @@ :steps [ :stepList ( <#loadCube> <#countInputQuads> <#injectCubeRevision> + <#injectIsHiddenCube> <#injectObservedBy> <#injectSoftwareVersions> ) ] @@ -245,6 +246,11 @@ _:get a code:EcmaScript ] ; code:arguments ( "jobUri"^^:VariableName ) . +<#injectIsHiddenCube> + a :Step ; + code:implementedBy [ code:link ; + a code:EcmaScript ] . + <#injectSoftwareVersions> a :Step ; code:implementedBy [ code:link ; From 1366665ca0760cde3c11b42317f9f96ea3b7cb61 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Mon, 11 Mar 2024 16:25:23 +0100 Subject: [PATCH 05/10] feat: hidden-graph fix create/update of project to have flag persisted --- apis/core/bootstrap/shapes/cube-project.ts | 3 +++ apis/core/lib/domain/cube-projects/Project.ts | 9 +++++++++ apis/core/lib/domain/cube-projects/create.ts | 14 ++++++++++++-- apis/core/lib/domain/cube-projects/update.ts | 1 + packages/model/Project.ts | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/apis/core/bootstrap/shapes/cube-project.ts b/apis/core/bootstrap/shapes/cube-project.ts index 99ac1601d..d7e89519b 100644 --- a/apis/core/bootstrap/shapes/cube-project.ts +++ b/apis/core/bootstrap/shapes/cube-project.ts @@ -22,6 +22,7 @@ const csvCubeShape = turtle` ${sh.ignoredProperties} ( ${rdfs.label} ${schema.maintainer} + ${cc.isHiddenCube} ${rdf.type} ${generatedProperties} ) ; @@ -49,6 +50,7 @@ const existingCubeShape = turtle` ${sh.ignoredProperties} ( ${rdfs.label} ${schema.maintainer} + ${cc.isHiddenCube} ${rdf.type} ${generatedProperties} ) ; @@ -95,6 +97,7 @@ const importedCubeShape = turtle` ${sh.ignoredProperties} ( ${rdfs.label} ${schema.maintainer} + ${cc.isHiddenCube} ${rdf.type} ${generatedProperties} ) ; diff --git a/apis/core/lib/domain/cube-projects/Project.ts b/apis/core/lib/domain/cube-projects/Project.ts index 5986a071a..cf3f9975e 100644 --- a/apis/core/lib/domain/cube-projects/Project.ts +++ b/apis/core/lib/domain/cube-projects/Project.ts @@ -16,6 +16,7 @@ interface ApiProject { initializeJobCollection(store: ResourceStore): void incrementPublishedRevision(): void updateMaintainer(organization: Term | undefined): { before: Term; after: Term } + updateIsHiddenCube(hiddenCube: Term | undefined): void rename(name: string | undefined): void } @@ -91,6 +92,14 @@ export function ProjectMixin { label: string maintainer: NamedNode + isHiddenCube: boolean projectNode: GraphPointer } -async function createCsvProjectResource({ user, projectNode, store, label, maintainer, resource }: CreateProjectResource) { +async function createCsvProjectResource({ user, projectNode, store, label, maintainer, isHiddenCube, resource }: CreateProjectResource) { const cubeIdentifier = resource.out(dcterms.identifier).value if (!cubeIdentifier) { throw new Error('Missing cube identifier name') @@ -45,6 +46,7 @@ async function createCsvProjectResource({ user, projectNode, store, label, maint creator: user, label, maintainer, + isHiddenCube, cubeIdentifier, sourceKind, }) @@ -60,7 +62,7 @@ async function createCsvProjectResource({ user, projectNode, store, label, maint return { project, dataset } } -async function createImportProjectResources({ resource, user, projectNode, store, label, maintainer }: CreateProjectResource) { +async function createImportProjectResources({ resource, user, projectNode, store, label, maintainer, isHiddenCube }: CreateProjectResource) { const sourceCube = resource.out(cc['CubeProject/sourceCube']).term if (sourceCube?.termType !== 'NamedNode') { throw new Error('Missing cube identifier') @@ -91,6 +93,7 @@ async function createImportProjectResources({ resource, user, projectNode, store creator: user, label, maintainer, + isHiddenCube, sourceCube, sourceEndpoint, sourceGraph, @@ -124,6 +127,11 @@ export async function createProject({ if (!maintainer || maintainer.termType !== 'NamedNode') { throw new DomainError('Missing organization or not a named node') } + const hiddenCube = resource.out(cc.isHiddenCube).term + if (!hiddenCube || hiddenCube.termType !== 'Literal' || hiddenCube.datatype.value !== 'http://www.w3.org/2001/XMLSchema#boolean') { + throw new DomainError('Missing flag isHiddenCube or not a boolean') + } + const isHiddenCube = hiddenCube.value === 'true' let project: Project.Project let dataset: Dataset.Dataset @@ -140,6 +148,7 @@ export async function createProject({ store, label, maintainer, + isHiddenCube, resource, })) } else if (isImportProject) { @@ -150,6 +159,7 @@ export async function createProject({ resource, label, maintainer, + isHiddenCube, })) } else { throw new error.BadRequest(`Unexpected value of ${cc.projectSourceKind.value}`) diff --git a/apis/core/lib/domain/cube-projects/update.ts b/apis/core/lib/domain/cube-projects/update.ts index 0fcf5f474..2e062ab95 100644 --- a/apis/core/lib/domain/cube-projects/update.ts +++ b/apis/core/lib/domain/cube-projects/update.ts @@ -23,6 +23,7 @@ export async function updateProject({ const project = await store.getResource(resource.term) project.rename(resource.out(rdfs.label).value) + project.updateIsHiddenCube(resource.out(cc.isHiddenCube).term) const maintainer = project.updateMaintainer(resource.out(schema.maintainer).term) let currentCube: NamedNode diff --git a/packages/model/Project.ts b/packages/model/Project.ts index cf23408cf..cf080ca69 100644 --- a/packages/model/Project.ts +++ b/packages/model/Project.ts @@ -108,7 +108,7 @@ export function ProjectMixin(base: Base): Mixin { ProjectMixin.appliesTo = cc.CubeProject -type MinimalFields = 'creator' | 'label' | 'maintainer' +type MinimalFields = 'creator' | 'label' | 'maintainer' | 'isHiddenCube' export const createMinimalProject = initializer(ProjectMixin) type CsvProjectMandatoryFields = MinimalFields | 'cubeIdentifier' | 'sourceKind' From 353ca8b59145963141363ec2bd49664886eaeb54 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Tue, 12 Mar 2024 09:32:00 +0100 Subject: [PATCH 06/10] feat: hidden-graph complete the property decorator with appropriate type declaration --- packages/model/Project.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/model/Project.ts b/packages/model/Project.ts index cf080ca69..aae6f100c 100644 --- a/packages/model/Project.ts +++ b/packages/model/Project.ts @@ -99,7 +99,7 @@ export function ProjectMixin(base: Base): Mixin { @property.literal({ path: lindasSchema.datasetNextDateModified, type: Date }) plannedNextUpdate?: Date - @property.literal({ path: cc.isHiddenCube, datatype: xsd.boolean }) + @property.literal({ path: cc.isHiddenCube, datatype: xsd.boolean, type: Boolean }) isHiddenCube!: boolean } From 7d9e9e5802abf6aa5d07cc2598d10e67e340caf9 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Wed, 13 Mar 2024 15:00:52 +0100 Subject: [PATCH 07/10] feat: hidden-graph fix build error --- apis/core/lib/domain/cube-projects/import.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apis/core/lib/domain/cube-projects/import.ts b/apis/core/lib/domain/cube-projects/import.ts index 0c20f319d..2cc6ee363 100644 --- a/apis/core/lib/domain/cube-projects/import.ts +++ b/apis/core/lib/domain/cube-projects/import.ts @@ -97,12 +97,18 @@ export async function importProject({ if (!maintainer) { throw new BadRequest('Missing organization') } + const hiddenCube = resource.out(cc.isHiddenCube).term + if (!hiddenCube || hiddenCube.termType !== 'Literal' || hiddenCube.datatype.value !== 'http://www.w3.org/2001/XMLSchema#boolean') { + throw new DomainError('Missing flag isHiddenCube or not a boolean') + } + const isHiddenCube = hiddenCube.value === 'true' const projectNode = await store.createMember(projectsCollection.term, id.cubeProject(label)) const project = createMinimalProject(projectNode, { creator: user, maintainer, + isHiddenCube, label, }) From b380cca90109479218df7c7c333fb1438b183d08 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Wed, 13 Mar 2024 15:40:51 +0100 Subject: [PATCH 08/10] feat: hidden-graph fix unit-tests --- .../test/domain/cube-projects/create.test.ts | 20 +++++++++++++++++++ .../test/domain/cube-projects/import.test.ts | 1 + .../test/domain/cube-projects/update.test.ts | 19 ++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/apis/core/test/domain/cube-projects/create.test.ts b/apis/core/test/domain/cube-projects/create.test.ts index c5962e2bc..47b70f08b 100644 --- a/apis/core/test/domain/cube-projects/create.test.ts +++ b/apis/core/test/domain/cube-projects/create.test.ts @@ -52,6 +52,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(dcterms.identifier, 'ubd/28') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -73,6 +74,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(dcterms.identifier, 'ubd/28') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -130,6 +132,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(dcterms.identifier, 'ubd/28') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -155,6 +158,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(dcterms.identifier, 'ubd/28') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -205,6 +209,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(dcterms.identifier, 'ubd/28') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -222,6 +227,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(schema.maintainer, organization.id) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -239,6 +245,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(schema.maintainer, organization.id) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -255,6 +262,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(schema.maintainer, organization.id) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -271,6 +279,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(schema.maintainer, organization.id) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) // when @@ -287,6 +296,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(schema.maintainer, organization.id) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(cc.publishGraph, $rdf.namedNode('http://example.com/published-cube')) .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) @@ -318,6 +328,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(schema.maintainer, organization.id) // when @@ -350,6 +361,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(schema.maintainer, organization.id) // when @@ -388,6 +400,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(schema.maintainer, organization.id) // when @@ -435,6 +448,7 @@ describe('domain/cube-projects/create', () => { .addOut(rdfs.label, 'Foo bar project') .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) .addOut(dcterms.identifier, 'ubd/28') + .addOut(cc.isHiddenCube, true) .addOut(schema.maintainer, organization.id) // when @@ -486,6 +500,7 @@ describe('domain/cube-projects/create', () => { .addOut(cc['CubeProject/sourceCube'], $rdf.namedNode('http://example.cube/')) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://example.endpoint/')) .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) // when const { project } = await createProject({ resource, store, projectsCollection, user }) @@ -503,6 +518,7 @@ describe('domain/cube-projects/create', () => { .addOut(cc['CubeProject/sourceCube'], $rdf.namedNode('http://example.cube/')) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://example.endpoint/')) .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) // when const { project } = await createProject({ resource, store, projectsCollection, user }) @@ -517,6 +533,7 @@ describe('domain/cube-projects/create', () => { .namedNode('') .addOut(rdfs.label, 'Import project') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://example.endpoint/')) .addOut(cc.projectSourceKind, cc['projectSourceKind/ExistingCube']) @@ -533,6 +550,7 @@ describe('domain/cube-projects/create', () => { .namedNode('') .addOut(rdfs.label, 'Import project') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc['CubeProject/sourceCube'], $rdf.literal('http://example.cube/')) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://example.endpoint/')) .addOut(cc.projectSourceKind, cc['projectSourceKind/ExistingCube']) @@ -550,6 +568,7 @@ describe('domain/cube-projects/create', () => { .namedNode('') .addOut(rdfs.label, 'Import project') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc['CubeProject/sourceCube'], $rdf.namedNode('http://example.cube/')) .addOut(cc.projectSourceKind, cc['projectSourceKind/ExistingCube']) @@ -566,6 +585,7 @@ describe('domain/cube-projects/create', () => { .namedNode('') .addOut(rdfs.label, 'Import project') .addOut(schema.maintainer, organization.id) + .addOut(cc.isHiddenCube, true) .addOut(cc['CubeProject/sourceCube'], $rdf.namedNode('http://example.cube/')) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://example.endpoint/')) .addOut(cc.publishGraph, $rdf.namedNode('http://example.com/published-cube')) diff --git a/apis/core/test/domain/cube-projects/import.test.ts b/apis/core/test/domain/cube-projects/import.test.ts index d2ff8d806..2cbd894d2 100644 --- a/apis/core/test/domain/cube-projects/import.test.ts +++ b/apis/core/test/domain/cube-projects/import.test.ts @@ -32,6 +32,7 @@ describe('@cube-creator/core-api/lib/domain/cube-projects/import', () => { resource = blankNode() .addOut(rdfs.label, 'UBD Imported') .addOut(schema.maintainer, ex.Bafu) + .addOut(cc.isHiddenCube, true) const organization = namedNode(ex.Bafu) .addOut(rdf.type, schema.Organization) .addOut(cc.namespace, $rdf.namedNode('https://test.ld.admin.ch/org/')) diff --git a/apis/core/test/domain/cube-projects/update.test.ts b/apis/core/test/domain/cube-projects/update.test.ts index f4c5970ca..62a4da241 100644 --- a/apis/core/test/domain/cube-projects/update.test.ts +++ b/apis/core/test/domain/cube-projects/update.test.ts @@ -55,6 +55,7 @@ describe('domain/cube-projects/update', () => { .node(id) .addOut(rdfs.label, 'Created name') .addOut(schema.maintainer, bafu.id) + .addOut(cc.isHiddenCube, true) .addOut(dcterms.identifier, 'cube') .addOut(cc.projectSourceKind, cc['projectSourceKind/CSV']) } @@ -101,6 +102,23 @@ describe('domain/cube-projects/update', () => { expect(editedProject.pointer.out(rdfs.label).term?.value).to.eq('Edited name') }) + it('updates isHiddenCube', async () => { + // given + const resource = projectPointer(project.term) + resource + .deleteOut(cc.isHiddenCube) + .addOut(cc.isHiddenCube, false) + + // when + const editedProject = await updateProject({ + resource, + store, + }) + + // then + expect(editedProject.pointer.out(cc.isHiddenCube).term?.value).to.eq('false') + }) + describe('when maintainer changes', () => { let editedProject: Project @@ -360,6 +378,7 @@ describe('domain/cube-projects/update', () => { .node(id) .addOut(rdfs.label, 'Created name') .addOut(schema.maintainer, bafu.id) + .addOut(cc.isHiddenCube, true) .addOut(cc['CubeProject/sourceCube'], $rdf.namedNode('http://external.cube')) .addOut(cc['CubeProject/sourceEndpoint'], $rdf.namedNode('http://external.cube/query')) .addOut(cc.projectSourceKind, cc['projectSourceKind/ExistingCube']) From c33daf99da14fb36345e60ca8743cfc07ac47cc5 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Thu, 14 Mar 2024 12:14:01 +0100 Subject: [PATCH 09/10] feat: hidden-graph fix e2e-tests --- e2e-tests/csv-source/delete.hydra | 3 ++- e2e-tests/csv-source/get-csv.hydra | 3 ++- e2e-tests/csv-source/upload.hydra | 3 ++- e2e-tests/cube-projects/create-invalid.hydra | 27 +++++++++++++------- e2e-tests/cube-projects/create.hydra | 7 +++-- e2e-tests/cube-projects/delete.hydra | 3 ++- e2e-tests/cube-projects/update.hydra | 3 ++- 7 files changed, 33 insertions(+), 16 deletions(-) diff --git a/e2e-tests/csv-source/delete.hydra b/e2e-tests/csv-source/delete.hydra index 849979c5b..350fcb051 100644 --- a/e2e-tests/csv-source/delete.hydra +++ b/e2e-tests/csv-source/delete.hydra @@ -27,7 +27,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Delete Source Test Project" ; dcterms:identifier "delete-csv-test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 201 diff --git a/e2e-tests/csv-source/get-csv.hydra b/e2e-tests/csv-source/get-csv.hydra index 43d95bbbb..23901e767 100644 --- a/e2e-tests/csv-source/get-csv.hydra +++ b/e2e-tests/csv-source/get-csv.hydra @@ -27,7 +27,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "GetCSV Test Project" ; dcterms:identifier "get-csv-test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 201 diff --git a/e2e-tests/csv-source/upload.hydra b/e2e-tests/csv-source/upload.hydra index ca544b5a0..a6358f230 100644 --- a/e2e-tests/csv-source/upload.hydra +++ b/e2e-tests/csv-source/upload.hydra @@ -27,7 +27,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Upload Test Project" ; dcterms:identifier "upload-test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 201 diff --git a/e2e-tests/cube-projects/create-invalid.hydra b/e2e-tests/cube-projects/create-invalid.hydra index aaaf6035c..bc3810b25 100644 --- a/e2e-tests/cube-projects/create-invalid.hydra +++ b/e2e-tests/cube-projects/create-invalid.hydra @@ -19,7 +19,8 @@ With Class api:EntryPoint { prefix schema: <> cc:projectSourceKind ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -32,7 +33,8 @@ With Class api:EntryPoint { prefix cc: prefix schema: <> cc:projectSourceKind ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -48,7 +50,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -65,7 +68,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Test Project" ; cc:namespace ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -84,7 +88,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Test Project" ; dcterms:identifier "ubd/28" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -103,7 +108,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Test Project" ; dcterms:identifier "example/px-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -123,7 +129,8 @@ With Class api:EntryPoint { rdfs:label "Test Project" ; CubeProject:sourceCube ; CubeProject:sourceEndpoint ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -143,7 +150,8 @@ With Class api:EntryPoint { rdfs:label "Test Project" ; CubeProject:sourceCube ; CubeProject:sourceEndpoint ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 @@ -163,7 +171,8 @@ With Class api:EntryPoint { rdfs:label "Test Project" ; CubeProject:sourceCube ; CubeProject:sourceEndpoint ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 diff --git a/e2e-tests/cube-projects/create.hydra b/e2e-tests/cube-projects/create.hydra index bac0a9cbc..8b3ddd622 100644 --- a/e2e-tests/cube-projects/create.hydra +++ b/e2e-tests/cube-projects/create.hydra @@ -26,7 +26,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Test Project" ; dcterms:identifier "test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 201 @@ -41,6 +42,7 @@ With Class api:EntryPoint { Expect Property schema:maintainer Expect Property dcterms:identifier Expect Property cc:export + Expect Property cc:isHiddenCube Expect Link cc:projectDetails { Expect Property schema:hasPart } @@ -73,7 +75,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Test Project" ; dcterms:identifier "test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 400 diff --git a/e2e-tests/cube-projects/delete.hydra b/e2e-tests/cube-projects/delete.hydra index df7b15a23..3f890aec8 100644 --- a/e2e-tests/cube-projects/delete.hydra +++ b/e2e-tests/cube-projects/delete.hydra @@ -25,7 +25,8 @@ With Class api:EntryPoint { <> cc:projectSourceKind ; rdfs:label "Deleted Test Project" ; dcterms:identifier "delete-test-cube" ; - schema:maintainer . + schema:maintainer ; + cc:isHiddenCube true . ``` } => { Expect Status 201 diff --git a/e2e-tests/cube-projects/update.hydra b/e2e-tests/cube-projects/update.hydra index f368d1062..30e688afc 100644 --- a/e2e-tests/cube-projects/update.hydra +++ b/e2e-tests/cube-projects/update.hydra @@ -35,7 +35,8 @@ With Class cc:CubeProject { cc:dataset ; cc:jobCollection ; cc:latestPublishedRevision 1 ; - cc:projectSourceKind . + cc:projectSourceKind ; + cc:isHiddenCube true . ``` } => { Expect Status 200 From 440952874528fc121d3ad1541e4789c07354aea0 Mon Sep 17 00:00:00 2001 From: Michael Rauch Date: Thu, 21 Mar 2024 16:37:33 +0100 Subject: [PATCH 10/10] feat: hidden-graph - property organization.hiddenGraph - testcase 'createPublishJob for hiddenCube' - remove Project.updateIsHiddenCube() --- apis/core/lib/domain/cube-projects/Project.ts | 9 ------- apis/core/lib/domain/cube-projects/create.ts | 12 ++++++--- apis/core/lib/domain/cube-projects/import.ts | 11 +++++--- apis/core/lib/domain/cube-projects/update.ts | 7 +++-- apis/core/lib/domain/job/create.ts | 2 +- apis/core/test/domain/job/create.test.ts | 27 +++++++++++++++++++ packages/model/Organization.ts | 6 +++++ packages/model/package.json | 5 ++-- 8 files changed, 57 insertions(+), 22 deletions(-) diff --git a/apis/core/lib/domain/cube-projects/Project.ts b/apis/core/lib/domain/cube-projects/Project.ts index cf3f9975e..5986a071a 100644 --- a/apis/core/lib/domain/cube-projects/Project.ts +++ b/apis/core/lib/domain/cube-projects/Project.ts @@ -16,7 +16,6 @@ interface ApiProject { initializeJobCollection(store: ResourceStore): void incrementPublishedRevision(): void updateMaintainer(organization: Term | undefined): { before: Term; after: Term } - updateIsHiddenCube(hiddenCube: Term | undefined): void rename(name: string | undefined): void } @@ -92,14 +91,6 @@ export function ProjectMixin resource: GraphPointer @@ -127,11 +131,11 @@ export async function createProject({ if (!maintainer || maintainer.termType !== 'NamedNode') { throw new DomainError('Missing organization or not a named node') } - const hiddenCube = resource.out(cc.isHiddenCube).term - if (!hiddenCube || hiddenCube.termType !== 'Literal' || hiddenCube.datatype.value !== 'http://www.w3.org/2001/XMLSchema#boolean') { + const hiddenCube = resource.out(cc.isHiddenCube) + if (!isLiteral(hiddenCube, xsd.boolean)) { throw new DomainError('Missing flag isHiddenCube or not a boolean') } - const isHiddenCube = hiddenCube.value === 'true' + const isHiddenCube = xsdTrue.equals(hiddenCube.term) let project: Project.Project let dataset: Dataset.Dataset diff --git a/apis/core/lib/domain/cube-projects/import.ts b/apis/core/lib/domain/cube-projects/import.ts index 2cc6ee363..d6b6e9f68 100644 --- a/apis/core/lib/domain/cube-projects/import.ts +++ b/apis/core/lib/domain/cube-projects/import.ts @@ -5,8 +5,9 @@ import $rdf from 'rdf-ext' import { cc } from '@cube-creator/core/namespace' import { Files } from '@cube-creator/express/multipart' import { createMinimalProject, Project } from '@cube-creator/model/Project' -import { dcterms, rdfs, schema, rdf } from '@tpluscode/rdf-ns-builders/strict' +import { dcterms, rdfs, schema, rdf, xsd } from '@tpluscode/rdf-ns-builders/strict' import clownface, { GraphPointer } from 'clownface' +import { isLiteral } from 'is-graph-pointer' import { obj } from 'through2' import TermSet from '@rdfjs/term-set' import { Organization } from '@rdfine/schema' @@ -16,6 +17,8 @@ import * as id from '../identifiers' import { ResourceStore } from '../../ResourceStore' import { exists } from './queries' +const xsdTrue = $rdf.literal('true', xsd.boolean) + interface ImportProject { projectsCollection: GraphPointer resource: GraphPointer @@ -97,11 +100,11 @@ export async function importProject({ if (!maintainer) { throw new BadRequest('Missing organization') } - const hiddenCube = resource.out(cc.isHiddenCube).term - if (!hiddenCube || hiddenCube.termType !== 'Literal' || hiddenCube.datatype.value !== 'http://www.w3.org/2001/XMLSchema#boolean') { + const hiddenCube = resource.out(cc.isHiddenCube) + if (!isLiteral(hiddenCube, xsd.boolean)) { throw new DomainError('Missing flag isHiddenCube or not a boolean') } - const isHiddenCube = hiddenCube.value === 'true' + const isHiddenCube = xsdTrue.equals(hiddenCube.term) const projectNode = await store.createMember(projectsCollection.term, id.cubeProject(label)) diff --git a/apis/core/lib/domain/cube-projects/update.ts b/apis/core/lib/domain/cube-projects/update.ts index 2e062ab95..d7f245495 100644 --- a/apis/core/lib/domain/cube-projects/update.ts +++ b/apis/core/lib/domain/cube-projects/update.ts @@ -1,8 +1,9 @@ import type { NamedNode } from '@rdfjs/types' +import $rdf from 'rdf-ext' import { GraphPointer } from 'clownface' import { DomainError } from '@cube-creator/api-errors' import { cc } from '@cube-creator/core/namespace' -import { dcterms, rdfs, schema } from '@tpluscode/rdf-ns-builders' +import { dcterms, rdfs, schema, xsd } from '@tpluscode/rdf-ns-builders' import { CsvProject, ImportProject, Project } from '@cube-creator/model' import type { Organization } from '@rdfine/schema' import type { Dictionary } from '@rdfine/prov' @@ -11,6 +12,8 @@ import { ResourceStore } from '../../ResourceStore' import { cubeNamespaceAllowed } from '../organization/query' import { exists, previouslyPublished } from './queries' +const xsdTrue = $rdf.literal('true', xsd.boolean) + interface UpdateProjectCommand { resource: GraphPointer store: ResourceStore @@ -23,7 +26,7 @@ export async function updateProject({ const project = await store.getResource(resource.term) project.rename(resource.out(rdfs.label).value) - project.updateIsHiddenCube(resource.out(cc.isHiddenCube).term) + project.isHiddenCube = xsdTrue.equals(resource.out(cc.isHiddenCube).term) const maintainer = project.updateMaintainer(resource.out(schema.maintainer).term) let currentCube: NamedNode diff --git a/apis/core/lib/domain/job/create.ts b/apis/core/lib/domain/job/create.ts index 02640c311..2b1a86283 100644 --- a/apis/core/lib/domain/job/create.ts +++ b/apis/core/lib/domain/job/create.ts @@ -76,7 +76,7 @@ export async function createPublishJob({ const metadata = await store.getResource(project.dataset) - const targetGraph = project.isHiddenCube ? $rdf.namedNode(organization.publishGraph.value + '/hidden') : organization.publishGraph + const targetGraph = project.isHiddenCube ? organization.hiddenGraph : organization.publishGraph const jobPointer = await store.createMember(jobCollection.term, id.job(jobCollection)) const job = Job.createPublish(jobPointer, { diff --git a/apis/core/test/domain/job/create.test.ts b/apis/core/test/domain/job/create.test.ts index 47b483e0e..2a22104bf 100644 --- a/apis/core/test/domain/job/create.test.ts +++ b/apis/core/test/domain/job/create.test.ts @@ -27,6 +27,7 @@ describe('domain/job/create', () => { maintainer: organization, cubeIdentifier: 'test-cube', dataset: $rdf.namedNode('myDataset'), + isHiddenCube: false, }) const tableCollection = namedNode('myTables') const csvMapping = namedNode('myCsvMapping') @@ -131,4 +132,30 @@ describe('domain/job/create', () => { await expect(promise).rejectedWith(DomainError) }) }) + + describe('createPublishJob for hiddenCube', () => { + let queries: Pick + + beforeEach(() => { + queries = { + getCubeTable: sinon.stub().resolves($rdf.namedNode('observations')), + } + + if (!organization.pointer.has(cc.publishGraph).value) { + organization.pointer.addOut(cc.publishGraph, $rdf.namedNode('publishGraph')) + } + project.isHiddenCube = true + }) + + it('creates a job resource', async () => { + // when + const job = await createPublishJob({ resource: jobCollection.term, store, queries }) + + // then + expect(job.has(rdf.type, cc.PublishJob).values.length).to.eq(1) + expect(job.out(cc.project).value).to.eq('myProject') + + expect(job.out(cc.publishGraph).term).to.deep.eq($rdf.namedNode('publishGraph/hidden')) + }) + }) }) diff --git a/packages/model/Organization.ts b/packages/model/Organization.ts index 89ef0195e..f83fa319e 100644 --- a/packages/model/Organization.ts +++ b/packages/model/Organization.ts @@ -1,4 +1,5 @@ import type { DatasetCore, NamedNode, Term } from '@rdfjs/types' +import $rdf from 'rdf-ext' import { Organization, OrganizationMixin as SchemaOrganizationMixin } from '@rdfine/schema' import { Constructor, namespace, property, ResourceIdentifier } from '@tpluscode/rdfine' import { cc } from '@cube-creator/core/namespace' @@ -13,6 +14,7 @@ interface CreateIdentifier { interface OrganizationEx { publishGraph: NamedNode + readonly hiddenGraph: NamedNode namespace: NamedNode dataset?: NamedNode accessURL: NamedNode @@ -31,6 +33,10 @@ export function OrganizationMixin