fix(cache): make cache keys for review more distinctive

This commit is contained in:
zyachel 2024-03-31 17:21:35 +05:30
parent 1041de5439
commit 324c138ec4
5 changed files with 20 additions and 16 deletions

View File

@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
import type { TitleReviewsCursored } from 'src/interfaces/shared/titleReviews'; import type { TitleReviewsCursored } from 'src/interfaces/shared/titleReviews';
import { cursoredReviews } from 'src/utils/fetchers/titleReviews'; import { cursoredReviews } from 'src/utils/fetchers/titleReviews';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import { titleReviewsCursoredKey } from 'src/utils/constants/keys'; import { titleReviewsKey } from 'src/utils/constants/keys';
import { AppError, cleanQueryStr } from 'src/utils/helpers'; import { AppError, cleanQueryStr } from 'src/utils/helpers';
import { keys as titleReviewsQueryKeys } from 'src/utils/constants/titleReviewsFilters'; import { keys as titleReviewsQueryKeys } from 'src/utils/constants/titleReviewsFilters';
@ -19,7 +19,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
const queryObj = req.query as Record<string, string>; const queryObj = req.query as Record<string, string>;
const queryStr = cleanQueryStr(queryObj, titleReviewsQueryKeys); const queryStr = cleanQueryStr(queryObj, titleReviewsQueryKeys);
const data = await getOrSetApiCache( const data = await getOrSetApiCache(
titleReviewsCursoredKey(titleId, paginationKey), titleReviewsKey(titleId, queryStr, paginationKey),
cursoredReviews, cursoredReviews,
titleId, titleId,
paginationKey, paginationKey,

View File

@ -15,7 +15,12 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
const titleId = req.query.titleId as string; const titleId = req.query.titleId as string;
const queryObj = req.query as Record<string, string>; const queryObj = req.query as Record<string, string>;
const queryStr = cleanQueryStr(queryObj, keys); const queryStr = cleanQueryStr(queryObj, keys);
const data = await getOrSetApiCache(titleReviewsKey(titleId), reviews, titleId, queryStr); const data = await getOrSetApiCache(
titleReviewsKey(titleId, queryStr, null),
reviews,
titleId,
queryStr
);
res.status(200).json({ status: true, data }); res.status(200).json({ status: true, data });
} catch (error: any) { } catch (error: any) {
const { message = 'Not found', statusCode = 404 } = error; const { message = 'Not found', statusCode = 404 } = error;

View File

@ -2,14 +2,14 @@ import { GetServerSideProps, InferGetServerSidePropsType } from 'next';
import Meta from 'src/components/meta/Meta'; import Meta from 'src/components/meta/Meta';
import Layout from 'src/components/layout'; import Layout from 'src/components/layout';
import ErrorInfo from 'src/components/error/ErrorInfo'; import ErrorInfo from 'src/components/error/ErrorInfo';
import { BasicCard, Filters, Pagination, Reviews, TitleCard } from 'src/components/titleReviews'; import { BasicCard, Filters, Pagination, Reviews } from 'src/components/titleReviews';
import { AppError } from 'src/interfaces/shared/error'; import { AppError } from 'src/interfaces/shared/error';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import titleReviews, { cursoredReviews } from 'src/utils/fetchers/titleReviews'; import { cursoredReviews } from 'src/utils/fetchers/titleReviews';
import { cleanQueryStr, getProxiedIMDbImgUrl } from 'src/utils/helpers'; import { cleanQueryStr } from 'src/utils/helpers';
import { titleKey, titleReviewsKey } from 'src/utils/constants/keys'; import { titleReviewsKey } from 'src/utils/constants/keys';
import styles from 'src/styles/modules/pages/titleReviews/titleReviews.module.scss'; import styles from 'src/styles/modules/pages/titleReviews/titleReviews.module.scss';
import TitleReviews, { TitleReviewsCursored } from 'src/interfaces/shared/titleReviews'; import { TitleReviewsCursored } from 'src/interfaces/shared/titleReviews';
import { keys as titleReviewsQueryKeys } from 'src/utils/constants/titleReviewsFilters'; import { keys as titleReviewsQueryKeys } from 'src/utils/constants/titleReviewsFilters';
type Props = InferGetServerSidePropsType<typeof getServerSideProps>; type Props = InferGetServerSidePropsType<typeof getServerSideProps>;
@ -51,7 +51,7 @@ export const getServerSideProps: GetServerSideProps<Data, Params> = async ctx =>
try { try {
const data = await getOrSetApiCache( const data = await getOrSetApiCache(
titleKey(titleId), titleReviewsKey(titleId, queryStr, paginationKey),
cursoredReviews, cursoredReviews,
titleId, titleId,
paginationKey, paginationKey,

View File

@ -5,9 +5,9 @@ import ErrorInfo from 'src/components/error/ErrorInfo';
import { Filters, Pagination, Reviews, TitleCard } from 'src/components/titleReviews'; import { Filters, Pagination, Reviews, TitleCard } from 'src/components/titleReviews';
import { AppError } from 'src/interfaces/shared/error'; import { AppError } from 'src/interfaces/shared/error';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import titleReviews, { cursoredReviews } from 'src/utils/fetchers/titleReviews'; import titleReviews from 'src/utils/fetchers/titleReviews';
import { cleanQueryStr, getProxiedIMDbImgUrl } from 'src/utils/helpers'; import { cleanQueryStr, getProxiedIMDbImgUrl } from 'src/utils/helpers';
import { titleKey, titleReviewsKey } from 'src/utils/constants/keys'; import { titleReviewsKey } from 'src/utils/constants/keys';
import styles from 'src/styles/modules/pages/titleReviews/titleReviews.module.scss'; import styles from 'src/styles/modules/pages/titleReviews/titleReviews.module.scss';
import TitleReviews from 'src/interfaces/shared/titleReviews'; import TitleReviews from 'src/interfaces/shared/titleReviews';
import { keys as titleReviewFiltersQueryKeys } from 'src/utils/constants/titleReviewsFilters'; import { keys as titleReviewFiltersQueryKeys } from 'src/utils/constants/titleReviewsFilters';
@ -31,7 +31,7 @@ const ReviewsPage = ({ data, error, originalPath }: Props) => {
if (!res.ok) throw new Error('something went wrong'); if (!res.ok) throw new Error('something went wrong');
return res.json(); return res.json();
}) })
.then(newData => .then((newData: { data: NonNullable<Props['data']> }) =>
setAllData(prev => ({ setAllData(prev => ({
list: prev.list.concat(newData.data.list), list: prev.list.concat(newData.data.list),
cursor: newData.data.cursor ?? null, cursor: newData.data.cursor ?? null,
@ -73,7 +73,7 @@ export const getServerSideProps: GetServerSideProps<Data, Params> = async ctx =>
const queryStr = cleanQueryStr(queryParams, titleReviewFiltersQueryKeys); const queryStr = cleanQueryStr(queryParams, titleReviewFiltersQueryKeys);
try { try {
const data = await getOrSetApiCache( const data = await getOrSetApiCache(
titleReviewsKey(titleId, queryStr), titleReviewsKey(titleId, queryStr, null),
titleReviews, titleReviews,
titleId, titleId,
queryStr queryStr

View File

@ -1,7 +1,6 @@
export const titleKey = (titleId: string) => `title:${titleId}`; export const titleKey = (titleId: string) => `title:${titleId}`;
export const titleReviewsKey = (titleId: string, query = '') => `title:${titleId}|${query}`; export const titleReviewsKey = (titleId: string, queryStr: string, paginationKey: string | null) =>
export const titleReviewsCursoredKey = (titleId: string, paginationKey: string) => `title/reviews:${titleId}?${queryStr}&paginationKey=${paginationKey}`;
`title:${titleId}|${paginationKey}`;
export const nameKey = (nameId: string) => `name:${nameId}`; export const nameKey = (nameId: string) => `name:${nameId}`;
export const listKey = (listId: string, pageNum = '1') => `list:${listId}?page=${pageNum}`; export const listKey = (listId: string, pageNum = '1') => `list:${listId}?page=${pageNum}`;
export const findKey = (query: string) => `find:${query}`; export const findKey = (query: string) => `find:${query}`;