From b26633eba0b180eda78403ffcf3ad8ac7e437447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20R=C3=B6sner?= <rene.roesner@fjd.de> Date: Thu, 14 Apr 2022 08:36:56 +0000 Subject: [PATCH] planning#367: Anpassung Schema Seiten --- docs/getting-started/schema-validation.mdx | 4 +- docs/getting-started/submission/metadata.mdx | 4 +- docs/metadata/overview.mdx | 31 ++++------ docs/metadata/schema.mdx | 8 --- docs/set-schema/overview.mdx | 15 +++++ docusaurus.config.js | 7 +-- sidebar.js | 1 - src/components/VersionSelect.js | 33 +++++++++++ src/lib/utils/getVersionList.js | 18 ++++++ src/views/JSONSchema.js | 60 +++++++++++++------- 10 files changed, 124 insertions(+), 57 deletions(-) delete mode 100644 docs/metadata/schema.mdx create mode 100644 docs/set-schema/overview.mdx create mode 100644 src/components/VersionSelect.js create mode 100644 src/lib/utils/getVersionList.js diff --git a/docs/getting-started/schema-validation.mdx b/docs/getting-started/schema-validation.mdx index 14561aeac..dee492105 100644 --- a/docs/getting-started/schema-validation.mdx +++ b/docs/getting-started/schema-validation.mdx @@ -275,8 +275,8 @@ Die Dokumentation wird noch um eine Validierung des Metadatenschema anhand eines Im Metadatensatz muss mindestens eine Struktur der übermittelten Inhalte einer Einreichung (Fachdaten, Anlagen) im Feld `contentStructure` angegeben werden. Zusätzlich können noch die Felder `authenticationInformation`, `paymentInformation`, `publicServiceType` und `replyChannel` mit entsprechenden Unterobjekten angegeben werden, um den Weg einer Antwort bzw. die Bezahlinformationen der Einreichung genauer zu definieren. -Die gültigen Formate, die die Felder des Schemas annehmen können, sind im [Metadatenschema selbst](../metadata/schema.mdx) definiert und können mithilfe von Bibliotheken validiert werden. -Eine Liste der zur Verfügung stehenden [Schema-Validatoren](https://json-schema.org/implementations.html#validators) sowie [Code-Generatoren](https://json-schema.org/implementations.html#generators-from-schemas) für verschiedenste Programmiersprachen findet sich auf der offiziellen Seite von JSON-Schema. +Die gültigen Formate, die die Felder des Schemas annehmen können, sind im [Metadatenschema selbst](../metadata/overview.mdx) definiert und können mithilfe von Bibliotheken validiert werden. +Eine Liste der zur Verfügung stehenden [Schmema-Validatoren](https://json-schema.org/implementations.html#validators) sowie [Code-Generatoren](https://json-schema.org/implementations.html#generators-from-schemas) für verschiedenste Programmiersprachen findet sich auf der offiziellen Seite von JSON-Schema. ## Validierung des Fachdatensatz diff --git a/docs/getting-started/submission/metadata.mdx b/docs/getting-started/submission/metadata.mdx index f62c0fb69..50727d0b1 100644 --- a/docs/getting-started/submission/metadata.mdx +++ b/docs/getting-started/submission/metadata.mdx @@ -4,8 +4,8 @@ title: Metadatensatz Die Antragsmetadaten beschreiben die Struktur der Einreichung und deren Inhalte, wie Anhänge oder Fachdaten. Zusätzlich können weitere Informationen über Verwaltungskund:innen hinterlegt werden. -Eine genaue Definition ist in der [Schema-Beschreibung](../../metadata/schema.mdx) zu finden. -Im Folgenden wird beschrieben, wie für das Versenden einer Einreichung das Schema aufgebaut und befüllt wird. +Eine genaue Definition ist in der [Schema-Beschreibung](../../metadata/overview.mdx) zu finden. +Im Folgenden wird nun beschrieben, wie für das Versenden einer Einreichung das Schema aufgebaut und befüllt wird. Das Minimum, was an Information in den Metadaten vorhanden sein muss, ist der Abschnitt `contentStructure`. In diesem muss angegeben werden, ob und in welchem Format ein Fachdatensatz mit versendet wird. diff --git a/docs/metadata/overview.mdx b/docs/metadata/overview.mdx index 84f526f83..21e3b3c6e 100644 --- a/docs/metadata/overview.mdx +++ b/docs/metadata/overview.mdx @@ -1,9 +1,14 @@ -# Metadatensatz +--- +title: Metadatensatz +hide_table_of_contents: true +--- + +import JSONSchema from '@views/JSONSchema' Metadaten sind ein zentraler Bestandteil einer Einreichung. Sie beschreiben die Struktur der Einreichung und deren Inhalte, wie beispielsweise Anlagen oder die Fachdaten. Zusätzlich können weitere Informationen über d:ie Verwaltungskund:in hinterlegt werden. -Eine genaue Definition ist in der [Schema-Definition](../metadata/schema.mdx) zu finden. +Eine genaue Definition ist in der [Schema-Definition](#metadatenschema) zu finden. Im Folgenden werden nun die großen Bereiche, die im Metadatenschema aufgeführt werden, grob beschrieben. :::tip Hinweis @@ -13,22 +18,6 @@ Ein Beispiel für den Metadatensatz eines Kindergeldantrags findet sich in der [ Das Metadaten-Schema validiert gegen und orientiert sich an der [JSON Schema Spezifikation 2020-12](https://json-schema.org/specification-links.html#2020-12) in der Version von 2020. Es besteht primär aus den fünf Bereichen Authentifizierungsinformationen, Inhaltsstruktur, Bezahlinformationen, Verwaltungsleistung und Rückkanal. -```json -{ - "authenticationInformation": [ - … - ], - "paymentInformation": { - … - }, - "publicServiceType": { - … - }, - "contentStructure": { - … - }, - "replyChannel": { - … - } -} -``` +## Metadatenschema + +<JSONSchema version={"1.*.*"} name="metadata" /> diff --git a/docs/metadata/schema.mdx b/docs/metadata/schema.mdx deleted file mode 100644 index 0c559bab7..000000000 --- a/docs/metadata/schema.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Metadatenschema -hide_table_of_contents: true ---- - -import JSONSchema from '@views/JSONSchema' - -<JSONSchema version={"1.*.*"} /> diff --git a/docs/set-schema/overview.mdx b/docs/set-schema/overview.mdx new file mode 100644 index 000000000..ff4e83633 --- /dev/null +++ b/docs/set-schema/overview.mdx @@ -0,0 +1,15 @@ +--- +title: Security Event Token +hide_table_of_contents: true +--- + +import JSONSchema from '@views/JSONSchema' + +Im Ereignisprotokoll (Event Log) werden relevante Ereignisse (events) aufgezeichnet. +Beim Abruf des Ereignisprotokolls liefert die API ein Array von JSON Web Token (JWT) gemäß [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519). +Der JWT ist einen Security-Event-Token (SET) gemäß [RFC 8417](https://datatracker.ietf.org/doc/html/rfc8417). +Wie mit den Security-Event-Token (SET) umgegangen wird, wird genauer in [Ereignisprotokoll](../getting-started/event-log/overview.mdx) beschrieben. + +## Security Event Token JSON Schema + +<JSONSchema version={"1.*.*"} name="set" /> diff --git a/docusaurus.config.js b/docusaurus.config.js index 92c68566b..53dc13c6a 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -62,12 +62,11 @@ module.exports = { label: '🚧 Metadatenschema', docId: 'metadata/overview', }, - /* { type: 'doc', - label: 'FIM', - docId: 'schemas/fim' - }*/ + label: '🚧 Security Event Token', + docId: 'set-schema/overview' + } ] }, /* diff --git a/sidebar.js b/sidebar.js index e780ab039..f8007f74f 100644 --- a/sidebar.js +++ b/sidebar.js @@ -113,7 +113,6 @@ module.exports = { ], metadataSidebar: [ 'metadata/overview', - 'metadata/schema', 'metadata/authenticationInformation', 'metadata/paymentInformation', 'metadata/publicServiceType', diff --git a/src/components/VersionSelect.js b/src/components/VersionSelect.js new file mode 100644 index 000000000..4d799ff85 --- /dev/null +++ b/src/components/VersionSelect.js @@ -0,0 +1,33 @@ +import React, {useEffect} from "react" +import useAsync from '@hooks/useAsync' +import getVersionList from "@lib/utils/getVersionList"; + +export default ({ version, setVersion, gitlabId }) => { + + const {execute, status, error, value: versions} = useAsync(getVersionList, { + projectId: gitlabId, + includePrerelease: false + }, false) + + useEffect(() => { + execute() + }, []) + + useEffect(async () => { + if (status === 'success') { + console.log('vvvvvv', versions) + } + }, [status]) + + return <div> + Andere Version anzeigen: <select + value={version} + onChange={e => setVersion(e.target.value)}> + {versions && versions.map ? versions.map((v, i) => ( + <option value={v} key={i}> + {v} + </option> + )) : ''} + </select> + </div> +} diff --git a/src/lib/utils/getVersionList.js b/src/lib/utils/getVersionList.js new file mode 100644 index 000000000..6182c8398 --- /dev/null +++ b/src/lib/utils/getVersionList.js @@ -0,0 +1,18 @@ +import axios from "axios"; +import semver from "semver"; + +export default async function ({projectId, includePrerelease = false}) { + return axios.get(`https://git.fitko.de/api/v4/projects/${projectId}/repository/tags`) + .catch((error) => { + throw `Fetching of tags failed with ${error.response.status}` + }) + .then(async ({data}) => { + const versionRange = `~*.*.*` + const suitableVersions = await data + .filter(({name}) => semver.satisfies(name, versionRange, {includePrerelease})) + .map(({name}) => name) + .sort() + + return suitableVersions + }) +} diff --git a/src/views/JSONSchema.js b/src/views/JSONSchema.js index 3b3960c0a..e0ad33935 100644 --- a/src/views/JSONSchema.js +++ b/src/views/JSONSchema.js @@ -9,39 +9,59 @@ import {useActivePlugin, useActiveVersion,} from '@theme/hooks/useDocs' import useAsync from '@hooks/useAsync' import getLatestVersion from "@lib/utils/getLatestVersion"; import DownloadLabel from "@components/DownloadLabel"; +import VersionSelect from "@components/VersionSelect"; const SCHEMA_BASE_URL = 'https://schema.fitko.de/fit-connect/metadata' const SCHEMA_FILE_NAME = 'metadata.schema.json' const GITLAB_PROJECT_ID = 40 -const loadSchema = async (version) => { - return await axios.get(`${SCHEMA_BASE_URL}/${version}/${SCHEMA_FILE_NAME}`).catch((error) => { - throw `Fetching of schema with version ${version} failed with status code ${error.response.status}` - }).then(({data}) => data) +const SCHEMA_BASE_URL_SET = 'https://schema.fitko.de/fit-connect/set-payload/' +const SCHEMA_FILE_NAME_SET = 'set-payload.schema.json' +const GITLAB_PROJECT_ID_SET = 81 + +const loadSchema = async (version, name) => { + if (name === 'set') { + return await axios.get(`${SCHEMA_BASE_URL_SET}/${version}/${SCHEMA_FILE_NAME_SET}`).catch((error) => { + throw `Fetching of Security Event Token schema with version ${version} failed with status code ${error.response.status}` + }).then(({data}) => data) + } else { + return await axios.get(`${SCHEMA_BASE_URL}/${version}/${SCHEMA_FILE_NAME}`).catch((error) => { + throw `Fetching of Metadata schema with version ${version} failed with status code ${error.response.status}` + }).then(({data}) => data) + } } export default function JSONSchema(props) { + const { name, version, includePrerelease } = props; + const [jsonSchema, setJsonSchema] = useState(null) + const [selectedVersion, setSelectedVersion] = useState(version) + console.log('selectedVersion: ', selectedVersion); const isInBrowser = ExecutionEnvironment.canUseDOM const {pluginId} = useActivePlugin({failfast: true}) const {name: siteVersion} = useActiveVersion(pluginId) + const schemaUrl = name === 'set' ? SCHEMA_BASE_URL_SET : SCHEMA_BASE_URL; + const schemaName = name === 'set' ? SCHEMA_FILE_NAME_SET : SCHEMA_FILE_NAME; + const gitlabId = name === 'set' ? GITLAB_PROJECT_ID_SET : GITLAB_PROJECT_ID; const {execute, status, error, value: latestVersion} = useAsync(getLatestVersion, { - siteVersion: props.version === undefined ? '*' : props.version, + siteVersion: selectedVersion === undefined ? '*' : selectedVersion, projectId: GITLAB_PROJECT_ID, - includePrerelease: props.includePrerelease !== undefined + includePrerelease: includePrerelease !== undefined }, false) - const [metadataSchema, setMetadataSchema] = useState(null) - if (isInBrowser) { useEffect(() => { execute() }, []) + useEffect(async () => { + setJsonSchema(await loadSchema(selectedVersion, name)) + }, [selectedVersion]) + useEffect(async () => { if (status === 'success') { - console.log('vvvvvv', latestVersion, siteVersion, props.version) - setMetadataSchema(await loadSchema(latestVersion)) + setSelectedVersion(latestVersion) + setJsonSchema(await loadSchema(latestVersion, name)) } }, [status]) } @@ -50,22 +70,24 @@ export default function JSONSchema(props) { <BrowserOnly fallback={<div>Lädt...</div>}> {() => ( <div> - <p>Die aktuell angezeigte Version des Metadatenschema ist {status === 'success' && - <code>{latestVersion}</code>} {status === 'success' && - <DownloadLabel baseURL={SCHEMA_BASE_URL} version={latestVersion} artifact={SCHEMA_FILE_NAME} label="JSON Schema"/>}. - </p><br /> + <p>Die aktuell angezeigte Version des JSON Schema ist {status === 'success' && + <code>{selectedVersion}</code>} {status === 'success' && + <DownloadLabel baseURL={schemaUrl} version={selectedVersion} artifact={schemaName} label="JSON Schema"/>}. + </p> + <VersionSelect version={selectedVersion} setVersion={setSelectedVersion} gitlabId={gitlabId}/> + <br /> - <div className="json-schema-viewer admonition admonition-note alert alert--secondary"> - {metadataSchema ? <JsonSchemaViewer - name="FIT-Connect Metadatenschema" - schema={metadataSchema} + <div className="json-schema-viewer admonition admonition-note alert alert--secondary pl-5"> + {jsonSchema ? <JsonSchemaViewer + name="FIT-Connect JSON Schema" + schema={jsonSchema} expanded={true} hideTopBar={false} emptyText="No schema defined" defaultExpandedDepth={1} /> : <p>wird geladen...</p>} </div> - {status === 'error' && <p>Das Metadatenschema konnte leider nicht geladen werden.</p>} + {status === 'error' && <p>Das JSON Schema konnte leider nicht geladen werden.</p>} </div> ) } -- GitLab