Commit 0e233644 authored by Filipa Lacerda's avatar Filipa Lacerda

Merge branch 'graphql-batch-requests-ee' into 'master'

Enable GraphQL batch requests

See merge request gitlab-org/gitlab-ce!28370
parents 9b3672ec bcf01ada
import { ApolloClient } from 'apollo-client'; import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory'; import { InMemoryCache } from 'apollo-cache-inmemory';
import { createUploadLink } from 'apollo-upload-client'; import { createUploadLink } from 'apollo-upload-client';
import { ApolloLink } from 'apollo-link';
import { BatchHttpLink } from 'apollo-link-batch-http';
import csrf from '~/lib/utils/csrf'; import csrf from '~/lib/utils/csrf';
export default (resolvers = {}, config = {}) => { export default (resolvers = {}, config = {}) => {
...@@ -11,13 +13,19 @@ export default (resolvers = {}, config = {}) => { ...@@ -11,13 +13,19 @@ export default (resolvers = {}, config = {}) => {
uri = `${config.baseUrl}${uri}`.replace(/\/{3,}/g, '/'); uri = `${config.baseUrl}${uri}`.replace(/\/{3,}/g, '/');
} }
return new ApolloClient({ const httpOptions = {
link: createUploadLink({
uri, uri,
headers: { headers: {
[csrf.headerKey]: csrf.token, [csrf.headerKey]: csrf.token,
}, },
}), };
return new ApolloClient({
link: ApolloLink.split(
operation => operation.getContext().hasUpload,
createUploadLink(httpOptions),
new BatchHttpLink(httpOptions),
),
cache: new InMemoryCache(config.cacheConfig), cache: new InMemoryCache(config.cacheConfig),
resolvers, resolvers,
}); });
......
...@@ -53,7 +53,8 @@ class GraphqlController < ApplicationController ...@@ -53,7 +53,8 @@ class GraphqlController < ApplicationController
{ {
query: single_query_info[:query], query: single_query_info[:query],
variables: build_variables(single_query_info[:variables]), variables: build_variables(single_query_info[:variables]),
operation_name: single_query_info[:operationName] operation_name: single_query_info[:operationName],
context: context
} }
end end
end end
......
...@@ -52,13 +52,22 @@ describe 'GitlabSchema configurations' do ...@@ -52,13 +52,22 @@ describe 'GitlabSchema configurations' do
end end
context 'multiplexed queries' do context 'multiplexed queries' do
let(:current_user) { nil }
subject do subject do
queries = [ queries = [
{ query: graphql_query_for('project', { 'fullPath' => project.full_path }, %w(id name description)) }, { query: graphql_query_for('project', { 'fullPath' => '$fullPath' }, %w(id name description)) },
{ query: graphql_query_for('echo', { 'text' => "$test" }, []), variables: { "test" => "Hello world" } } { query: graphql_query_for('echo', { 'text' => "$test" }, []), variables: { "test" => "Hello world" } },
{ query: graphql_query_for('project', { 'fullPath' => project.full_path }, "userPermissions { createIssue }") }
] ]
post_multiplex(queries) post_multiplex(queries, current_user: current_user)
end
it 'does not authenticate all queries' do
subject
expect(json_response.last['data']['project']).to be_nil
end end
it_behaves_like 'imposing query limits' do it_behaves_like 'imposing query limits' do
...@@ -69,18 +78,28 @@ describe 'GitlabSchema configurations' do ...@@ -69,18 +78,28 @@ describe 'GitlabSchema configurations' do
subject subject
# Expect a response for each query, even though it will be empty # Expect a response for each query, even though it will be empty
expect(json_response.size).to eq(2) expect(json_response.size).to eq(3)
json_response.each do |single_query_response| json_response.each do |single_query_response|
expect(single_query_response).not_to have_key('data') expect(single_query_response).not_to have_key('data')
end end
# Expect errors for each query # Expect errors for each query
expect(graphql_errors.size).to eq(2) expect(graphql_errors.size).to eq(3)
graphql_errors.each do |single_query_errors| graphql_errors.each do |single_query_errors|
expect(single_query_errors.first['message']).to include('which exceeds max complexity of 4') expect(single_query_errors.first['message']).to include('which exceeds max complexity of 4')
end end
end end
end end
context 'authentication' do
let(:current_user) { project.owner }
it 'authenticates all queries' do
subject
expect(json_response.last['data']['project']['userPermissions']['createIssue']).to be(true)
end
end
end end
context 'when IntrospectionQuery' do context 'when IntrospectionQuery' do
......
...@@ -1398,6 +1398,24 @@ apollo-client@^2.5.1: ...@@ -1398,6 +1398,24 @@ apollo-client@^2.5.1:
tslib "^1.9.3" tslib "^1.9.3"
zen-observable "^0.8.0" zen-observable "^0.8.0"
apollo-link-batch-http@^1.2.11:
version "1.2.11"
resolved "https://registry.yarnpkg.com/apollo-link-batch-http/-/apollo-link-batch-http-1.2.11.tgz#ae42dbcc02820658e1e267d05bf2aae7ac208088"
integrity sha512-f+KEdbP51I3AeEaBDW2lKS3eaPK/1IXaTM9F2moj02s1hgC/TzeUORRuUeOExW8ggXveW1Jzp6aYMJ2SQkZJyA==
dependencies:
apollo-link "^1.2.11"
apollo-link-batch "^1.1.12"
apollo-link-http-common "^0.2.13"
tslib "^1.9.3"
apollo-link-batch@^1.1.12:
version "1.1.12"
resolved "https://registry.yarnpkg.com/apollo-link-batch/-/apollo-link-batch-1.1.12.tgz#64eb231082f182b0395ef7ab903600627f6c7fe8"
integrity sha512-6NqLiB9tEGxRiyhtnX/7CPHkmFG0IXfEP7pC5kirhjV+4KxqBaWvJnJGKpGp7Owgdph7KJlV+9+niOKEkcwreg==
dependencies:
apollo-link "^1.2.11"
tslib "^1.9.3"
apollo-link-dedup@^1.0.0: apollo-link-dedup@^1.0.0:
version "1.0.10" version "1.0.10"
resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz#7b94589fe7f969777efd18a129043c78430800ae" resolved "https://registry.yarnpkg.com/apollo-link-dedup/-/apollo-link-dedup-1.0.10.tgz#7b94589fe7f969777efd18a129043c78430800ae"
...@@ -1405,7 +1423,7 @@ apollo-link-dedup@^1.0.0: ...@@ -1405,7 +1423,7 @@ apollo-link-dedup@^1.0.0:
dependencies: dependencies:
apollo-link "^1.2.3" apollo-link "^1.2.3"
apollo-link-http-common@^0.2.8: apollo-link-http-common@^0.2.13, apollo-link-http-common@^0.2.8:
version "0.2.13" version "0.2.13"
resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz#c688f6baaffdc7b269b2db7ae89dae7c58b5b350" resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.13.tgz#c688f6baaffdc7b269b2db7ae89dae7c58b5b350"
integrity sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA== integrity sha512-Uyg1ECQpTTA691Fwx5e6Rc/6CPSu4TB4pQRTGIpwZ4l5JDOQ+812Wvi/e3IInmzOZpwx5YrrOfXrtN8BrsDXoA==
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment