From a3e221e2b4580fa43f1467d8042a1540f03a953d Mon Sep 17 00:00:00 2001 From: "jason.lam" Date: Tue, 29 Apr 2025 12:36:31 +0800 Subject: [PATCH] [feature] update get by page logic & update paging utils --- .../com/ffii/core/response/RecordsRes.java | 2 +- .../java/com/ffii/core/utils/PagingUtils.java | 38 ++++++++++++++++++ .../modules/master/service/ItemsService.kt | 27 ++++++++++++- .../modules/master/web/ItemsController.kt | 40 +++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/ffii/core/utils/PagingUtils.java diff --git a/src/main/java/com/ffii/core/response/RecordsRes.java b/src/main/java/com/ffii/core/response/RecordsRes.java index 7798b9e..0437711 100644 --- a/src/main/java/com/ffii/core/response/RecordsRes.java +++ b/src/main/java/com/ffii/core/response/RecordsRes.java @@ -17,7 +17,7 @@ public class RecordsRes { this.records = records; } - public RecordsRes(List records, int total) { + public RecordsRes(List records, Integer total) { this.records = records; this.total = total; } diff --git a/src/main/java/com/ffii/core/utils/PagingUtils.java b/src/main/java/com/ffii/core/utils/PagingUtils.java new file mode 100644 index 0000000..db47a9c --- /dev/null +++ b/src/main/java/com/ffii/core/utils/PagingUtils.java @@ -0,0 +1,38 @@ +package com.ffii.core.utils; + +import java.util.Collections; +import java.util.List; + +/** + * MapUtils + * + * @author Jason Lam + */ + +public class PagingUtils { + + /** + * Create target sub list from a full list + * + * @param fullList + * List to be split + * @param pageSize + * targeted record per page + * @param pageNum + * targeted page to be display + * + * @return List + */ + public static List getPaginatedList(List fullList, int pageSize, int pageNum) { + // Calculate the start and end indices for subList + int startIndex = (pageNum - 1) * pageSize; + int endIndex = Math.min(startIndex + pageSize, fullList.size()); + + // Ensure we don't go out of bounds + if (startIndex < fullList.size()) { + return fullList.subList(startIndex, endIndex); + } else { + return Collections.emptyList(); // Return empty list if start index is out of bounds + } + } +} diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt index 5cbaa30..d04f624 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt @@ -2,6 +2,7 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.modules.master.dto.ItemFilterRequestDTO import com.ffii.fpsms.modules.master.entity.* import com.ffii.fpsms.modules.master.web.models.ItemQc import com.ffii.fpsms.modules.master.web.models.ItemWithQcResponse @@ -10,7 +11,6 @@ import com.ffii.fpsms.modules.master.web.models.NewItemRequest import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.io.IOException -import kotlin.jvm.optionals.getOrNull @Service open class ItemsService( @@ -25,7 +25,30 @@ open class ItemsService( val items = itemsRepository.findAll() return items } - + + open fun getItemsByPage(args: Map): List> { + // Extract parameters from the DTO + val sql = StringBuilder( + "SELECT " + + "i.id, " + + "i.code, " + + "i.name, " + + "i.description " + + "FROM items i " + + "WHERE i.deleted = FALSE" + ); + + if (args.containsKey("name")){ + sql.append(" AND i.name like :name "); + } + + if (args.containsKey("code")){ + sql.append(" AND i.code like :code "); + } + + return jdbcDao.queryForList(sql.toString(), args); + } + // QcCheck included item open fun getItem(id: Long): ItemWithQcResponse { val list = listOf(1,2) diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt index dc485cc..e4b09bd 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/ItemsController.kt @@ -1,13 +1,19 @@ package com.ffii.fpsms.modules.master.web import com.ffii.core.exception.NotFoundException +import com.ffii.core.response.RecordsRes +import com.ffii.core.utils.CriteriaArgsBuilder +import com.ffii.core.utils.PagingUtils +import com.ffii.fpsms.modules.master.dto.ItemFilterRequestDTO import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.master.service.ItemsService import com.ffii.fpsms.modules.master.web.models.ItemWithQcResponse import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.master.web.models.NewItemRequest +import jakarta.servlet.http.HttpServletRequest import jakarta.validation.Valid import org.springframework.web.bind.annotation.* +import java.util.Collections.emptyList @RestController @RequestMapping("/items") @@ -18,6 +24,40 @@ class ItemsController( fun allItems(): List { return itemsService.allItems() } + +// @GetMapping("/getRecordByPage") +// fun getAllItemsByPage(@RequestBody filterRequest: HttpServletRequest): RecordsRes> { +// val pageSize = filterRequest.getParameter("pageSize").toString().toInt(); // Default to 10 if not provided +// val pageNumber = filterRequest.getParameter("pageNum").toString().toInt(); // Default to 0 if not provided +// val criteriaArgs = CriteriaArgsBuilder.withRequest(filterRequest) +// .addStringLike("name") +// .build(); +// +// val fullList = itemsService.getItemsByPage(criteriaArgs)?.subList(pageSize*pageNumber+1, pageSize*pageNumber+pageSize) +// val outputList = fullList?.subList(pageSize*pageNumber+1, pageSize*pageNumber+pageSize) +// +// return RecordsRes(outputList as List>?, fullList?.size) +// } + + @GetMapping("/getRecordByPage") + fun getAllItemsByPage( + request: HttpServletRequest + ): RecordsRes> { + val criteriaArgs = CriteriaArgsBuilder.withRequest(request) + .addStringLike("name") + .addStringLike("code") + .build() + + val pageSize = request.getParameter("pageSize")?.toIntOrNull() ?: 10 // Default to 10 if not provided + val pageNum = request.getParameter("pageNum")?.toIntOrNull() ?: 1 // Default to 1 if not provided + + val fullList = itemsService.getItemsByPage(criteriaArgs) ?: emptyList() + + val paginatedList = PagingUtils.getPaginatedList(fullList,pageSize, pageNum) + + return RecordsRes(paginatedList as List>, fullList.size) + } + @GetMapping("/details/{id}") fun getItems(@PathVariable id: Long): ItemWithQcResponse { return itemsService.getItem(id)