From 1bc1fae274c4097bfeb0efdb3311347f49900195 Mon Sep 17 00:00:00 2001 From: Md Sharafat Hassain Binoy Date: Fri, 17 Apr 2026 23:36:01 +0600 Subject: [PATCH] order api:implement pagination system --- src/app/modules/order/order.service.ts | 137 +++++++++++++++---------- src/app/modules/order/order.swagger.ts | 45 ++++---- src/app/utils/pagination_helper.ts | 34 ++++++ 3 files changed, 142 insertions(+), 74 deletions(-) create mode 100644 src/app/utils/pagination_helper.ts diff --git a/src/app/modules/order/order.service.ts b/src/app/modules/order/order.service.ts index c9c11b8..3063531 100644 --- a/src/app/modules/order/order.service.ts +++ b/src/app/modules/order/order.service.ts @@ -1,61 +1,92 @@ - import { Request } from "express"; import { configs } from "../../configs"; import { prisma } from "../../lib/prisma"; import { orderEmailQueue } from "../../queues/email/order/order.email.queue"; +import paginationHelper from "../../utils/pagination_helper"; const get_all_order_from_db = async (req: Request) => { // define your own login here - const search=req.query.search as string - const customerName=req.query.customerName as string - const productName=req.query.productName as string - console.log(productName) - const andCondition=[] as any[] - if(search){ - andCondition.push({ - OR:[ - { - productName:{ - contains:search, - mode:"insensitive" - } - } - ] - }) - } - if(customerName){ - andCondition.push({ - OR:[ - { - customerName:{ - contains:customerName, - mode:"insensitive" - } - } - ] - }) - } - if(productName){ - andCondition.push({ - OR:[ - { - productName:{ - contains:productName, - mode:"insensitive" - } - } - ] - }) - } - - console.log(search) + const search = req.query.search as string; + const customerName = req.query.customerName as string; + const productName = req.query.productName as string; + const status = (req.query.status as string) || undefined; + const { page, limit, skip, sortBy, sortOrder } = paginationHelper(req.query); - const result = await prisma.order.findMany({ - where:{ - AND:andCondition - } + const andCondition = [] as any[]; + if (search) { + andCondition.push({ + OR: [ + { + productName: { + contains: search, + mode: "insensitive", + }, + }, + ], + }); + } + if (customerName) { + andCondition.push({ + OR: [ + { + customerName: { + contains: customerName, + mode: "insensitive", + }, + }, + ], + }); + } + if (productName) { + andCondition.push({ + OR: [ + { + productName: { + contains: productName, + mode: "insensitive", + }, + }, + ], + }); + } + if (status) { + andCondition.push({ + OR: [ + { + status: { + contains: status, + mode: "insensitive", + }, + }, + ], + }); + } + + const getAllOrders = await prisma.order.findMany({ + take: limit, + skip, + where: { + AND: andCondition, + }, + orderBy: { + [sortBy as string]: sortOrder, + }, }); - return result; + const result = await prisma.order.count({ + where: { + AND: andCondition, + }, + }); + console.log(status); + return { + data: getAllOrders, + pagination: { + total: result, + page, + limit, + totalPages: Math.ceil(result / limit), + }, + }; }; const get_single_order_from_db = async (req: Request) => { @@ -67,9 +98,9 @@ const get_single_order_from_db = async (req: Request) => { const create_order_into_db = async (req: Request) => { const payload = req?.body; - console.log(payload) + console.log(payload); payload.status = "INITIATED"; - payload.paymentType = "COD" + payload.paymentType = "COD"; // nwo init order const result = await prisma.order.create({ data: payload }); @@ -81,8 +112,8 @@ const create_order_into_db = async (req: Request) => { email: payload.customerEmail, subject: "Order Tracking", textBody: `Your order has been created. Track your order here: ${trackingLink}`, - htmlBody: `

Your order has been created. Track your order here: Track Order

` - }) + htmlBody: `

Your order has been created. Track your order here: Track Order

`, + }); } return result; }; diff --git a/src/app/modules/order/order.swagger.ts b/src/app/modules/order/order.swagger.ts index 103de00..927705d 100644 --- a/src/app/modules/order/order.swagger.ts +++ b/src/app/modules/order/order.swagger.ts @@ -1,4 +1,3 @@ - export const orderSwaggerDocs = { "/api/order": { post: { @@ -10,16 +9,16 @@ export const orderSwaggerDocs = { content: { "application/json": { example: JSON.stringify({ - "shopAccountId": "", - "productPrice": 1500, - "productQuantity": 2, - "productName": "Wireless Mouse", - "customerName": "Rahim Uddin", - "customerPhone": "+8801712345678", - "customerEmail": "softvence.abumahid@gmail.com", - "customerAddress": "Rangpur, Bangladesh", - "customerNote": "Please deliver between 3-5 PM" - }) + shopAccountId: "", + productPrice: 1500, + productQuantity: 2, + productName: "Wireless Mouse", + customerName: "Rahim Uddin", + customerPhone: "+8801712345678", + customerEmail: "softvence.abumahid@gmail.com", + customerAddress: "Rangpur, Bangladesh", + customerNote: "Please deliver between 3-5 PM", + }), }, }, }, @@ -63,6 +62,12 @@ export const orderSwaggerDocs = { required: false, schema: { type: "string" }, }, + { + name: "status", + in: "query", + required: false, + schema: { type: "string" }, + }, ], responses: { 200: { description: "order fetched successfully" }, @@ -106,14 +111,14 @@ export const orderSwaggerDocs = { content: { "application/json": { example: JSON.stringify({ - "shopAccountId": "", - "productPrice": 1500, - "productQuantity": 2, - "productName": "Wireless Mouse", - "customerName": "Rahim Uddin", - "customerPhone": "+8801712345678", - "customerAddress": "Rangpur, Bangladesh", - "customerNote": "Please deliver between 3-5 PM" + shopAccountId: "", + productPrice: 1500, + productQuantity: 2, + productName: "Wireless Mouse", + customerName: "Rahim Uddin", + customerPhone: "+8801712345678", + customerAddress: "Rangpur, Bangladesh", + customerNote: "Please deliver between 3-5 PM", }), // put your request body }, }, @@ -142,5 +147,3 @@ export const orderSwaggerDocs = { }, }, }; - - diff --git a/src/app/utils/pagination_helper.ts b/src/app/utils/pagination_helper.ts new file mode 100644 index 0000000..9ed373f --- /dev/null +++ b/src/app/utils/pagination_helper.ts @@ -0,0 +1,34 @@ +// options type +type IOptions = { + page?: number | string; + limit?: number | string; + sortOrder?: string; + sortBy?: string; +}; + +// return type +export type IPaginationResult = { + page: number; + limit: number; + skip: number; + sortOrder?: string; + sortBy?: string; +}; +const paginationHelper = (options:IOptions): IPaginationResult => { + const page = Number(options?.page) || 1; + const limit = Number(options?.limit) || 10; + const skip = (page-1)*limit + const sortBy =options?.sortBy ||"createdAt"; + const sortOrder = options?.sortOrder || "desc"; + + return { + page, + limit, + skip, + sortBy, + sortOrder + } +}; + + +export default paginationHelper; \ No newline at end of file