Skip to content

Instantly share code, notes, and snippets.

@neharkarvishal
Created January 7, 2023 09:08
Show Gist options
  • Save neharkarvishal/6acc872ee0231c40c9b69e18cf54167e to your computer and use it in GitHub Desktop.
Save neharkarvishal/6acc872ee0231c40c9b69e18cf54167e to your computer and use it in GitHub Desktop.
Generate Cache Key
'use strict';
const { generateHeadersKey } = require('./generateHeadersKey');
const { generateQueryParamsKey } = require('./generateQueryParamsKey');
function generateCacheKey(
ctx,
keys = {
useQueryParams: false, // @todo: array or boolean => can be optimized
useHeaders: [],
}
) {
let querySuffix = '';
let headersSuffix = '';
if (keys.useQueryParams !== false) {
querySuffix = generateQueryParamsKey(ctx, keys.useQueryParams);
}
if (keys.useHeaders.length > 0) {
headersSuffix = generateHeadersKey(ctx, keys.useHeaders);
}
return `${ctx.request.path}?${querySuffix}&${headersSuffix}`;
}
module.exports = { generateCacheKey };
'use strict';
function generateHeadersKey(ctx, useHeaders = []) {
return useHeaders
.filter((k) => ctx.request.header[k] !== undefined)
.map((k) => `${k.toLowerCase()}=${ctx.request.header[k.toLowerCase()]}`) // headers are key insensitive
.join(',');
}
module.exports = { generateHeadersKey };
'use strict';
function generateQueryParamsKey(
ctx,
useQueryParams = true // @todo: array or boolean => can be optimized
) {
let keys = [];
if (useQueryParams === true) {
keys = Object.keys(ctx.query);
} else if (useQueryParams.length > 0) {
keys = Object.keys(ctx.query).filter((key) => useQueryParams.includes(key));
}
if (keys.length === 0) {
return '';
}
keys.sort();
return keys
.map(
(k) =>
`${k}=${
typeof ctx.query[k] === 'object'
? JSON.stringify(ctx.query[k])
: ctx.query[k]
}`
) // query strings are key sensitive
.join(',');
}
module.exports = { generateQueryParamsKey };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment