fix(api): refactor all endpoints a bit

disallow methods other that GET
properly type return types
add type guards where needed
make all endpoints
return same response format for consistency
This commit is contained in:
zyachel 2023-10-30 01:24:10 +05:30
parent 264442448f
commit 4dffbbc0ec
4 changed files with 62 additions and 65 deletions

View File

@ -1,37 +1,32 @@
import { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import Find, { FindQueryParams } from 'src/interfaces/shared/search'; import Find, { type FindQueryParams } from 'src/interfaces/shared/search';
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import basicSearch from 'src/utils/fetchers/basicSearch'; import basicSearch from 'src/utils/fetchers/basicSearch';
import { cleanQueryStr } from 'src/utils/helpers'; import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import { findKey } from 'src/utils/constants/keys'; import { findKey } from 'src/utils/constants/keys';
import { AppError, cleanQueryStr } from 'src/utils/helpers';
export default async function handler(req: NextApiRequest, res: NextApiResponse) { type ResponseData =
const queryObj = req.query as FindQueryParams; | { status: true; data: { title: null | string; results: null | Find } }
| { status: false; message: string };
export default async function handler(req: NextApiRequest, res: NextApiResponse<ResponseData>) {
try {
if (req.method !== 'GET') throw new AppError('Invalid method', 400);
const queryObj = req.query as FindQueryParams | Record<string, never>;
const query = queryObj.q?.trim(); const query = queryObj.q?.trim();
if (!query) { if (!query) {
res.status(200); return res.status(200).json({ status: true, data: { title: null, results: null } });
res.json({
title: null,
results: null
});
} }
try {
const entries = Object.entries(queryObj); const entries = Object.entries(queryObj);
const queryStr = cleanQueryStr(entries); const queryStr = cleanQueryStr(entries);
const result = await getOrSetApiCache(findKey(queryStr), basicSearch, queryStr); const results = await getOrSetApiCache(findKey(queryStr), basicSearch, queryStr);
res.status(200);
res.json({ res.status(200).json({ status: true, data: { title: query, results } });
title: query,
results: result
});
} catch (error: any) { } catch (error: any) {
const { message, statusCode } = error; const { message = 'Not found', statusCode = 404 } = error;
res.status(statusCode); res.status(statusCode).json({ status: false, message });
res.json({
success: false,
message: message
});
} }
} }

View File

@ -1,22 +1,23 @@
import { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import type List from 'src/interfaces/shared/list';
import list from 'src/utils/fetchers/list'; import list from 'src/utils/fetchers/list';
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import { listKey } from 'src/utils/constants/keys'; import { listKey } from 'src/utils/constants/keys';
import { AppError } from 'src/utils/helpers';
export default async function handler(req: NextApiRequest, res: NextApiResponse) { type ResponseData = { status: true; data: List } | { status: false; message: string };
const listId = req.query.listId;
const pageNum = (req.query.page as string | undefined) ?? '1';
export default async function handler(req: NextApiRequest, res: NextApiResponse<ResponseData>) {
try { try {
if (req.method !== 'GET') throw new AppError('Invalid method', 400);
const listId = req.query.listId as string;
const pageNum = req.query.page as string | undefined;
const data = await getOrSetApiCache(listKey(listId, pageNum), list, listId, pageNum); const data = await getOrSetApiCache(listKey(listId, pageNum), list, listId, pageNum);
res.status(200); res.status(200).json({ status: true, data });
res.json(data);
} catch (error: any) { } catch (error: any) {
const { message, statusCode } = error; const { message = 'Not found', statusCode = 404 } = error;
res.status(statusCode); res.status(statusCode).json({ status: false, message });
res.json({
success: false,
message: message
});
} }
} }

View File

@ -1,21 +1,22 @@
import { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import type Name from 'src/interfaces/shared/name';
import name from 'src/utils/fetchers/name'; import name from 'src/utils/fetchers/name';
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import { nameKey } from 'src/utils/constants/keys'; import { nameKey } from 'src/utils/constants/keys';
import { AppError } from 'src/utils/helpers';
export default async function handler(req: NextApiRequest, res: NextApiResponse) { type ResponseData = { status: true; data: Name } | { status: false; message: string };
const nameId = req.query.nameId;
export default async function handler(req: NextApiRequest, res: NextApiResponse<ResponseData>) {
try { try {
if (req.method !== 'GET') throw new AppError('Invalid method', 400);
const nameId = req.query.nameId as string;
const data = await getOrSetApiCache(nameKey(nameId), name, nameId); const data = await getOrSetApiCache(nameKey(nameId), name, nameId);
res.status(200); res.status(200).json({ status: true, data });
res.json(data);
} catch (error: any) { } catch (error: any) {
const { message, statusCode } = error; const { message = 'Not found', statusCode = 404 } = error;
res.status(statusCode); res.status(statusCode).json({ status: false, message });
res.json({
success: false,
message: message
});
} }
} }

View File

@ -1,21 +1,21 @@
import { NextApiRequest, NextApiResponse } from 'next'; import type { NextApiRequest, NextApiResponse } from 'next';
import getOrSetApiCache from 'src/utils/getOrSetApiCache'; import type Title from 'src/interfaces/shared/title';
import title from 'src/utils/fetchers/title'; import title from 'src/utils/fetchers/title';
import getOrSetApiCache from 'src/utils/getOrSetApiCache';
import { titleKey } from 'src/utils/constants/keys'; import { titleKey } from 'src/utils/constants/keys';
import { AppError } from 'src/utils/helpers';
export default async function handler(req: NextApiRequest, res: NextApiResponse) { type ResponseData = { status: true; data: Title } | { status: false; message: string };
const titleId = req.query.titleId;
export default async function handler(req: NextApiRequest, res: NextApiResponse<ResponseData>) {
try { try {
if (req.method !== 'GET') throw new AppError('Invalid method', 400);
const titleId = req.query.titleId as string;
const data = await getOrSetApiCache(titleKey(titleId), title, titleId); const data = await getOrSetApiCache(titleKey(titleId), title, titleId);
res.status(200); res.status(200).json({ status: true, data });
res.json(data);
} catch (error: any) { } catch (error: any) {
const { message, statusCode } = error; const { message = 'Not found', statusCode = 404 } = error;
res.status(statusCode); res.status(statusCode).json({ status: false, message });
res.json({
success: false,
message: message
});
} }
} }