Cache: Fix check if endpoint is /graphql or not (#15599)

This commit is contained in:
José Varela
2022-09-16 14:12:00 +01:00
committed by GitHub
parent 93a99f0b87
commit 54cd2d47da
4 changed files with 34 additions and 12 deletions

View File

@@ -4,33 +4,49 @@ import { getCacheKey } from '../../src/utils/get-cache-key';
const restUrl = 'http://localhost/items/example';
const graphQlUrl = 'http://localhost/graphql';
const accountability = { user: '00000000-0000-0000-0000-000000000000' };
const method = 'GET';
const requests = [
{
name: 'as unauthenticated request',
params: { originalUrl: restUrl },
params: { method, originalUrl: restUrl },
key: '17da8272c9a0ec6eea38a37d6d78bddeb7c79045',
},
{
name: 'as authenticated request',
params: { originalUrl: restUrl, accountability },
params: { method, originalUrl: restUrl, accountability },
key: '99a6394222a3d7d149ac1662fc2fff506932db58',
},
{
name: 'a request with a fields query',
params: { originalUrl: restUrl, sanitizedQuery: { fields: ['id', 'name'] } },
params: { method, originalUrl: restUrl, sanitizedQuery: { fields: ['id', 'name'] } },
key: 'aa6e2d8a78de4dfb4af6eaa230d1cd9b7d31ed19',
},
{
name: 'a request with a filter query',
params: { originalUrl: restUrl, sanitizedQuery: { filter: { name: { _eq: 'test' } } } },
params: { method, originalUrl: restUrl, sanitizedQuery: { filter: { name: { _eq: 'test' } } } },
key: 'd7eb8970f0429e1cf85e12eb5bb8669f618b09d3',
},
{
name: 'a GraphQL query request',
params: { originalUrl: graphQlUrl, query: { query: 'query { test { id } }' } },
name: 'a GraphQL GET query request',
params: { method, originalUrl: graphQlUrl, query: { query: 'query { test { id } }' } },
key: '201731b75c627c60554512d819b6935b54c73814',
},
{
name: 'a GraphQL POST query request',
params: { method: 'POST', originalUrl: graphQlUrl, body: { query: 'query { test { name } }' } },
key: '64eb0c48ea69d0863ff930398f29b5c7884f88f7',
},
{
name: 'an authenticated GraphQL GET query request',
params: { method, originalUrl: graphQlUrl, accountability, query: { query: 'query { test { id } }' } },
key: '9bc52c98dcf2de04c64589f52e0ada1e38d53a90',
},
{
name: 'an authenticated GraphQL POST query request',
params: { method: 'POST', originalUrl: graphQlUrl, accountability, body: { query: 'query { test { name } }' } },
key: '051ea77ce5ba71bbc88bcb567b9ddc602b585c13',
},
];
const cases = requests.map(({ name, params, key }) => [name, params, key]);
@@ -41,7 +57,7 @@ describe('get cache key', () => {
});
test('should create a unique key for each request', () => {
const keys = requests.map((r) => r.key);
const keys = cases.map(([, params]) => getCacheKey(params as unknown as Request));
const hasDuplicate = keys.some((key) => keys.indexOf(key) !== keys.lastIndexOf(key));
expect(hasDuplicate).toBeFalsy();
@@ -52,9 +68,14 @@ describe('get cache key', () => {
const operationName = 'test';
const variables1 = JSON.stringify({ name: 'test 1' });
const variables2 = JSON.stringify({ name: 'test 2' });
const req1: any = { originalUrl: graphQlUrl, query: { query, operationName, variables: variables1 } };
const req2: any = { originalUrl: graphQlUrl, query: { query, operationName, variables: variables2 } };
const req1: any = { method, originalUrl: graphQlUrl, query: { query, operationName, variables: variables1 } };
const req2: any = { method, originalUrl: graphQlUrl, query: { query, operationName, variables: variables2 } };
const postReq1: any = { method: 'POST', originalUrl: req1.originalUrl, body: req1.query };
const postReq2: any = { method: 'POST', originalUrl: req2.originalUrl, body: req2.query };
expect(getCacheKey(req1)).not.toEqual(getCacheKey(req2));
expect(getCacheKey(postReq1)).not.toEqual(getCacheKey(postReq2));
expect(getCacheKey(req1)).toEqual(getCacheKey(postReq1));
expect(getCacheKey(req2)).toEqual(getCacheKey(postReq2));
});
});

View File

@@ -6,11 +6,12 @@ import { pick } from 'lodash';
export function getCacheKey(req: Request): string {
const path = url.parse(req.originalUrl).pathname;
const isGraphQl = path?.includes('/graphql');
const isGet = req.method?.toLowerCase() === 'get';
const info = {
user: req.accountability?.user || null,
path,
query: isGraphQl ? pick(req.query, ['query', 'variables']) : req.sanitizedQuery,
query: isGraphQl ? pick(isGet ? req.query : req.body, ['query', 'variables']) : req.sanitizedQuery,
};
const key = hash(info);