From c945024300563da76c8085888c9e8e3a29be9910 Mon Sep 17 00:00:00 2001 From: huydo862003 Date: Wed, 20 Dec 2023 18:54:59 +0700 Subject: [PATCH] fix: pagination missing values --- src/dtos/in/defaultModel.dto.ts | 8 ++-- src/dtos/in/order.dto.ts | 8 ++-- src/dtos/in/userModel.dto.ts | 8 ++-- src/dtos/out/defaultModelList.dto.ts | 35 +++++++++-------- src/dtos/out/orderListResult.dto.ts | 39 ++++++++++--------- src/dtos/out/userModelList.dto.ts | 19 ++++++---- src/handlers/defaultModel.handler.ts | 57 +++++++++++++++++----------- src/handlers/order.handler.ts | 46 +++++++++++++--------- src/handlers/userModel.handler.ts | 26 ++++++++----- 9 files changed, 143 insertions(+), 103 deletions(-) diff --git a/src/dtos/in/defaultModel.dto.ts b/src/dtos/in/defaultModel.dto.ts index 50e5237..7162cbd 100644 --- a/src/dtos/in/defaultModel.dto.ts +++ b/src/dtos/in/defaultModel.dto.ts @@ -4,15 +4,15 @@ export const DefaultModelQueryStringDto = Type.Object({ keyword: Type.Optional(Type.String({ description: 'The substring that the model name should contain' })), uploaded_after: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time after which the model was uploaded, specified in ISO format', + format: 'date', + description: 'The date after which the model was uploaded, specified in ISO format', examples: ['2023-12-18'] }) ), uploaded_before: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time before which the model was uploaded, specified in ISO format', + format: 'date', + description: 'The date before which the model was uploaded, specified in ISO format', examples: ['2023-12-25'] }) ), diff --git a/src/dtos/in/order.dto.ts b/src/dtos/in/order.dto.ts index a6fbb37..cc396e5 100644 --- a/src/dtos/in/order.dto.ts +++ b/src/dtos/in/order.dto.ts @@ -32,15 +32,15 @@ export const CreateOrderInputDto = Type.Object( export const OrderQueryStringDto = Type.Object({ created_after: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time after which the order was created, specified in ISO format', + format: 'date', + description: 'The date after which the order was created, specified in ISO format', examples: ['2023-12-18'] }) ), created_before: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time before which the order was created, specified in ISO format', + format: 'date', + description: 'The date before which the order was created, specified in ISO format', examples: ['2023-12-25'] }) ), diff --git a/src/dtos/in/userModel.dto.ts b/src/dtos/in/userModel.dto.ts index 9c13e19..e3e6650 100644 --- a/src/dtos/in/userModel.dto.ts +++ b/src/dtos/in/userModel.dto.ts @@ -4,15 +4,15 @@ export const UserModelQueryStringDto = Type.Object({ keyword: Type.Optional(Type.String({ description: 'The substring that the model name should contain' })), uploaded_after: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time after which the model was uploaded, specified in ISO format', + format: 'date', + description: 'The date after which the model was uploaded, specified in ISO format', examples: ['2023-12-18'] }) ), uploaded_before: Type.Optional( Type.String({ - format: 'date-time', - description: 'The time before which the model was uploaded, specified in ISO format', + format: 'date', + description: 'The date before which the model was uploaded, specified in ISO format', examples: ['2023-12-25'] }) ), diff --git a/src/dtos/out/defaultModelList.dto.ts b/src/dtos/out/defaultModelList.dto.ts index f8e6aea..8ee1776 100644 --- a/src/dtos/out/defaultModelList.dto.ts +++ b/src/dtos/out/defaultModelList.dto.ts @@ -2,21 +2,24 @@ import { Static, Type } from '@sinclair/typebox'; // See https://github.com/sinclairzx81/typebox -export const DefaultModelListResultDto = Type.Array( - Type.Object({ - id: Type.String(), - name: Type.String(), - price: Type.Number(), - imageUrl: Type.String(), - category_id: Type.String(), - category: Type.String(), - likesNo: Type.Number(), - uploadTime: Type.String({ format: 'date-time' }), - description: Type.String(), - numberBought: Type.Number(), - subImages: Type.Array(Type.String()), - discount: Type.Optional(Type.Number()) - }) -); +export const DefaultModelListResultDto = Type.Object({ + total: Type.Number({ minimum: 0 }), + models: Type.Array( + Type.Object({ + id: Type.String(), + name: Type.String(), + price: Type.Number(), + imageUrl: Type.String(), + category_id: Type.String(), + category: Type.String(), + likesNo: Type.Number(), + uploadTime: Type.String({ format: 'date-time' }), + description: Type.String(), + numberBought: Type.Number(), + subImages: Type.Array(Type.String()), + discount: Type.Optional(Type.Number()) + }) + ) +}); export type DefaultModelListResultDto = Static; diff --git a/src/dtos/out/orderListResult.dto.ts b/src/dtos/out/orderListResult.dto.ts index 02fb41d..8add2e6 100644 --- a/src/dtos/out/orderListResult.dto.ts +++ b/src/dtos/out/orderListResult.dto.ts @@ -1,23 +1,26 @@ import { Status } from '@prisma/client'; import { Static, Type } from '@sinclair/typebox'; -export const OrderListResultDto = Type.Array( - Type.Object({ - id: Type.String(), - userId: Type.String(), - totalPrice: Type.Number(), - shippingFee: Type.Number(), - estimatedDeliveryTime: Type.String({ format: 'date-time' }), - status: Type.Union(Object.values(Status).map((e) => Type.Literal(e))), - district: Type.String(), - ward: Type.String(), - street: Type.String(), - streetNo: Type.String(), - creationTime: Type.String({ format: 'date-time' }), - isPaid: Type.Boolean(), - note: Type.Optional(Type.String()), - digitalOrderId: Type.Optional(Type.String()) - }) -); +export const OrderListResultDto = Type.Object({ + total: Type.Number({ minimum: 0 }), + orders: Type.Array( + Type.Object({ + id: Type.String(), + userId: Type.String(), + totalPrice: Type.Number(), + shippingFee: Type.Number(), + estimatedDeliveryTime: Type.String({ format: 'date-time' }), + status: Type.Union(Object.values(Status).map((e) => Type.Literal(e))), + district: Type.String(), + ward: Type.String(), + street: Type.String(), + streetNo: Type.String(), + creationTime: Type.String({ format: 'date-time' }), + isPaid: Type.Boolean(), + note: Type.Optional(Type.String()), + digitalOrderId: Type.Optional(Type.String()) + }) + ) +}); export type OrderListResultDto = Static; diff --git a/src/dtos/out/userModelList.dto.ts b/src/dtos/out/userModelList.dto.ts index 11d8949..ea1d95a 100644 --- a/src/dtos/out/userModelList.dto.ts +++ b/src/dtos/out/userModelList.dto.ts @@ -2,13 +2,16 @@ import { Static, Type } from '@sinclair/typebox'; // See https://github.com/sinclairzx81/typebox -export const UserModelListResultDto = Type.Array( - Type.Object({ - id: Type.String(), - name: Type.String(), - price: Type.Number(), - uploadTime: Type.String({ format: 'date-time' }) - }) -); +export const UserModelListResultDto = Type.Object({ + total: Type.Number({ minimum: 0 }), + models: Type.Array( + Type.Object({ + id: Type.String(), + name: Type.String(), + price: Type.Number(), + uploadTime: Type.String({ format: 'date-time' }) + }) + ) +}); export type UserModelListResultDto = Static; diff --git a/src/handlers/defaultModel.handler.ts b/src/handlers/defaultModel.handler.ts index 04d4d24..7042ef2 100644 --- a/src/handlers/defaultModel.handler.ts +++ b/src/handlers/defaultModel.handler.ts @@ -6,6 +6,8 @@ import { prisma } from '@repositories'; import { UpdateDefaultModelInputDto } from '@dtos/in'; const getAll: Handler = async (req) => { + const totalModels = await prisma.defaultModel.count(); + try { const defaultModels = await prisma.defaultModel.findMany({ select: { @@ -52,33 +54,42 @@ const getAll: Handler ({ - id: model.model_id, - category_id: model.category_id, - category: model.Category.name, - imageUrl: model.imageUrl, - likesNo: model.likesNo, - name: model.model.name, - price: model.model.price, - uploadTime: model.model.uploadTime.toISOString(), - description: model.model.description, - numberBought: model.model.boughtAmount, - subImages: model.subImageUrls, - discount: model.model.ModelPromotion?.discount - })); + return { + total: totalModels, + models: defaultModels.map((model) => ({ + id: model.model_id, + category_id: model.category_id, + category: model.Category.name, + imageUrl: model.imageUrl, + likesNo: model.likesNo, + name: model.model.name, + price: model.model.price, + uploadTime: model.model.uploadTime.toISOString(), + description: model.model.description, + numberBought: model.model.boughtAmount, + subImages: model.subImageUrls, + discount: model.model.ModelPromotion?.discount + })) + }; } catch (e) { - return []; + return { + total: totalModels, + models: [] + }; } }; @@ -139,8 +150,8 @@ const get: Handler = async (r }; }; -const upload: Handler = async (req) => { - const outputList: DefaultModelListResultDto = []; +const upload: Handler = async (req) => { + const outputList: DefaultModelListResultDto['models'] = []; const inputList = req.body; try { diff --git a/src/handlers/order.handler.ts b/src/handlers/order.handler.ts index 05eb6d7..e322e5d 100644 --- a/src/handlers/order.handler.ts +++ b/src/handlers/order.handler.ts @@ -89,6 +89,12 @@ const getOrders: Handler ({ - creationTime: order.creation_time.toISOString(), - digitalOrderId: order.digital_order_id || undefined, - district: order.district, - estimatedDeliveryTime: order.est_deli_time.toISOString(), - id: order.id, - isPaid: order.isPaid, - shippingFee: order.shipping_fee, - status: order.status, - street: order.street, - streetNo: order.streetNo, - totalPrice: order.total_price, - ward: order.ward, - note: order.extra_note || undefined, - userId: order.user_id - })); + return { + total: totalOrders, + orders: orders.map((order) => ({ + creationTime: order.creation_time.toISOString(), + digitalOrderId: order.digital_order_id || undefined, + district: order.district, + estimatedDeliveryTime: order.est_deli_time.toISOString(), + id: order.id, + isPaid: order.isPaid, + shippingFee: order.shipping_fee, + status: order.status, + street: order.street, + streetNo: order.streetNo, + totalPrice: order.total_price, + ward: order.ward, + note: order.extra_note || undefined, + userId: order.user_id + })) + }; } catch (e) { - return []; + return { + total: totalOrders, + orders: [] + }; } }; diff --git a/src/handlers/userModel.handler.ts b/src/handlers/userModel.handler.ts index 10efe87..ec7cc6c 100644 --- a/src/handlers/userModel.handler.ts +++ b/src/handlers/userModel.handler.ts @@ -19,6 +19,8 @@ const getAll: Handler ({ - id: model.model_id, - name: model.model.name, - price: model.model.price, - uploadTime: model.model.uploadTime.toISOString() - })); + return { + total: totalModels, + models: userModels.map((model) => ({ + id: model.model_id, + name: model.model.name, + price: model.model.price, + uploadTime: model.model.uploadTime.toISOString() + })) + }; } catch (e) { - return []; + return { + total: totalModels, + models: [] + }; } }; @@ -101,9 +109,9 @@ const get: Handler = async (req, }; }; -const upload: Handler = async (req, res) => { +const upload: Handler = async (req, res) => { const userId = req.userId; - const outputList: UserModelListResultDto = []; + const outputList: UserModelListResultDto['models'] = []; const inputList = req.body; try {