mirror of
				https://github.com/DerTyp7/explainegy-nextjs.git
				synced 2025-10-29 21:02:13 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Request, Response } from "express";
 | |
| import prisma from "../../../lib/prisma";
 | |
| //@ts-ignore
 | |
| import { Prisma } from "@prisma/client";
 | |
| //@ts-ignore
 | |
| import { Article, Category } from "@prisma/client";
 | |
| import { ResponseError } from "../../../types/responseErrors";
 | |
| import { formatTextToUrlName } from "../../../utils";
 | |
| import { isValidText } from "../../../validators";
 | |
| import { title } from 'process';
 | |
| import { UpdateArticle } from "../../../types/api";
 | |
| 
 | |
| export default async function handler(req: Request, res: Response) {
 | |
|   res.setHeader("Content-Type", "application/json");
 | |
| 
 | |
|   if (req.method == "GET") {
 | |
|     const categoryName: string = req.query.categoryName?.toString() ?? "";
 | |
|     const limit: number = req.query.limit ? Number(req.query.limit) : undefined;
 | |
|     const orderBy: string = req.query.orderBy?.toString() ?? "";
 | |
| 
 | |
|     const category = await prisma.category.findUnique({ where: { name: categoryName } });
 | |
| 
 | |
|     let orderByObj: Prisma.Enumerable<Prisma.ArticleOrderByWithRelationInput>;
 | |
| 
 | |
|     if (orderBy === "recent") {
 | |
|       orderByObj = {
 | |
|         dateCreated: "desc"
 | |
|       }
 | |
|     } else if (orderBy === "popularity") {
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
|     await prisma.article
 | |
|       .findMany({
 | |
|         where: { category: categoryName.length > 0 ? category : undefined },
 | |
|         include: { category: true },
 | |
|         take: limit,
 | |
|         orderBy: orderByObj
 | |
|       })
 | |
|       .then((result: Article[]) => { //! ContentTableEntries not sorted
 | |
|         if (result !== null) {
 | |
|           res.end(JSON.stringify(result));
 | |
|         } else {
 | |
|           const error: ResponseError = {
 | |
|             code: "404",
 | |
|             message: "No articles found!",
 | |
|           };
 | |
|           res.status(404).send(JSON.stringify(error));
 | |
|         }
 | |
|       })
 | |
|       .catch((err) => {
 | |
|         const error: ResponseError = {
 | |
|           code: "500",
 | |
|           message: err,
 | |
|         };
 | |
|         res.status(500).send(JSON.stringify(error));
 | |
|       });
 | |
|   } else if (req.method == "POST") {
 | |
|     const data: any = req.body;
 | |
| 
 | |
|     if (!isValidText(data.title)) {
 | |
|       res.send(JSON.stringify({ target: "title", error: "Not a valid title" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (!isValidText(data.introduction)) {
 | |
|       res.send(JSON.stringify({ target: "introduction", error: "Not a valid introduction" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (!data.categoryId) {
 | |
|       res.send(JSON.stringify({ target: "category", error: "Category is required" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     data.name = formatTextToUrlName(data.title);
 | |
|     prisma.article
 | |
|       .create({ data: data, include: { category: true } })
 | |
|       .then(
 | |
|         (data) => {
 | |
|           res.send(JSON.stringify({ success: true, data: data }));
 | |
|         },
 | |
|         (errorReason) => {
 | |
|           if (errorReason.code === "P2002") {
 | |
|             res.send(JSON.stringify({ target: errorReason.meta.target[0], error: "Already exists" }));
 | |
|           }
 | |
|         }
 | |
|       )
 | |
|       .catch((err) => {
 | |
|         console.error(err);
 | |
|         res.sendStatus(500).end();
 | |
|       });
 | |
|   } else if (req.method == "PUT") {
 | |
|     const data: UpdateArticle = req.body;
 | |
| 
 | |
|     if (!isValidText(data.title)) {
 | |
|       res.send(JSON.stringify({ target: "title", error: "Not a valid title" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (!isValidText(data.introduction)) {
 | |
|       res.send(JSON.stringify({ target: "introduction", error: "Not a valid introduction" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (!data.categoryId) {
 | |
|       res.send(JSON.stringify({ target: "category", error: "Category is required" }));
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     const newArticle: Prisma.ArticleUncheckedUpdateInput = {
 | |
|       title: data.title,
 | |
|       name: formatTextToUrlName(data.title),
 | |
|       introduction: data.introduction,
 | |
|       //@ts-ignore
 | |
|       categoryId: data.categoryId,
 | |
|       contentTable: data.contentTable,
 | |
|       markdown: data.markdown,
 | |
|       //@ts-ignore
 | |
|       imageId: data.imageId,
 | |
|     }
 | |
| 
 | |
|     await prisma.article.update({ data: newArticle, where: { id: data.id }, include: { category: true } })
 | |
|       .then(
 | |
|         (data) => {
 | |
|           res.send(JSON.stringify({ success: true, data: data }));
 | |
|         },
 | |
|         (errorReason) => {
 | |
|           if (errorReason.code === "P2002") {
 | |
|             res.send(JSON.stringify({ target: errorReason.meta.target[0], error: "Already exists" }));
 | |
|           }
 | |
|         }
 | |
|       )
 | |
|       .catch((err) => {
 | |
|         console.error(err);
 | |
|         res.sendStatus(500).end();
 | |
|       });
 | |
|   }
 | |
| 
 | |
| }
 | 
