fix/news-media-pagination #17

Merged
kailasdevdas merged 2 commits from fix/news-media-pagination into dev 2026-04-27 05:39:47 +00:00
3 changed files with 33 additions and 51 deletions
+23 -37
View File
@@ -4,53 +4,40 @@ import prisma from "../prisma/client.js";
export const getAllNews = async (req, res) => { export const getAllNews = async (req, res) => {
try { try {
const page = parseInt(req.query.page); const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit); const limit = parseInt(req.query.limit) || 10;
const search = req.query.search?.trim() || "";
const includeImages = { const includeImages = {
images: true, images: true,
}; };
if (!page && !limit) { const searchFilter = search
const news = await prisma.newsMedia.findMany({ ? {
include: includeImages, headline: {
orderBy: { createdAt: "desc" }, contains: search,
}); mode: "insensitive",
},
}
: {};
const response = news.map((n) => ({ const whereCondition = {
Id: n.id.toString(), ...searchFilter,
Headline: n.headline, };
Content: n.content,
FirstPara: n.firstPara,
SecondPara: n.secondPara,
Date: n.date,
Author: n.author,
Images: n.images.map((img) => ({
id: img.id,
image: img.url,
})),
}));
return res.status(200).json({ const skip = (page - 1) * limit;
success: true,
data: response,
meta: null,
});
}
const currentPage = page || 1;
const currentLimit = limit || 10;
const skip = (currentPage - 1) * currentLimit;
const [news, total] = await Promise.all([ const [news, total] = await Promise.all([
prisma.newsMedia.findMany({ prisma.newsMedia.findMany({
where: whereCondition,
include: includeImages, include: includeImages,
orderBy: { createdAt: "desc" }, orderBy: { createdAt: "desc" },
skip, skip,
take: currentLimit, take: limit,
}),
prisma.newsMedia.count({
where: whereCondition,
}), }),
prisma.newsMedia.count(),
]); ]);
const response = news.map((n) => ({ const response = news.map((n) => ({
@@ -72,9 +59,9 @@ export const getAllNews = async (req, res) => {
data: response, data: response,
meta: { meta: {
total, total,
page: currentPage, page,
limit: currentLimit, limit,
totalPages: Math.ceil(total / currentLimit), totalPages: Math.ceil(total / limit),
}, },
}); });
} catch (error) { } catch (error) {
@@ -85,7 +72,6 @@ export const getAllNews = async (req, res) => {
}); });
} }
}; };
// GET NEWS BY ID // GET NEWS BY ID
export const getNewsById = async (req, res) => { export const getNewsById = async (req, res) => {
+2 -2
View File
@@ -1,8 +1,8 @@
import apiClient from "@/api/client"; import apiClient from "@/api/client";
export const getNewsApi = async (page = 1, limit = 10) => { export const getNewsApi = async (page = 1, limit = 10, search = "") => {
const res = await apiClient.get( const res = await apiClient.get(
`/newsMedia/getAll?page=${page}&limit=${limit}`, `/newsMedia/getAll?page=${page}&limit=${limit}&search=${search}`,
); );
return res.data; return res.data;
}; };
+8 -12
View File
@@ -73,7 +73,7 @@ export default function NewsPage() {
const fetchAll = useCallback(async () => { const fetchAll = useCallback(async () => {
setLoading(true); setLoading(true);
try { try {
const res = await getNewsApi(currentPage, itemsPerPage); const res = await getNewsApi(currentPage, itemsPerPage, searchText);
setNews(res?.data || []); setNews(res?.data || []);
setTotalItems(res?.meta?.total || 0); setTotalItems(res?.meta?.total || 0);
@@ -82,18 +82,12 @@ export default function NewsPage() {
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [currentPage, itemsPerPage]); }, [currentPage, itemsPerPage, searchText]);
useEffect(() => { useEffect(() => {
fetchAll(); fetchAll();
}, [fetchAll]); }, [fetchAll]);
const filteredNews = news.filter(
(item) =>
item.Headline?.toLowerCase().includes(searchText.toLowerCase()) ||
item.Author?.toLowerCase().includes(searchText.toLowerCase()),
);
const totalPages = Math.ceil(totalItems / itemsPerPage); const totalPages = Math.ceil(totalItems / itemsPerPage);
function handleChange(e: any) { function handleChange(e: any) {
@@ -171,8 +165,10 @@ export default function NewsPage() {
<Input <Input
placeholder="Filter headline..." placeholder="Filter headline..."
value={searchText} value={searchText}
onChange={(e) => setSearchText(e.target.value)} onChange={(e) => {
className="w-[250px] text-base" setSearchText(e.target.value);
setCurrentPage(1); // reset page
}}
/> />
<select <select
@@ -246,7 +242,7 @@ export default function NewsPage() {
<Loader2 className="h-8 w-8 animate-spin mx-auto text-primary" /> <Loader2 className="h-8 w-8 animate-spin mx-auto text-primary" />
</TableCell> </TableCell>
</TableRow> </TableRow>
) : filteredNews.length === 0 ? ( ) : news.length === 0 ? (
<TableRow> <TableRow>
<TableCell <TableCell
colSpan={7} colSpan={7}
@@ -256,7 +252,7 @@ export default function NewsPage() {
</TableCell> </TableCell>
</TableRow> </TableRow>
) : ( ) : (
filteredNews.map((item) => ( news.map((item) => (
<TableRow key={item.Id} className="hover:bg-muted/50"> <TableRow key={item.Id} className="hover:bg-muted/50">
<TableCell className="font-mono text-xs"> <TableCell className="font-mono text-xs">
{item.Id} {item.Id}