From a44fcd3dc9ef70e3c8d5fa5f8a94515b72aa7c49 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sat, 3 Jun 2023 23:56:48 +0200 Subject: [PATCH] refactor: get/create categories endpoints --- src/lib/category/getUserCategoryByName.ts | 11 +++++ src/pages/api/category/create.ts | 40 ----------------- src/pages/api/category/index.ts | 55 ++++++++++++++++------- src/utils/api.ts | 12 ----- 4 files changed, 49 insertions(+), 69 deletions(-) create mode 100644 src/lib/category/getUserCategoryByName.ts delete mode 100644 src/pages/api/category/create.ts delete mode 100644 src/utils/api.ts diff --git a/src/lib/category/getUserCategoryByName.ts b/src/lib/category/getUserCategoryByName.ts new file mode 100644 index 0000000..07b26de --- /dev/null +++ b/src/lib/category/getUserCategoryByName.ts @@ -0,0 +1,11 @@ +import { Category, User } from "@prisma/client"; +import prisma from "utils/prisma"; + +export default async function getUserCategoryByName( + user: User, + name: Category["name"] +) { + return await prisma.category.findFirst({ + where: { name, authorId: user.id }, + }); +} diff --git a/src/pages/api/category/create.ts b/src/pages/api/category/create.ts deleted file mode 100644 index 054e102..0000000 --- a/src/pages/api/category/create.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NextApiRequest, NextApiResponse } from "next"; - -import { checkMethodAllowedOrThrow } from "utils/api"; -import prisma from "utils/prisma"; -import { getSessionOrThrow } from "utils/session"; - -export default async function POST(req: NextApiRequest, res: NextApiResponse) { - await checkMethodAllowedOrThrow(req, ["post"]); - const session = await getSessionOrThrow(req, res); - - const name = req.body?.name as string; - if (!name) { - throw new Error("Categorie name missing"); - } - - const category = await prisma.category.findFirst({ - where: { name }, - }); - if (category) { - throw new Error("Category name already used"); - } - - const { id: authorId } = await prisma.user.findFirstOrThrow({ - where: { - email: session.user.email, - }, - select: { - id: true, - }, - }); - - const categoryCreated = await prisma.category.create({ - data: { name, authorId }, - }); - console.log("là"); - return res.status(200).send({ - success: "Category successfully created", - categoryId: categoryCreated.id, - }); -} diff --git a/src/pages/api/category/index.ts b/src/pages/api/category/index.ts index 8538a81..34ec9c4 100644 --- a/src/pages/api/category/index.ts +++ b/src/pages/api/category/index.ts @@ -1,20 +1,41 @@ -import { NextApiRequest, NextApiResponse } from "next"; +import { apiHandler } from "lib/api/handler"; +import getUserCategories from "lib/category/getUserCategories"; +import getUserCategoryByName from "lib/category/getUserCategoryByName"; import prisma from "utils/prisma"; +import { object, string } from "yup"; -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - try { - const categories = await prisma.category.findMany(); - console.log("request"); - return res.status(200).send({ - categories, - }); - } catch (error) { - console.error(error); - return res.status(400).send({ - error: "Une erreur est survenue lors de la récupération des catégories", - }); - } +export default apiHandler({ + get: getCatgories, + post: createCategory, +}); + +async function getCatgories({ res, user }) { + const categories = await getUserCategories(user); + return res.status(200).send({ + categories, + }); +} + +const bodySchema = object({ + name: string() + .trim() + .required("name is required") + .max(32, "name is too long"), +}).typeError("Missing request Body"); + +async function createCategory({ req, res, user }) { + const { name } = await bodySchema.validate(req.body); + + const category = await getUserCategoryByName(user, name); + if (category) { + throw new Error("Category name already used"); + } + + const categoryCreated = await prisma.category.create({ + data: { name, authorId: user.id }, + }); + return res.status(200).send({ + success: "Category successfully created", + categoryId: categoryCreated.id, + }); } diff --git a/src/utils/api.ts b/src/utils/api.ts deleted file mode 100644 index 0e23587..0000000 --- a/src/utils/api.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NextApiRequest } from "next"; - -export function checkMethodAllowedOrThrow( - req: NextApiRequest, - methods: Array -) { - const isMethodAllowed = methods.includes(req.method.toLowerCase()); - if (!isMethodAllowed) { - throw new Error(`Method ${req.method} not allowed`); - } - return isMethodAllowed; -}