From 95341965acc56ce29b745c7dd964acd5754fba48 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 25 Apr 2020 12:53:50 +0200 Subject: [PATCH] plugins/graphiql: added graphql browsing api --- .../graphiql/src/lib/api/GraphQLBrowser.ts | 62 +++++++++++++++++++ plugins/graphiql/src/lib/api/index.ts | 18 ++++++ plugins/graphiql/src/lib/api/types.ts | 39 ++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 plugins/graphiql/src/lib/api/GraphQLBrowser.ts create mode 100644 plugins/graphiql/src/lib/api/index.ts create mode 100644 plugins/graphiql/src/lib/api/types.ts diff --git a/plugins/graphiql/src/lib/api/GraphQLBrowser.ts b/plugins/graphiql/src/lib/api/GraphQLBrowser.ts new file mode 100644 index 0000000000..645658237d --- /dev/null +++ b/plugins/graphiql/src/lib/api/GraphQLBrowser.ts @@ -0,0 +1,62 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed 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 { GraphQLBrowseApi, GraphQLEndpoint } from './types'; + +// Helper for generic http endpoints +export type EndpointConfig = { + id: string; + title: string; + // Endpoint URL + url: string; + // only supports POST right now + method?: 'POST'; + // Defaults to setting Content-Type to application/json + headers?: { [name in string]: string }; +}; + +export class GraphQLBrowser implements GraphQLBrowseApi { + static createEndpoint(config: EndpointConfig): GraphQLEndpoint { + const { id, title, url, method = 'POST' } = config; + return { + id, + title, + fetcher: async (params: any) => { + const body = JSON.stringify(params); + const headers = { + 'Content-Type': 'application/json', + ...config.headers, + }; + const res = await fetch(url, { + method, + headers, + body, + }); + return res.json(); + }, + }; + } + + static fromEndpoints(endpoints: GraphQLEndpoint[]) { + return new GraphQLBrowser(endpoints); + } + + private constructor(private readonly endpoints: GraphQLEndpoint[]) {} + + async getEndpoints() { + return this.endpoints; + } +} diff --git a/plugins/graphiql/src/lib/api/index.ts b/plugins/graphiql/src/lib/api/index.ts new file mode 100644 index 0000000000..e5ae2131ea --- /dev/null +++ b/plugins/graphiql/src/lib/api/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed 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. + */ + +export * from './GraphQLBrowser'; +export * from './types'; diff --git a/plugins/graphiql/src/lib/api/types.ts b/plugins/graphiql/src/lib/api/types.ts new file mode 100644 index 0000000000..6c41e2aaa0 --- /dev/null +++ b/plugins/graphiql/src/lib/api/types.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed 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 { ApiRef } from '@backstage/core'; + +export type GraphQLEndpoint = { + // Will be used as unique key for storing history and query data + id: string; + + // Displayed to the user to identify the source. + title: string; + + // Method used send a GraphQL query. + // The body parameter is equivalent to the POST body to be JSON-serialized, and the + // return value should be the equivalent of a parsed JSON response from that POST. + fetcher: (body: any) => Promise; +}; + +export type GraphQLBrowseApi = { + getEndpoints(): Promise; +}; + +export const graphQlBrowseApiRef = new ApiRef({ + id: 'plugin.graphiql.browse', + description: 'Used to supply GraphQL endpoints for browsing', +});