This is an automated email from the ASF dual-hosted git repository. shuber pushed a commit to branch UNOMI-296-graphql-playground in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 3f5669b0f84eff5956dd105c12cf17b39003fd80 Author: Serge Huber <[email protected]> AuthorDate: Wed Jul 1 10:12:16 2020 +0200 UNOMI-296 Integrate GraphQL Playground Also contains some feature refactoring to make Swagger UI and GraphQL Playground separate Karaf features that could be uninstalled. --- graphql/graphql-playground/.babelrc | 6 ++ graphql/graphql-playground/package.json | 32 ++++++ graphql/graphql-playground/pom.xml | 115 +++++++++++++++++++++ .../graphql-playground/src/javascript/index.jsx | 30 ++++++ .../graphql-playground/src/main/webapp/index.css | 45 ++++++++ .../graphql-playground/src/main/webapp/index.html | 67 ++++++++++++ graphql/graphql-playground/webpack.config.js | 50 +++++++++ graphql/pom.xml | 1 + kar/src/main/feature/feature.xml | 11 +- package/pom.xml | 2 + wab/src/main/webapp/index.html | 6 ++ 11 files changed, 364 insertions(+), 1 deletion(-) diff --git a/graphql/graphql-playground/.babelrc b/graphql/graphql-playground/.babelrc new file mode 100644 index 0000000..0960c01 --- /dev/null +++ b/graphql/graphql-playground/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ] +} \ No newline at end of file diff --git a/graphql/graphql-playground/package.json b/graphql/graphql-playground/package.json new file mode 100644 index 0000000..d3537d9 --- /dev/null +++ b/graphql/graphql-playground/package.json @@ -0,0 +1,32 @@ +{ + "name": "unomi-graphql-playground", + "version": "1.0.0", + "description": "The Apache Unomi GraphQL Playground integration.", + "main": "target/javascript/unomi-graphql-playground.js", + "keywords": [ + "unomi", + "graphql-playground", + "apache" + ], + "author": "Apache Software Foundation", + "license": "Apache-2.0", + "scripts": { + "build": "webpack" + }, + "dependencies": { + "graphql": "^15.2.0", + "graphql-playground-react": "^1.7.23", + "react": "^16.13.1" + }, + "devDependencies": { + "@babel/core": "^7.10.4", + "@babel/preset-env": "^7.10.4", + "@babel/preset-react": "^7.10.4", + "babel-loader": "^8.1.0", + "css-loader": "^3.6.0", + "file-loader": "^6.0.0", + "style-loader": "^1.2.1", + "webpack": "^4.43.0", + "webpack-cli": "^3.3.12" + } +} diff --git a/graphql/graphql-playground/pom.xml b/graphql/graphql-playground/pom.xml new file mode 100644 index 0000000..70dd054 --- /dev/null +++ b/graphql/graphql-playground/pom.xml @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to You under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.unomi</groupId> + <artifactId>unomi-graphql</artifactId> + <version>2.0.0-SNAPSHOT</version> + </parent> + + <artifactId>unomi-graphql-playground</artifactId> + <name>Apache Unomi :: GraphQL API :: GraphQL Playground</name> + <description>An integrated GraphQL playground UI</description> + <packaging>bundle</packaging> + + <properties> + <yarn.arguments>build</yarn.arguments> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.unomi</groupId> + <artifactId>unomi-api</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient-osgi</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpcore-osgi</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <scope>provided</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>com.github.eirslett</groupId> + <artifactId>frontend-maven-plugin</artifactId> + <version>1.8.0</version> + <executions> + <execution> + <id>npm install node and yarn</id> + <phase>generate-resources</phase> + <goals> + <goal>install-node-and-yarn</goal> + </goals> + <configuration> + <nodeVersion>v11.11.0</nodeVersion> + <yarnVersion>v1.19.1</yarnVersion> + </configuration> + </execution> + <execution> + <id>yarn install</id> + <phase>generate-resources</phase> + <goals> + <goal>yarn</goal> + </goals> + </execution> + <execution> + <id>yarn post-install</id> + <phase>generate-resources</phase> + <goals> + <goal>yarn</goal> + </goals> + <configuration> + <arguments>${yarn.arguments}</arguments> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <_wab>src/main/webapp,target/javascript</_wab> + <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> + <Import-Package> + * + </Import-Package> + <Web-ContextPath>/graphql-ui</Web-ContextPath> + </instructions> + </configuration> + </plugin> + </plugins> + </build> + +</project> diff --git a/graphql/graphql-playground/src/javascript/index.jsx b/graphql/graphql-playground/src/javascript/index.jsx new file mode 100644 index 0000000..15c13f5 --- /dev/null +++ b/graphql/graphql-playground/src/javascript/index.jsx @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import {Provider} from 'react-redux'; +import {Playground, store} from 'graphql-playground-react'; + +document.addEventListener('DOMContentLoaded', function() { + ReactDOM.render( + <Provider store={store}> + <Playground endpoint='http://localhost:8181/graphql'/> + </Provider>, + document.body + ) +}, false); diff --git a/graphql/graphql-playground/src/main/webapp/index.css b/graphql/graphql-playground/src/main/webapp/index.css new file mode 100644 index 0000000..054969a --- /dev/null +++ b/graphql/graphql-playground/src/main/webapp/index.css @@ -0,0 +1,45 @@ +@import "https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700|Source+Code+Pro:400,700"; + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + overflow: hidden; +} + +#root { + height: 100%; +} + +body { + font-family: 'Open Sans', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: rgba(0,0,0,.8); + line-height: 1.5; + height: 100vh; + letter-spacing: 0.53px; + margin-right: -1px !important; +} + +html, body, p, a, h1, h2, h3, h4, ul, pre, code { + margin: 0; + padding: 0; + color: inherit; +} + +a:active, a:focus, button:focus, input:focus { + outline: none; +} + +input, button, submit { + border: none; +} + +input, button, pre { + font-family: 'Open Sans', sans-serif; +} + +code { + font-family: Consolas, monospace; +} \ No newline at end of file diff --git a/graphql/graphql-playground/src/main/webapp/index.html b/graphql/graphql-playground/src/main/webapp/index.html new file mode 100644 index 0000000..f581719 --- /dev/null +++ b/graphql/graphql-playground/src/main/webapp/index.html @@ -0,0 +1,67 @@ +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one or more + ~ contributor license agreements. See the NOTICE file distributed with + ~ this work for additional information regarding copyright ownership. + ~ The ASF licenses this file to You under the Apache License, Version 2.0 + ~ (the "License"); you may not use this file except in compliance with + ~ the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<!DOCTYPE html> +<html> + +<head> + <meta charset=utf-8 /> + <meta name="viewport" content="user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui"> + <title>GraphQL Playground</title> + <link href="index.css" rel="stylesheet" /> + <script src="unomi-graphql-playground.js"></script> +</head> + +<body> +<div id="root"> + <style> + body { + background-color: rgb(23, 42, 58); + font-family: Open Sans, sans-serif; + height: 90vh; + } + + #root { + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + } + + .loading { + font-size: 32px; + font-weight: 200; + color: rgba(255, 255, 255, .6); + margin-left: 20px; + } + + img { + width: 78px; + height: 78px; + } + + .title { + font-weight: 400; + } + </style> + <div class="loading"> Loading + <span class="title">GraphQL Playground</span> + </div> +</div> +</body> + +</html> \ No newline at end of file diff --git a/graphql/graphql-playground/webpack.config.js b/graphql/graphql-playground/webpack.config.js new file mode 100644 index 0000000..9b6e335 --- /dev/null +++ b/graphql/graphql-playground/webpack.config.js @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +const path = require('path'); + +module.exports = { + entry: './src/javascript/index.jsx', + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: ['babel-loader'] + }, + { + test: /\.(png|svg|jpg|gif)$/, + use: [ + 'file-loader', + ], + }, + { + test: /\.css$/, + use: [ + 'style-loader', + 'css-loader', + ], + }, + ] + }, + resolve: { + extensions: ['*', '.js', '.jsx'] + }, + output: { + path: path.resolve(__dirname, 'target/javascript'), + filename: 'unomi-graphql-playground.js' + } +}; \ No newline at end of file diff --git a/graphql/pom.xml b/graphql/pom.xml index eaa4219..822a215 100644 --- a/graphql/pom.xml +++ b/graphql/pom.xml @@ -41,6 +41,7 @@ <modules> <module>cxs-impl</module> + <module>graphql-playground</module> <module>karaf-feature</module> </modules> diff --git a/kar/src/main/feature/feature.xml b/kar/src/main/feature/feature.xml index 69ecb29..f000558 100644 --- a/kar/src/main/feature/feature.xml +++ b/kar/src/main/feature/feature.xml @@ -82,11 +82,20 @@ <bundle start-level="85" start="false">mvn:org.apache.unomi/unomi-web-tracker-wab/${project.version}</bundle> <bundle start-level="99">mvn:org.apache.unomi/shell-commands/${project.version}</bundle> - <bundle start-level="85">mvn:org.webjars/swagger-ui/3.23.8</bundle> </feature> <feature name="unomi-documentation" description="Documentation of Unomi in HTML" version="${project.version}"> <feature>war</feature> <bundle>mvn:org.apache.unomi/manual/${project.version}</bundle> </feature> + + <feature name="unomi-rest-ui" description="Enables Swagger UI to browse the REST API" version="${project.version"> + <feature>unomi-kar</feature> + <bundle start-level="85">mvn:org.webjars/swagger-ui/3.23.8</bundle> + </feature> + + <feature name="unomi-graphql-ui" description="Enables GraphQL UI to browse the GraphQL API" version="${project.version}"> + <feature>unomi-kar</feature> + <bundle start-level="85">mvn:org.apache.unomi/unomi-graphql-playground/${project.version}</bundle> + </feature> </features> diff --git a/package/pom.xml b/package/pom.xml index c995048..2e31641 100644 --- a/package/pom.xml +++ b/package/pom.xml @@ -344,6 +344,8 @@ <feature>unomi-router-karaf-feature</feature> <feature>unomi-web-tracker-karaf-kar</feature> <feature>cdp-graphql-feature</feature> + <feature>unomi-rest-ui</feature> + <feature>unomi-graphql-ui</feature> </bootFeatures> <!-- <libraries> diff --git a/wab/src/main/webapp/index.html b/wab/src/main/webapp/index.html index dec81a4..56363a7 100644 --- a/wab/src/main/webapp/index.html +++ b/wab/src/main/webapp/index.html @@ -67,6 +67,12 @@ <li> Try Apache Unomi's <a href="/tracker/">integrated tracker</a> </li> + <li> + Access the <a href="/graphql-ui">GraphQL Playground UI</a> to browse and test GraphQL API requests + </li> + <li> + Access <a href="/cxs/api-docs?url=openapi.json">Swagger REST API UI</a> to browse and test the REST API + </li> <li>Checkout some cool <a href="http://unomi.apache.org/resources.html" target="_blank">videos & tutorials</a> </li> <li>Read <a href="http://unomi.apache.org/manual/latest/index.html" target="_blank">Apache Unomi's manual</a>
