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,