From d6e381de8716062c383611b820b5983595a7c82c Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Tue, 27 Nov 2018 12:01:44 +0100 Subject: [PATCH] swagger trial & error --- data/aquarius.json | 526 +++++++++++++++++++++++++++++++++++ data/sidebars/api.yml | 2 +- gatsby-config.js | 32 +++ gatsby-node.js | 32 +++ package.json | 2 + src/templates/ApiSwagger.jsx | 112 ++++++++ 6 files changed, 705 insertions(+), 1 deletion(-) create mode 100644 data/aquarius.json create mode 100644 src/templates/ApiSwagger.jsx diff --git a/data/aquarius.json b/data/aquarius.json new file mode 100644 index 00000000..05cbefbc --- /dev/null +++ b/data/aquarius.json @@ -0,0 +1,526 @@ +{ + "definitions":{ + + }, + "info":{ + "title":"Aquarius", + "description": "Hello description", + "version":"0.1.4" + }, + "paths":{ + "/api/v1/aquarius/assets":{ + "get":{ + "description":"", + "responses":{ + "200":{ + "description":"successful action" + } + }, + "summary":"Get all assets ids.", + "tags":[ + "ddo" + ] + } + }, + "/api/v1/aquarius/assets/ddo":{ + "get":{ + "description":"", + "responses":{ + "200":{ + "description":"successful action" + } + }, + "summary":"Get ddo of all assets.", + "tags":[ + "ddo" + ] + }, + "post":{ + "consumes":[ + "application/json" + ], + "description":"", + "parameters":[ + { + "description":"Asset ddo.", + "in":"body", + "name":"body", + "required":true, + "schema":{ + "properties":{ + "@context":{ + "description":null, + "example":"https://w3id.org/future-method/v1", + "type":"string" + }, + "authentication":{ + "description":"List with the authentications.", + "example":[ + { + "type":"RsaSignatureAuthentication2018" + }, + { + "publicKey":"did:op:123456789abcdefghi#keys-1" + } + ], + "type":"array" + }, + "id":{ + "description":"ID of the asset.", + "example":"did:op:123456789abcdefghi", + "type":"string" + }, + "publicKey":{ + "description":"List of publicKeys.", + "example":[ + { + "id":"did:op:123456789abcdefghi#keys-1" + }, + { + "type":"Ed25519VerificationKey2018" + }, + { + "owner":"did:op:123456789abcdefghi" + }, + { + "publicKeyBase58":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" + } + ], + "type":"array" + }, + "service":{ + "description":"List of services.", + "example":[ + { + "serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}", + "type":"Consume" + }, + { + "serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}", + "type":"Compute" + }, + { + "metadata":{ + "additionalInformation":{ + "structuredMarkup":[ + { + "mediaType":"application/ld+json", + "uri":"http://skos.um.es/unescothes/C01194/jsonld" + }, + { + "mediaType":"text/turtle", + "uri":"http://skos.um.es/unescothes/C01194/turtle" + } + ], + "updateFrecuency":"yearly" + }, + "base":{ + "author":"Met Office", + "compression":"zip", + "contentType":"text/csv", + "contentUrls":[ + "https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip" + ], + "copyrightHolder":"Met Office", + "dateCreated":"2012-10-10T17:00:000Z", + "description":"Weather information of UK including temperature and humidity", + "encoding":"UTF-8", + "inLanguage":"en", + "license":"CC-BY", + "links":[ + { + "sample1":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-daily/" + }, + { + "sample2":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-averages-25km/" + }, + { + "fieldsDescription":"http://data.ceda.ac.uk/badc/ukcp09/" + } + ], + "name":"UK Weather information 2011", + "price":10, + "size":"3.1gb", + "tags":"weather, uk, 2011, temperature, humidity", + "type":"dataset", + "workExample":"423432fsd,51.509865,-0.118092,2011-01-01T10:55:11+00:00,7.2,68" + }, + "curation":{ + "numVotes":123, + "rating":0.93, + "schema":"Binary Votting" + } + }, + "serviceEndpoint":"http://myaquarius.org/api/v1/provider/assets/metadata/{did}", + "type":"Metadata" + } + ], + "type":"array" + } + }, + "required":[ + "@context", + "id", + "publicKey", + "authentication", + "service" + ], + "type":"object" + } + } + ], + "responses":{ + "201":{ + "description":"Asset successfully registered." + }, + "400":{ + "description":"One of the required attributes is missed." + }, + "404":{ + "description":"Invalid asset data." + }, + "500":{ + "description":"Error" + } + }, + "summary":"Register ddo of a new asset", + "tags":[ + "ddo" + ] + } + }, + "/api/v1/aquarius/assets/ddo/query":{ + "get":{ + "description":"", + "parameters":[ + { + "description":"ID of the asset.", + "in":"query", + "name":"text", + "required":true, + "type":"string" + }, + { + "description":"key or list of keys to sort the result", + "in":"query", + "name":"sort", + "type":"object" + }, + { + "description":"Number of records per page", + "example":100, + "in":"query", + "name":"offset", + "type":"int" + }, + { + "description":"Page showed", + "example":0, + "in":"query", + "name":"page", + "type":"int" + } + ], + "responses":{ + "200":{ + "description":"successful action" + } + }, + "summary":"Get a list of ddo that match with the text.", + "tags":[ + "ddo" + ] + }, + "post":{ + "consumes":[ + "application/json" + ], + "description":"", + "parameters":[ + { + "description":"Asset metadata.", + "in":"body", + "name":"body", + "required":true, + "schema":{ + "properties":{ + "offset":{ + "description":"Number of records per page", + "example":100, + "type":"int" + }, + "page":{ + "description":"Page showed", + "example":0, + "type":"int" + }, + "query":{ + "description":"Query to realize", + "example":{ + "value":1 + }, + "type":"string" + }, + "sort":{ + "description":"key or list of keys to sort the result", + "example":{ + "value":1 + }, + "type":"object" + } + }, + "type":"object" + } + } + ], + "responses":{ + "200":{ + "description":"successful action" + } + }, + "summary":"Get a list of ddo that match with the query executed.", + "tags":[ + "ddo" + ] + } + }, + "/api/v1/aquarius/assets/ddo/{did}":{ + "put":{ + "consumes":[ + "application/json" + ], + "description":"", + "parameters":[ + { + "description":"Asset ddo.", + "in":"body", + "name":"body", + "required":true, + "schema":{ + "properties":{ + "@context":{ + "description":null, + "example":"https://w3id.org/future-method/v1", + "type":"string" + }, + "authentication":{ + "description":"List with the authentications.", + "example":[ + { + "type":"RsaSignatureAuthentication2018" + }, + { + "publicKey":"did:op:123456789abcdefghi#keys-1" + } + ], + "type":"array" + }, + "id":{ + "description":"ID of the asset.", + "example":"did:op:123456789abcdefghi", + "type":"string" + }, + "publicKey":{ + "description":"List of publicKeys.", + "example":[ + { + "id":"did:op:123456789abcdefghi#keys-1" + }, + { + "type":"Ed25519VerificationKey2018" + }, + { + "owner":"did:op:123456789abcdefghi" + }, + { + "publicKeyBase58":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV" + } + ], + "type":"array" + }, + "service":{ + "description":"List of services.", + "example":[ + { + "serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}", + "type":"Consume" + }, + { + "serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}", + "type":"Compute" + }, + { + "metadata":{ + "additionalInformation":{ + "structuredMarkup":[ + { + "mediaType":"application/ld+json", + "uri":"http://skos.um.es/unescothes/C01194/jsonld" + }, + { + "mediaType":"text/turtle", + "uri":"http://skos.um.es/unescothes/C01194/turtle" + } + ], + "updateFrecuency":"yearly" + }, + "base":{ + "author":"Met Office", + "compression":"zip", + "contentType":"text/csv", + "contentUrls":[ + "https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip" + ], + "copyrightHolder":"Met Office", + "dateCreated":"2012-10-10T17:00:000Z", + "description":"Weather information of UK including temperature and humidity", + "encoding":"UTF-8", + "inLanguage":"en", + "license":"CC-BY", + "links":[ + { + "sample1":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-daily/" + }, + { + "sample2":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-averages-25km/" + }, + { + "fieldsDescription":"http://data.ceda.ac.uk/badc/ukcp09/" + } + ], + "name":"UK Weather information 2011", + "price":10, + "size":"3.1gb", + "tags":"weather, uk, 2011, temperature, humidity", + "type":"dataset", + "workExample":"423432fsd,51.509865,-0.118092,2011-01-01T10:55:11+00:00,7.2,68" + }, + "curation":{ + "numVotes":123, + "rating":0.93, + "schema":"Binary Votting" + } + }, + "serviceEndpoint":"http://myaquarius.org/api/v1/provider/assets/metadata/{did}", + "type":"Metadata" + } + ], + "type":"array" + } + }, + "required":[ + "@context", + "id", + "publicKey", + "authentication", + "service" + ], + "type":"object" + } + } + ], + "responses":{ + "200":{ + "description":"Asset successfully updated." + }, + "201":{ + "description":"Asset successfully registered." + }, + "400":{ + "description":"One of the required attributes is missed." + }, + "404":{ + "description":"Invalid asset data." + }, + "500":{ + "description":"Error" + } + }, + "summary":"Update ddo of an existing asset", + "tags":[ + "ddo" + ] + } + }, + "/api/v1/aquarius/assets/ddo/{id}":{ + "delete":{ + "description":"", + "parameters":[ + { + "description":"ID of the asset.", + "in":"path", + "name":"id", + "required":true, + "type":"string" + } + ], + "responses":{ + "200":{ + "description":"successfully deleted" + }, + "404":{ + "description":"This asset id is not in OceanDB" + }, + "500":{ + "description":"Error" + } + }, + "summary":"Retire metadata of an asset", + "tags":[ + "ddo" + ] + }, + "get":{ + "description":"", + "parameters":[ + { + "description":"ID of the asset.", + "in":"path", + "name":"id", + "required":true, + "type":"string" + } + ], + "responses":{ + "200":{ + "description":"successful operation" + }, + "404":{ + "description":"This asset id is not in OceanDB" + } + }, + "summary":"Get ddo of a particular asset.", + "tags":[ + "ddo" + ] + } + }, + "/api/v1/aquarius/assets/metadata/{id}":{ + "get":{ + "description":"", + "parameters":[ + { + "description":"ID of the asset.", + "in":"path", + "name":"id", + "required":true, + "type":"string" + } + ], + "responses":{ + "200":{ + "description":"successful operation" + }, + "404":{ + "description":"This asset id is not in OceanDB" + } + }, + "summary":"Get metadata of a particular asset", + "tags":[ + "metadata" + ] + } + } + }, + "swagger":"2.0" +} diff --git a/data/sidebars/api.yml b/data/sidebars/api.yml index 3bca2d21..8ce3a95e 100644 --- a/data/sidebars/api.yml +++ b/data/sidebars/api.yml @@ -11,4 +11,4 @@ - group: aquarius items: - title: API reference - link: https://github.com/oceanprotocol/aquarius/blob/develop/docs/for_api_users/API.md + link: /api/aquarius/ diff --git a/gatsby-config.js b/gatsby-config.js index 6464be02..755a5d6b 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -1,3 +1,6 @@ +const fs = require('fs') +const path = require('path') + require('dotenv').config() if (!process.env.GITHUB_TOKEN) { @@ -9,6 +12,20 @@ if (!process.env.GITHUB_TOKEN) { const config = require('./config.js') +const fromJson = filePath => { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf8', (err, data) => { + if (err) { + reject(err) + return + } + + const spec = JSON.parse(data) + resolve(spec) + }) + }) +} + module.exports = { siteMetadata: { // spread all of our config values here @@ -106,6 +123,21 @@ module.exports = { ] } }, + { + resolve: 'gatsby-source-openapi-aggregate', + options: { + specs: [ + { + name: 'aquarius', + resolve: () => + fromJson( + path.resolve(__dirname, './data/aquarius.json') + ) + } + ] + } + }, + 'gatsby-transformer-json', 'gatsby-transformer-yaml', { resolve: 'gatsby-plugin-sass', diff --git a/gatsby-node.js b/gatsby-node.js index f393bf48..58aabfa4 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -74,6 +74,17 @@ exports.createPages = ({ graphql, actions }) => { } } } + + allOpenApiSpec { + edges { + node { + id + name + version + title + } + } + } } ` ).then(result => { @@ -122,6 +133,27 @@ exports.createPages = ({ graphql, actions }) => { }) }) + // Create pages from swagger json files + const swaggerSpecs = result.data.allOpenApiSpec.edges + const apiSwaggerTemplate = path.resolve( + './src/templates/ApiSwagger.jsx' + ) + console.log(swaggerSpecs) + + swaggerSpecs.map(({ node }) => { + const slug = `/api/${node.name}` + console.log(slug) + + createPage({ + path: slug, + component: apiSwaggerTemplate, + context: { + slug, + id: node.id + } + }) + }) + resolve() }) ) diff --git a/package.json b/package.json index 7c410eb9..7b677569 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,8 @@ "gatsby-remark-smartypants": "^2.0.6", "gatsby-source-filesystem": "^2.0.9", "gatsby-source-graphql": "^2.0.6", + "gatsby-source-openapi-aggregate": "^0.1.8", + "gatsby-transformer-json": "^2.1.5", "gatsby-transformer-remark": "^2.1.12", "gatsby-transformer-sharp": "^2.1.8", "gatsby-transformer-yaml": "^2.1.5", diff --git a/src/templates/ApiSwagger.jsx b/src/templates/ApiSwagger.jsx new file mode 100644 index 00000000..f5ef5123 --- /dev/null +++ b/src/templates/ApiSwagger.jsx @@ -0,0 +1,112 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { graphql } from 'gatsby' +import Helmet from 'react-helmet' +import Layout from '../components/Layout' +import Content from '../components/Content' +import HeaderSection from '../components/HeaderSection' +import Sidebar from '../components/Sidebar' +import DocHeader from '../components/DocHeader' +import SEO from '../components/Seo' +import stylesDoc from './Doc.module.scss' + +export default class ApiSwaggerTemplate extends Component { + static propTypes = { + data: PropTypes.object.isRequired, + location: PropTypes.object.isRequired, + pageContext: PropTypes.object.isRequired + } + + render() { + const { location } = this.props + const api = this.props.data.openApiSpec + const paths = api.childrenOpenApiSpecPath + const sections = this.props.data.allSectionsYaml.edges + const { title, description } = api + + // output section title as defined in sections.yml + const sectionTitle = sections.map(({ node }) => { + // compare section against section title from sections.yml + if (node.title.toLowerCase().includes('api')) { + return node.title + } + }) + + return ( + <> + + + + + + + + + + +
+ +
+ + + {Object.keys(paths).map(path => ( +
{path}
+ ))} +
+
+
+
+ + ) + } +} + +export const pageQuery = graphql` + query ApiQuery($id: String!) { + openApiSpec(id: { eq: $id }) { + version + title + description + childrenOpenApiSpecPath { + name + verb + summary + description + parameters { + name + in + description + required + type + } + tag + childrenOpenApiSpecResponse { + id + statusCode + description + } + } + } + + allSectionsYaml { + edges { + node { + title + description + link + } + } + } + } +`