fix/news-media-pagination #17
@@ -4,53 +4,40 @@ import prisma from "../prisma/client.js";
|
||||
|
||||
export const getAllNews = async (req, res) => {
|
||||
try {
|
||||
const page = parseInt(req.query.page);
|
||||
const limit = parseInt(req.query.limit);
|
||||
const page = parseInt(req.query.page) || 1;
|
||||
const limit = parseInt(req.query.limit) || 10;
|
||||
const search = req.query.search?.trim() || "";
|
||||
|
||||
const includeImages = {
|
||||
images: true,
|
||||
};
|
||||
|
||||
if (!page && !limit) {
|
||||
const news = await prisma.newsMedia.findMany({
|
||||
include: includeImages,
|
||||
orderBy: { createdAt: "desc" },
|
||||
});
|
||||
const searchFilter = search
|
||||
? {
|
||||
headline: {
|
||||
contains: search,
|
||||
mode: "insensitive",
|
||||
},
|
||||
}
|
||||
: {};
|
||||
|
||||
const response = news.map((n) => ({
|
||||
Id: n.id.toString(),
|
||||
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,
|
||||
})),
|
||||
}));
|
||||
const whereCondition = {
|
||||
...searchFilter,
|
||||
};
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
data: response,
|
||||
meta: null,
|
||||
});
|
||||
}
|
||||
|
||||
const currentPage = page || 1;
|
||||
const currentLimit = limit || 10;
|
||||
|
||||
const skip = (currentPage - 1) * currentLimit;
|
||||
const skip = (page - 1) * limit;
|
||||
|
||||
const [news, total] = await Promise.all([
|
||||
prisma.newsMedia.findMany({
|
||||
where: whereCondition,
|
||||
include: includeImages,
|
||||
orderBy: { createdAt: "desc" },
|
||||
skip,
|
||||
take: currentLimit,
|
||||
take: limit,
|
||||
}),
|
||||
prisma.newsMedia.count({
|
||||
where: whereCondition,
|
||||
}),
|
||||
prisma.newsMedia.count(),
|
||||
]);
|
||||
|
||||
const response = news.map((n) => ({
|
||||
@@ -72,9 +59,9 @@ export const getAllNews = async (req, res) => {
|
||||
data: response,
|
||||
meta: {
|
||||
total,
|
||||
page: currentPage,
|
||||
limit: currentLimit,
|
||||
totalPages: Math.ceil(total / currentLimit),
|
||||
page,
|
||||
limit,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
@@ -85,7 +72,6 @@ export const getAllNews = async (req, res) => {
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// GET NEWS BY ID
|
||||
|
||||
export const getNewsById = async (req, res) => {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
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(
|
||||
`/newsMedia/getAll?page=${page}&limit=${limit}`,
|
||||
`/newsMedia/getAll?page=${page}&limit=${limit}&search=${search}`,
|
||||
);
|
||||
return res.data;
|
||||
};
|
||||
|
||||
@@ -73,7 +73,7 @@ export default function NewsPage() {
|
||||
const fetchAll = useCallback(async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const res = await getNewsApi(currentPage, itemsPerPage);
|
||||
const res = await getNewsApi(currentPage, itemsPerPage, searchText);
|
||||
|
||||
setNews(res?.data || []);
|
||||
setTotalItems(res?.meta?.total || 0);
|
||||
@@ -82,18 +82,12 @@ export default function NewsPage() {
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [currentPage, itemsPerPage]);
|
||||
}, [currentPage, itemsPerPage, searchText]);
|
||||
|
||||
useEffect(() => {
|
||||
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);
|
||||
|
||||
function handleChange(e: any) {
|
||||
@@ -171,8 +165,10 @@ export default function NewsPage() {
|
||||
<Input
|
||||
placeholder="Filter headline..."
|
||||
value={searchText}
|
||||
onChange={(e) => setSearchText(e.target.value)}
|
||||
className="w-[250px] text-base"
|
||||
onChange={(e) => {
|
||||
setSearchText(e.target.value);
|
||||
setCurrentPage(1); // reset page
|
||||
}}
|
||||
/>
|
||||
|
||||
<select
|
||||
@@ -246,7 +242,7 @@ export default function NewsPage() {
|
||||
<Loader2 className="h-8 w-8 animate-spin mx-auto text-primary" />
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
) : filteredNews.length === 0 ? (
|
||||
) : news.length === 0 ? (
|
||||
<TableRow>
|
||||
<TableCell
|
||||
colSpan={7}
|
||||
@@ -256,7 +252,7 @@ export default function NewsPage() {
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
) : (
|
||||
filteredNews.map((item) => (
|
||||
news.map((item) => (
|
||||
<TableRow key={item.Id} className="hover:bg-muted/50">
|
||||
<TableCell className="font-mono text-xs">
|
||||
{item.Id}
|
||||
|
||||
Reference in New Issue
Block a user