This is an automated email from the ASF dual-hosted git repository.

linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-answer.git


The following commit(s) were added to refs/heads/dev by this push:
     new 916dba3f feat(pager): Show 404 when page is out of range (#1135)
916dba3f is described below

commit 916dba3f063b95ab8297c63630750b2d08988046
Author: Luffy <[email protected]>
AuthorDate: Fri Oct 18 10:12:59 2024 +0800

    feat(pager): Show 404 when page is out of range (#1135)
    
    close #1133
---
 internal/base/pager/pagination.go          | 12 ++++++++++++
 internal/controller/question_controller.go |  4 ++++
 internal/controller/tag_controller.go      |  5 +++++
 internal/controller/template_controller.go | 10 +++++++---
 internal/service/tag/tag_service.go        |  1 -
 ui/src/services/client/question.ts         |  5 ++---
 ui/src/services/common.ts                  | 10 +++++-----
 7 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/internal/base/pager/pagination.go 
b/internal/base/pager/pagination.go
index 5411e685..36849fed 100644
--- a/internal/base/pager/pagination.go
+++ b/internal/base/pager/pagination.go
@@ -62,3 +62,15 @@ func ValPageAndPageSize(page, pageSize int) (int, int) {
        }
        return page, pageSize
 }
+
+// ValPageOutOfRange validate page out of range
+func ValPageOutOfRange(total int64, page, pageSize int) bool {
+       if total <= 0 {
+               return false
+       }
+       if pageSize <= 0 {
+               return true
+       }
+       totalPages := (total + int64(pageSize) - 1) / int64(pageSize)
+       return page < 1 || page > int(totalPages)
+}
diff --git a/internal/controller/question_controller.go 
b/internal/controller/question_controller.go
index 8f349855..310a8201 100644
--- a/internal/controller/question_controller.go
+++ b/internal/controller/question_controller.go
@@ -337,6 +337,10 @@ func (qc *QuestionController) QuestionPage(ctx 
*gin.Context) {
                handler.HandleResponse(ctx, err, nil)
                return
        }
+       if pager.ValPageOutOfRange(total, req.Page, req.PageSize) {
+               handler.HandleResponse(ctx, 
errors.NotFound(reason.RequestFormatError), nil)
+               return
+       }
        handler.HandleResponse(ctx, nil, pager.NewPageModel(total, questions))
 }
 
diff --git a/internal/controller/tag_controller.go 
b/internal/controller/tag_controller.go
index 5f5cf5fb..1e98b480 100644
--- a/internal/controller/tag_controller.go
+++ b/internal/controller/tag_controller.go
@@ -22,6 +22,7 @@ package controller
 import (
        "github.com/apache/incubator-answer/internal/base/handler"
        "github.com/apache/incubator-answer/internal/base/middleware"
+       "github.com/apache/incubator-answer/internal/base/pager"
        "github.com/apache/incubator-answer/internal/base/reason"
        "github.com/apache/incubator-answer/internal/schema"
        "github.com/apache/incubator-answer/internal/service/permission"
@@ -269,6 +270,10 @@ func (tc *TagController) GetTagWithPage(ctx *gin.Context) {
        req.UserID = middleware.GetLoginUserIDFromContext(ctx)
 
        resp, err := tc.tagService.GetTagWithPage(ctx, req)
+       if pager.ValPageOutOfRange(resp.Count, req.Page, req.PageSize) {
+               handler.HandleResponse(ctx, 
errors.NotFound(reason.RequestFormatError), nil)
+               return
+       }
        handler.HandleResponse(ctx, err, resp)
 }
 
diff --git a/internal/controller/template_controller.go 
b/internal/controller/template_controller.go
index 5a63e6de..c3a2ff0a 100644
--- a/internal/controller/template_controller.go
+++ b/internal/controller/template_controller.go
@@ -23,6 +23,7 @@ import (
        "encoding/json"
        "fmt"
        "github.com/apache/incubator-answer/internal/base/middleware"
+       "github.com/apache/incubator-answer/internal/base/pager"
        "github.com/apache/incubator-answer/internal/service/content"
        "github.com/apache/incubator-answer/internal/service/event_queue"
        "github.com/apache/incubator-answer/plugin"
@@ -145,7 +146,7 @@ func (tc *TemplateController) Index(ctx *gin.Context) {
        var page = req.Page
 
        data, count, err := tc.templateRenderController.Index(ctx, req)
-       if err != nil {
+       if err != nil || (len(data) == 0 && pager.ValPageOutOfRange(count, 
page, req.PageSize)) {
                tc.Page404(ctx)
                return
        }
@@ -186,7 +187,7 @@ func (tc *TemplateController) QuestionList(ctx 
*gin.Context) {
        }
        var page = req.Page
        data, count, err := tc.templateRenderController.Index(ctx, req)
-       if err != nil {
+       if err != nil || (len(data) == 0 && pager.ValPageOutOfRange(count, 
page, req.PageSize)) {
                tc.Page404(ctx)
                return
        }
@@ -454,8 +455,11 @@ func (tc *TemplateController) TagList(ctx *gin.Context) {
        if handler.BindAndCheck(ctx, req) {
                return
        }
+       if req.PageSize == 0 {
+               req.PageSize = constant.DefaultPageSize
+       }
        data, err := tc.templateRenderController.TagList(ctx, req)
-       if err != nil {
+       if err != nil || pager.ValPageOutOfRange(data.Count, req.Page, 
req.PageSize) {
                tc.Page404(ctx)
                return
        }
diff --git a/internal/service/tag/tag_service.go 
b/internal/service/tag/tag_service.go
index 01864163..e5fcf597 100644
--- a/internal/service/tag/tag_service.go
+++ b/internal/service/tag/tag_service.go
@@ -432,7 +432,6 @@ func (ts *TagService) GetTagWithPage(ctx context.Context, 
req *schema.GetTagWith
                }
                item.GetExcerpt()
                resp = append(resp, item)
-
        }
        return pager.NewPageModel(total, resp), nil
 }
diff --git a/ui/src/services/client/question.ts 
b/ui/src/services/client/question.ts
index b62fbf1a..169ccf3d 100644
--- a/ui/src/services/client/question.ts
+++ b/ui/src/services/client/question.ts
@@ -25,9 +25,8 @@ import type * as Type from '@/common/interface';
 
 export const useQuestionList = (params: Type.QueryQuestionsReq) => {
   const apiUrl = `/answer/api/v1/question/page?${qs.stringify(params)}`;
-  const { data, error } = useSWR<Type.ListResult, Error>(
-    [apiUrl],
-    request.instance.get,
+  const { data, error } = useSWR<Type.ListResult, Error>(apiUrl, (url) =>
+    request.get(url, { allow404: true }),
   );
   return {
     data,
diff --git a/ui/src/services/common.ts b/ui/src/services/common.ts
index ad0d99e0..cfc1d9cd 100644
--- a/ui/src/services/common.ts
+++ b/ui/src/services/common.ts
@@ -35,11 +35,11 @@ export const queryQuestionByTitle = (title: string) => {
 };
 
 export const useQueryTags = (params) => {
-  const { data, error, mutate } = useSWR<Type.ListResult>(
-    `/answer/api/v1/tags/page?${qs.stringify(params, {
-      skipNulls: true,
-    })}`,
-    request.instance.get,
+  const apiUrl = `/answer/api/v1/tags/page?${qs.stringify(params, {
+    skipNulls: true,
+  })}`;
+  const { data, error, mutate } = useSWR<Type.ListResult>(apiUrl, (url) =>
+    request.get(url, { allow404: true }),
   );
   return {
     data,

Reply via email to