feat: sorting

This commit is contained in:
Florian Sylvain
2024-10-13 20:51:32 +02:00
parent 307d7212e0
commit 641908ace5
3 changed files with 28 additions and 15 deletions
+17 -10
View File
@@ -26,19 +26,29 @@ const paramsIdParser = z
.required()
async function findCategories(userId: number, pagination: Pagination): Promise<Category[]> {
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)
+10 -4
View File
@@ -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}`,
}
}