From 7972966884a6b9461999eb00239f28e7964b36af Mon Sep 17 00:00:00 2001
From: Yufan Sheng <syhily@gmail.com>
Date: Wed, 8 Jan 2025 16:05:34 +0800
Subject: [PATCH] fix: invalid page number after changing the pagination size.

---
 package.json                                | 2 +-
 src/pages/cats/[slug]/page/[num].astro      | 2 +-
 src/pages/page/[num].astro                  | 6 ++++++
 src/pages/search/[keyword]/page/[num].astro | 5 ++---
 src/pages/tags/[slug]/page/[num].astro      | 2 +-
 5 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/package.json b/package.json
index 40a1613..9b36883 100644
--- a/package.json
+++ b/package.json
@@ -89,7 +89,7 @@
   },
   "packageManager": "npm@11.0.0",
   "engines": {
-    "node": "22.12.0"
+    "node": "22.13.0"
   },
   "overrides": {
     "astro-uploader": {
diff --git a/src/pages/cats/[slug]/page/[num].astro b/src/pages/cats/[slug]/page/[num].astro
index 2deca9e..1dd11d8 100644
--- a/src/pages/cats/[slug]/page/[num].astro
+++ b/src/pages/cats/[slug]/page/[num].astro
@@ -20,7 +20,7 @@ const pageSize = options.settings.pagination.category;
 const total = Math.ceil(filteredPosts.length / pageSize);
 
 if (pageNum > total) {
-  return Astro.redirect('/404');
+  return Astro.redirect(`${total}`, 302);
 }
 ---
 
diff --git a/src/pages/page/[num].astro b/src/pages/page/[num].astro
index 5bc8d25..ce0e2b8 100644
--- a/src/pages/page/[num].astro
+++ b/src/pages/page/[num].astro
@@ -1,6 +1,7 @@
 ---
 import { posts, tags } from '@/helpers/schema';
 import PostsLayout from '@/layouts/posts/PostsLayout.astro';
+import options from '@/options';
 
 const { num } = Astro.params;
 
@@ -13,6 +14,11 @@ const pageNum = Number.parseInt(num);
 if (pageNum <= 1) {
   return Astro.redirect('/');
 }
+
+const total = Math.ceil(posts.length / options.settings.pagination.posts);
+if (pageNum > total) {
+  return Astro.redirect(`${total}`, 302);
+}
 ---
 
 <PostsLayout {posts} {pageNum} {tags} />
diff --git a/src/pages/search/[keyword]/page/[num].astro b/src/pages/search/[keyword]/page/[num].astro
index 629ed6c..5ae1672 100644
--- a/src/pages/search/[keyword]/page/[num].astro
+++ b/src/pages/search/[keyword]/page/[num].astro
@@ -21,11 +21,10 @@ const searchResults = searchPosts(query)
   .map((slug) => posts.find((post) => post.slug === slug))
   .filter((post) => post !== undefined);
 
-const pageSize = options.settings.pagination.tags;
-const total = Math.ceil(searchResults.length / pageSize);
+const total = Math.ceil(searchResults.length / options.settings.pagination.tags);
 
 if (pageNum > total) {
-  return Astro.redirect('/404');
+  return Astro.redirect(`${total}`, 302);
 }
 ---
 
diff --git a/src/pages/tags/[slug]/page/[num].astro b/src/pages/tags/[slug]/page/[num].astro
index 8e7cb84..33bafb6 100644
--- a/src/pages/tags/[slug]/page/[num].astro
+++ b/src/pages/tags/[slug]/page/[num].astro
@@ -20,7 +20,7 @@ const pageSize = options.settings.pagination.tags;
 const total = Math.ceil(filteredPosts.length / pageSize);
 
 if (pageNum > total) {
-  return Astro.redirect('/404');
+  return Astro.redirect(`${total}`, 302);
 }
 ---