Files
cal.diy/packages/app-store/giphy/api/search.ts
T
9bfa4165b9 fix: prevent sending raw errors in responses (#24282)
* fix: prevent sending raw errors in responses

* correct already existing typo

* style: fix import ordering per biome lint

Co-Authored-By: unknown <>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-02-19 02:43:14 +05:30

67 lines
1.9 KiB
TypeScript

import type { NextApiRequest, NextApiResponse } from "next";
import { z, ZodError } from "zod";
import { getServerErrorFromUnknown } from "@calcom/lib/server/getServerErrorFromUnknown";
import prisma from "@calcom/prisma";
import { GiphyManager } from "../lib";
const searchSchema = z.object({
keyword: z.string(),
offset: z.number().min(0),
});
/**
* This is an example endpoint for an app, these will run under `/api/integrations/[...args]`
* @param req
* @param res
*/
async function handler(req: NextApiRequest, res: NextApiResponse) {
const userId = req.session?.user?.id;
if (!userId) {
return res.status(401).json({ message: "You must be logged in to do this" });
}
try {
const user = await prisma.user.findFirst({
where: {
id: userId,
},
select: {
id: true,
locale: true,
},
});
const locale = user?.locale || "en";
const { keyword, offset } = req.body;
const { gifImageUrl, total } = await GiphyManager.searchGiphy(locale, keyword, offset);
return res.status(200).json({
image: gifImageUrl,
// rotate results to 0 offset when no more gifs
nextOffset: total === offset + 1 ? 0 : offset + 1,
});
} catch (error: unknown) {
const httpError = getServerErrorFromUnknown(error);
return res.status(httpError.statusCode).json({ message: httpError.message });
}
}
function validate(handler: (req: NextApiRequest, res: NextApiResponse) => Promise<NextApiResponse | void>) {
return async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method === "POST") {
try {
searchSchema.parse(req.body);
} catch (error) {
if (error instanceof ZodError && error?.name === "ZodError") {
return res.status(400).json(error?.issues);
}
return res.status(402);
}
} else {
return res.status(405);
}
await handler(req, res);
};
}
export default validate(handler);