From 84d17ff7320346e06a7c4bca8b99741af817983b Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Tue, 22 Nov 2022 16:18:52 +0100 Subject: [PATCH] Add urql to frontend --- client/package-lock.json | 82 ++++ client/package.json | 2 + client/src/main.ts | 5 + server/schema.graphql | 903 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 992 insertions(+) create mode 100644 server/schema.graphql diff --git a/client/package-lock.json b/client/package-lock.json index efc6bbaa..feed9cb2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -11,7 +11,9 @@ "@headlessui/vue": "^1.6.7", "@sentry/tracing": "^7.20.0", "@sentry/vue": "^7.20.0", + "@urql/vue": "^1.0.2", "d3": "^7.6.1", + "graphql": "^16.6.0", "lodash": "^4.17.21", "loglevel": "^1.8.0", "pinia": "^2.0.21", @@ -261,6 +263,14 @@ "node": "*" } }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -1226,6 +1236,31 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@urql/core": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.0.5.tgz", + "integrity": "sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "wonka": "^6.0.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@urql/vue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@urql/vue/-/vue-1.0.2.tgz", + "integrity": "sha512-TBfMfu+aGmuudqAz4lE+VxlN+2y5xM0ubiQCTFsojCB4CkSa/D0n914ibhqbDtDzs2Ww5dlB/vof1ep1LGRMow==", + "dependencies": { + "@urql/core": "^3.0.0", + "wonka": "^6.0.0" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "vue": "^2.7.0 || ^3.0.0" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", @@ -4077,6 +4112,14 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6909,6 +6952,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wonka": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.1.1.tgz", + "integrity": "sha512-shBtyZ0KFvUadtnDGlTRA4mF4pgcRoyZKikdputKhmShoXWcZDvlg6CUw6Jx9nTL7Ub8QUJoIarPpxdlosg9cw==" + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7201,6 +7249,12 @@ } } }, + "@graphql-typed-document-node/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz", + "integrity": "sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg==", + "requires": {} + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -7985,6 +8039,24 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@urql/core": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-3.0.5.tgz", + "integrity": "sha512-6/1HG+WEAcPs+hXSFnxWBTWkNUwa8dj2cHysWokMaFIbAioGtUaSdxp2q9FDMtWAIGdc640NFSt2B8itGLdoAA==", + "requires": { + "@graphql-typed-document-node/core": "^3.1.1", + "wonka": "^6.0.0" + } + }, + "@urql/vue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@urql/vue/-/vue-1.0.2.tgz", + "integrity": "sha512-TBfMfu+aGmuudqAz4lE+VxlN+2y5xM0ubiQCTFsojCB4CkSa/D0n914ibhqbDtDzs2Ww5dlB/vof1ep1LGRMow==", + "requires": { + "@urql/core": "^3.0.0", + "wonka": "^6.0.0" + } + }, "@vitejs/plugin-vue": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", @@ -10071,6 +10143,11 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphql": { + "version": "16.6.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", + "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==" + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -11979,6 +12056,11 @@ "is-typed-array": "^1.1.10" } }, + "wonka": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.1.1.tgz", + "integrity": "sha512-shBtyZ0KFvUadtnDGlTRA4mF4pgcRoyZKikdputKhmShoXWcZDvlg6CUw6Jx9nTL7Ub8QUJoIarPpxdlosg9cw==" + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", diff --git a/client/package.json b/client/package.json index fbb90298..15658b69 100644 --- a/client/package.json +++ b/client/package.json @@ -17,7 +17,9 @@ "@headlessui/vue": "^1.6.7", "@sentry/tracing": "^7.20.0", "@sentry/vue": "^7.20.0", + "@urql/vue": "^1.0.2", "d3": "^7.6.1", + "graphql": "^16.6.0", "lodash": "^4.17.21", "loglevel": "^1.8.0", "pinia": "^2.0.21", diff --git a/client/src/main.ts b/client/src/main.ts index d143fa9b..33016159 100644 --- a/client/src/main.ts +++ b/client/src/main.ts @@ -3,6 +3,8 @@ import * as log from "loglevel"; import { createPinia } from "pinia"; import { createApp, markRaw } from "vue"; +import urql from "@urql/vue"; + import App from "./App.vue"; import { loadLocaleMessages, setupI18n } from "./i18n"; import router from "./router"; @@ -42,6 +44,9 @@ loadLocaleMessages(i18n, "de").then(() => { }); app.use(pinia); app.use(i18n); + app.use(urql, { + url: "http://localhost:8000/server/graphql/", + }); app.mount("#app"); }); diff --git a/server/schema.graphql b/server/schema.graphql new file mode 100644 index 00000000..76603d6c --- /dev/null +++ b/server/schema.graphql @@ -0,0 +1,903 @@ +schema { + query: Query +} + +type BlockQuoteBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type BooleanBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: Boolean! +} + +type CharBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type ChoiceBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! + choices: [ChoiceOption!]! +} + +type ChoiceOption { + key: String! + value: String! +} + +type Circle implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type CollectionObjectType { + id: ID! + path: String! + depth: Int! + numchild: Int! + name: String! + descendants: [CollectionObjectType]! + ancestors: [CollectionObjectType]! +} + +type CompetencePage implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type CompetenceProfilePage implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type Course { + id: ID +} + +type CourseCategory { + id: ID +} + +type CourseCompletion { + id: ID +} + +type CoursePage implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type CourseSession { + id: ID +} + +type CourseSessionUser { + id: ID +} + +type DateBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value(format: String): String! +} + +scalar DateTime + +type DateTimeBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value(format: String): String! +} + +type DecimalBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: Float! +} + +type DocumentChooserBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + document: LibraryDocument! +} + +type EmailBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type EmbedBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! + url: String! + embed: String + rawEmbed: JSONString +} + +type FloatBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: Float! +} + +type ImageChooserBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + image: ImageObjectType! +} + +type ImageObjectType { + id: ID! + collection: CollectionObjectType! + title: String! + file: String! + width: Int! + height: Int! + createdAt: DateTime! + uploadedByUser: User + focalPointX: Int + focalPointY: Int + focalPointWidth: Int + focalPointHeight: Int + fileSize: Int + fileHash: String! + renditions: [ImageRenditionObjectType!]! + src: String! @deprecated(reason: "Use the `url` attribute") + url: String! + aspectRatio: Float! + sizes: String! + tags: [TagObjectType!]! + rendition(max: String, min: String, width: Int, height: Int, fill: String, format: String, bgcolor: String, jpegquality: Int, webpquality: Int): ImageRenditionObjectType + srcSet(sizes: [Int], format: String): String +} + +type ImageRenditionObjectType { + id: ID! + filterSpec: String! + file: String! + width: Int! + height: Int! + focalPointKey: String! + image: ImageObjectType! + title: String! + createdAt: DateTime! + focalPointX: Int + focalPointY: Int + focalPointWidth: Int + focalPointHeight: Int + fileSize: Int + fileHash: String! + src: String! @deprecated(reason: "Use the `url` attribute") + url: String! + aspectRatio: Float! + sizes: String! + collection: CollectionObjectType! + tags: [TagObjectType!]! +} + +type IntegerBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: Int! +} + +scalar JSONString + +type LearningContent implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type LearningPath implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type LearningSequence implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type LearningUnit implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type LibraryDocument { + id: ID + collection: CollectionObjectType! + title: String! + file: String! + createdAt: DateTime! + fileSize: Int + fileHash: String! + url: String! + tags: [TagObjectType!]! +} + +type ListBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + items: [StreamFieldInterface!]! +} + +type MediaCategoryPage implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type MediaLibraryPage implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type Page implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + sitesRootedHere: [SiteObjectType!]! + aliases: [Page!]! + coursepage: CoursePage + learningpath: LearningPath + topic: Topic + circle: Circle + learningsequence: LearningSequence + learningunit: LearningUnit + learningcontent: LearningContent + competenceprofilepage: CompetenceProfilePage + competencepage: CompetencePage + performancecriteria: PerformanceCriteria + medialibrarypage: MediaLibraryPage + mediacategorypage: MediaCategoryPage + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type PageChooserBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + page: PageInterface! +} + +interface PageInterface { + id: ID + title: String! + slug: String! + contentType: String! + pageType: String + live: Boolean! + url: String + urlPath: String! + depth: Int + seoTitle: String! + searchDescription: String + showInMenus: Boolean! + locked: Boolean + firstPublishedAt: DateTime + lastPublishedAt: DateTime + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type PerformanceCriteria implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +scalar PositiveInt + +type Query { + redirects: [RedirectType!]! + collections(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [CollectionObjectType]! + tag(id: ID): TagObjectType + tags(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [TagObjectType!]! + search(query: String): [Search!]! + document(id: ID): LibraryDocument + documents(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [LibraryDocument!]! + documentType: String! + image(id: ID): ImageObjectType + images(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [ImageObjectType!]! + imageType: String! + site(hostname: String, id: ID): SiteObjectType + sites(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [SiteObjectType!]! + pages(contentType: String, inSite: Boolean = false, site: String, ancestor: ID, parent: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + page(id: Int, slug: String, urlPath: String, token: String, contentType: String, inSite: Boolean = false, site: String): PageInterface +} + +type RawHTMLBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type RedirectType { + oldPath: String! + oldUrl: String! + newUrl: String! + page: PageInterface + isPermanent: Boolean! +} + +type RegexBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type RichTextBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +union Search = CoursePage | LearningPath | Topic | Circle | LearningSequence | LearningUnit | LearningContent | CompetenceProfilePage | CompetencePage | PerformanceCriteria | MediaLibraryPage | MediaCategoryPage | Page | LibraryDocument | User | SecurityRequestResponseLog | Course | CourseCategory | CourseCompletion | CourseSession | CourseSessionUser + +type SecurityRequestResponseLog { + id: ID +} + +type SiteObjectType { + id: ID! + hostname: String! + port: Int! + siteName: String! + rootPage: Page! + isDefaultSite: Boolean! + pages(contentType: String, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + page(id: Int, slug: String, urlPath: String, token: String, contentType: String): PageInterface +} + +type StaticBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type StreamBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + blocks: [StreamFieldInterface!]! +} + +type StreamFieldBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +interface StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! +} + +type StructBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + blocks: [StreamFieldInterface!]! +} + +type TagObjectType { + id: ID! + name: String! +} + +type TextBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +type TimeBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value(format: String): String! +} + +type Topic implements PageInterface { + id: ID + path: String! + depth: Int + numchild: Int! + translationKey: UUID! + title: String! + draftTitle: String! + slug: String! + contentType: String! + live: Boolean! + hasUnpublishedChanges: Boolean! + urlPath: String! + owner: User + seoTitle: String! + showInMenus: Boolean! + searchDescription: String + goLiveAt: DateTime + expireAt: DateTime + expired: Boolean! + locked: Boolean + lockedAt: DateTime + lockedBy: User + firstPublishedAt: DateTime + lastPublishedAt: DateTime + latestRevisionCreatedAt: DateTime + aliasOf: Page + pageType: String + url: String + parent: PageInterface + children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! + ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]! +} + +type URLBlock implements StreamFieldInterface { + id: String + blockType: String! + field: String! + rawValue: String! + value: String! +} + +scalar UUID + +type User { + id: ID +}