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