From 641908ace59c45cedc315bd2e7deb0412302f70c Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Sun, 13 Oct 2024 20:51:32 +0200 Subject: [PATCH] feat: sorting --- snippets-manager-front | 2 +- src/routers/category.ts | 27 +++++++++++++++++---------- src/utils/pagination.ts | 14 ++++++++++---- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/snippets-manager-front b/snippets-manager-front index ec9bc1b..57d431a 160000 --- a/snippets-manager-front +++ b/snippets-manager-front @@ -1 +1 @@ -Subproject commit ec9bc1bb4b8b83af341c5439ba4e97897f915cc6 +Subproject commit 57d431a0ba0dbbf96df0d658eff5538ae3667043 diff --git a/src/routers/category.ts b/src/routers/category.ts index 489f9cf..453a8d0 100644 --- a/src/routers/category.ts +++ b/src/routers/category.ts @@ -26,19 +26,29 @@ const paramsIdParser = z .required() async function findCategories(userId: number, pagination: Pagination): Promise { - return await prisma.category.findMany({ + const query: any = { where: { user_id: userId }, - ...pagination, - }) + skip: pagination.skip, + take: pagination.take, + } + + if (pagination.orderBy) { + query.orderBy = [{ [pagination.orderBy]: pagination.direction }] + } + + return prisma.category.findMany(query) } const categoryGet: RequestHandler = async (req, res) => { let categories: Category[] | null = null - const pagination = queryPaginationParser.parse(req.query) + let categoriesTotal: number = 0 + let pagination = {} as Pagination try { + pagination = queryPaginationParser.parse(req.query) const userId = parseJwtUserId(req.cookies.jwt) categories = await findCategories(userId ?? -1, pagination) + categoriesTotal = await prisma.category.count({ where: { user_id: userId } }) } catch (error: any) { res.status(400).json({ message: error.issues ?? error }) return @@ -48,7 +58,7 @@ const categoryGet: RequestHandler = async (req, res) => { categories, pagination, links: getPaginationLinks(pagination, "category"), - total: categories.length, + total: categoriesTotal, }) } @@ -112,22 +122,19 @@ const categoryUpdate: RequestHandler = async (req, res) => { } const categoryDelete: RequestHandler = async (req, res) => { - let deleted: Prisma.BatchPayload - try { const userId = parseJwtUserId(req.cookies.jwt) - deleted = await prisma.category.deleteMany({ + const deleted = await prisma.category.delete({ where: { id: paramsIdParser.parse(req.params).id, user_id: userId, }, }) + res.json({ message: `Category successfully deleted.`, id: deleted.id }) } catch (error: any) { res.status(400).json({ message: error.issues ?? error }) return } - - res.json({ message: `${deleted.count} category / categories successfully deleted.` }) } categoryRouter.get("/", userIdMiddleware, categoryGet) diff --git a/src/utils/pagination.ts b/src/utils/pagination.ts index 1d74015..78d19b1 100644 --- a/src/utils/pagination.ts +++ b/src/utils/pagination.ts @@ -3,19 +3,25 @@ import { z } from "zod" export interface Pagination { skip: number take: number + orderBy?: string + direction: string } export const queryPaginationParser = z.object({ skip: z.coerce.number().optional().default(0), take: z.coerce.number().optional().default(10), + orderBy: z.string().optional(), + direction: z.string().optional().default("asc"), }) export function getPaginationLinks(query: Pagination, routeName: string): object { - const nextStart = query.skip + query.take - const prevStart = Math.max(0, query.skip - query.take) + const nextSkip = query.skip + query.take + const prevSkip = Math.max(0, query.skip - query.take) + + const sorting = query.orderBy ? `&orderBy=${query.orderBy}&direction=${query.direction}` : "" return { - next: `/v1/${routeName}?start=${nextStart}&per_page=${query.take}`, - prev: `/v1/${routeName}?start=${prevStart}&per_page=${query.take}`, + next: `/v1/${routeName}?skip=${nextSkip}&take=${query.take}${sorting}`, + prev: `/v1/${routeName}?skip=${prevSkip}&take=${query.take}${sorting}`, } }